blob: e3527f2ab8357f352dac0605a11d9e1cb96743dd [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"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000031#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000032using namespace clang;
33
Chris Lattner5ba61f02006-10-14 07:39:34 +000034//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000035// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
37
Chris Lattner1e1c0b92009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000044
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055}
56
Benjamin Kramere3b442d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000096 if (Opts.Sanitize.has(SanitizerKind::Address))
97 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Evan Cheng31dd9a62014-01-26 23:12:43 +0000141 // Set the appropriate OS version define.
142 if (Triple.isiOS()) {
143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 Str);
153 } else if (Triple.isMacOSX()) {
154 // Note that the Driver allows versions which aren't representable in the
155 // define (because we only get a single digit for the minor and micro
156 // revision numbers). So, we limit them to the maximum representable
157 // version.
158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000159 char Str[7];
160 if (Maj < 10 || (Maj == 10 && Min < 10)) {
161 Str[0] = '0' + (Maj / 10);
162 Str[1] = '0' + (Maj % 10);
163 Str[2] = '0' + std::min(Min, 9U);
164 Str[3] = '0' + std::min(Rev, 9U);
165 Str[4] = '\0';
166 } else {
167 // Handle versions > 10.9.
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
170 Str[2] = '0' + (Min / 10);
171 Str[3] = '0' + (Min % 10);
172 Str[4] = '0' + (Rev / 10);
173 Str[5] = '0' + (Rev % 10);
174 Str[6] = '\0';
175 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000176 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000177 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 // Tell users about the kernel if there is one.
180 if (Triple.isOSDarwin())
181 Builder.defineMacro("__MACH__");
182
Daniel Dunbarecf13562011-04-19 21:40:34 +0000183 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000184}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000185
Benjamin Kramerd5748c72015-03-23 12:31:05 +0000186namespace {
Ed Schoutenf33c6072015-03-11 08:42:46 +0000187// CloudABI Target
188template <typename Target>
189class CloudABITargetInfo : public OSTargetInfo<Target> {
190protected:
191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
193 Builder.defineMacro("__CloudABI__");
194 Builder.defineMacro("__ELF__");
195
196 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
197 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
198 Builder.defineMacro("__STDC_UTF_16__");
199 Builder.defineMacro("__STDC_UTF_32__");
200 }
201
202public:
203 CloudABITargetInfo(const llvm::Triple &Triple)
204 : OSTargetInfo<Target>(Triple) {
205 this->UserLabelPrefix = "";
206 }
207};
208
Torok Edwinb2b37c62009-06-30 17:10:35 +0000209template<typename Target>
210class DarwinTargetInfo : public OSTargetInfo<Target> {
211protected:
Craig Topper3164f332014-03-11 03:39:26 +0000212 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
213 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000214 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000215 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216 }
Mike Stump11289f42009-09-09 15:08:12 +0000217
Torok Edwinb2b37c62009-06-30 17:10:35 +0000218public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000219 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
220 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
221 this->MCountName = "\01mcount";
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223
Craig Topper3164f332014-03-11 03:39:26 +0000224 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000225 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000226 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000228 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000230 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000231 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000232
Craig Topper3164f332014-03-11 03:39:26 +0000233 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000234 // FIXME: We should return 0 when building kexts.
235 return "__TEXT,__StaticInit,regular,pure_instructions";
236 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000237
John McCalleed64c72012-01-29 01:20:30 +0000238 /// Darwin does not support protected visibility. Darwin's "default"
239 /// is very similar to ELF's "protected"; Darwin requires a "weak"
240 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000241 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000242 return false;
243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244};
245
Chris Lattner30ba6742009-08-10 19:03:04 +0000246
Torok Edwinb2b37c62009-06-30 17:10:35 +0000247// DragonFlyBSD Target
248template<typename Target>
249class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
250protected:
Craig Topper3164f332014-03-11 03:39:26 +0000251 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
252 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000254 Builder.defineMacro("__DragonFly__");
255 Builder.defineMacro("__DragonFly_cc_version", "100001");
256 Builder.defineMacro("__ELF__");
257 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
258 Builder.defineMacro("__tune_i386__");
259 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260 }
261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000262 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
263 : OSTargetInfo<Target>(Triple) {
264 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000265
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000273 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274};
275
276// FreeBSD Target
277template<typename Target>
278class FreeBSDTargetInfo : public OSTargetInfo<Target> {
279protected:
Craig Topper3164f332014-03-11 03:39:26 +0000280 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
281 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282 // FreeBSD defines; list based off of gcc output
283
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000284 unsigned Release = Triple.getOSMajorVersion();
285 if (Release == 0U)
286 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000287
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000288 Builder.defineMacro("__FreeBSD__", Twine(Release));
289 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000290 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
291 DefineStd(Builder, "unix", Opts);
292 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000293
294 // On FreeBSD, wchar_t contains the number of the code point as
295 // used by the character set of the locale. These character sets are
296 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000297 //
298 // FIXME: This is wrong; the macro refers to the numerical values
299 // of wchar_t *literals*, which are not locale-dependent. However,
300 // FreeBSD systems apparently depend on us getting this wrong, and
301 // setting this to 1 is conforming even if all the basic source
302 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000303 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000304 }
305public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000306 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
307 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000308
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000309 switch (Triple.getArch()) {
310 default:
311 case llvm::Triple::x86:
312 case llvm::Triple::x86_64:
313 this->MCountName = ".mcount";
314 break;
315 case llvm::Triple::mips:
316 case llvm::Triple::mipsel:
317 case llvm::Triple::ppc:
318 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000319 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000320 this->MCountName = "_mcount";
321 break;
322 case llvm::Triple::arm:
323 this->MCountName = "__mcount";
324 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000325 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000326 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000327};
328
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000329// GNU/kFreeBSD Target
330template<typename Target>
331class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
332protected:
Craig Topper3164f332014-03-11 03:39:26 +0000333 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
334 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000335 // GNU/kFreeBSD defines; list based off of gcc output
336
337 DefineStd(Builder, "unix", Opts);
338 Builder.defineMacro("__FreeBSD_kernel__");
339 Builder.defineMacro("__GLIBC__");
340 Builder.defineMacro("__ELF__");
341 if (Opts.POSIXThreads)
342 Builder.defineMacro("_REENTRANT");
343 if (Opts.CPlusPlus)
344 Builder.defineMacro("_GNU_SOURCE");
345 }
346public:
Eric Christopher917e9522014-11-18 22:36:15 +0000347 KFreeBSDTargetInfo(const llvm::Triple &Triple)
348 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000349 this->UserLabelPrefix = "";
350 }
351};
352
Chris Lattner3e2ee142010-07-07 16:01:42 +0000353// Minix Target
354template<typename Target>
355class MinixTargetInfo : public OSTargetInfo<Target> {
356protected:
Craig Topper3164f332014-03-11 03:39:26 +0000357 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
358 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000359 // Minix defines
360
361 Builder.defineMacro("__minix", "3");
362 Builder.defineMacro("_EM_WSIZE", "4");
363 Builder.defineMacro("_EM_PSIZE", "4");
364 Builder.defineMacro("_EM_SSIZE", "2");
365 Builder.defineMacro("_EM_LSIZE", "4");
366 Builder.defineMacro("_EM_FSIZE", "4");
367 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000368 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000369 DefineStd(Builder, "unix", Opts);
370 }
371public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000372 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
373 this->UserLabelPrefix = "";
374 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000375};
376
Torok Edwinb2b37c62009-06-30 17:10:35 +0000377// Linux target
378template<typename Target>
379class LinuxTargetInfo : public OSTargetInfo<Target> {
380protected:
Craig Topper3164f332014-03-11 03:39:26 +0000381 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
382 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000383 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000384 DefineStd(Builder, "unix", Opts);
385 DefineStd(Builder, "linux", Opts);
386 Builder.defineMacro("__gnu_linux__");
387 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000388 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000389 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000390 unsigned Maj, Min, Rev;
391 Triple.getOSVersion(Maj, Min, Rev);
392 this->PlatformName = "android";
393 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
394 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000395 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000396 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000399 }
400public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000401 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000402 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000403 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000404
405 switch (Triple.getArch()) {
406 default:
407 break;
408 case llvm::Triple::ppc:
409 case llvm::Triple::ppc64:
410 case llvm::Triple::ppc64le:
411 this->MCountName = "_mcount";
412 break;
413 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000414 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000415
Craig Topper3164f332014-03-11 03:39:26 +0000416 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000417 return ".text.startup";
418 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419};
420
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000421// NetBSD Target
422template<typename Target>
423class NetBSDTargetInfo : public OSTargetInfo<Target> {
424protected:
Craig Topper3164f332014-03-11 03:39:26 +0000425 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
426 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000427 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000428 Builder.defineMacro("__NetBSD__");
429 Builder.defineMacro("__unix__");
430 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000431 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000432 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000433
434 switch (Triple.getArch()) {
435 default:
436 break;
437 case llvm::Triple::arm:
438 case llvm::Triple::armeb:
439 case llvm::Triple::thumb:
440 case llvm::Triple::thumbeb:
441 Builder.defineMacro("__ARM_DWARF_EH__");
442 break;
443 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000444 }
445public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000446 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
447 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000448 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000449 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000450};
451
Torok Edwinb2b37c62009-06-30 17:10:35 +0000452// OpenBSD Target
453template<typename Target>
454class OpenBSDTargetInfo : public OSTargetInfo<Target> {
455protected:
Craig Topper3164f332014-03-11 03:39:26 +0000456 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
457 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000458 // OpenBSD defines; list based off of gcc output
459
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000460 Builder.defineMacro("__OpenBSD__");
461 DefineStd(Builder, "unix", Opts);
462 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000463 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000464 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000465 }
466public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000467 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
468 this->UserLabelPrefix = "";
469 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000470
Eli Friedman3715d1f2011-12-15 02:15:56 +0000471 switch (Triple.getArch()) {
472 default:
473 case llvm::Triple::x86:
474 case llvm::Triple::x86_64:
475 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000476 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000477 this->MCountName = "__mcount";
478 break;
479 case llvm::Triple::mips64:
480 case llvm::Triple::mips64el:
481 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000482 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000483 this->MCountName = "_mcount";
484 break;
485 }
486 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000487};
488
Eli Friedman9fa28852012-08-08 23:57:20 +0000489// Bitrig Target
490template<typename Target>
491class BitrigTargetInfo : public OSTargetInfo<Target> {
492protected:
Craig Topper3164f332014-03-11 03:39:26 +0000493 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
494 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000495 // Bitrig defines; list based off of gcc output
496
497 Builder.defineMacro("__Bitrig__");
498 DefineStd(Builder, "unix", Opts);
499 Builder.defineMacro("__ELF__");
500 if (Opts.POSIXThreads)
501 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000502
503 switch (Triple.getArch()) {
504 default:
505 break;
506 case llvm::Triple::arm:
507 case llvm::Triple::armeb:
508 case llvm::Triple::thumb:
509 case llvm::Triple::thumbeb:
510 Builder.defineMacro("__ARM_DWARF_EH__");
511 break;
512 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000513 }
514public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000515 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
516 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000518 }
519};
520
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000521// PSP Target
522template<typename Target>
523class PSPTargetInfo : public OSTargetInfo<Target> {
524protected:
Craig Topper3164f332014-03-11 03:39:26 +0000525 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
526 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000527 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000528 Builder.defineMacro("PSP");
529 Builder.defineMacro("_PSP");
530 Builder.defineMacro("__psp__");
531 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000532 }
533public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000534 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000535 this->UserLabelPrefix = "";
536 }
537};
538
John Thompsone467e192009-11-19 17:18:50 +0000539// PS3 PPU Target
540template<typename Target>
541class PS3PPUTargetInfo : public OSTargetInfo<Target> {
542protected:
Craig Topper3164f332014-03-11 03:39:26 +0000543 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
544 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000545 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000546 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000547 Builder.defineMacro("__PPU__");
548 Builder.defineMacro("__CELLOS_LV2__");
549 Builder.defineMacro("__ELF__");
550 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000551 Builder.defineMacro("_ARCH_PPC64");
552 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000553 }
554public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000555 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000556 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000557 this->LongWidth = this->LongAlign = 32;
558 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000559 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000560 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000561 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000562 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000563 }
564};
565
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000566template <typename Target>
567class PS4OSTargetInfo : public OSTargetInfo<Target> {
568protected:
569 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
570 MacroBuilder &Builder) const override {
571 Builder.defineMacro("__FreeBSD__", "9");
572 Builder.defineMacro("__FreeBSD_cc_version", "900001");
573 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
574 DefineStd(Builder, "unix", Opts);
575 Builder.defineMacro("__ELF__");
576 Builder.defineMacro("__PS4__");
577 }
578public:
579 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
580 this->WCharType = this->UnsignedShort;
581
582 this->UserLabelPrefix = "";
583
584 switch (Triple.getArch()) {
585 default:
586 case llvm::Triple::x86_64:
587 this->MCountName = ".mcount";
588 break;
589 }
590 }
591};
592
Torok Edwinb2b37c62009-06-30 17:10:35 +0000593// Solaris target
594template<typename Target>
595class SolarisTargetInfo : public OSTargetInfo<Target> {
596protected:
Craig Topper3164f332014-03-11 03:39:26 +0000597 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000599 DefineStd(Builder, "sun", Opts);
600 DefineStd(Builder, "unix", Opts);
601 Builder.defineMacro("__ELF__");
602 Builder.defineMacro("__svr4__");
603 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000604 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
605 // newer, but to 500 for everything else. feature_test.h has a check to
606 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000607 // with a new version.
608 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000609 Builder.defineMacro("_XOPEN_SOURCE", "600");
610 else
611 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000612 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000613 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000614 Builder.defineMacro("_LARGEFILE_SOURCE");
615 Builder.defineMacro("_LARGEFILE64_SOURCE");
616 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000617 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000618 }
619public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000620 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000621 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000622 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000623 // FIXME: WIntType should be SignedLong
624 }
625};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000626
627// Windows target
628template<typename Target>
629class WindowsTargetInfo : public OSTargetInfo<Target> {
630protected:
Craig Topper3164f332014-03-11 03:39:26 +0000631 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
632 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000633 Builder.defineMacro("_WIN32");
634 }
635 void getVisualStudioDefines(const LangOptions &Opts,
636 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000637 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000638 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639 Builder.defineMacro("_CPPRTTI");
640
Reid Kleckner16514352015-01-30 21:42:55 +0000641 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000642 Builder.defineMacro("_CPPUNWIND");
643 }
644
645 if (!Opts.CharIsSigned)
646 Builder.defineMacro("_CHAR_UNSIGNED");
647
648 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
649 // but it works for now.
650 if (Opts.POSIXThreads)
651 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000652
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000653 if (Opts.MSCompatibilityVersion) {
654 Builder.defineMacro("_MSC_VER",
655 Twine(Opts.MSCompatibilityVersion / 100000));
656 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000657 // FIXME We cannot encode the revision information into 32-bits
658 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000659
David Majnemerb710a932015-05-11 03:57:49 +0000660 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000661 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000662 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000663
664 if (Opts.MicrosoftExt) {
665 Builder.defineMacro("_MSC_EXTENSIONS");
666
667 if (Opts.CPlusPlus11) {
668 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
669 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
670 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
671 }
672 }
673
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000674 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000675 }
676
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000677public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000678 WindowsTargetInfo(const llvm::Triple &Triple)
679 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000680};
681
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000682template <typename Target>
683class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000684protected:
Craig Topper3164f332014-03-11 03:39:26 +0000685 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
686 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000687 if (Opts.POSIXThreads)
688 Builder.defineMacro("_REENTRANT");
689 if (Opts.CPlusPlus)
690 Builder.defineMacro("_GNU_SOURCE");
691
692 DefineStd(Builder, "unix", Opts);
693 Builder.defineMacro("__ELF__");
694 Builder.defineMacro("__native_client__");
695 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000696
697public:
698 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000699 this->UserLabelPrefix = "";
700 this->LongAlign = 32;
701 this->LongWidth = 32;
702 this->PointerAlign = 32;
703 this->PointerWidth = 32;
704 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000705 this->Int64Type = TargetInfo::SignedLongLong;
706 this->DoubleAlign = 64;
707 this->LongDoubleWidth = 64;
708 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000709 this->LongLongWidth = 64;
710 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000711 this->SizeType = TargetInfo::UnsignedInt;
712 this->PtrDiffType = TargetInfo::SignedInt;
713 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000714 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000715 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000716 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000717 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000718 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000719 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000720 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000721 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000722 } else if (Triple.getArch() == llvm::Triple::mipsel) {
723 // Handled on mips' setDescriptionString.
724 } else {
725 assert(Triple.getArch() == llvm::Triple::le32);
726 this->DescriptionString = "e-p:32:32-i64:64";
727 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000728 }
729};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000730
Chris Lattner09d98f52008-10-05 21:50:58 +0000731//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000732// Specific target implementations.
733//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000734
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000735// PPC abstract base class
736class PPCTargetInfo : public TargetInfo {
737 static const Builtin::Info BuiltinInfo[];
738 static const char * const GCCRegNames[];
739 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000740 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000741
742 // Target cpu features.
743 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000744 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000745 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000746 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000747 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000748 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000749 bool HasBPERMD;
750 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000751
Ulrich Weigand8afad612014-07-28 13:17:52 +0000752protected:
753 std::string ABI;
754
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000755public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000756 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000757 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000758 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000759 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000760 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000761 LongDoubleWidth = LongDoubleAlign = 128;
762 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
763 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000764
Hal Finkel6b984f02012-07-03 16:51:04 +0000765 /// \brief Flags for architecture specific defines.
766 typedef enum {
767 ArchDefineNone = 0,
768 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
769 ArchDefinePpcgr = 1 << 1,
770 ArchDefinePpcsq = 1 << 2,
771 ArchDefine440 = 1 << 3,
772 ArchDefine603 = 1 << 4,
773 ArchDefine604 = 1 << 5,
774 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000775 ArchDefinePwr5 = 1 << 7,
776 ArchDefinePwr5x = 1 << 8,
777 ArchDefinePwr6 = 1 << 9,
778 ArchDefinePwr6x = 1 << 10,
779 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000780 ArchDefinePwr8 = 1 << 12,
781 ArchDefineA2 = 1 << 13,
782 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000783 } ArchDefineTypes;
784
Bill Schmidt38378a02013-02-01 20:23:10 +0000785 // Note: GCC recognizes the following additional cpus:
786 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
787 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
788 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000789 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000790 bool CPUKnown = llvm::StringSwitch<bool>(Name)
791 .Case("generic", true)
792 .Case("440", true)
793 .Case("450", true)
794 .Case("601", true)
795 .Case("602", true)
796 .Case("603", true)
797 .Case("603e", true)
798 .Case("603ev", true)
799 .Case("604", true)
800 .Case("604e", true)
801 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000802 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000803 .Case("g3", true)
804 .Case("7400", true)
805 .Case("g4", true)
806 .Case("7450", true)
807 .Case("g4+", true)
808 .Case("750", true)
809 .Case("970", true)
810 .Case("g5", true)
811 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000812 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000813 .Case("e500mc", true)
814 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000815 .Case("power3", true)
816 .Case("pwr3", true)
817 .Case("power4", true)
818 .Case("pwr4", true)
819 .Case("power5", true)
820 .Case("pwr5", true)
821 .Case("power5x", true)
822 .Case("pwr5x", true)
823 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000824 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000825 .Case("power6x", true)
826 .Case("pwr6x", true)
827 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000828 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000829 .Case("power8", true)
830 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000831 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000832 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000833 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000834 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000835 .Case("powerpc64le", true)
836 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000837 .Default(false);
838
839 if (CPUKnown)
840 CPU = Name;
841
842 return CPUKnown;
843 }
844
Ulrich Weigand8afad612014-07-28 13:17:52 +0000845
846 StringRef getABI() const override { return ABI; }
847
Craig Topper3164f332014-03-11 03:39:26 +0000848 void getTargetBuiltins(const Builtin::Info *&Records,
849 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000850 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000851 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000852 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000853
Craig Topper3164f332014-03-11 03:39:26 +0000854 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000855
Craig Topper3164f332014-03-11 03:39:26 +0000856 void getTargetDefines(const LangOptions &Opts,
857 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000858
Craig Topper3164f332014-03-11 03:39:26 +0000859 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000860
Craig Topper3164f332014-03-11 03:39:26 +0000861 bool handleTargetFeatures(std::vector<std::string> &Features,
862 DiagnosticsEngine &Diags) override;
863 bool hasFeature(StringRef Feature) const override;
864
865 void getGCCRegNames(const char * const *&Names,
866 unsigned &NumNames) const override;
867 void getGCCRegAliases(const GCCRegAlias *&Aliases,
868 unsigned &NumAliases) const override;
869 bool validateAsmConstraint(const char *&Name,
870 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000871 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000872 default: return false;
873 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000874 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000875 case 'b': // Base register
876 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000877 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000878 break;
879 // FIXME: The following are added to allow parsing.
880 // I just took a guess at what the actions should be.
881 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000882 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000883 case 'v': // Altivec vector register
884 Info.setAllowsRegister();
885 break;
886 case 'w':
887 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000888 case 'd':// VSX vector register to hold vector double data
889 case 'f':// VSX vector register to hold vector float data
890 case 's':// VSX vector register to hold scalar float data
891 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000892 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000893 break;
894 default:
895 return false;
896 }
897 Info.setAllowsRegister();
898 Name++; // Skip over 'w'.
899 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000900 case 'h': // `MQ', `CTR', or `LINK' register
901 case 'q': // `MQ' register
902 case 'c': // `CTR' register
903 case 'l': // `LINK' register
904 case 'x': // `CR' register (condition register) number 0
905 case 'y': // `CR' register (condition register)
906 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000907 Info.setAllowsRegister();
908 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000909 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000910 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000911 // (use `L' instead for SImode constants)
912 case 'K': // Unsigned 16-bit constant
913 case 'L': // Signed 16-bit constant shifted left 16 bits
914 case 'M': // Constant larger than 31
915 case 'N': // Exact power of 2
916 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000917 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000918 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000919 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000920 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000921 break;
922 case 'm': // Memory operand. Note that on PowerPC targets, m can
923 // include addresses that update the base register. It
924 // is therefore only safe to use `m' in an asm statement
925 // if that asm statement accesses the operand exactly once.
926 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000927 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000928 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000929 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000930 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000931 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
932 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000933 // register to be updated.
934 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000935 if (Name[1] != 's')
936 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000937 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000938 // include any automodification of the base register. Unlike
939 // `m', this constraint can be used in asm statements that
940 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000941 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000942 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000943 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000944 break;
945 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000946 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000947 case 'Z': // Memory operand that is an indexed or indirect from a
948 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000949 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000950 Info.setAllowsMemory();
951 Info.setAllowsRegister();
952 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000953 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000954 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000955 // register (`p' is preferable for asm statements)
956 case 'S': // Constant suitable as a 64-bit mask operand
957 case 'T': // Constant suitable as a 32-bit mask operand
958 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000959 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000960 // instructions
961 case 'W': // Vector constant that does not require memory
962 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000963 break;
964 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000965 }
John Thompson07a61a42010-06-24 22:44:13 +0000966 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000967 }
Craig Topper3164f332014-03-11 03:39:26 +0000968 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000969 std::string R;
970 switch (*Constraint) {
971 case 'e':
972 case 'w':
973 // Two-character constraint; add "^" hint for later parsing.
974 R = std::string("^") + std::string(Constraint, 2);
975 Constraint++;
976 break;
977 default:
978 return TargetInfo::convertConstraint(Constraint);
979 }
980 return R;
981 }
Craig Topper3164f332014-03-11 03:39:26 +0000982 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000983 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000984 }
Craig Topper3164f332014-03-11 03:39:26 +0000985 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000986 if (RegNo == 0) return 3;
987 if (RegNo == 1) return 4;
988 return -1;
989 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +0000990
991 bool hasSjLjLowering() const override {
992 return true;
993 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000994};
Anders Carlssonf511f642007-11-27 04:11:28 +0000995
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000996const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000997#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000998#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000999 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001000#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001001};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001002
Eric Christopher917e9522014-11-18 22:36:15 +00001003/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001004/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001005bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001006 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001007 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1008 // Ignore disabled features.
1009 if (Features[i][0] == '-')
1010 continue;
1011
1012 StringRef Feature = StringRef(Features[i]).substr(1);
1013
1014 if (Feature == "vsx") {
1015 HasVSX = true;
1016 continue;
1017 }
1018
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001019 if (Feature == "bpermd") {
1020 HasBPERMD = true;
1021 continue;
1022 }
1023
1024 if (Feature == "extdiv") {
1025 HasExtDiv = true;
1026 continue;
1027 }
1028
Bill Schmidt59eb7672014-10-10 15:09:43 +00001029 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001030 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001031 continue;
1032 }
1033
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001034 if (Feature == "crypto") {
1035 HasP8Crypto = true;
1036 continue;
1037 }
1038
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001039 if (Feature == "direct-move") {
1040 HasDirectMove = true;
1041 continue;
1042 }
1043
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001044 if (Feature == "qpx") {
1045 HasQPX = true;
1046 continue;
1047 }
1048
Kit Barton8246f282015-03-25 19:41:41 +00001049 if (Feature == "htm") {
1050 HasHTM = true;
1051 continue;
1052 }
1053
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001054 // TODO: Finish this list and add an assert that we've handled them
1055 // all.
1056 }
1057
1058 return true;
1059}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001060
Chris Lattnerecd49032009-03-02 22:27:17 +00001061/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1062/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001063void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001064 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001065 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001066 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001067 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001068 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001069 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001070 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001071 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001072 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001073 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001074 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001075 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001076 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001077
Chris Lattnerecd49032009-03-02 22:27:17 +00001078 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001079 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1080 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001081 } else {
1082 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1083 getTriple().getOS() != llvm::Triple::OpenBSD)
1084 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001085 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001086
Ulrich Weigand8afad612014-07-28 13:17:52 +00001087 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001088 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001089 Builder.defineMacro("_CALL_ELF", "1");
1090 if (ABI == "elfv2")
1091 Builder.defineMacro("_CALL_ELF", "2");
1092
Chris Lattnerecd49032009-03-02 22:27:17 +00001093 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001094 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1095 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001096
Chris Lattnerecd49032009-03-02 22:27:17 +00001097 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001098 if (LongDoubleWidth == 128)
1099 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001100
John Thompsone467e192009-11-19 17:18:50 +00001101 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001102 Builder.defineMacro("__VEC__", "10206");
1103 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001104 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001105
1106 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001107 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1108 .Case("440", ArchDefineName)
1109 .Case("450", ArchDefineName | ArchDefine440)
1110 .Case("601", ArchDefineName)
1111 .Case("602", ArchDefineName | ArchDefinePpcgr)
1112 .Case("603", ArchDefineName | ArchDefinePpcgr)
1113 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1114 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1115 .Case("604", ArchDefineName | ArchDefinePpcgr)
1116 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1117 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001118 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001119 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1120 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1121 .Case("750", ArchDefineName | ArchDefinePpcgr)
1122 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1123 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001124 .Case("a2", ArchDefineA2)
1125 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001126 .Case("pwr3", ArchDefinePpcgr)
1127 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1128 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1129 | ArchDefinePpcsq)
1130 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1131 | ArchDefinePpcgr | ArchDefinePpcsq)
1132 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1133 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1134 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1135 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1136 | ArchDefinePpcsq)
1137 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1138 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001139 | ArchDefinePpcgr | ArchDefinePpcsq)
1140 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1141 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1142 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001143 .Case("power3", ArchDefinePpcgr)
1144 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1145 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1146 | ArchDefinePpcsq)
1147 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1148 | ArchDefinePpcgr | ArchDefinePpcsq)
1149 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1150 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1152 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1153 | ArchDefinePpcsq)
1154 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1155 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001156 | ArchDefinePpcgr | ArchDefinePpcsq)
1157 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1158 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1159 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001160 .Default(ArchDefineNone);
1161
1162 if (defs & ArchDefineName)
1163 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1164 if (defs & ArchDefinePpcgr)
1165 Builder.defineMacro("_ARCH_PPCGR");
1166 if (defs & ArchDefinePpcsq)
1167 Builder.defineMacro("_ARCH_PPCSQ");
1168 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001169 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001170 if (defs & ArchDefine603)
1171 Builder.defineMacro("_ARCH_603");
1172 if (defs & ArchDefine604)
1173 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001174 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001175 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001176 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001177 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001178 if (defs & ArchDefinePwr5x)
1179 Builder.defineMacro("_ARCH_PWR5X");
1180 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001181 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001182 if (defs & ArchDefinePwr6x)
1183 Builder.defineMacro("_ARCH_PWR6X");
1184 if (defs & ArchDefinePwr7)
1185 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001186 if (defs & ArchDefinePwr8)
1187 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001188 if (defs & ArchDefineA2)
1189 Builder.defineMacro("_ARCH_A2");
1190 if (defs & ArchDefineA2q) {
1191 Builder.defineMacro("_ARCH_A2Q");
1192 Builder.defineMacro("_ARCH_QP");
1193 }
1194
1195 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1196 Builder.defineMacro("__bg__");
1197 Builder.defineMacro("__THW_BLUEGENE__");
1198 Builder.defineMacro("__bgq__");
1199 Builder.defineMacro("__TOS_BGQ__");
1200 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001201
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001202 if (HasVSX)
1203 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001204 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001205 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001206 if (HasP8Crypto)
1207 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001208 if (HasHTM)
1209 Builder.defineMacro("__HTM__");
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001210 if (getTriple().getArch() == llvm::Triple::ppc64le ||
1211 (defs & ArchDefinePwr8)) {
1212 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1213 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1214 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1215 if (PointerWidth == 64)
1216 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1217 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001218
Bill Schmidt38378a02013-02-01 20:23:10 +00001219 // FIXME: The following are not yet generated here by Clang, but are
1220 // generated by GCC:
1221 //
1222 // _SOFT_FLOAT_
1223 // __RECIP_PRECISION__
1224 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001225 // __RECIP__
1226 // __RECIPF__
1227 // __RSQRTE__
1228 // __RSQRTEF__
1229 // _SOFT_DOUBLE_
1230 // __NO_LWSYNC__
1231 // __HAVE_BSWAP__
1232 // __LONGDOUBLE128
1233 // __CMODEL_MEDIUM__
1234 // __CMODEL_LARGE__
1235 // _CALL_SYSV
1236 // _CALL_DARWIN
1237 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001238}
1239
1240void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1241 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1242 .Case("7400", true)
1243 .Case("g4", true)
1244 .Case("7450", true)
1245 .Case("g4+", true)
1246 .Case("970", true)
1247 .Case("g5", true)
1248 .Case("pwr6", true)
1249 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001250 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001251 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001252 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001253 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001254
1255 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001256 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1257 .Case("ppc64le", true)
1258 .Case("pwr8", true)
1259 .Default(false);
1260 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1261 .Case("ppc64le", true)
1262 .Case("pwr8", true)
1263 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001264 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1265 .Case("ppc64le", true)
1266 .Case("pwr8", true)
1267 .Case("pwr7", true)
1268 .Default(false);
1269 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1270 .Case("ppc64le", true)
1271 .Case("pwr8", true)
1272 .Case("pwr7", true)
1273 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001274 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1275 .Case("ppc64le", true)
1276 .Case("pwr8", true)
1277 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001278}
1279
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001280bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001281 return llvm::StringSwitch<bool>(Feature)
1282 .Case("powerpc", true)
1283 .Case("vsx", HasVSX)
1284 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001285 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001286 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001287 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001288 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001289 .Case("bpermd", HasBPERMD)
1290 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001291 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001292}
Chris Lattner17df24e2008-04-21 18:56:49 +00001293
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001294const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001295 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1296 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1297 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1298 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1299 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1300 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1301 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1302 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001303 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001304 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001305 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001306 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1307 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1308 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1309 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001310 "vrsave", "vscr",
1311 "spe_acc", "spefscr",
1312 "sfp"
1313};
Chris Lattner10a5b382007-01-29 05:24:35 +00001314
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001315void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001316 unsigned &NumNames) const {
1317 Names = GCCRegNames;
1318 NumNames = llvm::array_lengthof(GCCRegNames);
1319}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001320
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001321const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1322 // While some of these aliases do map to different registers
1323 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001324 { { "0" }, "r0" },
1325 { { "1"}, "r1" },
1326 { { "2" }, "r2" },
1327 { { "3" }, "r3" },
1328 { { "4" }, "r4" },
1329 { { "5" }, "r5" },
1330 { { "6" }, "r6" },
1331 { { "7" }, "r7" },
1332 { { "8" }, "r8" },
1333 { { "9" }, "r9" },
1334 { { "10" }, "r10" },
1335 { { "11" }, "r11" },
1336 { { "12" }, "r12" },
1337 { { "13" }, "r13" },
1338 { { "14" }, "r14" },
1339 { { "15" }, "r15" },
1340 { { "16" }, "r16" },
1341 { { "17" }, "r17" },
1342 { { "18" }, "r18" },
1343 { { "19" }, "r19" },
1344 { { "20" }, "r20" },
1345 { { "21" }, "r21" },
1346 { { "22" }, "r22" },
1347 { { "23" }, "r23" },
1348 { { "24" }, "r24" },
1349 { { "25" }, "r25" },
1350 { { "26" }, "r26" },
1351 { { "27" }, "r27" },
1352 { { "28" }, "r28" },
1353 { { "29" }, "r29" },
1354 { { "30" }, "r30" },
1355 { { "31" }, "r31" },
1356 { { "fr0" }, "f0" },
1357 { { "fr1" }, "f1" },
1358 { { "fr2" }, "f2" },
1359 { { "fr3" }, "f3" },
1360 { { "fr4" }, "f4" },
1361 { { "fr5" }, "f5" },
1362 { { "fr6" }, "f6" },
1363 { { "fr7" }, "f7" },
1364 { { "fr8" }, "f8" },
1365 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001366 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001367 { { "fr11" }, "f11" },
1368 { { "fr12" }, "f12" },
1369 { { "fr13" }, "f13" },
1370 { { "fr14" }, "f14" },
1371 { { "fr15" }, "f15" },
1372 { { "fr16" }, "f16" },
1373 { { "fr17" }, "f17" },
1374 { { "fr18" }, "f18" },
1375 { { "fr19" }, "f19" },
1376 { { "fr20" }, "f20" },
1377 { { "fr21" }, "f21" },
1378 { { "fr22" }, "f22" },
1379 { { "fr23" }, "f23" },
1380 { { "fr24" }, "f24" },
1381 { { "fr25" }, "f25" },
1382 { { "fr26" }, "f26" },
1383 { { "fr27" }, "f27" },
1384 { { "fr28" }, "f28" },
1385 { { "fr29" }, "f29" },
1386 { { "fr30" }, "f30" },
1387 { { "fr31" }, "f31" },
1388 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001389};
1390
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001391void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001392 unsigned &NumAliases) const {
1393 Aliases = GCCRegAliases;
1394 NumAliases = llvm::array_lengthof(GCCRegAliases);
1395}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001396
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001397class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001398public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001399 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001400 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001401
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001402 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001403 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001404 case llvm::Triple::FreeBSD:
1405 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001406 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001407 PtrDiffType = SignedInt;
1408 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001409 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001410 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001411 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001412 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001413
Roman Divacky3ffe7462012-03-13 19:20:17 +00001414 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1415 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001416 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001417 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001418
1419 // PPC32 supports atomics up to 4 bytes.
1420 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001421 }
1422
Craig Topper3164f332014-03-11 03:39:26 +00001423 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001424 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001425 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001426 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001427};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001428
Bill Schmidt778d3872013-07-26 01:36:11 +00001429// Note: ABI differences may eventually require us to have a separate
1430// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001431class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001432public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001433 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001434 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001435 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001436 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001437
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001438 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1439 DescriptionString = "e-m:e-i64:64-n32:64";
1440 ABI = "elfv2";
1441 } else {
1442 DescriptionString = "E-m:e-i64:64-n32:64";
1443 ABI = "elfv1";
1444 }
1445
1446 switch (getTriple().getOS()) {
1447 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001448 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001449 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001450 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001451 case llvm::Triple::NetBSD:
1452 IntMaxType = SignedLongLong;
1453 Int64Type = SignedLongLong;
1454 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001455 default:
1456 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001457 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001458
1459 // PPC64 supports atomics up to 8 bytes.
1460 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001461 }
Craig Topper3164f332014-03-11 03:39:26 +00001462 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001463 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001464 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001465 // PPC64 Linux-specifc ABI options.
1466 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001467 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001468 ABI = Name;
1469 return true;
1470 }
1471 return false;
1472 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001473};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001474
Roman Divacky965b0b72011-01-06 08:27:10 +00001475class DarwinPPC32TargetInfo :
1476 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001477public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001478 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1479 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001480 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001481 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001482 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001483 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001484 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001485 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001486 }
Craig Topper3164f332014-03-11 03:39:26 +00001487 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001488 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001489 }
1490};
1491
1492class DarwinPPC64TargetInfo :
1493 public DarwinTargetInfo<PPC64TargetInfo> {
1494public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001495 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1496 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001497 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001498 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001499 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001500 }
1501};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001502
Peter Collingbournec947aae2012-05-20 23:28:41 +00001503 static const unsigned NVPTXAddrSpaceMap[] = {
1504 1, // opencl_global
1505 3, // opencl_local
1506 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001507 // FIXME: generic has to be added to the target
1508 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001509 1, // cuda_device
1510 4, // cuda_constant
1511 3, // cuda_shared
1512 };
1513 class NVPTXTargetInfo : public TargetInfo {
1514 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001515 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001516
1517 // The GPU profiles supported by the NVPTX backend
1518 enum GPUKind {
1519 GK_NONE,
1520 GK_SM20,
1521 GK_SM21,
1522 GK_SM30,
1523 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001524 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001525 } GPU;
1526
Peter Collingbournec947aae2012-05-20 23:28:41 +00001527 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001528 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001529 BigEndian = false;
1530 TLSSupported = false;
1531 LongWidth = LongAlign = 64;
1532 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001533 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001534 // Define available target features
1535 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001536 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001537 // Set the default GPU to sm20
1538 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001539 }
Craig Topper3164f332014-03-11 03:39:26 +00001540 void getTargetDefines(const LangOptions &Opts,
1541 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001542 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001543 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001544 if (Opts.CUDAIsDevice) {
1545 // Set __CUDA_ARCH__ for the GPU specified.
1546 std::string CUDAArchCode;
1547 switch (GPU) {
1548 case GK_SM20:
1549 CUDAArchCode = "200";
1550 break;
1551 case GK_SM21:
1552 CUDAArchCode = "210";
1553 break;
1554 case GK_SM30:
1555 CUDAArchCode = "300";
1556 break;
1557 case GK_SM35:
1558 CUDAArchCode = "350";
1559 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001560 case GK_SM37:
1561 CUDAArchCode = "370";
1562 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001563 default:
1564 llvm_unreachable("Unhandled target CPU");
1565 }
1566 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1567 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001568 }
Craig Topper3164f332014-03-11 03:39:26 +00001569 void getTargetBuiltins(const Builtin::Info *&Records,
1570 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001571 Records = BuiltinInfo;
1572 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001573 }
Craig Topper3164f332014-03-11 03:39:26 +00001574 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001575 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001576 }
Craig Topper3164f332014-03-11 03:39:26 +00001577
1578 void getGCCRegNames(const char * const *&Names,
1579 unsigned &NumNames) const override;
1580 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1581 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001582 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001583 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001584 NumAliases = 0;
1585 }
Eric Christopher917e9522014-11-18 22:36:15 +00001586 bool
1587 validateAsmConstraint(const char *&Name,
1588 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001589 switch (*Name) {
1590 default: return false;
1591 case 'c':
1592 case 'h':
1593 case 'r':
1594 case 'l':
1595 case 'f':
1596 case 'd':
1597 Info.setAllowsRegister();
1598 return true;
1599 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001600 }
Craig Topper3164f332014-03-11 03:39:26 +00001601 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001602 // FIXME: Is this really right?
1603 return "";
1604 }
Craig Topper3164f332014-03-11 03:39:26 +00001605 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001606 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001607 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001608 }
Craig Topper3164f332014-03-11 03:39:26 +00001609 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001610 GPU = llvm::StringSwitch<GPUKind>(Name)
1611 .Case("sm_20", GK_SM20)
1612 .Case("sm_21", GK_SM21)
1613 .Case("sm_30", GK_SM30)
1614 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001615 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001616 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001617
Reid Klecknerbbc01782014-12-03 21:53:36 +00001618 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001619 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001620 };
1621
1622 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1623#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1624#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1625 ALL_LANGUAGES },
1626#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001627 };
1628
1629 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1630 "r0"
1631 };
1632
1633 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1634 unsigned &NumNames) const {
1635 Names = GCCRegNames;
1636 NumNames = llvm::array_lengthof(GCCRegNames);
1637 }
1638
1639 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1640 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001641 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001642 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001643 SizeType = TargetInfo::UnsignedInt;
1644 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001645 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001646 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001647 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001648 };
1649
1650 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1651 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001652 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001653 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001654 SizeType = TargetInfo::UnsignedLong;
1655 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001656 IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001657 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001658 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001659 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001660
1661static const unsigned R600AddrSpaceMap[] = {
1662 1, // opencl_global
1663 3, // opencl_local
1664 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001665 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001666 1, // cuda_device
1667 2, // cuda_constant
1668 3 // cuda_shared
1669};
1670
Tom Stellarda96344b2014-08-21 13:58:40 +00001671// If you edit the description strings, make sure you update
1672// getPointerWidthV().
1673
Tom Stellardc74b1e02013-03-04 17:40:53 +00001674static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001675 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1676 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001677
1678static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001679 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1680 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001681
1682static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001683 "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 +00001684 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1685 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001686
Eli Friedmand13b41e2012-10-12 23:32:00 +00001687class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001688 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001689 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001690
Tom Stellardc74b1e02013-03-04 17:40:53 +00001691 /// \brief The GPU profiles supported by the R600 target.
1692 enum GPUKind {
1693 GK_NONE,
1694 GK_R600,
1695 GK_R600_DOUBLE_OPS,
1696 GK_R700,
1697 GK_R700_DOUBLE_OPS,
1698 GK_EVERGREEN,
1699 GK_EVERGREEN_DOUBLE_OPS,
1700 GK_NORTHERN_ISLANDS,
1701 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001702 GK_SOUTHERN_ISLANDS,
1703 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001704 } GPU;
1705
Jan Veselyeebeaea2015-05-04 19:53:36 +00001706 bool hasFP64:1;
1707 bool hasFMAF:1;
1708 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001709
Eli Friedmand13b41e2012-10-12 23:32:00 +00001710public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001711 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001712 : TargetInfo(Triple) {
1713
1714 if (Triple.getArch() == llvm::Triple::amdgcn) {
1715 DescriptionString = DescriptionStringSI;
1716 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001717 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001718 hasFMAF = true;
1719 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001720 } else {
1721 DescriptionString = DescriptionStringR600;
1722 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001723 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001724 hasFMAF = false;
1725 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001726 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001727 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001728 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001729 }
1730
Tom Stellarda96344b2014-08-21 13:58:40 +00001731 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1732 if (GPU <= GK_CAYMAN)
1733 return 32;
1734
1735 switch(AddrSpace) {
1736 default:
1737 return 64;
1738 case 0:
1739 case 3:
1740 case 5:
1741 return 32;
1742 }
1743 }
1744
Craig Topper3164f332014-03-11 03:39:26 +00001745 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001746 return "";
1747 }
1748
Craig Topper3164f332014-03-11 03:39:26 +00001749 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001750 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001751
Craig Topper3164f332014-03-11 03:39:26 +00001752 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1753 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001754 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001755 NumAliases = 0;
1756 }
1757
Craig Topper3164f332014-03-11 03:39:26 +00001758 bool validateAsmConstraint(const char *&Name,
1759 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001760 return true;
1761 }
1762
Craig Topper3164f332014-03-11 03:39:26 +00001763 void getTargetBuiltins(const Builtin::Info *&Records,
1764 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001765 Records = BuiltinInfo;
1766 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001767 }
1768
Craig Topper3164f332014-03-11 03:39:26 +00001769 void getTargetDefines(const LangOptions &Opts,
1770 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001771 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001772 if (hasFMAF)
1773 Builder.defineMacro("__HAS_FMAF__");
1774 if (hasLDEXPF)
1775 Builder.defineMacro("__HAS_LDEXPF__");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001776 if (hasFP64 && Opts.OpenCL) {
Tom Stellardfded50f2015-02-27 15:10:19 +00001777 Builder.defineMacro("cl_khr_fp64");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001778 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001779 }
1780
Craig Topper3164f332014-03-11 03:39:26 +00001781 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001782 return TargetInfo::CharPtrBuiltinVaList;
1783 }
1784
Craig Topper3164f332014-03-11 03:39:26 +00001785 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001786 GPU = llvm::StringSwitch<GPUKind>(Name)
1787 .Case("r600" , GK_R600)
1788 .Case("rv610", GK_R600)
1789 .Case("rv620", GK_R600)
1790 .Case("rv630", GK_R600)
1791 .Case("rv635", GK_R600)
1792 .Case("rs780", GK_R600)
1793 .Case("rs880", GK_R600)
1794 .Case("rv670", GK_R600_DOUBLE_OPS)
1795 .Case("rv710", GK_R700)
1796 .Case("rv730", GK_R700)
1797 .Case("rv740", GK_R700_DOUBLE_OPS)
1798 .Case("rv770", GK_R700_DOUBLE_OPS)
1799 .Case("palm", GK_EVERGREEN)
1800 .Case("cedar", GK_EVERGREEN)
1801 .Case("sumo", GK_EVERGREEN)
1802 .Case("sumo2", GK_EVERGREEN)
1803 .Case("redwood", GK_EVERGREEN)
1804 .Case("juniper", GK_EVERGREEN)
1805 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1806 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1807 .Case("barts", GK_NORTHERN_ISLANDS)
1808 .Case("turks", GK_NORTHERN_ISLANDS)
1809 .Case("caicos", GK_NORTHERN_ISLANDS)
1810 .Case("cayman", GK_CAYMAN)
1811 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001812 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001813 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1814 .Case("verde", GK_SOUTHERN_ISLANDS)
1815 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001816 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001817 .Case("bonaire", GK_SEA_ISLANDS)
1818 .Case("kabini", GK_SEA_ISLANDS)
1819 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001820 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001821 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001822 .Default(GK_NONE);
1823
1824 if (GPU == GK_NONE) {
1825 return false;
1826 }
1827
1828 // Set the correct data layout
1829 switch (GPU) {
1830 case GK_NONE:
1831 case GK_R600:
1832 case GK_R700:
1833 case GK_EVERGREEN:
1834 case GK_NORTHERN_ISLANDS:
1835 DescriptionString = DescriptionStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001836 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001837 hasFMAF = false;
1838 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001839 break;
1840 case GK_R600_DOUBLE_OPS:
1841 case GK_R700_DOUBLE_OPS:
1842 case GK_EVERGREEN_DOUBLE_OPS:
1843 case GK_CAYMAN:
1844 DescriptionString = DescriptionStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001845 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001846 hasFMAF = true;
1847 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001848 break;
1849 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001850 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001851 DescriptionString = DescriptionStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001852 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001853 hasFMAF = true;
1854 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001855 break;
1856 }
1857
1858 return true;
1859 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001860};
1861
Matt Arsenault56f008d2014-06-24 20:45:01 +00001862const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1863#define BUILTIN(ID, TYPE, ATTRS) \
1864 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1865#include "clang/Basic/BuiltinsR600.def"
1866};
Tom Stellard7b1059b2015-04-14 14:36:56 +00001867const char * const R600TargetInfo::GCCRegNames[] = {
1868 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1869 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1870 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1871 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1872 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1873 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1874 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1875 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1876 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1877 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1878 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1879 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1880 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1881 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1882 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1883 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1884 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1885 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1886 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1887 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1888 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1889 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1890 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1891 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1892 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1893 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1894 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1895 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1896 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1897 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1898 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1899 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1900 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1901 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1902 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1903 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1904 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1905 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1906 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1907 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1908 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1909 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1910 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1911 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1912 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1913 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1914 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1915 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1916 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1917 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1918};
1919
1920void R600TargetInfo::getGCCRegNames(const char * const *&Names,
1921 unsigned &NumNames) const {
1922 Names = GCCRegNames;
1923 NumNames = llvm::array_lengthof(GCCRegNames);
1924}
Matt Arsenault56f008d2014-06-24 20:45:01 +00001925
Eli Friedman3fd920a2008-08-20 02:34:37 +00001926// Namespace for x86 abstract base class
1927const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001928#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001929#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001930 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001931#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001932};
Eli Friedmanb5366062008-05-20 14:21:01 +00001933
Nuno Lopescfca1f02009-12-23 17:49:57 +00001934static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001935 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1936 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001937 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001938 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1939 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1940 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001941 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001942 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1943 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001944};
1945
Eric Christophercdd36352011-06-21 00:05:20 +00001946const TargetInfo::AddlRegName AddlRegNames[] = {
1947 { { "al", "ah", "eax", "rax" }, 0 },
1948 { { "bl", "bh", "ebx", "rbx" }, 3 },
1949 { { "cl", "ch", "ecx", "rcx" }, 2 },
1950 { { "dl", "dh", "edx", "rdx" }, 1 },
1951 { { "esi", "rsi" }, 4 },
1952 { { "edi", "rdi" }, 5 },
1953 { { "esp", "rsp" }, 7 },
1954 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001955};
1956
1957// X86 target abstract base class; x86-32 and x86-64 are very close, so
1958// most of the implementation can be shared.
1959class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001960 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001961 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001962 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001963 enum MMX3DNowEnum {
1964 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1965 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001966 enum XOPEnum {
1967 NoXOP,
1968 SSE4A,
1969 FMA4,
1970 XOP
1971 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001972
Eric Christophere1ddaf92010-04-02 23:50:19 +00001973 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001974 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001975 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001976 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001977 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001978 bool HasBMI;
1979 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001980 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001981 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001982 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001983 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001984 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001985 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001986 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001987 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001988 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1989 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001990 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001991 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001992
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001993 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1994 ///
1995 /// Each enumeration represents a particular CPU supported by Clang. These
1996 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1997 enum CPUKind {
1998 CK_Generic,
1999
2000 /// \name i386
2001 /// i386-generation processors.
2002 //@{
2003 CK_i386,
2004 //@}
2005
2006 /// \name i486
2007 /// i486-generation processors.
2008 //@{
2009 CK_i486,
2010 CK_WinChipC6,
2011 CK_WinChip2,
2012 CK_C3,
2013 //@}
2014
2015 /// \name i586
2016 /// i586-generation processors, P5 microarchitecture based.
2017 //@{
2018 CK_i586,
2019 CK_Pentium,
2020 CK_PentiumMMX,
2021 //@}
2022
2023 /// \name i686
2024 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2025 //@{
2026 CK_i686,
2027 CK_PentiumPro,
2028 CK_Pentium2,
2029 CK_Pentium3,
2030 CK_Pentium3M,
2031 CK_PentiumM,
2032 CK_C3_2,
2033
2034 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2035 /// Clang however has some logic to suport this.
2036 // FIXME: Warn, deprecate, and potentially remove this.
2037 CK_Yonah,
2038 //@}
2039
2040 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002041 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002042 //@{
2043 CK_Pentium4,
2044 CK_Pentium4M,
2045 CK_Prescott,
2046 CK_Nocona,
2047 //@}
2048
2049 /// \name Core
2050 /// Core microarchitecture based processors.
2051 //@{
2052 CK_Core2,
2053
2054 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2055 /// codename which GCC no longer accepts as an option to -march, but Clang
2056 /// has some logic for recognizing it.
2057 // FIXME: Warn, deprecate, and potentially remove this.
2058 CK_Penryn,
2059 //@}
2060
2061 /// \name Atom
2062 /// Atom processors
2063 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002064 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002065 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002066 //@}
2067
2068 /// \name Nehalem
2069 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002070 CK_Nehalem,
2071
2072 /// \name Westmere
2073 /// Westmere microarchitecture based processors.
2074 CK_Westmere,
2075
2076 /// \name Sandy Bridge
2077 /// Sandy Bridge microarchitecture based processors.
2078 CK_SandyBridge,
2079
2080 /// \name Ivy Bridge
2081 /// Ivy Bridge microarchitecture based processors.
2082 CK_IvyBridge,
2083
2084 /// \name Haswell
2085 /// Haswell microarchitecture based processors.
2086 CK_Haswell,
2087
2088 /// \name Broadwell
2089 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002090 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002091
2092 /// \name Skylake
2093 /// Skylake microarchitecture based processors.
2094 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002095
Craig Topper449314e2013-08-20 07:09:39 +00002096 /// \name Knights Landing
2097 /// Knights Landing processor.
2098 CK_KNL,
2099
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002100 /// \name K6
2101 /// K6 architecture processors.
2102 //@{
2103 CK_K6,
2104 CK_K6_2,
2105 CK_K6_3,
2106 //@}
2107
2108 /// \name K7
2109 /// K7 architecture processors.
2110 //@{
2111 CK_Athlon,
2112 CK_AthlonThunderbird,
2113 CK_Athlon4,
2114 CK_AthlonXP,
2115 CK_AthlonMP,
2116 //@}
2117
2118 /// \name K8
2119 /// K8 architecture processors.
2120 //@{
2121 CK_Athlon64,
2122 CK_Athlon64SSE3,
2123 CK_AthlonFX,
2124 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002125 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002126 CK_Opteron,
2127 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002128 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002129 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002130
Benjamin Kramer569f2152012-01-10 11:50:18 +00002131 /// \name Bobcat
2132 /// Bobcat architecture processors.
2133 //@{
2134 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002135 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002136 //@}
2137
2138 /// \name Bulldozer
2139 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002140 //@{
2141 CK_BDVER1,
2142 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002143 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002144 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002145 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002146
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002147 /// This specification is deprecated and will be removed in the future.
2148 /// Users should prefer \see CK_K8.
2149 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002150 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002151 CK_x86_64,
2152 //@}
2153
2154 /// \name Geode
2155 /// Geode processors.
2156 //@{
2157 CK_Geode
2158 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002159 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002160
Rafael Espindolaeb265472013-08-21 21:59:03 +00002161 enum FPMathKind {
2162 FP_Default,
2163 FP_SSE,
2164 FP_387
2165 } FPMath;
2166
Eli Friedman3fd920a2008-08-20 02:34:37 +00002167public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002168 X86TargetInfo(const llvm::Triple &Triple)
2169 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002170 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002171 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2172 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2173 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2174 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2175 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2176 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002177 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002178 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002179 }
Craig Topper3164f332014-03-11 03:39:26 +00002180 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002181 // X87 evaluates with 80 bits "long double" precision.
2182 return SSELevel == NoSSE ? 2 : 0;
2183 }
Craig Topper3164f332014-03-11 03:39:26 +00002184 void getTargetBuiltins(const Builtin::Info *&Records,
2185 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002186 Records = BuiltinInfo;
2187 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002188 }
Craig Topper3164f332014-03-11 03:39:26 +00002189 void getGCCRegNames(const char * const *&Names,
2190 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002191 Names = GCCRegNames;
2192 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002193 }
Craig Topper3164f332014-03-11 03:39:26 +00002194 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2195 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002196 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002197 NumAliases = 0;
2198 }
Craig Topper3164f332014-03-11 03:39:26 +00002199 void getGCCAddlRegNames(const AddlRegName *&Names,
2200 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002201 Names = AddlRegNames;
2202 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002203 }
Craig Topper3164f332014-03-11 03:39:26 +00002204 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002205 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002206
Akira Hatanaka974131e2014-09-18 18:17:18 +00002207 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2208
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002209 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2210
Akira Hatanaka974131e2014-09-18 18:17:18 +00002211 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2212
Craig Topper3164f332014-03-11 03:39:26 +00002213 std::string convertConstraint(const char *&Constraint) const override;
2214 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002215 return "~{dirflag},~{fpsr},~{flags}";
2216 }
Craig Topper3164f332014-03-11 03:39:26 +00002217 void getTargetDefines(const LangOptions &Opts,
2218 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002219 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2220 bool Enabled);
2221 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2222 bool Enabled);
2223 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2224 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002225 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2226 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002227 setFeatureEnabledImpl(Features, Name, Enabled);
2228 }
2229 // This exists purely to cut down on the number of virtual calls in
2230 // getDefaultFeatures which calls this repeatedly.
2231 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2232 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002233 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2234 bool hasFeature(StringRef Feature) const override;
2235 bool handleTargetFeatures(std::vector<std::string> &Features,
2236 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002237 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002238 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002239 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002240 else if (getTriple().getArch() == llvm::Triple::x86 &&
2241 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002242 return "no-mmx";
2243 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002244 }
Craig Topper3164f332014-03-11 03:39:26 +00002245 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002246 CPU = llvm::StringSwitch<CPUKind>(Name)
2247 .Case("i386", CK_i386)
2248 .Case("i486", CK_i486)
2249 .Case("winchip-c6", CK_WinChipC6)
2250 .Case("winchip2", CK_WinChip2)
2251 .Case("c3", CK_C3)
2252 .Case("i586", CK_i586)
2253 .Case("pentium", CK_Pentium)
2254 .Case("pentium-mmx", CK_PentiumMMX)
2255 .Case("i686", CK_i686)
2256 .Case("pentiumpro", CK_PentiumPro)
2257 .Case("pentium2", CK_Pentium2)
2258 .Case("pentium3", CK_Pentium3)
2259 .Case("pentium3m", CK_Pentium3M)
2260 .Case("pentium-m", CK_PentiumM)
2261 .Case("c3-2", CK_C3_2)
2262 .Case("yonah", CK_Yonah)
2263 .Case("pentium4", CK_Pentium4)
2264 .Case("pentium4m", CK_Pentium4M)
2265 .Case("prescott", CK_Prescott)
2266 .Case("nocona", CK_Nocona)
2267 .Case("core2", CK_Core2)
2268 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002269 .Case("bonnell", CK_Bonnell)
2270 .Case("atom", CK_Bonnell) // Legacy name.
2271 .Case("silvermont", CK_Silvermont)
2272 .Case("slm", CK_Silvermont) // Legacy name.
2273 .Case("nehalem", CK_Nehalem)
2274 .Case("corei7", CK_Nehalem) // Legacy name.
2275 .Case("westmere", CK_Westmere)
2276 .Case("sandybridge", CK_SandyBridge)
2277 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2278 .Case("ivybridge", CK_IvyBridge)
2279 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2280 .Case("haswell", CK_Haswell)
2281 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002282 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002283 .Case("skylake", CK_Skylake)
2284 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002285 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002286 .Case("k6", CK_K6)
2287 .Case("k6-2", CK_K6_2)
2288 .Case("k6-3", CK_K6_3)
2289 .Case("athlon", CK_Athlon)
2290 .Case("athlon-tbird", CK_AthlonThunderbird)
2291 .Case("athlon-4", CK_Athlon4)
2292 .Case("athlon-xp", CK_AthlonXP)
2293 .Case("athlon-mp", CK_AthlonMP)
2294 .Case("athlon64", CK_Athlon64)
2295 .Case("athlon64-sse3", CK_Athlon64SSE3)
2296 .Case("athlon-fx", CK_AthlonFX)
2297 .Case("k8", CK_K8)
2298 .Case("k8-sse3", CK_K8SSE3)
2299 .Case("opteron", CK_Opteron)
2300 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002301 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002302 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002303 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002304 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002305 .Case("bdver1", CK_BDVER1)
2306 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002307 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002308 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002309 .Case("x86-64", CK_x86_64)
2310 .Case("geode", CK_Geode)
2311 .Default(CK_Generic);
2312
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002313 // Perform any per-CPU checks necessary to determine if this CPU is
2314 // acceptable.
2315 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2316 // invalid without explaining *why*.
2317 switch (CPU) {
2318 case CK_Generic:
2319 // No processor selected!
2320 return false;
2321
2322 case CK_i386:
2323 case CK_i486:
2324 case CK_WinChipC6:
2325 case CK_WinChip2:
2326 case CK_C3:
2327 case CK_i586:
2328 case CK_Pentium:
2329 case CK_PentiumMMX:
2330 case CK_i686:
2331 case CK_PentiumPro:
2332 case CK_Pentium2:
2333 case CK_Pentium3:
2334 case CK_Pentium3M:
2335 case CK_PentiumM:
2336 case CK_Yonah:
2337 case CK_C3_2:
2338 case CK_Pentium4:
2339 case CK_Pentium4M:
2340 case CK_Prescott:
2341 case CK_K6:
2342 case CK_K6_2:
2343 case CK_K6_3:
2344 case CK_Athlon:
2345 case CK_AthlonThunderbird:
2346 case CK_Athlon4:
2347 case CK_AthlonXP:
2348 case CK_AthlonMP:
2349 case CK_Geode:
2350 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002351 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002352 return false;
2353
2354 // Fallthrough
2355 case CK_Nocona:
2356 case CK_Core2:
2357 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002358 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002359 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002360 case CK_Nehalem:
2361 case CK_Westmere:
2362 case CK_SandyBridge:
2363 case CK_IvyBridge:
2364 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002365 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002366 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002367 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002368 case CK_Athlon64:
2369 case CK_Athlon64SSE3:
2370 case CK_AthlonFX:
2371 case CK_K8:
2372 case CK_K8SSE3:
2373 case CK_Opteron:
2374 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002375 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002376 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002377 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002378 case CK_BDVER1:
2379 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002380 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002381 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002382 case CK_x86_64:
2383 return true;
2384 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002385 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002386 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002387
Craig Topper3164f332014-03-11 03:39:26 +00002388 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002389
Craig Topper3164f332014-03-11 03:39:26 +00002390 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002391 // We accept all non-ARM calling conventions
2392 return (CC == CC_X86ThisCall ||
2393 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002394 CC == CC_X86StdCall ||
2395 CC == CC_X86VectorCall ||
2396 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002397 CC == CC_X86Pascal ||
2398 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002399 }
2400
Craig Topper3164f332014-03-11 03:39:26 +00002401 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002402 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002403 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002404
2405 bool hasSjLjLowering() const override {
2406 return true;
2407 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002408};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002409
Rafael Espindolaeb265472013-08-21 21:59:03 +00002410bool X86TargetInfo::setFPMath(StringRef Name) {
2411 if (Name == "387") {
2412 FPMath = FP_387;
2413 return true;
2414 }
2415 if (Name == "sse") {
2416 FPMath = FP_SSE;
2417 return true;
2418 }
2419 return false;
2420}
2421
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002422void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002423 // FIXME: This *really* should not be here.
2424
2425 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002426 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002427 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002428
Chandler Carruth212334f2011-09-28 08:55:37 +00002429 switch (CPU) {
2430 case CK_Generic:
2431 case CK_i386:
2432 case CK_i486:
2433 case CK_i586:
2434 case CK_Pentium:
2435 case CK_i686:
2436 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002437 break;
2438 case CK_PentiumMMX:
2439 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002440 case CK_K6:
2441 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002442 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002443 break;
2444 case CK_Pentium3:
2445 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002446 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002447 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002448 break;
2449 case CK_PentiumM:
2450 case CK_Pentium4:
2451 case CK_Pentium4M:
2452 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002453 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002454 break;
2455 case CK_Yonah:
2456 case CK_Prescott:
2457 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002458 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002459 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002460 break;
2461 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002462 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002463 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002464 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002465 break;
2466 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002467 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002468 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002469 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002470 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002471 setFeatureEnabledImpl(Features, "avx512f", true);
2472 setFeatureEnabledImpl(Features, "avx512cd", true);
2473 setFeatureEnabledImpl(Features, "avx512dq", true);
2474 setFeatureEnabledImpl(Features, "avx512bw", true);
2475 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002476 // FALLTHROUGH
2477 case CK_Broadwell:
2478 setFeatureEnabledImpl(Features, "rdseed", true);
2479 setFeatureEnabledImpl(Features, "adx", true);
2480 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002481 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002482 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002483 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002484 setFeatureEnabledImpl(Features, "bmi", true);
2485 setFeatureEnabledImpl(Features, "bmi2", true);
2486 setFeatureEnabledImpl(Features, "rtm", true);
2487 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002488 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002489 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002490 setFeatureEnabledImpl(Features, "rdrnd", true);
2491 setFeatureEnabledImpl(Features, "f16c", true);
2492 setFeatureEnabledImpl(Features, "fsgsbase", true);
2493 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002494 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002495 setFeatureEnabledImpl(Features, "avx", true);
2496 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002497 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002498 case CK_Silvermont:
2499 setFeatureEnabledImpl(Features, "aes", true);
2500 setFeatureEnabledImpl(Features, "pclmul", true);
2501 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002502 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002503 setFeatureEnabledImpl(Features, "sse4.2", true);
2504 setFeatureEnabledImpl(Features, "cx16", true);
2505 break;
2506 case CK_KNL:
2507 setFeatureEnabledImpl(Features, "avx512f", true);
2508 setFeatureEnabledImpl(Features, "avx512cd", true);
2509 setFeatureEnabledImpl(Features, "avx512er", true);
2510 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002511 setFeatureEnabledImpl(Features, "rdseed", true);
2512 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002513 setFeatureEnabledImpl(Features, "lzcnt", true);
2514 setFeatureEnabledImpl(Features, "bmi", true);
2515 setFeatureEnabledImpl(Features, "bmi2", true);
2516 setFeatureEnabledImpl(Features, "rtm", true);
2517 setFeatureEnabledImpl(Features, "fma", true);
2518 setFeatureEnabledImpl(Features, "rdrnd", true);
2519 setFeatureEnabledImpl(Features, "f16c", true);
2520 setFeatureEnabledImpl(Features, "fsgsbase", true);
2521 setFeatureEnabledImpl(Features, "aes", true);
2522 setFeatureEnabledImpl(Features, "pclmul", true);
2523 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002524 break;
2525 case CK_K6_2:
2526 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002527 case CK_WinChip2:
2528 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002529 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002530 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002531 case CK_Athlon:
2532 case CK_AthlonThunderbird:
2533 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002534 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002535 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002536 case CK_Athlon4:
2537 case CK_AthlonXP:
2538 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002539 setFeatureEnabledImpl(Features, "sse", true);
2540 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002541 break;
2542 case CK_K8:
2543 case CK_Opteron:
2544 case CK_Athlon64:
2545 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002546 setFeatureEnabledImpl(Features, "sse2", true);
2547 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002548 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002549 case CK_AMDFAM10:
2550 setFeatureEnabledImpl(Features, "sse4a", true);
2551 setFeatureEnabledImpl(Features, "lzcnt", true);
2552 setFeatureEnabledImpl(Features, "popcnt", true);
2553 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002554 case CK_K8SSE3:
2555 case CK_OpteronSSE3:
2556 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002557 setFeatureEnabledImpl(Features, "sse3", true);
2558 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002559 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002560 case CK_BTVER2:
2561 setFeatureEnabledImpl(Features, "avx", true);
2562 setFeatureEnabledImpl(Features, "aes", true);
2563 setFeatureEnabledImpl(Features, "pclmul", true);
2564 setFeatureEnabledImpl(Features, "bmi", true);
2565 setFeatureEnabledImpl(Features, "f16c", true);
2566 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002567 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002568 setFeatureEnabledImpl(Features, "ssse3", true);
2569 setFeatureEnabledImpl(Features, "sse4a", true);
2570 setFeatureEnabledImpl(Features, "lzcnt", true);
2571 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002572 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002573 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002574 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002575 case CK_BDVER4:
2576 setFeatureEnabledImpl(Features, "avx2", true);
2577 setFeatureEnabledImpl(Features, "bmi2", true);
2578 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002579 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002580 setFeatureEnabledImpl(Features, "fsgsbase", true);
2581 // FALLTHROUGH
2582 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002583 setFeatureEnabledImpl(Features, "bmi", true);
2584 setFeatureEnabledImpl(Features, "fma", true);
2585 setFeatureEnabledImpl(Features, "f16c", true);
2586 setFeatureEnabledImpl(Features, "tbm", true);
2587 // FALLTHROUGH
2588 case CK_BDVER1:
2589 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002590 setFeatureEnabledImpl(Features, "xop", true);
2591 setFeatureEnabledImpl(Features, "lzcnt", true);
2592 setFeatureEnabledImpl(Features, "aes", true);
2593 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002594 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002595 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002596 break;
Eli Friedman33465822011-07-08 23:31:17 +00002597 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002598}
2599
Rafael Espindolae62e2792013-08-20 13:44:29 +00002600void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002601 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002602 if (Enabled) {
2603 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002604 case AVX512F:
2605 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002606 case AVX2:
2607 Features["avx2"] = true;
2608 case AVX:
2609 Features["avx"] = true;
2610 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002611 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002612 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002613 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002614 case SSSE3:
2615 Features["ssse3"] = true;
2616 case SSE3:
2617 Features["sse3"] = true;
2618 case SSE2:
2619 Features["sse2"] = true;
2620 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002621 Features["sse"] = true;
2622 case NoSSE:
2623 break;
2624 }
2625 return;
2626 }
2627
2628 switch (Level) {
2629 case NoSSE:
2630 case SSE1:
2631 Features["sse"] = false;
2632 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002633 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2634 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002635 case SSE3:
2636 Features["sse3"] = false;
2637 setXOPLevel(Features, NoXOP, false);
2638 case SSSE3:
2639 Features["ssse3"] = false;
2640 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002641 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002642 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002643 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002644 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002645 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002646 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002647 case AVX2:
2648 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002649 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002650 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002651 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2652 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002653 }
2654}
2655
2656void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002657 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002658 if (Enabled) {
2659 switch (Level) {
2660 case AMD3DNowAthlon:
2661 Features["3dnowa"] = true;
2662 case AMD3DNow:
2663 Features["3dnow"] = true;
2664 case MMX:
2665 Features["mmx"] = true;
2666 case NoMMX3DNow:
2667 break;
2668 }
2669 return;
2670 }
2671
2672 switch (Level) {
2673 case NoMMX3DNow:
2674 case MMX:
2675 Features["mmx"] = false;
2676 case AMD3DNow:
2677 Features["3dnow"] = false;
2678 case AMD3DNowAthlon:
2679 Features["3dnowa"] = false;
2680 }
2681}
2682
2683void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002684 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002685 if (Enabled) {
2686 switch (Level) {
2687 case XOP:
2688 Features["xop"] = true;
2689 case FMA4:
2690 Features["fma4"] = true;
2691 setSSELevel(Features, AVX, true);
2692 case SSE4A:
2693 Features["sse4a"] = true;
2694 setSSELevel(Features, SSE3, true);
2695 case NoXOP:
2696 break;
2697 }
2698 return;
2699 }
2700
2701 switch (Level) {
2702 case NoXOP:
2703 case SSE4A:
2704 Features["sse4a"] = false;
2705 case FMA4:
2706 Features["fma4"] = false;
2707 case XOP:
2708 Features["xop"] = false;
2709 }
2710}
2711
Craig Topper86d79ef2013-09-17 04:51:29 +00002712void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2713 StringRef Name, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002714 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002715
Craig Topper29561122013-09-19 01:13:07 +00002716 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002717 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002718 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002719 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002720 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002721 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002722 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002723 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002724 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002725 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002726 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002727 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002728 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002729 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002730 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002731 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002732 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002733 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002734 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002735 if (Enabled)
2736 setSSELevel(Features, SSE2, Enabled);
2737 } else if (Name == "pclmul") {
2738 if (Enabled)
2739 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002740 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002741 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002742 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002743 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002744 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002745 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002746 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2747 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002748 if (Enabled)
2749 setSSELevel(Features, AVX512F, Enabled);
2750 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002751 if (Enabled)
2752 setSSELevel(Features, AVX, Enabled);
2753 } else if (Name == "fma4") {
2754 setXOPLevel(Features, FMA4, Enabled);
2755 } else if (Name == "xop") {
2756 setXOPLevel(Features, XOP, Enabled);
2757 } else if (Name == "sse4a") {
2758 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002759 } else if (Name == "f16c") {
2760 if (Enabled)
2761 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002762 } else if (Name == "sha") {
2763 if (Enabled)
2764 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002765 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002766}
2767
Eric Christopher3ff21b32013-10-16 21:26:26 +00002768/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002769/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002770bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002771 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002772 // Remember the maximum enabled sselevel.
2773 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2774 // Ignore disabled features.
2775 if (Features[i][0] == '-')
2776 continue;
2777
Benjamin Kramer27402c62012-03-05 15:10:44 +00002778 StringRef Feature = StringRef(Features[i]).substr(1);
2779
2780 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002781 HasAES = true;
2782 continue;
2783 }
2784
Craig Topper3f122a72012-05-31 05:18:48 +00002785 if (Feature == "pclmul") {
2786 HasPCLMUL = true;
2787 continue;
2788 }
2789
Benjamin Kramer27402c62012-03-05 15:10:44 +00002790 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002791 HasLZCNT = true;
2792 continue;
2793 }
2794
Rafael Espindola89049822013-08-23 20:21:37 +00002795 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002796 HasRDRND = true;
2797 continue;
2798 }
2799
Craig Topper8c7f2512014-11-03 06:51:41 +00002800 if (Feature == "fsgsbase") {
2801 HasFSGSBASE = true;
2802 continue;
2803 }
2804
Benjamin Kramer27402c62012-03-05 15:10:44 +00002805 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002806 HasBMI = true;
2807 continue;
2808 }
2809
Benjamin Kramer27402c62012-03-05 15:10:44 +00002810 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002811 HasBMI2 = true;
2812 continue;
2813 }
2814
Benjamin Kramer27402c62012-03-05 15:10:44 +00002815 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002816 HasPOPCNT = true;
2817 continue;
2818 }
2819
Michael Liao625a8752012-11-10 05:17:46 +00002820 if (Feature == "rtm") {
2821 HasRTM = true;
2822 continue;
2823 }
2824
Michael Liao74f4eaf2013-03-26 17:52:08 +00002825 if (Feature == "prfchw") {
2826 HasPRFCHW = true;
2827 continue;
2828 }
2829
Michael Liaoffaae352013-03-29 05:17:55 +00002830 if (Feature == "rdseed") {
2831 HasRDSEED = true;
2832 continue;
2833 }
2834
Robert Khasanov50e6f582014-09-19 09:53:48 +00002835 if (Feature == "adx") {
2836 HasADX = true;
2837 continue;
2838 }
2839
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002840 if (Feature == "tbm") {
2841 HasTBM = true;
2842 continue;
2843 }
2844
Craig Topperbba778b2012-06-03 21:46:30 +00002845 if (Feature == "fma") {
2846 HasFMA = true;
2847 continue;
2848 }
2849
Manman Rena45358c2012-10-11 00:59:55 +00002850 if (Feature == "f16c") {
2851 HasF16C = true;
2852 continue;
2853 }
2854
Craig Topper679b53a2013-08-21 05:29:10 +00002855 if (Feature == "avx512cd") {
2856 HasAVX512CD = true;
2857 continue;
2858 }
2859
2860 if (Feature == "avx512er") {
2861 HasAVX512ER = true;
2862 continue;
2863 }
2864
2865 if (Feature == "avx512pf") {
2866 HasAVX512PF = true;
2867 continue;
2868 }
2869
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002870 if (Feature == "avx512dq") {
2871 HasAVX512DQ = true;
2872 continue;
2873 }
2874
2875 if (Feature == "avx512bw") {
2876 HasAVX512BW = true;
2877 continue;
2878 }
2879
2880 if (Feature == "avx512vl") {
2881 HasAVX512VL = true;
2882 continue;
2883 }
2884
Ben Langmuir58078d02013-09-19 13:22:04 +00002885 if (Feature == "sha") {
2886 HasSHA = true;
2887 continue;
2888 }
2889
Nick Lewycky50e8f482013-10-05 20:14:27 +00002890 if (Feature == "cx16") {
2891 HasCX16 = true;
2892 continue;
2893 }
2894
Daniel Dunbar979586e2009-11-11 09:38:56 +00002895 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002896 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002897 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002898 .Case("avx2", AVX2)
2899 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002900 .Case("sse4.2", SSE42)
2901 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002902 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002903 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002904 .Case("sse2", SSE2)
2905 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002906 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002907 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002908
Eli Friedman33465822011-07-08 23:31:17 +00002909 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002910 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002911 .Case("3dnowa", AMD3DNowAthlon)
2912 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002913 .Case("mmx", MMX)
2914 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002915 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002916
2917 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2918 .Case("xop", XOP)
2919 .Case("fma4", FMA4)
2920 .Case("sse4a", SSE4A)
2921 .Default(NoXOP);
2922 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002923 }
Eli Friedman33465822011-07-08 23:31:17 +00002924
Craig Topper7481d8a2013-09-10 06:55:47 +00002925 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2926 // Can't do this earlier because we need to be able to explicitly enable
2927 // popcnt and still disable sse4.2.
2928 if (!HasPOPCNT && SSELevel >= SSE42 &&
2929 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2930 HasPOPCNT = true;
2931 Features.push_back("+popcnt");
2932 }
2933
Yunzhong Gao61089362013-10-16 19:07:02 +00002934 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2935 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2936 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2937 HasPRFCHW = true;
2938 Features.push_back("+prfchw");
2939 }
2940
Rafael Espindolaeb265472013-08-21 21:59:03 +00002941 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2942 // matches the selected sse level.
2943 if (FPMath == FP_SSE && SSELevel < SSE1) {
2944 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2945 return false;
2946 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2947 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2948 return false;
2949 }
2950
Eli Friedman33465822011-07-08 23:31:17 +00002951 // Don't tell the backend if we're turning off mmx; it will end up disabling
2952 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002953 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2954 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002955 std::vector<std::string>::iterator it;
2956 it = std::find(Features.begin(), Features.end(), "-mmx");
2957 if (it != Features.end())
2958 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002959 else if (SSELevel > NoSSE)
2960 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002961 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002962}
Chris Lattnerecd49032009-03-02 22:27:17 +00002963
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002964/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2965/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002966void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002967 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002968 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002969 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002970 Builder.defineMacro("__amd64__");
2971 Builder.defineMacro("__amd64");
2972 Builder.defineMacro("__x86_64");
2973 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002974 if (getTriple().getArchName() == "x86_64h") {
2975 Builder.defineMacro("__x86_64h");
2976 Builder.defineMacro("__x86_64h__");
2977 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002978 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002979 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002980 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002981
Chris Lattnerecd49032009-03-02 22:27:17 +00002982 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002983 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2984 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002985 switch (CPU) {
2986 case CK_Generic:
2987 break;
2988 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002989 // The rest are coming from the i386 define above.
2990 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002991 break;
2992 case CK_i486:
2993 case CK_WinChipC6:
2994 case CK_WinChip2:
2995 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002996 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002997 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002998 case CK_PentiumMMX:
2999 Builder.defineMacro("__pentium_mmx__");
3000 Builder.defineMacro("__tune_pentium_mmx__");
3001 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003002 case CK_i586:
3003 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003004 defineCPUMacros(Builder, "i586");
3005 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003006 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003007 case CK_Pentium3:
3008 case CK_Pentium3M:
3009 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003010 Builder.defineMacro("__tune_pentium3__");
3011 // Fallthrough
3012 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003013 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003014 Builder.defineMacro("__tune_pentium2__");
3015 // Fallthrough
3016 case CK_PentiumPro:
3017 Builder.defineMacro("__tune_i686__");
3018 Builder.defineMacro("__tune_pentiumpro__");
3019 // Fallthrough
3020 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003021 Builder.defineMacro("__i686");
3022 Builder.defineMacro("__i686__");
3023 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3024 Builder.defineMacro("__pentiumpro");
3025 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003026 break;
3027 case CK_Pentium4:
3028 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003029 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003030 break;
3031 case CK_Yonah:
3032 case CK_Prescott:
3033 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003034 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003035 break;
3036 case CK_Core2:
3037 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003038 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003039 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003040 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003041 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003042 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003043 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003044 defineCPUMacros(Builder, "slm");
3045 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003046 case CK_Nehalem:
3047 case CK_Westmere:
3048 case CK_SandyBridge:
3049 case CK_IvyBridge:
3050 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003051 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003052 // FIXME: Historically, we defined this legacy name, it would be nice to
3053 // remove it at some point. We've never exposed fine-grained names for
3054 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003055 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003056 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003057 case CK_Skylake:
3058 // FIXME: Historically, we defined this legacy name, it would be nice to
3059 // remove it at some point. This is the only fine-grained CPU macro in the
3060 // main intel CPU line, and it would be better to not have these and force
3061 // people to use ISA macros.
3062 defineCPUMacros(Builder, "skx");
3063 break;
Craig Topper449314e2013-08-20 07:09:39 +00003064 case CK_KNL:
3065 defineCPUMacros(Builder, "knl");
3066 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003067 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003068 Builder.defineMacro("__k6_2__");
3069 Builder.defineMacro("__tune_k6_2__");
3070 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003071 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003072 if (CPU != CK_K6_2) { // In case of fallthrough
3073 // FIXME: GCC may be enabling these in cases where some other k6
3074 // architecture is specified but -m3dnow is explicitly provided. The
3075 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003076 Builder.defineMacro("__k6_3__");
3077 Builder.defineMacro("__tune_k6_3__");
3078 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003079 // Fallthrough
3080 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003081 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003082 break;
3083 case CK_Athlon:
3084 case CK_AthlonThunderbird:
3085 case CK_Athlon4:
3086 case CK_AthlonXP:
3087 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003088 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003089 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003090 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003091 Builder.defineMacro("__tune_athlon_sse__");
3092 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003093 break;
3094 case CK_K8:
3095 case CK_K8SSE3:
3096 case CK_x86_64:
3097 case CK_Opteron:
3098 case CK_OpteronSSE3:
3099 case CK_Athlon64:
3100 case CK_Athlon64SSE3:
3101 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003102 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003103 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003104 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003105 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003106 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003107 case CK_BTVER1:
3108 defineCPUMacros(Builder, "btver1");
3109 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003110 case CK_BTVER2:
3111 defineCPUMacros(Builder, "btver2");
3112 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003113 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003114 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003115 break;
3116 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003117 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003118 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003119 case CK_BDVER3:
3120 defineCPUMacros(Builder, "bdver3");
3121 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003122 case CK_BDVER4:
3123 defineCPUMacros(Builder, "bdver4");
3124 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003125 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003126 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003127 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003128 }
Chris Lattner96e43572009-03-02 22:40:39 +00003129
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003130 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003131 Builder.defineMacro("__REGISTER_PREFIX__", "");
3132
Chris Lattner6df41af2009-04-19 17:32:33 +00003133 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3134 // functions in glibc header files that use FP Stack inline asm which the
3135 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003136 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003137
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003138 if (HasAES)
3139 Builder.defineMacro("__AES__");
3140
Craig Topper3f122a72012-05-31 05:18:48 +00003141 if (HasPCLMUL)
3142 Builder.defineMacro("__PCLMUL__");
3143
Craig Topper22967d42011-12-25 05:06:45 +00003144 if (HasLZCNT)
3145 Builder.defineMacro("__LZCNT__");
3146
Benjamin Kramer1e250392012-07-07 09:39:18 +00003147 if (HasRDRND)
3148 Builder.defineMacro("__RDRND__");
3149
Craig Topper8c7f2512014-11-03 06:51:41 +00003150 if (HasFSGSBASE)
3151 Builder.defineMacro("__FSGSBASE__");
3152
Craig Topper22967d42011-12-25 05:06:45 +00003153 if (HasBMI)
3154 Builder.defineMacro("__BMI__");
3155
3156 if (HasBMI2)
3157 Builder.defineMacro("__BMI2__");
3158
Craig Topper1de83482011-12-29 16:10:46 +00003159 if (HasPOPCNT)
3160 Builder.defineMacro("__POPCNT__");
3161
Michael Liao625a8752012-11-10 05:17:46 +00003162 if (HasRTM)
3163 Builder.defineMacro("__RTM__");
3164
Michael Liao74f4eaf2013-03-26 17:52:08 +00003165 if (HasPRFCHW)
3166 Builder.defineMacro("__PRFCHW__");
3167
Michael Liaoffaae352013-03-29 05:17:55 +00003168 if (HasRDSEED)
3169 Builder.defineMacro("__RDSEED__");
3170
Robert Khasanov50e6f582014-09-19 09:53:48 +00003171 if (HasADX)
3172 Builder.defineMacro("__ADX__");
3173
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003174 if (HasTBM)
3175 Builder.defineMacro("__TBM__");
3176
Rafael Espindolae62e2792013-08-20 13:44:29 +00003177 switch (XOPLevel) {
3178 case XOP:
3179 Builder.defineMacro("__XOP__");
3180 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003181 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003182 case SSE4A:
3183 Builder.defineMacro("__SSE4A__");
3184 case NoXOP:
3185 break;
3186 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003187
Craig Topperbba778b2012-06-03 21:46:30 +00003188 if (HasFMA)
3189 Builder.defineMacro("__FMA__");
3190
Manman Rena45358c2012-10-11 00:59:55 +00003191 if (HasF16C)
3192 Builder.defineMacro("__F16C__");
3193
Craig Topper679b53a2013-08-21 05:29:10 +00003194 if (HasAVX512CD)
3195 Builder.defineMacro("__AVX512CD__");
3196 if (HasAVX512ER)
3197 Builder.defineMacro("__AVX512ER__");
3198 if (HasAVX512PF)
3199 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003200 if (HasAVX512DQ)
3201 Builder.defineMacro("__AVX512DQ__");
3202 if (HasAVX512BW)
3203 Builder.defineMacro("__AVX512BW__");
3204 if (HasAVX512VL)
3205 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003206
Ben Langmuir58078d02013-09-19 13:22:04 +00003207 if (HasSHA)
3208 Builder.defineMacro("__SHA__");
3209
Nick Lewycky50e8f482013-10-05 20:14:27 +00003210 if (HasCX16)
3211 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3212
Chris Lattner96e43572009-03-02 22:40:39 +00003213 // Each case falls through to the previous one here.
3214 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003215 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003216 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003217 case AVX2:
3218 Builder.defineMacro("__AVX2__");
3219 case AVX:
3220 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003221 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003222 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003223 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003224 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003225 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003226 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003227 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003228 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003229 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003230 Builder.defineMacro("__SSE2__");
3231 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003232 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003233 Builder.defineMacro("__SSE__");
3234 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003235 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003236 break;
3237 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003238
Derek Schuffc7dd7222012-10-11 15:52:22 +00003239 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003240 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003241 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003242 case AVX2:
3243 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003244 case SSE42:
3245 case SSE41:
3246 case SSSE3:
3247 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003248 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003249 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003250 break;
3251 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003252 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003253 break;
3254 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003255 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003256 }
3257 }
3258
Anders Carlssone437c682010-01-27 03:47:49 +00003259 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003260 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003261 case AMD3DNowAthlon:
3262 Builder.defineMacro("__3dNOW_A__");
3263 case AMD3DNow:
3264 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003265 case MMX:
3266 Builder.defineMacro("__MMX__");
3267 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003268 break;
3269 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003270
3271 if (CPU >= CK_i486) {
3272 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3273 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3274 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3275 }
3276 if (CPU >= CK_i586)
3277 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003278}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003279
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003280bool X86TargetInfo::hasFeature(StringRef Feature) const {
3281 return llvm::StringSwitch<bool>(Feature)
3282 .Case("aes", HasAES)
3283 .Case("avx", SSELevel >= AVX)
3284 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003285 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003286 .Case("avx512cd", HasAVX512CD)
3287 .Case("avx512er", HasAVX512ER)
3288 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003289 .Case("avx512dq", HasAVX512DQ)
3290 .Case("avx512bw", HasAVX512BW)
3291 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003292 .Case("bmi", HasBMI)
3293 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003294 .Case("cx16", HasCX16)
3295 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003296 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003297 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003298 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003299 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003300 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3301 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3302 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003303 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003304 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003305 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003306 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003307 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003308 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003309 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003310 .Case("sse", SSELevel >= SSE1)
3311 .Case("sse2", SSELevel >= SSE2)
3312 .Case("sse3", SSELevel >= SSE3)
3313 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003314 .Case("sse4.1", SSELevel >= SSE41)
3315 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003316 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003317 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003318 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003319 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3320 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003321 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003322 .Default(false);
3323}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003324
Eli Friedman3fd920a2008-08-20 02:34:37 +00003325bool
Anders Carlsson58436352009-02-28 17:11:49 +00003326X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003327 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003328 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003329 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003330 case 'I':
3331 Info.setRequiresImmediate(0, 31);
3332 return true;
3333 case 'J':
3334 Info.setRequiresImmediate(0, 63);
3335 return true;
3336 case 'K':
3337 Info.setRequiresImmediate(-128, 127);
3338 return true;
3339 case 'L':
3340 // FIXME: properly analyze this constraint:
3341 // must be one of 0xff, 0xffff, or 0xffffffff
3342 return true;
3343 case 'M':
3344 Info.setRequiresImmediate(0, 3);
3345 return true;
3346 case 'N':
3347 Info.setRequiresImmediate(0, 255);
3348 return true;
3349 case 'O':
3350 Info.setRequiresImmediate(0, 127);
3351 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003352 case 'Y': // first letter of a pair:
3353 switch (*(Name+1)) {
3354 default: return false;
3355 case '0': // First SSE register.
3356 case 't': // Any SSE register, when SSE2 is enabled.
3357 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3358 case 'm': // any MMX register, when inter-unit moves enabled.
3359 break; // falls through to setAllowsRegister.
3360 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003361 case 'f': // any x87 floating point stack register.
3362 // Constraint 'f' cannot be used for output operands.
3363 if (Info.ConstraintStr[0] == '=')
3364 return false;
3365
3366 Info.setAllowsRegister();
3367 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003368 case 'a': // eax.
3369 case 'b': // ebx.
3370 case 'c': // ecx.
3371 case 'd': // edx.
3372 case 'S': // esi.
3373 case 'D': // edi.
3374 case 'A': // edx:eax.
3375 case 't': // top of floating point stack.
3376 case 'u': // second from top of floating point stack.
3377 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003378 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003379 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003380 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003381 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3382 case 'l': // "Index" registers: any general register that can be used as an
3383 // index in a base+index memory access.
3384 Info.setAllowsRegister();
3385 return true;
3386 case 'C': // SSE floating point constant.
3387 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003388 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003389 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003390 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003391 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003392 return true;
3393 }
3394}
3395
Akira Hatanaka974131e2014-09-18 18:17:18 +00003396bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3397 unsigned Size) const {
3398 // Strip off constraint modifiers.
3399 while (Constraint[0] == '=' ||
3400 Constraint[0] == '+' ||
3401 Constraint[0] == '&')
3402 Constraint = Constraint.substr(1);
3403
3404 return validateOperandSize(Constraint, Size);
3405}
3406
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003407bool X86TargetInfo::validateInputSize(StringRef Constraint,
3408 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003409 return validateOperandSize(Constraint, Size);
3410}
3411
3412bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3413 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003414 switch (Constraint[0]) {
3415 default: break;
3416 case 'y':
3417 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003418 case 'f':
3419 case 't':
3420 case 'u':
3421 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003422 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003423 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003424 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003425 }
3426
3427 return true;
3428}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003429
Eli Friedman3fd920a2008-08-20 02:34:37 +00003430std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003431X86TargetInfo::convertConstraint(const char *&Constraint) const {
3432 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003433 case 'a': return std::string("{ax}");
3434 case 'b': return std::string("{bx}");
3435 case 'c': return std::string("{cx}");
3436 case 'd': return std::string("{dx}");
3437 case 'S': return std::string("{si}");
3438 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003439 case 'p': // address
3440 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003441 case 't': // top of floating point stack.
3442 return std::string("{st}");
3443 case 'u': // second from top of floating point stack.
3444 return std::string("{st(1)}"); // second from top of floating point stack.
3445 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003446 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003447 }
3448}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003449
Eli Friedman3fd920a2008-08-20 02:34:37 +00003450// X86-32 generic target
3451class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003452public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003453 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003454 DoubleAlign = LongLongAlign = 32;
3455 LongDoubleWidth = 96;
3456 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003457 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003458 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003459 SizeType = UnsignedInt;
3460 PtrDiffType = SignedInt;
3461 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003462 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003463
3464 // Use fpret for all types.
3465 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3466 (1 << TargetInfo::Double) |
3467 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003468
3469 // x86-32 has atomics up to 8 bytes
3470 // FIXME: Check that we actually have cmpxchg8b before setting
3471 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3472 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003473 }
Craig Topper3164f332014-03-11 03:39:26 +00003474 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003475 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003476 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003477
Craig Topper3164f332014-03-11 03:39:26 +00003478 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003479 if (RegNo == 0) return 0;
3480 if (RegNo == 1) return 2;
3481 return -1;
3482 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003483 bool validateOperandSize(StringRef Constraint,
3484 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003485 switch (Constraint[0]) {
3486 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003487 case 'R':
3488 case 'q':
3489 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003490 case 'a':
3491 case 'b':
3492 case 'c':
3493 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003494 case 'S':
3495 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003496 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003497 case 'A':
3498 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003499 }
3500
Akira Hatanaka974131e2014-09-18 18:17:18 +00003501 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003502 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003503};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003504
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003505class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3506public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003507 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3508 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003509
Craig Topper3164f332014-03-11 03:39:26 +00003510 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003511 unsigned Major, Minor, Micro;
3512 getTriple().getOSVersion(Major, Minor, Micro);
3513 // New NetBSD uses the default rounding mode.
3514 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3515 return X86_32TargetInfo::getFloatEvalMethod();
3516 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003517 return 1;
3518 }
3519};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003520
Eli Friedmane3aa4542009-07-05 18:47:56 +00003521class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3522public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003523 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3524 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003525 SizeType = UnsignedLong;
3526 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003527 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003528 }
3529};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003530
Eli Friedman9fa28852012-08-08 23:57:20 +00003531class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3532public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003533 BitrigI386TargetInfo(const llvm::Triple &Triple)
3534 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003535 SizeType = UnsignedLong;
3536 IntPtrType = SignedLong;
3537 PtrDiffType = SignedLong;
3538 }
3539};
Eli Friedman9fa28852012-08-08 23:57:20 +00003540
Torok Edwinb2b37c62009-06-30 17:10:35 +00003541class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003542public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003543 DarwinI386TargetInfo(const llvm::Triple &Triple)
3544 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003545 LongDoubleWidth = 128;
3546 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003547 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003548 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003549 SizeType = UnsignedLong;
3550 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003551 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003552 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003553 }
3554
Eli Friedman3fd920a2008-08-20 02:34:37 +00003555};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003556
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003557// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003558class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003559public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003560 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3561 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003562 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003563 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003564 bool IsWinCOFF =
3565 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Reid Kleckneraf676022015-04-30 22:13:05 +00003566 DescriptionString = IsWinCOFF
3567 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3568 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003569 }
Craig Topper3164f332014-03-11 03:39:26 +00003570 void getTargetDefines(const LangOptions &Opts,
3571 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003572 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3573 }
3574};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003575
3576// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003577class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003578public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003579 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003580 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003581 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003582 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3583 }
Craig Topper3164f332014-03-11 03:39:26 +00003584 void getTargetDefines(const LangOptions &Opts,
3585 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003586 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3587 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3588 // The value of the following reflects processor type.
3589 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3590 // We lost the original triple, so we use the default.
3591 Builder.defineMacro("_M_IX86", "600");
3592 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003593};
3594} // end anonymous namespace
3595
Reid Kleckner47606832014-04-21 20:58:00 +00003596static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3597 Builder.defineMacro("__MSVCRT__");
3598 Builder.defineMacro("__MINGW32__");
3599
3600 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3601 // __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
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003623namespace {
3624// x86-32 MinGW target
3625class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3626public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003627 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3628 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003629 void getTargetDefines(const LangOptions &Opts,
3630 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003631 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003632 DefineStd(Builder, "WIN32", Opts);
3633 DefineStd(Builder, "WINNT", Opts);
3634 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003635 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003636 }
3637};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003638
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003639// x86-32 Cygwin target
3640class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3641public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003642 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3643 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003644 TLSSupported = false;
3645 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003646 DoubleAlign = LongLongAlign = 64;
Reid Kleckneraf676022015-04-30 22:13:05 +00003647 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 +00003648 }
Craig Topper3164f332014-03-11 03:39:26 +00003649 void getTargetDefines(const LangOptions &Opts,
3650 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003651 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003652 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003653 Builder.defineMacro("__CYGWIN__");
3654 Builder.defineMacro("__CYGWIN32__");
3655 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003656 if (Opts.CPlusPlus)
3657 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003658 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003659};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003660
Chris Lattnerb986aba2010-04-11 19:29:39 +00003661// x86-32 Haiku target
3662class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3663public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003664 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003665 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003666 IntPtrType = SignedLong;
3667 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003668 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003669 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003670 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003671 }
Craig Topper3164f332014-03-11 03:39:26 +00003672 void getTargetDefines(const LangOptions &Opts,
3673 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003674 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3675 Builder.defineMacro("__INTEL__");
3676 Builder.defineMacro("__HAIKU__");
3677 }
3678};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003679
Douglas Gregor9fabd852011-07-01 22:41:14 +00003680// RTEMS Target
3681template<typename Target>
3682class RTEMSTargetInfo : public OSTargetInfo<Target> {
3683protected:
Craig Topper3164f332014-03-11 03:39:26 +00003684 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3685 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003686 // RTEMS defines; list based off of gcc output
3687
Douglas Gregor9fabd852011-07-01 22:41:14 +00003688 Builder.defineMacro("__rtems__");
3689 Builder.defineMacro("__ELF__");
3690 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003691
Douglas Gregor9fabd852011-07-01 22:41:14 +00003692public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003693 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3694 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003695
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003696 switch (Triple.getArch()) {
3697 default:
3698 case llvm::Triple::x86:
3699 // this->MCountName = ".mcount";
3700 break;
3701 case llvm::Triple::mips:
3702 case llvm::Triple::mipsel:
3703 case llvm::Triple::ppc:
3704 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003705 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003706 // this->MCountName = "_mcount";
3707 break;
3708 case llvm::Triple::arm:
3709 // this->MCountName = "__mcount";
3710 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003711 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003712 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003713};
3714
Douglas Gregor9fabd852011-07-01 22:41:14 +00003715// x86-32 RTEMS target
3716class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3717public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003718 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003719 SizeType = UnsignedLong;
3720 IntPtrType = SignedLong;
3721 PtrDiffType = SignedLong;
3722 this->UserLabelPrefix = "";
3723 }
Craig Topper3164f332014-03-11 03:39:26 +00003724 void getTargetDefines(const LangOptions &Opts,
3725 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003726 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3727 Builder.defineMacro("__INTEL__");
3728 Builder.defineMacro("__rtems__");
3729 }
3730};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003731
Eli Friedman3fd920a2008-08-20 02:34:37 +00003732// x86-64 generic target
3733class X86_64TargetInfo : public X86TargetInfo {
3734public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003735 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003736 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003737 bool IsWinCOFF =
3738 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003739 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003740 LongDoubleWidth = 128;
3741 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003742 LargeArrayMinWidth = 128;
3743 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003744 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003745 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3746 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3747 IntPtrType = IsX32 ? SignedInt : SignedLong;
3748 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003749 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003750 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003751
Eric Christopher917e9522014-11-18 22:36:15 +00003752 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003753 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3754 : IsWinCOFF
3755 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3756 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003757
3758 // Use fpret only for long double.
3759 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003760
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003761 // Use fp2ret for _Complex long double.
3762 ComplexLongDoubleUsesFP2Ret = true;
3763
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003764 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003765 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003766 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003767 }
Craig Topper3164f332014-03-11 03:39:26 +00003768 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003769 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003770 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003771
Craig Topper3164f332014-03-11 03:39:26 +00003772 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003773 if (RegNo == 0) return 0;
3774 if (RegNo == 1) return 1;
3775 return -1;
3776 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003777
Craig Topper3164f332014-03-11 03:39:26 +00003778 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003779 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003780 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003781 CC == CC_IntelOclBicc ||
3782 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003783 }
3784
Craig Topper3164f332014-03-11 03:39:26 +00003785 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003786 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003787 }
3788
Pavel Chupinfd223e12014-08-04 12:39:43 +00003789 // for x32 we need it here explicitly
3790 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003791};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003792
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003793// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003794class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003795public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003796 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3797 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003798 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003799 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003800 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003801 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003802 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003803 SizeType = UnsignedLongLong;
3804 PtrDiffType = SignedLongLong;
3805 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003806 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003807 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003808
Craig Topper3164f332014-03-11 03:39:26 +00003809 void getTargetDefines(const LangOptions &Opts,
3810 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003811 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003812 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003813 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003814
Craig Topper3164f332014-03-11 03:39:26 +00003815 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003816 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003817 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003818
Craig Topper3164f332014-03-11 03:39:26 +00003819 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003820 switch (CC) {
3821 case CC_X86StdCall:
3822 case CC_X86ThisCall:
3823 case CC_X86FastCall:
3824 return CCCR_Ignore;
3825 case CC_C:
3826 case CC_X86VectorCall:
3827 case CC_IntelOclBicc:
3828 case CC_X86_64SysV:
3829 return CCCR_OK;
3830 default:
3831 return CCCR_Warning;
3832 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003833 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003834};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003835
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003836// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003837class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003838public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003839 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003840 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003841 LongDoubleWidth = LongDoubleAlign = 64;
3842 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003843 }
Craig Topper3164f332014-03-11 03:39:26 +00003844 void getTargetDefines(const LangOptions &Opts,
3845 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003846 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3847 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003848 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003849 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003850 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003851};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003852
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003853// x86-64 MinGW target
3854class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3855public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003856 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3857 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003858 void getTargetDefines(const LangOptions &Opts,
3859 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003860 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003861 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003862 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003863 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003864
3865 // GCC defines this macro when it is using __gxx_personality_seh0.
3866 if (!Opts.SjLjExceptions)
3867 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003868 }
3869};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003870
Eli Friedman2857ccb2009-07-01 03:36:11 +00003871class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3872public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003873 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3874 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003875 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003876 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003877 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3878 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003879 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003880 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003881 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003882 }
3883};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003884
Eli Friedman245f2292009-07-05 22:31:18 +00003885class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3886public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003887 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3888 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003889 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003890 Int64Type = SignedLongLong;
3891 }
3892};
Eli Friedman245f2292009-07-05 22:31:18 +00003893
Eli Friedman9fa28852012-08-08 23:57:20 +00003894class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3895public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003896 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3897 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3898 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003899 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003900 }
3901};
Tim Northover9bb857a2013-01-31 12:13:10 +00003902
Eli Friedmanf05b7722008-08-20 07:44:10 +00003903class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003904 // Possible FPU choices.
3905 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003906 VFP2FPU = (1 << 0),
3907 VFP3FPU = (1 << 1),
3908 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003909 NeonFPU = (1 << 3),
3910 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003911 };
3912
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003913 // Possible HWDiv features.
3914 enum HWDivMode {
3915 HWDivThumb = (1 << 0),
3916 HWDivARM = (1 << 1)
3917 };
3918
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003919 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003920 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003921 }
3922
3923 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3924 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003925
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003926 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003927
Rafael Espindolaeb265472013-08-21 21:59:03 +00003928 enum {
3929 FP_Default,
3930 FP_VFP,
3931 FP_Neon
3932 } FPMath;
3933
Bernard Ogdenda13af32013-10-24 18:32:51 +00003934 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003935
Logan Chien57086ce2012-10-10 06:56:20 +00003936 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003937 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003938 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003939
3940 // Initialized via features.
3941 unsigned SoftFloat : 1;
3942 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003943
Bernard Ogden18b57012013-10-29 09:47:51 +00003944 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003945 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003946
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003947 // ACLE 6.5.1 Hardware floating point
3948 enum {
3949 HW_FP_HP = (1 << 1), /// half (16-bit)
3950 HW_FP_SP = (1 << 2), /// single (32-bit)
3951 HW_FP_DP = (1 << 3), /// double (64-bit)
3952 };
3953 uint32_t HW_FP;
3954
Chris Lattner5cc15e02010-03-03 19:03:45 +00003955 static const Builtin::Info BuiltinInfo[];
3956
Rafael Espindola101d5b92013-05-13 20:09:47 +00003957 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003958 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003959 if (T.getArch() == llvm::Triple::arm ||
3960 T.getArch() == llvm::Triple::armeb) {
3961 StringRef VersionStr;
3962 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003963 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003964 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003965 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003966 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003967 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003968 unsigned Version;
3969 if (VersionStr.getAsInteger(10, Version))
3970 return false;
3971 return Version >= 6;
3972 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003973 assert(T.getArch() == llvm::Triple::thumb ||
3974 T.getArch() == llvm::Triple::thumbeb);
3975 StringRef VersionStr;
3976 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003977 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003978 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003979 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003980 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003981 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003982 unsigned Version;
3983 if (VersionStr.getAsInteger(10, Version))
3984 return false;
3985 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003986 }
3987
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003988 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003989 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003990
3991 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003992 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003993
Renato Golin9ba39232015-02-27 16:35:48 +00003994 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3995 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3996 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003997 SizeType = UnsignedLong;
3998 else
3999 SizeType = UnsignedInt;
4000
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004001 switch (T.getOS()) {
4002 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004003 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004004 break;
4005 case llvm::Triple::Win32:
4006 WCharType = UnsignedShort;
4007 break;
4008 case llvm::Triple::Linux:
4009 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004010 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4011 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004012 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004013 }
4014
4015 UseBitFieldTypeAlignment = true;
4016
4017 ZeroLengthBitfieldBoundary = 0;
4018
Tim Northover147cd2f2014-10-14 22:12:21 +00004019 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4020 // so set preferred for small types to 32.
4021 if (T.isOSBinFormatMachO()) {
4022 DescriptionString =
4023 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4024 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4025 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004026 assert(!BigEndian && "Windows on ARM does not support big endian");
4027 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00004028 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00004029 "-p:32:32"
4030 "-i64:64"
4031 "-v128:64:128"
4032 "-a:0:32"
4033 "-n32"
4034 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004035 } else if (T.isOSNaCl()) {
4036 assert(!BigEndian && "NaCl on ARM does not support big endian");
4037 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004038 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00004039 DescriptionString =
4040 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4041 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004042 }
4043
4044 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004045 }
4046
4047 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004048 const llvm::Triple &T = getTriple();
4049
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004050 IsAAPCS = false;
4051
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004052 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004053
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004054 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004055 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004056 SizeType = UnsignedInt;
4057 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004058 SizeType = UnsignedLong;
4059
4060 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4061 WCharType = SignedInt;
4062
4063 // Do not respect the alignment of bit-field types when laying out
4064 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4065 UseBitFieldTypeAlignment = false;
4066
4067 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4068 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4069 /// gcc.
4070 ZeroLengthBitfieldBoundary = 32;
4071
Tim Northover147cd2f2014-10-14 22:12:21 +00004072 if (T.isOSBinFormatMachO())
4073 DescriptionString =
4074 BigEndian
4075 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4076 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4077 else
4078 DescriptionString =
4079 BigEndian
4080 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4081 : "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 +00004082
4083 // FIXME: Override "preferred align" for double and long long.
4084 }
4085
Chris Lattner17df24e2008-04-21 18:56:49 +00004086public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004087 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004088 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004089 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004090 BigEndian = IsBigEndian;
4091
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004092 switch (getTriple().getOS()) {
4093 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004094 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004095 break;
4096 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004097 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004098 break;
4099 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004100
Chris Lattner1a8f3942010-04-23 16:29:58 +00004101 // {} in inline assembly are neon specifiers, not assembly variant
4102 // specifiers.
4103 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004104
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004105 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00004106 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004107
Eric Christopher0e261882014-12-05 01:06:59 +00004108 // FIXME: This duplicates code from the driver that sets the -target-abi
4109 // option - this code is used if -target-abi isn't passed and should
4110 // be unified in some way.
4111 if (Triple.isOSBinFormatMachO()) {
4112 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4113 // the frontend matches that.
4114 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4115 Triple.getOS() == llvm::Triple::UnknownOS ||
4116 StringRef(CPU).startswith("cortex-m")) {
4117 setABI("aapcs");
4118 } else {
4119 setABI("apcs-gnu");
4120 }
4121 } else if (Triple.isOSWindows()) {
4122 // FIXME: this is invalid for WindowsCE
4123 setABI("aapcs");
4124 } else {
4125 // Select the default based on the platform.
4126 switch (Triple.getEnvironment()) {
4127 case llvm::Triple::Android:
4128 case llvm::Triple::GNUEABI:
4129 case llvm::Triple::GNUEABIHF:
4130 setABI("aapcs-linux");
4131 break;
4132 case llvm::Triple::EABIHF:
4133 case llvm::Triple::EABI:
4134 setABI("aapcs");
4135 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004136 case llvm::Triple::GNU:
4137 setABI("apcs-gnu");
4138 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004139 default:
4140 if (Triple.getOS() == llvm::Triple::NetBSD)
4141 setABI("apcs-gnu");
4142 else
4143 setABI("aapcs");
4144 break;
4145 }
4146 }
John McCall86353412010-08-21 22:46:04 +00004147
4148 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004149 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004150
4151 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004152 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004153 if (shouldUseInlineAtomic(getTriple()))
4154 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004155
4156 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004157 // the alignment of the zero-length bitfield is greater than the member
4158 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004159 // zero length bitfield.
4160 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004161 }
Alp Toker4925ba72014-06-07 23:30:42 +00004162 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004163 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004164 ABI = Name;
4165
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004166 // The defaults (above) are for AAPCS, check if we need to change them.
4167 //
4168 // FIXME: We need support for -meabi... we could just mangle it into the
4169 // name.
4170 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004171 setABIAPCS();
4172 return true;
4173 }
4174 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4175 setABIAAPCS();
4176 return true;
4177 }
4178 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004179 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004180
Craig Topper3164f332014-03-11 03:39:26 +00004181 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004182 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004183 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4184 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004185 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004186 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004187 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004188 }
4189 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004190 Features["vfp4"] = true;
4191 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004192 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4193 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004194 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004195 Features["vfp4"] = true;
4196 Features["neon"] = true;
4197 Features["hwdiv"] = true;
4198 Features["hwdiv-arm"] = true;
Tim Northoverf9b517c2015-05-01 21:17:25 +00004199 } else if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
4200 CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004201 Features["fp-armv8"] = true;
4202 Features["neon"] = true;
4203 Features["hwdiv"] = true;
4204 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004205 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004206 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004207 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004208 // Enable the hwdiv extension for all v8a AArch32 cores by
4209 // default.
4210 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004211 ArchName == "armebv8a" || ArchName == "armebv8" ||
4212 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4213 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004214 Features["hwdiv"] = true;
4215 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004216 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004217 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004218 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004219 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004220 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004221
Craig Topper3164f332014-03-11 03:39:26 +00004222 bool handleTargetFeatures(std::vector<std::string> &Features,
4223 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004224 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004225 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004226 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004227 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004228 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004229
4230 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004231 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004232 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004233 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004234 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004235 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004236 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004237 HW_FP = HW_FP_SP | HW_FP_DP;
4238 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004239 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004240 HW_FP = HW_FP_SP | HW_FP_DP;
4241 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004242 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004243 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4244 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004245 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004246 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4247 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004248 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004249 HW_FP = HW_FP_SP | HW_FP_DP;
4250 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004251 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004252 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004253 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004254 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004255 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004256 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004257 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004258 } else if (Feature == "+fp-only-sp") {
4259 HW_FP &= ~HW_FP_DP;
4260 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004261 }
4262
Rafael Espindolaeb265472013-08-21 21:59:03 +00004263 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4264 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4265 return false;
4266 }
4267
4268 if (FPMath == FP_Neon)
4269 Features.push_back("+neonfp");
4270 else if (FPMath == FP_VFP)
4271 Features.push_back("-neonfp");
4272
Daniel Dunbar893d4752009-12-19 04:15:38 +00004273 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004274 auto Feature =
4275 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4276 if (Feature != Features.end())
4277 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004278
Rafael Espindolaeb265472013-08-21 21:59:03 +00004279 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004280 }
4281
Craig Topper3164f332014-03-11 03:39:26 +00004282 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004283 return llvm::StringSwitch<bool>(Feature)
4284 .Case("arm", true)
4285 .Case("softfloat", SoftFloat)
4286 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004287 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004288 .Case("hwdiv", HWDiv & HWDivThumb)
4289 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004290 .Default(false);
4291 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004292 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004293 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004294 return llvm::StringSwitch<const char *>(Name)
4295 .Cases("arm8", "arm810", "4")
4296 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4297 "4")
4298 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4299 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4300 .Case("ep9312", "4T")
4301 .Cases("arm10tdmi", "arm1020t", "5T")
4302 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4303 .Case("arm926ej-s", "5TEJ")
4304 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4305 .Cases("xscale", "iwmmxt", "5TE")
4306 .Case("arm1136j-s", "6J")
Renato Goline11531f2015-03-17 11:55:43 +00004307 .Case("arm1136jf-s", "6")
4308 .Cases("mpcorenovfp", "mpcore", "6K")
4309 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Eric Christopher917e9522014-11-18 22:36:15 +00004310 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4311 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4312 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4313 "7A")
Javed Absar879d18b82015-04-09 14:12:10 +00004314 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004315 .Case("swift", "7S")
4316 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004317 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004318 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004319 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004320 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004321 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004322 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004323 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004324 return llvm::StringSwitch<const char *>(Name)
4325 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4326 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4327 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004328 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004329 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4330 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
Javed Absar879d18b82015-04-09 14:12:10 +00004331 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004332 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004333 }
Craig Topper3164f332014-03-11 03:39:26 +00004334 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004335 if (!getCPUDefineSuffix(Name))
4336 return false;
4337
Tim Northovere8c37212014-07-09 09:24:43 +00004338 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4339 StringRef Profile = getCPUProfile(Name);
4340 if (Profile == "M" && MaxAtomicInlineWidth) {
4341 MaxAtomicPromoteWidth = 32;
4342 MaxAtomicInlineWidth = 32;
4343 }
4344
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004345 CPU = Name;
4346 return true;
4347 }
Craig Topper3164f332014-03-11 03:39:26 +00004348 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004349 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4350 unsigned CPUArchVer) const {
4351 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4352 (CPUArch.find('M') != StringRef::npos);
4353 }
4354 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4355 unsigned CPUArchVer) const {
4356 // We check both CPUArchVer and ArchName because when only triple is
4357 // specified, the default CPU is arm1136j-s.
4358 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4359 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4360 }
Craig Topper3164f332014-03-11 03:39:26 +00004361 void getTargetDefines(const LangOptions &Opts,
4362 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004363 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004364 Builder.defineMacro("__arm");
4365 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004366
Chris Lattnerecd49032009-03-02 22:27:17 +00004367 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004368 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004369
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004370 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004371 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004372 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004373 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004374 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004375
4376 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004377 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004378 StringRef ArchName = getTriple().getArchName();
4379
4380 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4381 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004382 if (CPUArch[0] >= '8') {
4383 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4384 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004385 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004386
4387 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4388 // is not defined for the M-profile.
4389 // NOTE that the deffault profile is assumed to be 'A'
4390 if (CPUProfile.empty() || CPUProfile != "M")
4391 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4392
4393 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4394 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4395 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4396 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4397 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4398 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4399 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4400
4401 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4402 // instruction set such as ARM or Thumb.
4403 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4404
4405 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4406
4407 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004408 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004409 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004410
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004411 // ACLE 6.5.1 Hardware Floating Point
4412 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004413 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004414
Yi Konga44c4d72014-06-27 21:25:42 +00004415 // ACLE predefines.
4416 Builder.defineMacro("__ARM_ACLE", "200");
4417
Mike Stump9d54bd72009-04-08 02:07:04 +00004418 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004419
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004420 // FIXME: It's more complicated than this and we don't really support
4421 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004422 // Windows on ARM does not "support" interworking
4423 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004424 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004425
David Tweed8f676532012-10-25 13:33:01 +00004426 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004427 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004428 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4429 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004430 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004431 Builder.defineMacro("__ARM_PCS", "1");
4432
David Tweed8f676532012-10-25 13:33:01 +00004433 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004434 Builder.defineMacro("__ARM_PCS_VFP", "1");
4435 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004436
Daniel Dunbar893d4752009-12-19 04:15:38 +00004437 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004438 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004439
4440 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004441 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004442
4443 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004444 Builder.defineMacro("__THUMBEL__");
4445 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004446 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004447 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004448 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004449 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4450 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004451
4452 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004453 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004454
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004455 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004456 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004457 if (FPU & VFP2FPU)
4458 Builder.defineMacro("__ARM_VFPV2__");
4459 if (FPU & VFP3FPU)
4460 Builder.defineMacro("__ARM_VFPV3__");
4461 if (FPU & VFP4FPU)
4462 Builder.defineMacro("__ARM_VFPV4__");
4463 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004464
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004465 // This only gets set when Neon instructions are actually available, unlike
4466 // the VFP define, hence the soft float and arch check. This is subtly
4467 // different from gcc, we follow the intent which was that it should be set
4468 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004469 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4470 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004471 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004472 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004473
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004474 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4475 Opts.ShortWChar ? "2" : "4");
4476
4477 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4478 Opts.ShortEnums ? "1" : "4");
4479
Bernard Ogden18b57012013-10-29 09:47:51 +00004480 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004481 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004482
Tim Northover02e38602014-02-03 17:28:04 +00004483 if (Crypto)
4484 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4485
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004486 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004487 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4488 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4489 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4490 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4491 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004492
4493 bool is5EOrAbove = (CPUArchVer >= 6 ||
4494 (CPUArchVer == 5 &&
4495 CPUArch.find('E') != StringRef::npos));
4496 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4497 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4498 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004499 }
Craig Topper3164f332014-03-11 03:39:26 +00004500 void getTargetBuiltins(const Builtin::Info *&Records,
4501 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004502 Records = BuiltinInfo;
4503 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004504 }
Craig Topper3164f332014-03-11 03:39:26 +00004505 bool isCLZForZeroUndef() const override { return false; }
4506 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004507 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004508 }
Craig Topper3164f332014-03-11 03:39:26 +00004509 void getGCCRegNames(const char * const *&Names,
4510 unsigned &NumNames) const override;
4511 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4512 unsigned &NumAliases) const override;
4513 bool validateAsmConstraint(const char *&Name,
4514 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004515 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004516 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004517 case 'l': // r0-r7
4518 case 'h': // r8-r15
4519 case 'w': // VFP Floating point register single precision
4520 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004521 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004522 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004523 case 'I':
4524 case 'J':
4525 case 'K':
4526 case 'L':
4527 case 'M':
4528 // FIXME
4529 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004530 case 'Q': // A memory address that is a single base register.
4531 Info.setAllowsMemory();
4532 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004533 case 'U': // a memory reference...
4534 switch (Name[1]) {
4535 case 'q': // ...ARMV4 ldrsb
4536 case 'v': // ...VFP load/store (reg+constant offset)
4537 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004538 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004539 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004540 case 'n': // valid address for Neon doubleword vector load/store
4541 case 'm': // valid address for Neon element and structure load/store
4542 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004543 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004544 Info.setAllowsMemory();
4545 Name++;
4546 return true;
4547 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004548 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004549 return false;
4550 }
Craig Topper3164f332014-03-11 03:39:26 +00004551 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004552 std::string R;
4553 switch (*Constraint) {
4554 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004555 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004556 Constraint++;
4557 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004558 case 'p': // 'p' should be translated to 'r' by default.
4559 R = std::string("r");
4560 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004561 default:
4562 return std::string(1, *Constraint);
4563 }
4564 return R;
4565 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004566 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004567 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004568 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004569 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004570 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004571
Bill Wendling9d1ee112012-10-25 23:28:48 +00004572 // Strip off constraint modifiers.
4573 while (Constraint[0] == '=' ||
4574 Constraint[0] == '+' ||
4575 Constraint[0] == '&')
4576 Constraint = Constraint.substr(1);
4577
4578 switch (Constraint[0]) {
4579 default: break;
4580 case 'r': {
4581 switch (Modifier) {
4582 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004583 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004584 case 'q':
4585 // A register of size 32 cannot fit a vector type.
4586 return false;
4587 }
4588 }
4589 }
4590
4591 return true;
4592 }
Craig Topper3164f332014-03-11 03:39:26 +00004593 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004594 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004595 return "";
4596 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004597
Craig Topper3164f332014-03-11 03:39:26 +00004598 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004599 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4600 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004601
Craig Topper3164f332014-03-11 03:39:26 +00004602 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004603 if (RegNo == 0) return 0;
4604 if (RegNo == 1) return 1;
4605 return -1;
4606 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004607};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004608
Rafael Espindolaeb265472013-08-21 21:59:03 +00004609bool ARMTargetInfo::setFPMath(StringRef Name) {
4610 if (Name == "neon") {
4611 FPMath = FP_Neon;
4612 return true;
4613 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4614 Name == "vfp4") {
4615 FPMath = FP_VFP;
4616 return true;
4617 }
4618 return false;
4619}
4620
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004621const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004622 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004623 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004624 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4625
4626 // Float registers
4627 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4628 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4629 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004630 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004631
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004632 // Double registers
4633 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4634 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004635 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4636 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004637
4638 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004639 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4640 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004641};
4642
4643void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004644 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004645 Names = GCCRegNames;
4646 NumNames = llvm::array_lengthof(GCCRegNames);
4647}
4648
4649const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004650 { { "a1" }, "r0" },
4651 { { "a2" }, "r1" },
4652 { { "a3" }, "r2" },
4653 { { "a4" }, "r3" },
4654 { { "v1" }, "r4" },
4655 { { "v2" }, "r5" },
4656 { { "v3" }, "r6" },
4657 { { "v4" }, "r7" },
4658 { { "v5" }, "r8" },
4659 { { "v6", "rfp" }, "r9" },
4660 { { "sl" }, "r10" },
4661 { { "fp" }, "r11" },
4662 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004663 { { "r13" }, "sp" },
4664 { { "r14" }, "lr" },
4665 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004666 // The S, D and Q registers overlap, but aren't really aliases; we
4667 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004668};
4669
4670void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4671 unsigned &NumAliases) const {
4672 Aliases = GCCRegAliases;
4673 NumAliases = llvm::array_lengthof(GCCRegAliases);
4674}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004675
4676const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004677#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004678#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004679 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004680#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004681
4682#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004683#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004684#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4685 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004686#include "clang/Basic/BuiltinsARM.def"
4687};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004688
4689class ARMleTargetInfo : public ARMTargetInfo {
4690public:
4691 ARMleTargetInfo(const llvm::Triple &Triple)
4692 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004693 void getTargetDefines(const LangOptions &Opts,
4694 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004695 Builder.defineMacro("__ARMEL__");
4696 ARMTargetInfo::getTargetDefines(Opts, Builder);
4697 }
4698};
4699
4700class ARMbeTargetInfo : public ARMTargetInfo {
4701public:
4702 ARMbeTargetInfo(const llvm::Triple &Triple)
4703 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004704 void getTargetDefines(const LangOptions &Opts,
4705 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004706 Builder.defineMacro("__ARMEB__");
4707 Builder.defineMacro("__ARM_BIG_ENDIAN");
4708 ARMTargetInfo::getTargetDefines(Opts, Builder);
4709 }
4710};
Chris Lattner17df24e2008-04-21 18:56:49 +00004711
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004712class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4713 const llvm::Triple Triple;
4714public:
4715 WindowsARMTargetInfo(const llvm::Triple &Triple)
4716 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4717 TLSSupported = false;
4718 WCharType = UnsignedShort;
4719 SizeType = UnsignedInt;
4720 UserLabelPrefix = "";
4721 }
4722 void getVisualStudioDefines(const LangOptions &Opts,
4723 MacroBuilder &Builder) const {
4724 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4725
4726 // FIXME: this is invalid for WindowsCE
4727 Builder.defineMacro("_M_ARM_NT", "1");
4728 Builder.defineMacro("_M_ARMT", "_M_ARM");
4729 Builder.defineMacro("_M_THUMB", "_M_ARM");
4730
4731 assert((Triple.getArch() == llvm::Triple::arm ||
4732 Triple.getArch() == llvm::Triple::thumb) &&
4733 "invalid architecture for Windows ARM target info");
4734 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4735 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4736
4737 // TODO map the complete set of values
4738 // 31: VFPv3 40: VFPv4
4739 Builder.defineMacro("_M_ARM_FP", "31");
4740 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004741 BuiltinVaListKind getBuiltinVaListKind() const override {
4742 return TargetInfo::CharPtrBuiltinVaList;
4743 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004744};
4745
4746// Windows ARM + Itanium C++ ABI Target
4747class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4748public:
4749 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4750 : WindowsARMTargetInfo(Triple) {
4751 TheCXXABI.set(TargetCXXABI::GenericARM);
4752 }
4753
4754 void getTargetDefines(const LangOptions &Opts,
4755 MacroBuilder &Builder) const override {
4756 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4757
4758 if (Opts.MSVCCompat)
4759 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4760 }
4761};
4762
4763// Windows ARM, MS (C++) ABI
4764class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4765public:
4766 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4767 : WindowsARMTargetInfo(Triple) {
4768 TheCXXABI.set(TargetCXXABI::Microsoft);
4769 }
4770
4771 void getTargetDefines(const LangOptions &Opts,
4772 MacroBuilder &Builder) const override {
4773 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4774 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4775 }
4776};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004777
Mike Stump11289f42009-09-09 15:08:12 +00004778class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004779 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004780protected:
Craig Topper3164f332014-03-11 03:39:26 +00004781 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4782 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004783 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004784 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004785
Torok Edwinb2b37c62009-06-30 17:10:35 +00004786public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004787 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004788 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004789 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004790 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004791 // FIXME: This should be based off of the target features in
4792 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004793 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004794
4795 // Darwin on iOS uses a variant of the ARM C++ ABI.
4796 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004797 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004798};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004799
Tim Northover573cbee2014-05-24 12:52:07 +00004800class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004801 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004802 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4803 static const char *const GCCRegNames[];
4804
James Molloy75f5f9e2014-04-16 15:33:48 +00004805 enum FPUModeEnum {
4806 FPUMode,
4807 NeonMode
4808 };
4809
4810 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004811 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004812 unsigned Crypto;
4813
Tim Northovera2ee4332014-03-29 15:09:45 +00004814 static const Builtin::Info BuiltinInfo[];
4815
4816 std::string ABI;
4817
4818public:
Tim Northover573cbee2014-05-24 12:52:07 +00004819 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004820 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004821
4822 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4823 WCharType = SignedInt;
4824
4825 // NetBSD apparently prefers consistency across ARM targets to consistency
4826 // across 64-bit targets.
4827 Int64Type = SignedLongLong;
4828 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004829 } else {
4830 WCharType = UnsignedInt;
4831 Int64Type = SignedLong;
4832 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004833 }
4834
Tim Northovera2ee4332014-03-29 15:09:45 +00004835 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004836 MaxVectorAlign = 128;
4837 RegParmMax = 8;
4838 MaxAtomicInlineWidth = 128;
4839 MaxAtomicPromoteWidth = 128;
4840
Tim Northovera6a19f12015-02-06 01:25:07 +00004841 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004842 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4843
Tim Northovera2ee4332014-03-29 15:09:45 +00004844 // {} in inline assembly are neon specifiers, not assembly variant
4845 // specifiers.
4846 NoAsmVariants = true;
4847
Tim Northover7ad87af2015-01-16 18:44:04 +00004848 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4849 // contributes to the alignment of the containing aggregate in the same way
4850 // a plain (non bit-field) member of that type would, without exception for
4851 // zero-sized or anonymous bit-fields."
4852 UseBitFieldTypeAlignment = true;
4853 UseZeroLengthBitfieldAlignment = true;
4854
Tim Northover573cbee2014-05-24 12:52:07 +00004855 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004856 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4857 }
4858
Alp Toker4925ba72014-06-07 23:30:42 +00004859 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004860 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004861 if (Name != "aapcs" && Name != "darwinpcs")
4862 return false;
4863
4864 ABI = Name;
4865 return true;
4866 }
4867
David Blaikie1cbb9712014-11-14 19:09:44 +00004868 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004869 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004870 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004871 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004872 .Case("cyclone", true)
4873 .Default(false);
4874 return CPUKnown;
4875 }
4876
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004877 void getTargetDefines(const LangOptions &Opts,
4878 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004879 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004880 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004881
4882 // Target properties.
4883 Builder.defineMacro("_LP64");
4884 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004885
4886 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4887 Builder.defineMacro("__ARM_ACLE", "200");
4888 Builder.defineMacro("__ARM_ARCH", "8");
4889 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4890
4891 Builder.defineMacro("__ARM_64BIT_STATE");
4892 Builder.defineMacro("__ARM_PCS_AAPCS64");
4893 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4894
4895 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4896 Builder.defineMacro("__ARM_FEATURE_CLZ");
4897 Builder.defineMacro("__ARM_FEATURE_FMA");
4898 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004899 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4900 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4901 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4902 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004903
4904 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4905
4906 // 0xe implies support for half, single and double precision operations.
4907 Builder.defineMacro("__ARM_FP", "0xe");
4908
4909 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4910 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4911 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4912
4913 if (Opts.FastMath || Opts.FiniteMathOnly)
4914 Builder.defineMacro("__ARM_FP_FAST");
4915
Richard Smithab506ad2014-10-20 23:26:58 +00004916 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004917 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4918
4919 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4920
4921 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4922 Opts.ShortEnums ? "1" : "4");
4923
James Molloy75f5f9e2014-04-16 15:33:48 +00004924 if (FPU == NeonMode) {
4925 Builder.defineMacro("__ARM_NEON");
4926 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004927 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004928 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004929
Bradley Smith418c5932014-05-02 15:17:51 +00004930 if (CRC)
4931 Builder.defineMacro("__ARM_FEATURE_CRC32");
4932
James Molloy75f5f9e2014-04-16 15:33:48 +00004933 if (Crypto)
4934 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Reid Klecknerd167d422015-05-06 15:31:46 +00004935
4936 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
4937 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4938 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4939 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4940 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00004941 }
4942
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004943 void getTargetBuiltins(const Builtin::Info *&Records,
4944 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004945 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004946 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004947 }
4948
David Blaikie1cbb9712014-11-14 19:09:44 +00004949 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004950 return Feature == "aarch64" ||
4951 Feature == "arm64" ||
4952 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004953 }
4954
James Molloy5e73df52014-04-16 15:06:20 +00004955 bool handleTargetFeatures(std::vector<std::string> &Features,
4956 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004957 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004958 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004959 Crypto = 0;
4960 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4961 if (Features[i] == "+neon")
4962 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004963 if (Features[i] == "+crc")
4964 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004965 if (Features[i] == "+crypto")
4966 Crypto = 1;
4967 }
4968
James Molloy5e73df52014-04-16 15:06:20 +00004969 setDescriptionString();
4970
4971 return true;
4972 }
4973
David Blaikie1cbb9712014-11-14 19:09:44 +00004974 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004975
David Blaikie1cbb9712014-11-14 19:09:44 +00004976 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004977 return TargetInfo::AArch64ABIBuiltinVaList;
4978 }
4979
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004980 void getGCCRegNames(const char *const *&Names,
4981 unsigned &NumNames) const override;
4982 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4983 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004984
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004985 bool validateAsmConstraint(const char *&Name,
4986 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004987 switch (*Name) {
4988 default:
4989 return false;
4990 case 'w': // Floating point and SIMD registers (V0-V31)
4991 Info.setAllowsRegister();
4992 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004993 case 'I': // Constant that can be used with an ADD instruction
4994 case 'J': // Constant that can be used with a SUB instruction
4995 case 'K': // Constant that can be used with a 32-bit logical instruction
4996 case 'L': // Constant that can be used with a 64-bit logical instruction
4997 case 'M': // Constant that can be used as a 32-bit MOV immediate
4998 case 'N': // Constant that can be used as a 64-bit MOV immediate
4999 case 'Y': // Floating point constant zero
5000 case 'Z': // Integer constant zero
5001 return true;
5002 case 'Q': // A memory reference with base register and no offset
5003 Info.setAllowsMemory();
5004 return true;
5005 case 'S': // A symbolic address
5006 Info.setAllowsRegister();
5007 return true;
5008 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005009 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5010 // Utf: A memory address suitable for ldp/stp in TF mode.
5011 // Usa: An absolute symbolic address.
5012 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5013 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005014 case 'z': // Zero register, wzr or xzr
5015 Info.setAllowsRegister();
5016 return true;
5017 case 'x': // Floating point and SIMD registers (V0-V15)
5018 Info.setAllowsRegister();
5019 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005020 }
5021 return false;
5022 }
5023
Akira Hatanaka987f1862014-08-22 06:05:21 +00005024 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005025 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005026 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005027 // Strip off constraint modifiers.
5028 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5029 Constraint = Constraint.substr(1);
5030
5031 switch (Constraint[0]) {
5032 default:
5033 return true;
5034 case 'z':
5035 case 'r': {
5036 switch (Modifier) {
5037 case 'x':
5038 case 'w':
5039 // For now assume that the person knows what they're
5040 // doing with the modifier.
5041 return true;
5042 default:
5043 // By default an 'r' constraint will be in the 'x'
5044 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005045 if (Size == 64)
5046 return true;
5047
5048 SuggestedModifier = "w";
5049 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005050 }
5051 }
5052 }
5053 }
5054
David Blaikie1cbb9712014-11-14 19:09:44 +00005055 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005056
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005057 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005058 if (RegNo == 0)
5059 return 0;
5060 if (RegNo == 1)
5061 return 1;
5062 return -1;
5063 }
5064};
5065
Tim Northover573cbee2014-05-24 12:52:07 +00005066const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005067 // 32-bit Integer registers
5068 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5069 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5070 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5071
5072 // 64-bit Integer registers
5073 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5074 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5075 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5076
5077 // 32-bit floating point regsisters
5078 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5079 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5080 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5081
5082 // 64-bit floating point regsisters
5083 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5084 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5085 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5086
5087 // Vector registers
5088 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5089 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5090 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5091};
5092
Tim Northover573cbee2014-05-24 12:52:07 +00005093void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005094 unsigned &NumNames) const {
5095 Names = GCCRegNames;
5096 NumNames = llvm::array_lengthof(GCCRegNames);
5097}
5098
Tim Northover573cbee2014-05-24 12:52:07 +00005099const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005100 { { "w31" }, "wsp" },
5101 { { "x29" }, "fp" },
5102 { { "x30" }, "lr" },
5103 { { "x31" }, "sp" },
5104 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5105 // don't want to substitute one of these for a different-sized one.
5106};
5107
Tim Northover573cbee2014-05-24 12:52:07 +00005108void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005109 unsigned &NumAliases) const {
5110 Aliases = GCCRegAliases;
5111 NumAliases = llvm::array_lengthof(GCCRegAliases);
5112}
5113
Tim Northover573cbee2014-05-24 12:52:07 +00005114const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005115#define BUILTIN(ID, TYPE, ATTRS) \
5116 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5117#include "clang/Basic/BuiltinsNEON.def"
5118
5119#define BUILTIN(ID, TYPE, ATTRS) \
5120 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005121#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005122};
James Molloy5e73df52014-04-16 15:06:20 +00005123
Tim Northover573cbee2014-05-24 12:52:07 +00005124class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005125 void setDescriptionString() override {
5126 if (getTriple().isOSBinFormatMachO())
5127 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5128 else
5129 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5130 }
5131
5132public:
Tim Northover573cbee2014-05-24 12:52:07 +00005133 AArch64leTargetInfo(const llvm::Triple &Triple)
5134 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005135 BigEndian = false;
5136 }
5137 void getTargetDefines(const LangOptions &Opts,
5138 MacroBuilder &Builder) const override {
5139 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005140 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005141 }
5142};
5143
Tim Northover573cbee2014-05-24 12:52:07 +00005144class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005145 void setDescriptionString() override {
5146 assert(!getTriple().isOSBinFormatMachO());
5147 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5148 }
5149
5150public:
Tim Northover573cbee2014-05-24 12:52:07 +00005151 AArch64beTargetInfo(const llvm::Triple &Triple)
5152 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005153 void getTargetDefines(const LangOptions &Opts,
5154 MacroBuilder &Builder) const override {
5155 Builder.defineMacro("__AARCH64EB__");
5156 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5157 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005158 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005159 }
5160};
Tim Northovera2ee4332014-03-29 15:09:45 +00005161
Tim Northover573cbee2014-05-24 12:52:07 +00005162class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005163protected:
5164 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5165 MacroBuilder &Builder) const override {
5166 Builder.defineMacro("__AARCH64_SIMD__");
5167 Builder.defineMacro("__ARM64_ARCH_8__");
5168 Builder.defineMacro("__ARM_NEON__");
5169 Builder.defineMacro("__LITTLE_ENDIAN__");
5170 Builder.defineMacro("__REGISTER_PREFIX__", "");
5171 Builder.defineMacro("__arm64", "1");
5172 Builder.defineMacro("__arm64__", "1");
5173
5174 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5175 }
5176
Tim Northovera2ee4332014-03-29 15:09:45 +00005177public:
Tim Northover573cbee2014-05-24 12:52:07 +00005178 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5179 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005180 Int64Type = SignedLongLong;
5181 WCharType = SignedInt;
5182 UseSignedCharForObjCBool = false;
5183
Tim Northovera6a19f12015-02-06 01:25:07 +00005184 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005185 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5186
5187 TheCXXABI.set(TargetCXXABI::iOS64);
5188 }
5189
David Blaikie1cbb9712014-11-14 19:09:44 +00005190 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005191 return TargetInfo::CharPtrBuiltinVaList;
5192 }
5193};
Tim Northovera2ee4332014-03-29 15:09:45 +00005194
Tony Linthicum76329bf2011-12-12 21:14:55 +00005195// Hexagon abstract base class
5196class HexagonTargetInfo : public TargetInfo {
5197 static const Builtin::Info BuiltinInfo[];
5198 static const char * const GCCRegNames[];
5199 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5200 std::string CPU;
5201public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005202 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005203 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005204 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005205
5206 // {} in inline assembly are packet specifiers, not assembly variant
5207 // specifiers.
5208 NoAsmVariants = true;
5209 }
5210
Craig Topper3164f332014-03-11 03:39:26 +00005211 void getTargetBuiltins(const Builtin::Info *&Records,
5212 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005213 Records = BuiltinInfo;
5214 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5215 }
5216
Craig Topper3164f332014-03-11 03:39:26 +00005217 bool validateAsmConstraint(const char *&Name,
5218 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005219 return true;
5220 }
5221
Craig Topper3164f332014-03-11 03:39:26 +00005222 void getTargetDefines(const LangOptions &Opts,
5223 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005224
Craig Topper3164f332014-03-11 03:39:26 +00005225 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005226 return Feature == "hexagon";
5227 }
Craig Topper3164f332014-03-11 03:39:26 +00005228
5229 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005230 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005231 }
Craig Topper3164f332014-03-11 03:39:26 +00005232 void getGCCRegNames(const char * const *&Names,
5233 unsigned &NumNames) const override;
5234 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5235 unsigned &NumAliases) const override;
5236 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005237 return "";
5238 }
Sebastian Pop86500282012-01-13 20:37:10 +00005239
5240 static const char *getHexagonCPUSuffix(StringRef Name) {
5241 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005242 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005243 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005244 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005245 }
5246
Craig Topper3164f332014-03-11 03:39:26 +00005247 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005248 if (!getHexagonCPUSuffix(Name))
5249 return false;
5250
Tony Linthicum76329bf2011-12-12 21:14:55 +00005251 CPU = Name;
5252 return true;
5253 }
5254};
5255
5256void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5257 MacroBuilder &Builder) const {
5258 Builder.defineMacro("qdsp6");
5259 Builder.defineMacro("__qdsp6", "1");
5260 Builder.defineMacro("__qdsp6__", "1");
5261
5262 Builder.defineMacro("hexagon");
5263 Builder.defineMacro("__hexagon", "1");
5264 Builder.defineMacro("__hexagon__", "1");
5265
5266 if(CPU == "hexagonv1") {
5267 Builder.defineMacro("__HEXAGON_V1__");
5268 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5269 if(Opts.HexagonQdsp6Compat) {
5270 Builder.defineMacro("__QDSP6_V1__");
5271 Builder.defineMacro("__QDSP6_ARCH__", "1");
5272 }
5273 }
5274 else if(CPU == "hexagonv2") {
5275 Builder.defineMacro("__HEXAGON_V2__");
5276 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5277 if(Opts.HexagonQdsp6Compat) {
5278 Builder.defineMacro("__QDSP6_V2__");
5279 Builder.defineMacro("__QDSP6_ARCH__", "2");
5280 }
5281 }
5282 else if(CPU == "hexagonv3") {
5283 Builder.defineMacro("__HEXAGON_V3__");
5284 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5285 if(Opts.HexagonQdsp6Compat) {
5286 Builder.defineMacro("__QDSP6_V3__");
5287 Builder.defineMacro("__QDSP6_ARCH__", "3");
5288 }
5289 }
5290 else if(CPU == "hexagonv4") {
5291 Builder.defineMacro("__HEXAGON_V4__");
5292 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5293 if(Opts.HexagonQdsp6Compat) {
5294 Builder.defineMacro("__QDSP6_V4__");
5295 Builder.defineMacro("__QDSP6_ARCH__", "4");
5296 }
5297 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005298 else if(CPU == "hexagonv5") {
5299 Builder.defineMacro("__HEXAGON_V5__");
5300 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5301 if(Opts.HexagonQdsp6Compat) {
5302 Builder.defineMacro("__QDSP6_V5__");
5303 Builder.defineMacro("__QDSP6_ARCH__", "5");
5304 }
5305 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005306}
5307
5308const char * const HexagonTargetInfo::GCCRegNames[] = {
5309 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5310 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5311 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5312 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5313 "p0", "p1", "p2", "p3",
5314 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5315};
5316
5317void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5318 unsigned &NumNames) const {
5319 Names = GCCRegNames;
5320 NumNames = llvm::array_lengthof(GCCRegNames);
5321}
5322
5323
5324const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5325 { { "sp" }, "r29" },
5326 { { "fp" }, "r30" },
5327 { { "lr" }, "r31" },
5328 };
5329
5330void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5331 unsigned &NumAliases) const {
5332 Aliases = GCCRegAliases;
5333 NumAliases = llvm::array_lengthof(GCCRegAliases);
5334}
5335
5336
5337const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5338#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5339#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5340 ALL_LANGUAGES },
5341#include "clang/Basic/BuiltinsHexagon.def"
5342};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005343
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005344// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5345class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005346 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5347 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005348 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005349public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005350 SparcTargetInfo(const llvm::Triple &Triple)
5351 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005352
Craig Topper3164f332014-03-11 03:39:26 +00005353 bool handleTargetFeatures(std::vector<std::string> &Features,
5354 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005355 // The backend doesn't actually handle soft float yet, but in case someone
5356 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005357 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5358 if (Feature != Features.end()) {
5359 SoftFloat = true;
5360 Features.erase(Feature);
5361 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005362 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005363 }
Craig Topper3164f332014-03-11 03:39:26 +00005364 void getTargetDefines(const LangOptions &Opts,
5365 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005366 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005367 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005368
5369 if (SoftFloat)
5370 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005371 }
Craig Topper3164f332014-03-11 03:39:26 +00005372
5373 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005374 return llvm::StringSwitch<bool>(Feature)
5375 .Case("softfloat", SoftFloat)
5376 .Case("sparc", true)
5377 .Default(false);
5378 }
Craig Topper3164f332014-03-11 03:39:26 +00005379
5380 void getTargetBuiltins(const Builtin::Info *&Records,
5381 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005382 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005383 }
Craig Topper3164f332014-03-11 03:39:26 +00005384 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005385 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005386 }
Craig Topper3164f332014-03-11 03:39:26 +00005387 void getGCCRegNames(const char * const *&Names,
5388 unsigned &NumNames) const override;
5389 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5390 unsigned &NumAliases) const override;
5391 bool validateAsmConstraint(const char *&Name,
5392 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005393 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005394 switch (*Name) {
5395 case 'I': // Signed 13-bit constant
5396 case 'J': // Zero
5397 case 'K': // 32-bit constant with the low 12 bits clear
5398 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5399 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5400 case 'N': // Same as 'K' but zext (required for SIMode)
5401 case 'O': // The constant 4096
5402 return true;
5403 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005404 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005405 }
Craig Topper3164f332014-03-11 03:39:26 +00005406 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005407 // FIXME: Implement!
5408 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005409 }
5410};
5411
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005412const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005413 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5414 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5415 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5416 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5417};
5418
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005419void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5420 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005421 Names = GCCRegNames;
5422 NumNames = llvm::array_lengthof(GCCRegNames);
5423}
5424
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005425const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005426 { { "g0" }, "r0" },
5427 { { "g1" }, "r1" },
5428 { { "g2" }, "r2" },
5429 { { "g3" }, "r3" },
5430 { { "g4" }, "r4" },
5431 { { "g5" }, "r5" },
5432 { { "g6" }, "r6" },
5433 { { "g7" }, "r7" },
5434 { { "o0" }, "r8" },
5435 { { "o1" }, "r9" },
5436 { { "o2" }, "r10" },
5437 { { "o3" }, "r11" },
5438 { { "o4" }, "r12" },
5439 { { "o5" }, "r13" },
5440 { { "o6", "sp" }, "r14" },
5441 { { "o7" }, "r15" },
5442 { { "l0" }, "r16" },
5443 { { "l1" }, "r17" },
5444 { { "l2" }, "r18" },
5445 { { "l3" }, "r19" },
5446 { { "l4" }, "r20" },
5447 { { "l5" }, "r21" },
5448 { { "l6" }, "r22" },
5449 { { "l7" }, "r23" },
5450 { { "i0" }, "r24" },
5451 { { "i1" }, "r25" },
5452 { { "i2" }, "r26" },
5453 { { "i3" }, "r27" },
5454 { { "i4" }, "r28" },
5455 { { "i5" }, "r29" },
5456 { { "i6", "fp" }, "r30" },
5457 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005458};
5459
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005460void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5461 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005462 Aliases = GCCRegAliases;
5463 NumAliases = llvm::array_lengthof(GCCRegAliases);
5464}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005465
5466// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5467class SparcV8TargetInfo : public SparcTargetInfo {
5468public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005469 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005470 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005471 }
5472
Craig Topper3164f332014-03-11 03:39:26 +00005473 void getTargetDefines(const LangOptions &Opts,
5474 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005475 SparcTargetInfo::getTargetDefines(Opts, Builder);
5476 Builder.defineMacro("__sparcv8");
5477 }
5478};
5479
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005480// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5481class SparcV8elTargetInfo : public SparcV8TargetInfo {
5482 public:
5483 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
5484 DescriptionString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
5485 BigEndian = false;
5486 }
5487};
5488
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005489// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5490class SparcV9TargetInfo : public SparcTargetInfo {
5491public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005492 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005493 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005494 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005495 // This is an LP64 platform.
5496 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005497
5498 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005499 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005500 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005501 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005502 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005503 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005504
5505 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5506 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5507 LongDoubleWidth = 128;
5508 LongDoubleAlign = 128;
5509 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005510 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005511 }
5512
Craig Topper3164f332014-03-11 03:39:26 +00005513 void getTargetDefines(const LangOptions &Opts,
5514 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005515 SparcTargetInfo::getTargetDefines(Opts, Builder);
5516 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005517 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005518 // Solaris doesn't need these variants, but the BSDs do.
5519 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005520 Builder.defineMacro("__sparc64__");
5521 Builder.defineMacro("__sparc_v9__");
5522 Builder.defineMacro("__sparcv9__");
5523 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005524 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005525
Craig Topper3164f332014-03-11 03:39:26 +00005526 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005527 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5528 .Case("v9", true)
5529 .Case("ultrasparc", true)
5530 .Case("ultrasparc3", true)
5531 .Case("niagara", true)
5532 .Case("niagara2", true)
5533 .Case("niagara3", true)
5534 .Case("niagara4", true)
5535 .Default(false);
5536
5537 // No need to store the CPU yet. There aren't any CPU-specific
5538 // macros to define.
5539 return CPUKnown;
5540 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005541};
5542
Torok Edwinb2b37c62009-06-30 17:10:35 +00005543class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005544public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005545 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5546 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005547 SizeType = UnsignedInt;
5548 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005549 }
5550};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005551
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005552class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005553 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005554 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005555 std::string CPU;
5556 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005557 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005558
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005559public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005560 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005561 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005562 IntMaxType = SignedLong;
5563 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005564 TLSSupported = true;
5565 IntWidth = IntAlign = 32;
5566 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5567 PointerWidth = PointerAlign = 64;
5568 LongDoubleWidth = 128;
5569 LongDoubleAlign = 64;
5570 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005571 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005572 MinGlobalAlign = 16;
5573 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5574 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5575 }
5576 void getTargetDefines(const LangOptions &Opts,
5577 MacroBuilder &Builder) const override {
5578 Builder.defineMacro("__s390__");
5579 Builder.defineMacro("__s390x__");
5580 Builder.defineMacro("__zarch__");
5581 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005582 if (HasTransactionalExecution)
5583 Builder.defineMacro("__HTM__");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005584 }
5585 void getTargetBuiltins(const Builtin::Info *&Records,
5586 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005587 Records = BuiltinInfo;
5588 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005589 }
5590
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005591 void getGCCRegNames(const char *const *&Names,
5592 unsigned &NumNames) const override;
5593 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5594 unsigned &NumAliases) const override {
5595 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005596 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005597 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005598 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005599 bool validateAsmConstraint(const char *&Name,
5600 TargetInfo::ConstraintInfo &info) const override;
5601 const char *getClobbers() const override {
5602 // FIXME: Is this really right?
5603 return "";
5604 }
5605 BuiltinVaListKind getBuiltinVaListKind() const override {
5606 return TargetInfo::SystemZBuiltinVaList;
5607 }
5608 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005609 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005610 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5611 .Case("z10", true)
5612 .Case("z196", true)
5613 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005614 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005615 .Default(false);
5616
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005617 return CPUKnown;
5618 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005619 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5620 if (CPU == "zEC12")
5621 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005622 if (CPU == "z13") {
5623 Features["transactional-execution"] = true;
5624 Features["vector"] = true;
5625 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005626 }
5627
5628 bool handleTargetFeatures(std::vector<std::string> &Features,
5629 DiagnosticsEngine &Diags) override {
5630 HasTransactionalExecution = false;
5631 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5632 if (Features[i] == "+transactional-execution")
5633 HasTransactionalExecution = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005634 if (Features[i] == "+vector")
5635 HasVector = true;
5636 }
5637 // If we use the vector ABI, vector types are 64-bit aligned.
5638 if (HasVector) {
5639 MaxVectorAlign = 64;
5640 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5641 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005642 }
5643 return true;
5644 }
5645
5646 bool hasFeature(StringRef Feature) const override {
5647 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005648 .Case("systemz", true)
5649 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005650 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005651 .Default(false);
5652 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005653
5654 StringRef getABI() const override {
5655 if (HasVector)
5656 return "vector";
5657 return "";
5658 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005659};
5660
5661const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5662#define BUILTIN(ID, TYPE, ATTRS) \
5663 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5664#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005665};
5666
5667const char *const SystemZTargetInfo::GCCRegNames[] = {
5668 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5669 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5670 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5671 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5672};
5673
5674void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5675 unsigned &NumNames) const {
5676 Names = GCCRegNames;
5677 NumNames = llvm::array_lengthof(GCCRegNames);
5678}
5679
5680bool SystemZTargetInfo::
5681validateAsmConstraint(const char *&Name,
5682 TargetInfo::ConstraintInfo &Info) const {
5683 switch (*Name) {
5684 default:
5685 return false;
5686
5687 case 'a': // Address register
5688 case 'd': // Data register (equivalent to 'r')
5689 case 'f': // Floating-point register
5690 Info.setAllowsRegister();
5691 return true;
5692
5693 case 'I': // Unsigned 8-bit constant
5694 case 'J': // Unsigned 12-bit constant
5695 case 'K': // Signed 16-bit constant
5696 case 'L': // Signed 20-bit displacement (on all targets we support)
5697 case 'M': // 0x7fffffff
5698 return true;
5699
5700 case 'Q': // Memory with base and unsigned 12-bit displacement
5701 case 'R': // Likewise, plus an index
5702 case 'S': // Memory with base and signed 20-bit displacement
5703 case 'T': // Likewise, plus an index
5704 Info.setAllowsMemory();
5705 return true;
5706 }
5707}
Ulrich Weigand47445072013-05-06 16:26:41 +00005708
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005709 class MSP430TargetInfo : public TargetInfo {
5710 static const char * const GCCRegNames[];
5711 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005712 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005713 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005714 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005715 IntWidth = 16; IntAlign = 16;
5716 LongWidth = 32; LongLongWidth = 64;
5717 LongAlign = LongLongAlign = 16;
5718 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005719 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005720 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005721 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005722 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005723 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005724 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005725 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005726 }
5727 void getTargetDefines(const LangOptions &Opts,
5728 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005729 Builder.defineMacro("MSP430");
5730 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005731 // FIXME: defines for different 'flavours' of MCU
5732 }
Craig Topper3164f332014-03-11 03:39:26 +00005733 void getTargetBuiltins(const Builtin::Info *&Records,
5734 unsigned &NumRecords) const override {
5735 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005736 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005737 NumRecords = 0;
5738 }
Craig Topper3164f332014-03-11 03:39:26 +00005739 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005740 return Feature == "msp430";
5741 }
Craig Topper3164f332014-03-11 03:39:26 +00005742 void getGCCRegNames(const char * const *&Names,
5743 unsigned &NumNames) const override;
5744 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5745 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005746 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005747 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005748 NumAliases = 0;
5749 }
Eric Christopher917e9522014-11-18 22:36:15 +00005750 bool
5751 validateAsmConstraint(const char *&Name,
5752 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005753 // FIXME: implement
5754 switch (*Name) {
5755 case 'K': // the constant 1
5756 case 'L': // constant -1^20 .. 1^19
5757 case 'M': // constant 1-4:
5758 return true;
5759 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005760 // No target constraints for now.
5761 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005762 }
Craig Topper3164f332014-03-11 03:39:26 +00005763 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005764 // FIXME: Is this really right?
5765 return "";
5766 }
Craig Topper3164f332014-03-11 03:39:26 +00005767 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005768 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005769 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005770 }
5771 };
5772
5773 const char * const MSP430TargetInfo::GCCRegNames[] = {
5774 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5775 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5776 };
5777
5778 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5779 unsigned &NumNames) const {
5780 Names = GCCRegNames;
5781 NumNames = llvm::array_lengthof(GCCRegNames);
5782 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005783
Mike Stump11289f42009-09-09 15:08:12 +00005784 // LLVM and Clang cannot be used directly to output native binaries for
5785 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005786 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005787 //
5788 // TCE uses the llvm bitcode as input and uses it for generating customized
5789 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005790 // publicly available in http://tce.cs.tut.fi
5791
Eli Friedman1f191002011-10-07 19:51:42 +00005792 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5793 3, // opencl_global
5794 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005795 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005796 // FIXME: generic has to be added to the target
5797 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005798 0, // cuda_device
5799 0, // cuda_constant
5800 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005801 };
5802
Eli Friedmana9c3d712009-08-19 20:47:07 +00005803 class TCETargetInfo : public TargetInfo{
5804 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005805 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005806 TLSSupported = false;
5807 IntWidth = 32;
5808 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005809 PointerWidth = 32;
5810 IntAlign = 32;
5811 LongAlign = LongLongAlign = 32;
5812 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005813 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005814 SizeType = UnsignedInt;
5815 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005816 IntPtrType = SignedInt;
5817 PtrDiffType = SignedInt;
5818 FloatWidth = 32;
5819 FloatAlign = 32;
5820 DoubleWidth = 32;
5821 DoubleAlign = 32;
5822 LongDoubleWidth = 32;
5823 LongDoubleAlign = 32;
5824 FloatFormat = &llvm::APFloat::IEEEsingle;
5825 DoubleFormat = &llvm::APFloat::IEEEsingle;
5826 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005827 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5828 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005829 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005830 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005831 }
5832
Craig Topper3164f332014-03-11 03:39:26 +00005833 void getTargetDefines(const LangOptions &Opts,
5834 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005835 DefineStd(Builder, "tce", Opts);
5836 Builder.defineMacro("__TCE__");
5837 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005838 }
Craig Topper3164f332014-03-11 03:39:26 +00005839 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005840 return Feature == "tce";
5841 }
Craig Topper3164f332014-03-11 03:39:26 +00005842
5843 void getTargetBuiltins(const Builtin::Info *&Records,
5844 unsigned &NumRecords) const override {}
5845 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005846 return "";
5847 }
Craig Topper3164f332014-03-11 03:39:26 +00005848 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005849 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005850 }
Craig Topper3164f332014-03-11 03:39:26 +00005851 void getGCCRegNames(const char * const *&Names,
5852 unsigned &NumNames) const override {}
5853 bool validateAsmConstraint(const char *&Name,
5854 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005855 return true;
5856 }
Craig Topper3164f332014-03-11 03:39:26 +00005857 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5858 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005859 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005860
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005861class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005862 virtual void setDescriptionString() = 0;
5863
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005864 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005865 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005866 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005867 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005868 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005869 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005870 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005871 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005872 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005873 enum DspRevEnum {
5874 NoDSP, DSP1, DSP2
5875 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005876 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005877
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005878protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005879 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005880 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005881
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005882public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005883 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5884 const std::string &CPUStr)
5885 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005886 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005887 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5888 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5889 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005890
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005891 bool isNaN2008Default() const {
5892 return CPU == "mips32r6" || CPU == "mips64r6";
5893 }
5894
5895 bool isFP64Default() const {
5896 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5897 }
5898
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005899 bool isNan2008() const override {
5900 return IsNan2008;
5901 }
5902
Alp Toker4925ba72014-06-07 23:30:42 +00005903 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005904 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005905 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5906 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005907 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005908 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005909 .Case("mips1", IsMips32)
5910 .Case("mips2", IsMips32)
5911 .Case("mips3", true)
5912 .Case("mips4", true)
5913 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005914 .Case("mips32", IsMips32)
5915 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005916 .Case("mips32r3", IsMips32)
5917 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005918 .Case("mips32r6", IsMips32)
5919 .Case("mips64", true)
5920 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005921 .Case("mips64r3", true)
5922 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005923 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005924 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005925 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005926 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005927 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005928 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005929 if (CPU == "octeon")
5930 Features["mips64r2"] = Features["cnmips"] = true;
5931 else
5932 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005933 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005934
Craig Topper3164f332014-03-11 03:39:26 +00005935 void getTargetDefines(const LangOptions &Opts,
5936 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005937 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005938 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005939 if (Opts.GNUMode)
5940 Builder.defineMacro("mips");
5941
Simon Atanasyan683535b2012-08-29 19:14:58 +00005942 Builder.defineMacro("__REGISTER_PREFIX__", "");
5943
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005944 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005945 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005946 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005947 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005948 case SoftFloat:
5949 Builder.defineMacro("__mips_soft_float", Twine(1));
5950 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005951 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005952
Simon Atanasyan16071912013-04-14 14:07:30 +00005953 if (IsSingleFloat)
5954 Builder.defineMacro("__mips_single_float", Twine(1));
5955
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005956 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5957 Builder.defineMacro("_MIPS_FPSET",
5958 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5959
Simon Atanasyan72244b62012-07-05 16:06:06 +00005960 if (IsMips16)
5961 Builder.defineMacro("__mips16", Twine(1));
5962
Simon Atanasyan60777612013-04-14 14:07:51 +00005963 if (IsMicromips)
5964 Builder.defineMacro("__mips_micromips", Twine(1));
5965
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005966 if (IsNan2008)
5967 Builder.defineMacro("__mips_nan2008", Twine(1));
5968
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005969 switch (DspRev) {
5970 default:
5971 break;
5972 case DSP1:
5973 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5974 Builder.defineMacro("__mips_dsp", Twine(1));
5975 break;
5976 case DSP2:
5977 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5978 Builder.defineMacro("__mips_dspr2", Twine(1));
5979 Builder.defineMacro("__mips_dsp", Twine(1));
5980 break;
5981 }
5982
Jack Carter44ff1e52013-08-12 17:20:29 +00005983 if (HasMSA)
5984 Builder.defineMacro("__mips_msa", Twine(1));
5985
Simon Atanasyan26f19672012-04-05 19:28:31 +00005986 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5987 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5988 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005989
5990 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5991 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005992 }
5993
Craig Topper3164f332014-03-11 03:39:26 +00005994 void getTargetBuiltins(const Builtin::Info *&Records,
5995 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005996 Records = BuiltinInfo;
5997 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005998 }
Craig Topper3164f332014-03-11 03:39:26 +00005999 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006000 return llvm::StringSwitch<bool>(Feature)
6001 .Case("mips", true)
6002 .Case("fp64", HasFP64)
6003 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006004 }
Craig Topper3164f332014-03-11 03:39:26 +00006005 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006006 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006007 }
Craig Topper3164f332014-03-11 03:39:26 +00006008 void getGCCRegNames(const char * const *&Names,
6009 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006010 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006011 // CPU register names
6012 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006013 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6014 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6015 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006016 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6017 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006018 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6019 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6020 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6021 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006022 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006023 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006024 "$fcc5","$fcc6","$fcc7",
6025 // MSA register names
6026 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6027 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6028 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6029 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6030 // MSA control register names
6031 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6032 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006033 };
6034 Names = GCCRegNames;
6035 NumNames = llvm::array_lengthof(GCCRegNames);
6036 }
Craig Topper3164f332014-03-11 03:39:26 +00006037 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6038 unsigned &NumAliases) const override = 0;
6039 bool validateAsmConstraint(const char *&Name,
6040 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006041 switch (*Name) {
6042 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006043 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006044 case 'r': // CPU registers.
6045 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006046 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006047 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006048 case 'c': // $25 for indirect jumps
6049 case 'l': // lo register
6050 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006051 Info.setAllowsRegister();
6052 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006053 case 'I': // Signed 16-bit constant
6054 case 'J': // Integer 0
6055 case 'K': // Unsigned 16-bit constant
6056 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6057 case 'M': // Constants not loadable via lui, addiu, or ori
6058 case 'N': // Constant -1 to -65535
6059 case 'O': // A signed 15-bit constant
6060 case 'P': // A constant between 1 go 65535
6061 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006062 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006063 Info.setAllowsMemory();
6064 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006065 case 'Z':
6066 if (Name[1] == 'C') { // An address usable by ll, and sc.
6067 Info.setAllowsMemory();
6068 Name++; // Skip over 'Z'.
6069 return true;
6070 }
6071 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006072 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006073 }
6074
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006075 std::string convertConstraint(const char *&Constraint) const override {
6076 std::string R;
6077 switch (*Constraint) {
6078 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6079 if (Constraint[1] == 'C') {
6080 R = std::string("^") + std::string(Constraint, 2);
6081 Constraint++;
6082 return R;
6083 }
6084 break;
6085 }
6086 return TargetInfo::convertConstraint(Constraint);
6087 }
6088
Craig Topper3164f332014-03-11 03:39:26 +00006089 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006090 // In GCC, $1 is not widely used in generated code (it's used only in a few
6091 // specific situations), so there is no real need for users to add it to
6092 // the clobbers list if they want to use it in their inline assembly code.
6093 //
6094 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6095 // code generation, so using it in inline assembly without adding it to the
6096 // clobbers list can cause conflicts between the inline assembly code and
6097 // the surrounding generated code.
6098 //
6099 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6100 // operands, which will conflict with the ".set at" assembler option (which
6101 // we use only for inline assembly, in order to maintain compatibility with
6102 // GCC) and will also conflict with the user's usage of $1.
6103 //
6104 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6105 // register for generated code is to automatically clobber $1 for all inline
6106 // assembly code.
6107 //
6108 // FIXME: We should automatically clobber $1 only for inline assembly code
6109 // which actually uses it. This would allow LLVM to use $1 for inline
6110 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006111 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006112 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006113
Craig Topper3164f332014-03-11 03:39:26 +00006114 bool handleTargetFeatures(std::vector<std::string> &Features,
6115 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006116 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006117 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006118 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006119 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006120 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006121 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006122 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006123
6124 for (std::vector<std::string>::iterator it = Features.begin(),
6125 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006126 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006127 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006128 else if (*it == "+soft-float")
6129 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006130 else if (*it == "+mips16")
6131 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006132 else if (*it == "+micromips")
6133 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006134 else if (*it == "+dsp")
6135 DspRev = std::max(DspRev, DSP1);
6136 else if (*it == "+dspr2")
6137 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006138 else if (*it == "+msa")
6139 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006140 else if (*it == "+fp64")
6141 HasFP64 = true;
6142 else if (*it == "-fp64")
6143 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006144 else if (*it == "+nan2008")
6145 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006146 else if (*it == "-nan2008")
6147 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006148 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006149
Akira Hatanaka9064e362013-10-29 18:30:33 +00006150 setDescriptionString();
6151
Rafael Espindolaeb265472013-08-21 21:59:03 +00006152 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006153 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006154
Craig Topper3164f332014-03-11 03:39:26 +00006155 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006156 if (RegNo == 0) return 4;
6157 if (RegNo == 1) return 5;
6158 return -1;
6159 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006160
6161 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006162};
6163
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006164const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6165#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6166#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6167 ALL_LANGUAGES },
6168#include "clang/Basic/BuiltinsMips.def"
6169};
6170
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006171class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006172public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006173 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006174 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006175 SizeType = UnsignedInt;
6176 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006177 Int64Type = SignedLongLong;
6178 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006179 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006180 }
Craig Topper3164f332014-03-11 03:39:26 +00006181 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006182 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006183 ABI = Name;
6184 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006185 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006186 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006187 }
Craig Topper3164f332014-03-11 03:39:26 +00006188 void getTargetDefines(const LangOptions &Opts,
6189 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006190 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006191
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006192 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006193 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6194
6195 const std::string& CPUStr = getCPU();
6196 if (CPUStr == "mips32")
6197 Builder.defineMacro("__mips_isa_rev", "1");
6198 else if (CPUStr == "mips32r2")
6199 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006200 else if (CPUStr == "mips32r3")
6201 Builder.defineMacro("__mips_isa_rev", "3");
6202 else if (CPUStr == "mips32r5")
6203 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006204 else if (CPUStr == "mips32r6")
6205 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006206
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006207 if (ABI == "o32") {
6208 Builder.defineMacro("__mips_o32");
6209 Builder.defineMacro("_ABIO32", "1");
6210 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6211 }
6212 else if (ABI == "eabi")
6213 Builder.defineMacro("__mips_eabi");
6214 else
David Blaikie83d382b2011-09-23 05:06:16 +00006215 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006216 }
Craig Topper3164f332014-03-11 03:39:26 +00006217 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6218 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006219 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6220 { { "at" }, "$1" },
6221 { { "v0" }, "$2" },
6222 { { "v1" }, "$3" },
6223 { { "a0" }, "$4" },
6224 { { "a1" }, "$5" },
6225 { { "a2" }, "$6" },
6226 { { "a3" }, "$7" },
6227 { { "t0" }, "$8" },
6228 { { "t1" }, "$9" },
6229 { { "t2" }, "$10" },
6230 { { "t3" }, "$11" },
6231 { { "t4" }, "$12" },
6232 { { "t5" }, "$13" },
6233 { { "t6" }, "$14" },
6234 { { "t7" }, "$15" },
6235 { { "s0" }, "$16" },
6236 { { "s1" }, "$17" },
6237 { { "s2" }, "$18" },
6238 { { "s3" }, "$19" },
6239 { { "s4" }, "$20" },
6240 { { "s5" }, "$21" },
6241 { { "s6" }, "$22" },
6242 { { "s7" }, "$23" },
6243 { { "t8" }, "$24" },
6244 { { "t9" }, "$25" },
6245 { { "k0" }, "$26" },
6246 { { "k1" }, "$27" },
6247 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006248 { { "sp","$sp" }, "$29" },
6249 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006250 { { "ra" }, "$31" }
6251 };
6252 Aliases = GCCRegAliases;
6253 NumAliases = llvm::array_lengthof(GCCRegAliases);
6254 }
6255};
6256
6257class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006258 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006259 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006260 }
6261
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006262public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006263 Mips32EBTargetInfo(const llvm::Triple &Triple)
6264 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006265 }
Craig Topper3164f332014-03-11 03:39:26 +00006266 void getTargetDefines(const LangOptions &Opts,
6267 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006268 DefineStd(Builder, "MIPSEB", Opts);
6269 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006270 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006271 }
6272};
6273
6274class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006275 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006276 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006277 }
6278
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006279public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006280 Mips32ELTargetInfo(const llvm::Triple &Triple)
6281 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006282 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006283 }
Craig Topper3164f332014-03-11 03:39:26 +00006284 void getTargetDefines(const LangOptions &Opts,
6285 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006286 DefineStd(Builder, "MIPSEL", Opts);
6287 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006288 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006289 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006290};
Akira Hatanakabef17452011-09-20 19:21:49 +00006291
6292class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006293public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006294 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006295 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006296 LongDoubleWidth = LongDoubleAlign = 128;
6297 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006298 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6299 LongDoubleWidth = LongDoubleAlign = 64;
6300 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6301 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006302 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006303 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006304 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006305 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006306
6307 void setN64ABITypes() {
6308 LongWidth = LongAlign = 64;
6309 PointerWidth = PointerAlign = 64;
6310 SizeType = UnsignedLong;
6311 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006312 Int64Type = SignedLong;
6313 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006314 }
6315
6316 void setN32ABITypes() {
6317 LongWidth = LongAlign = 32;
6318 PointerWidth = PointerAlign = 32;
6319 SizeType = UnsignedInt;
6320 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006321 Int64Type = SignedLongLong;
6322 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006323 }
6324
Craig Topper3164f332014-03-11 03:39:26 +00006325 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006326 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006327 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006328 ABI = Name;
6329 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006330 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006331 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006332 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006333 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006334 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006335 }
6336 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006337 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006338
Craig Topper3164f332014-03-11 03:39:26 +00006339 void getTargetDefines(const LangOptions &Opts,
6340 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006341 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006342
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006343 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006344 Builder.defineMacro("__mips64");
6345 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006346 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6347
6348 const std::string& CPUStr = getCPU();
6349 if (CPUStr == "mips64")
6350 Builder.defineMacro("__mips_isa_rev", "1");
6351 else if (CPUStr == "mips64r2")
6352 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006353 else if (CPUStr == "mips64r3")
6354 Builder.defineMacro("__mips_isa_rev", "3");
6355 else if (CPUStr == "mips64r5")
6356 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006357 else if (CPUStr == "mips64r6")
6358 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006359
Akira Hatanakabef17452011-09-20 19:21:49 +00006360 if (ABI == "n32") {
6361 Builder.defineMacro("__mips_n32");
6362 Builder.defineMacro("_ABIN32", "2");
6363 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6364 }
6365 else if (ABI == "n64") {
6366 Builder.defineMacro("__mips_n64");
6367 Builder.defineMacro("_ABI64", "3");
6368 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6369 }
6370 else
David Blaikie83d382b2011-09-23 05:06:16 +00006371 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006372 }
Craig Topper3164f332014-03-11 03:39:26 +00006373 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6374 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006375 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6376 { { "at" }, "$1" },
6377 { { "v0" }, "$2" },
6378 { { "v1" }, "$3" },
6379 { { "a0" }, "$4" },
6380 { { "a1" }, "$5" },
6381 { { "a2" }, "$6" },
6382 { { "a3" }, "$7" },
6383 { { "a4" }, "$8" },
6384 { { "a5" }, "$9" },
6385 { { "a6" }, "$10" },
6386 { { "a7" }, "$11" },
6387 { { "t0" }, "$12" },
6388 { { "t1" }, "$13" },
6389 { { "t2" }, "$14" },
6390 { { "t3" }, "$15" },
6391 { { "s0" }, "$16" },
6392 { { "s1" }, "$17" },
6393 { { "s2" }, "$18" },
6394 { { "s3" }, "$19" },
6395 { { "s4" }, "$20" },
6396 { { "s5" }, "$21" },
6397 { { "s6" }, "$22" },
6398 { { "s7" }, "$23" },
6399 { { "t8" }, "$24" },
6400 { { "t9" }, "$25" },
6401 { { "k0" }, "$26" },
6402 { { "k1" }, "$27" },
6403 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006404 { { "sp","$sp" }, "$29" },
6405 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006406 { { "ra" }, "$31" }
6407 };
6408 Aliases = GCCRegAliases;
6409 NumAliases = llvm::array_lengthof(GCCRegAliases);
6410 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006411
6412 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006413};
6414
6415class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006416 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006417 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006418 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 +00006419 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006420 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006421
Akira Hatanakabef17452011-09-20 19:21:49 +00006422 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006423
Akira Hatanakabef17452011-09-20 19:21:49 +00006424public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006425 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006426 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006427 void getTargetDefines(const LangOptions &Opts,
6428 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006429 DefineStd(Builder, "MIPSEB", Opts);
6430 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006431 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006432 }
6433};
6434
6435class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006436 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006437 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006438 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 +00006439 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006440 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006441 }
6442public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006443 Mips64ELTargetInfo(const llvm::Triple &Triple)
6444 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006445 // Default ABI is n64.
6446 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006447 }
Craig Topper3164f332014-03-11 03:39:26 +00006448 void getTargetDefines(const LangOptions &Opts,
6449 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006450 DefineStd(Builder, "MIPSEL", Opts);
6451 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006452 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006453 }
6454};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006455
Ivan Krasindd7403e2011-08-24 20:22:22 +00006456class PNaClTargetInfo : public TargetInfo {
6457public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006458 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006459 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006460 this->UserLabelPrefix = "";
6461 this->LongAlign = 32;
6462 this->LongWidth = 32;
6463 this->PointerAlign = 32;
6464 this->PointerWidth = 32;
6465 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006466 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006467 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006468 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006469 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006470 this->SizeType = TargetInfo::UnsignedInt;
6471 this->PtrDiffType = TargetInfo::SignedInt;
6472 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006473 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006474 }
6475
Craig Topper3164f332014-03-11 03:39:26 +00006476 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006477 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006478 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006479 Builder.defineMacro("__le32__");
6480 Builder.defineMacro("__pnacl__");
6481 }
Craig Topper3164f332014-03-11 03:39:26 +00006482 void getTargetDefines(const LangOptions &Opts,
6483 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006484 getArchDefines(Opts, Builder);
6485 }
Craig Topper3164f332014-03-11 03:39:26 +00006486 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006487 return Feature == "pnacl";
6488 }
Craig Topper3164f332014-03-11 03:39:26 +00006489 void getTargetBuiltins(const Builtin::Info *&Records,
6490 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006491 }
Craig Topper3164f332014-03-11 03:39:26 +00006492 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006493 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006494 }
Craig Topper3164f332014-03-11 03:39:26 +00006495 void getGCCRegNames(const char * const *&Names,
6496 unsigned &NumNames) const override;
6497 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6498 unsigned &NumAliases) const override;
6499 bool validateAsmConstraint(const char *&Name,
6500 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006501 return false;
6502 }
6503
Craig Topper3164f332014-03-11 03:39:26 +00006504 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006505 return "";
6506 }
6507};
6508
6509void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6510 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006511 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006512 NumNames = 0;
6513}
6514
6515void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6516 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006517 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006518 NumAliases = 0;
6519}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006520
JF Bastien643817d2014-09-12 17:52:47 +00006521class Le64TargetInfo : public TargetInfo {
6522 static const Builtin::Info BuiltinInfo[];
6523
6524public:
6525 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6526 BigEndian = false;
6527 NoAsmVariants = true;
6528 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6529 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6530 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006531 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006532 }
6533
6534 void getTargetDefines(const LangOptions &Opts,
6535 MacroBuilder &Builder) const override {
6536 DefineStd(Builder, "unix", Opts);
6537 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6538 Builder.defineMacro("__ELF__");
6539 }
6540 void getTargetBuiltins(const Builtin::Info *&Records,
6541 unsigned &NumRecords) const override {
6542 Records = BuiltinInfo;
6543 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6544 }
6545 BuiltinVaListKind getBuiltinVaListKind() const override {
6546 return TargetInfo::PNaClABIBuiltinVaList;
6547 }
6548 const char *getClobbers() const override { return ""; }
6549 void getGCCRegNames(const char *const *&Names,
6550 unsigned &NumNames) const override {
6551 Names = nullptr;
6552 NumNames = 0;
6553 }
6554 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6555 unsigned &NumAliases) const override {
6556 Aliases = nullptr;
6557 NumAliases = 0;
6558 }
6559 bool validateAsmConstraint(const char *&Name,
6560 TargetInfo::ConstraintInfo &Info) const override {
6561 return false;
6562 }
6563
6564 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006565};
6566} // end anonymous namespace.
6567
6568const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6569#define BUILTIN(ID, TYPE, ATTRS) \
6570 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6571#include "clang/Basic/BuiltinsLe64.def"
6572};
6573
6574namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006575 static const unsigned SPIRAddrSpaceMap[] = {
6576 1, // opencl_global
6577 3, // opencl_local
6578 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006579 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006580 0, // cuda_device
6581 0, // cuda_constant
6582 0 // cuda_shared
6583 };
6584 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006585 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006586 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006587 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6588 "SPIR target must use unknown OS");
6589 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6590 "SPIR target must use unknown environment type");
6591 BigEndian = false;
6592 TLSSupported = false;
6593 LongWidth = LongAlign = 64;
6594 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006595 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006596 // Define available target features
6597 // These must be defined in sorted order!
6598 NoAsmVariants = true;
6599 }
Craig Topper3164f332014-03-11 03:39:26 +00006600 void getTargetDefines(const LangOptions &Opts,
6601 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006602 DefineStd(Builder, "SPIR", Opts);
6603 }
Craig Topper3164f332014-03-11 03:39:26 +00006604 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006605 return Feature == "spir";
6606 }
Craig Topper3164f332014-03-11 03:39:26 +00006607
6608 void getTargetBuiltins(const Builtin::Info *&Records,
6609 unsigned &NumRecords) const override {}
6610 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006611 return "";
6612 }
Craig Topper3164f332014-03-11 03:39:26 +00006613 void getGCCRegNames(const char * const *&Names,
6614 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006615 bool
6616 validateAsmConstraint(const char *&Name,
6617 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006618 return true;
6619 }
Craig Topper3164f332014-03-11 03:39:26 +00006620 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6621 unsigned &NumAliases) const override {}
6622 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006623 return TargetInfo::VoidPtrBuiltinVaList;
6624 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006625
6626 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6627 return (CC == CC_SpirFunction ||
6628 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6629 }
6630
6631 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6632 return CC_SpirFunction;
6633 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006634 };
6635
6636
6637 class SPIR32TargetInfo : public SPIRTargetInfo {
6638 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006639 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006640 PointerWidth = PointerAlign = 32;
6641 SizeType = TargetInfo::UnsignedInt;
6642 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6643 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006644 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6645 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006646 }
Craig Topper3164f332014-03-11 03:39:26 +00006647 void getTargetDefines(const LangOptions &Opts,
6648 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006649 DefineStd(Builder, "SPIR32", Opts);
6650 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006651 };
6652
6653 class SPIR64TargetInfo : public SPIRTargetInfo {
6654 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006655 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006656 PointerWidth = PointerAlign = 64;
6657 SizeType = TargetInfo::UnsignedLong;
6658 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006659 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6660 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006661 }
Craig Topper3164f332014-03-11 03:39:26 +00006662 void getTargetDefines(const LangOptions &Opts,
6663 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006664 DefineStd(Builder, "SPIR64", Opts);
6665 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006666 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006667
Robert Lytton0e076492013-08-13 09:43:10 +00006668class XCoreTargetInfo : public TargetInfo {
6669 static const Builtin::Info BuiltinInfo[];
6670public:
6671 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6672 BigEndian = false;
6673 NoAsmVariants = true;
6674 LongLongAlign = 32;
6675 SuitableAlign = 32;
6676 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006677 SizeType = UnsignedInt;
6678 PtrDiffType = SignedInt;
6679 IntPtrType = SignedInt;
6680 WCharType = UnsignedChar;
6681 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006682 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006683 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 +00006684 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006685 }
Craig Topper3164f332014-03-11 03:39:26 +00006686 void getTargetDefines(const LangOptions &Opts,
6687 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006688 Builder.defineMacro("__XS1B__");
6689 }
Craig Topper3164f332014-03-11 03:39:26 +00006690 void getTargetBuiltins(const Builtin::Info *&Records,
6691 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006692 Records = BuiltinInfo;
6693 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6694 }
Craig Topper3164f332014-03-11 03:39:26 +00006695 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006696 return TargetInfo::VoidPtrBuiltinVaList;
6697 }
Craig Topper3164f332014-03-11 03:39:26 +00006698 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006699 return "";
6700 }
Craig Topper3164f332014-03-11 03:39:26 +00006701 void getGCCRegNames(const char * const *&Names,
6702 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006703 static const char * const GCCRegNames[] = {
6704 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6705 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6706 };
6707 Names = GCCRegNames;
6708 NumNames = llvm::array_lengthof(GCCRegNames);
6709 }
Craig Topper3164f332014-03-11 03:39:26 +00006710 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6711 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006712 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006713 NumAliases = 0;
6714 }
Craig Topper3164f332014-03-11 03:39:26 +00006715 bool validateAsmConstraint(const char *&Name,
6716 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006717 return false;
6718 }
Craig Topper3164f332014-03-11 03:39:26 +00006719 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006720 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6721 return (RegNo < 2)? RegNo : -1;
6722 }
Robert Lytton0e076492013-08-13 09:43:10 +00006723};
6724
6725const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6726#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6727#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6728 ALL_LANGUAGES },
6729#include "clang/Basic/BuiltinsXCore.def"
6730};
6731} // end anonymous namespace.
6732
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006733namespace {
6734// x86_32 Android target
6735class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6736public:
6737 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6738 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6739 SuitableAlign = 32;
6740 LongDoubleWidth = 64;
6741 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6742 }
6743};
6744} // end anonymous namespace
6745
6746namespace {
6747// x86_64 Android target
6748class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6749public:
6750 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6751 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6752 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6753 }
6754};
6755} // end anonymous namespace
6756
Ivan Krasindd7403e2011-08-24 20:22:22 +00006757
Chris Lattner5ba61f02006-10-14 07:39:34 +00006758//===----------------------------------------------------------------------===//
6759// Driver code
6760//===----------------------------------------------------------------------===//
6761
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006762static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006763 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006764
Daniel Dunbar52322032009-08-18 05:47:58 +00006765 switch (Triple.getArch()) {
6766 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006767 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006768
Tim Northover2a0783d2014-05-30 14:14:07 +00006769 case llvm::Triple::xcore:
6770 return new XCoreTargetInfo(Triple);
6771
6772 case llvm::Triple::hexagon:
6773 return new HexagonTargetInfo(Triple);
6774
6775 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006776 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006777 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006778
6779 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006780 case llvm::Triple::FreeBSD:
6781 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006782 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006783 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006784 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006785 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006786 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006787 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006788 }
6789
Christian Pirker9b019ae2014-02-25 13:51:00 +00006790 case llvm::Triple::aarch64_be:
6791 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006792 case llvm::Triple::FreeBSD:
6793 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006794 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006795 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006796 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006797 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006798 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006799 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006800 }
6801
Daniel Dunbar52322032009-08-18 05:47:58 +00006802 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006803 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006804 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006805 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006806
Daniel Dunbar52322032009-08-18 05:47:58 +00006807 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006808 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006809 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006810 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006811 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006812 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006813 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006814 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006815 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006816 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006817 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006818 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006819 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006820 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006821 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006822 case llvm::Triple::Win32:
6823 switch (Triple.getEnvironment()) {
6824 default:
6825 return new ARMleTargetInfo(Triple);
6826 case llvm::Triple::Itanium:
6827 return new ItaniumWindowsARMleTargetInfo(Triple);
6828 case llvm::Triple::MSVC:
6829 return new MicrosoftARMleTargetInfo(Triple);
6830 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006831 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006832 return new ARMleTargetInfo(Triple);
6833 }
6834
6835 case llvm::Triple::armeb:
6836 case llvm::Triple::thumbeb:
6837 if (Triple.isOSDarwin())
6838 return new DarwinARMTargetInfo(Triple);
6839
6840 switch (os) {
6841 case llvm::Triple::Linux:
6842 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6843 case llvm::Triple::FreeBSD:
6844 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6845 case llvm::Triple::NetBSD:
6846 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6847 case llvm::Triple::OpenBSD:
6848 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6849 case llvm::Triple::Bitrig:
6850 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6851 case llvm::Triple::RTEMS:
6852 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6853 case llvm::Triple::NaCl:
6854 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6855 default:
6856 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006857 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006858
Daniel Dunbar52322032009-08-18 05:47:58 +00006859 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006860 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006861
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006862 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006863 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006864 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006865 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006866 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006867 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006868 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006869 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006870 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006871 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006872 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006873 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006874 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006875
6876 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006877 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006878 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006879 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006880 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006881 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006882 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006883 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006884 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006885 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006886 case llvm::Triple::NaCl:
6887 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006888 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006889 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006890 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006891
Akira Hatanakabef17452011-09-20 19:21:49 +00006892 case llvm::Triple::mips64:
6893 switch (os) {
6894 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006895 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006896 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006897 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006898 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006899 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006900 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006901 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006902 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006903 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006904 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006905 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006906 }
6907
6908 case llvm::Triple::mips64el:
6909 switch (os) {
6910 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006911 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006912 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006913 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006914 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006915 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006916 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006917 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006918 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006919 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006920 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006921 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006922 }
6923
Ivan Krasindd7403e2011-08-24 20:22:22 +00006924 case llvm::Triple::le32:
6925 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00006926 case llvm::Triple::NaCl:
6927 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
6928 default:
6929 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006930 }
6931
JF Bastien643817d2014-09-12 17:52:47 +00006932 case llvm::Triple::le64:
6933 return new Le64TargetInfo(Triple);
6934
Daniel Dunbar52322032009-08-18 05:47:58 +00006935 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006936 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006937 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006938 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006939 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006940 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006941 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006942 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006943 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006944 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006945 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006946 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006947 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006948 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006949 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006950 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006951 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006952
6953 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006954 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006955 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006956 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006957 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006958 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006959 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006960 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006961 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006962 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006963 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006964 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006965 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006966 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006967 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006968
Bill Schmidt778d3872013-07-26 01:36:11 +00006969 case llvm::Triple::ppc64le:
6970 switch (os) {
6971 case llvm::Triple::Linux:
6972 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00006973 case llvm::Triple::NetBSD:
6974 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00006975 default:
6976 return new PPC64TargetInfo(Triple);
6977 }
6978
Peter Collingbournec947aae2012-05-20 23:28:41 +00006979 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006980 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006981 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006982 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006983
Tom Stellardd8e38a32015-01-06 20:34:47 +00006984 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006985 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006986 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006987
Daniel Dunbar52322032009-08-18 05:47:58 +00006988 case llvm::Triple::sparc:
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<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006992 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006993 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006994 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006995 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006996 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006997 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006998 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006999 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007000 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007001 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007002 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007003
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007004 // The 'sparcel' architecture copies all the above cases except for Solaris.
7005 case llvm::Triple::sparcel:
7006 switch (os) {
7007 case llvm::Triple::Linux:
7008 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7009 case llvm::Triple::NetBSD:
7010 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7011 case llvm::Triple::OpenBSD:
7012 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7013 case llvm::Triple::RTEMS:
7014 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7015 default:
7016 return new SparcV8elTargetInfo(Triple);
7017 }
7018
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007019 case llvm::Triple::sparcv9:
7020 switch (os) {
7021 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007022 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007023 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007024 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007025 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007026 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007027 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007028 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007029 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007030 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007031 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007032 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007033 }
7034
Ulrich Weigand47445072013-05-06 16:26:41 +00007035 case llvm::Triple::systemz:
7036 switch (os) {
7037 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007038 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007039 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007040 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007041 }
7042
Eli Friedmana9c3d712009-08-19 20:47:07 +00007043 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007044 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007045
Daniel Dunbar52322032009-08-18 05:47:58 +00007046 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007047 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007048 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007049
Daniel Dunbar52322032009-08-18 05:47:58 +00007050 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007051 case llvm::Triple::Linux: {
7052 switch (Triple.getEnvironment()) {
7053 default:
7054 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7055 case llvm::Triple::Android:
7056 return new AndroidX86_32TargetInfo(Triple);
7057 }
7058 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007059 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007060 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007061 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007062 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007063 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007064 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007065 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007066 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007067 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007068 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007069 case llvm::Triple::KFreeBSD:
7070 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007071 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007072 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007073 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007074 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007075 case llvm::Triple::Win32: {
7076 switch (Triple.getEnvironment()) {
7077 default:
7078 return new X86_32TargetInfo(Triple);
7079 case llvm::Triple::Cygnus:
7080 return new CygwinX86_32TargetInfo(Triple);
7081 case llvm::Triple::GNU:
7082 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007083 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007084 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007085 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007086 }
7087 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007088 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007089 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007090 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007091 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007092 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007093 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007094 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007095 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007096 }
7097
7098 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007099 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007100 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007101
Daniel Dunbar52322032009-08-18 05:47:58 +00007102 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007103 case llvm::Triple::CloudABI:
7104 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007105 case llvm::Triple::Linux: {
7106 switch (Triple.getEnvironment()) {
7107 default:
7108 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7109 case llvm::Triple::Android:
7110 return new AndroidX86_64TargetInfo(Triple);
7111 }
7112 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007113 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007114 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007115 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007116 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007117 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007118 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007119 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007120 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007121 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007122 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007123 case llvm::Triple::KFreeBSD:
7124 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007125 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007126 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007127 case llvm::Triple::Win32: {
7128 switch (Triple.getEnvironment()) {
7129 default:
7130 return new X86_64TargetInfo(Triple);
7131 case llvm::Triple::GNU:
7132 return new MinGWX86_64TargetInfo(Triple);
7133 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007134 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007135 }
7136 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007137 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007138 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007139 case llvm::Triple::PS4:
7140 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007141 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007142 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007143 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007144
Douglas Katzman78d7c542015-05-12 21:18:10 +00007145 case llvm::Triple::spir: {
7146 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7147 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7148 return nullptr;
7149 return new SPIR32TargetInfo(Triple);
7150 }
7151 case llvm::Triple::spir64: {
7152 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7153 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7154 return nullptr;
7155 return new SPIR64TargetInfo(Triple);
7156 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007157 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007158}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007159
7160/// CreateTargetInfo - Return the target info object for the specified target
7161/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007162TargetInfo *
7163TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7164 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007165 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007166
7167 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007168 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007169 if (!Target) {
7170 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007171 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007172 }
Alp Toker80758082014-07-06 05:26:44 +00007173 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007174
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007175 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007176 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7177 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007178 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007179 }
7180
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007181 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007182 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7183 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007184 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007185 }
7186
Rafael Espindolaeb265472013-08-21 21:59:03 +00007187 // Set the fp math unit.
7188 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7189 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007190 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007191 }
7192
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007193 // Compute the default target features, we need the target to handle this
7194 // because features may have dependencies on one another.
7195 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007196 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007197
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007198 // Apply the user specified deltas.
7199 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7200 I < N; ++I) {
7201 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007202 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007203 bool Enabled = Name[0] == '+';
7204 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007205 }
7206
7207 // Add the features to the compile options.
7208 //
7209 // FIXME: If we are completely confident that we have the right set, we only
7210 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007211 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007212 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7213 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007214 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007215 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007216 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007217
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007218 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007219}