blob: 3f6177eecd5e648fbe22249b8d39719ddfd22c99 [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
Ed Schoutenf33c6072015-03-11 08:42:46 +0000186// CloudABI Target
187template <typename Target>
188class CloudABITargetInfo : public OSTargetInfo<Target> {
189protected:
190 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
191 MacroBuilder &Builder) const override {
192 Builder.defineMacro("__CloudABI__");
193 Builder.defineMacro("__ELF__");
194
195 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
196 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
197 Builder.defineMacro("__STDC_UTF_16__");
198 Builder.defineMacro("__STDC_UTF_32__");
199 }
200
201public:
202 CloudABITargetInfo(const llvm::Triple &Triple)
203 : OSTargetInfo<Target>(Triple) {
204 this->UserLabelPrefix = "";
205 }
206};
207
Chris Lattner30ba6742009-08-10 19:03:04 +0000208namespace {
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 = "";
448 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// OpenBSD Target
452template<typename Target>
453class OpenBSDTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // OpenBSD defines; list based off of gcc output
458
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 Builder.defineMacro("__OpenBSD__");
460 DefineStd(Builder, "unix", Opts);
461 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000462 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000463 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000464 }
465public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000466 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
467 this->UserLabelPrefix = "";
468 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000469
Eli Friedman3715d1f2011-12-15 02:15:56 +0000470 switch (Triple.getArch()) {
471 default:
472 case llvm::Triple::x86:
473 case llvm::Triple::x86_64:
474 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000475 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000476 this->MCountName = "__mcount";
477 break;
478 case llvm::Triple::mips64:
479 case llvm::Triple::mips64el:
480 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000481 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000482 this->MCountName = "_mcount";
483 break;
484 }
485 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000486};
487
Eli Friedman9fa28852012-08-08 23:57:20 +0000488// Bitrig Target
489template<typename Target>
490class BitrigTargetInfo : public OSTargetInfo<Target> {
491protected:
Craig Topper3164f332014-03-11 03:39:26 +0000492 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
493 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000494 // Bitrig defines; list based off of gcc output
495
496 Builder.defineMacro("__Bitrig__");
497 DefineStd(Builder, "unix", Opts);
498 Builder.defineMacro("__ELF__");
499 if (Opts.POSIXThreads)
500 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000501
502 switch (Triple.getArch()) {
503 default:
504 break;
505 case llvm::Triple::arm:
506 case llvm::Triple::armeb:
507 case llvm::Triple::thumb:
508 case llvm::Triple::thumbeb:
509 Builder.defineMacro("__ARM_DWARF_EH__");
510 break;
511 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000512 }
513public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000514 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
515 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000516 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000517 }
518};
519
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000520// PSP Target
521template<typename Target>
522class PSPTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000526 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000527 Builder.defineMacro("PSP");
528 Builder.defineMacro("_PSP");
529 Builder.defineMacro("__psp__");
530 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000531 }
532public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000533 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000534 this->UserLabelPrefix = "";
535 }
536};
537
John Thompsone467e192009-11-19 17:18:50 +0000538// PS3 PPU Target
539template<typename Target>
540class PS3PPUTargetInfo : public OSTargetInfo<Target> {
541protected:
Craig Topper3164f332014-03-11 03:39:26 +0000542 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
543 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000544 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000545 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000546 Builder.defineMacro("__PPU__");
547 Builder.defineMacro("__CELLOS_LV2__");
548 Builder.defineMacro("__ELF__");
549 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000550 Builder.defineMacro("_ARCH_PPC64");
551 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000552 }
553public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000554 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000555 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000556 this->LongWidth = this->LongAlign = 32;
557 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000558 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000559 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000560 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000561 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000562 }
563};
564
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000565template <typename Target>
566class PS4OSTargetInfo : public OSTargetInfo<Target> {
567protected:
568 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
569 MacroBuilder &Builder) const override {
570 Builder.defineMacro("__FreeBSD__", "9");
571 Builder.defineMacro("__FreeBSD_cc_version", "900001");
572 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
573 DefineStd(Builder, "unix", Opts);
574 Builder.defineMacro("__ELF__");
575 Builder.defineMacro("__PS4__");
576 }
577public:
578 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
579 this->WCharType = this->UnsignedShort;
580
581 this->UserLabelPrefix = "";
582
583 switch (Triple.getArch()) {
584 default:
585 case llvm::Triple::x86_64:
586 this->MCountName = ".mcount";
587 break;
588 }
589 }
590};
591
Torok Edwinb2b37c62009-06-30 17:10:35 +0000592// Solaris target
593template<typename Target>
594class SolarisTargetInfo : public OSTargetInfo<Target> {
595protected:
Craig Topper3164f332014-03-11 03:39:26 +0000596 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
597 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000598 DefineStd(Builder, "sun", Opts);
599 DefineStd(Builder, "unix", Opts);
600 Builder.defineMacro("__ELF__");
601 Builder.defineMacro("__svr4__");
602 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000603 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
604 // newer, but to 500 for everything else. feature_test.h has a check to
605 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000606 // with a new version.
607 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000608 Builder.defineMacro("_XOPEN_SOURCE", "600");
609 else
610 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000611 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000612 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000613 Builder.defineMacro("_LARGEFILE_SOURCE");
614 Builder.defineMacro("_LARGEFILE64_SOURCE");
615 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000616 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000617 }
618public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000619 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000620 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000621 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000622 // FIXME: WIntType should be SignedLong
623 }
624};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000625
626// Windows target
627template<typename Target>
628class WindowsTargetInfo : public OSTargetInfo<Target> {
629protected:
Craig Topper3164f332014-03-11 03:39:26 +0000630 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
631 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000632 Builder.defineMacro("_WIN32");
633 }
634 void getVisualStudioDefines(const LangOptions &Opts,
635 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000636 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000637 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000638 Builder.defineMacro("_CPPRTTI");
639
Reid Kleckner16514352015-01-30 21:42:55 +0000640 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000641 Builder.defineMacro("_CPPUNWIND");
642 }
643
644 if (!Opts.CharIsSigned)
645 Builder.defineMacro("_CHAR_UNSIGNED");
646
647 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
648 // but it works for now.
649 if (Opts.POSIXThreads)
650 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000651
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000652 if (Opts.MSCompatibilityVersion) {
653 Builder.defineMacro("_MSC_VER",
654 Twine(Opts.MSCompatibilityVersion / 100000));
655 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000656 // FIXME We cannot encode the revision information into 32-bits
657 Builder.defineMacro("_MSC_BUILD", Twine(1));
658 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000659
660 if (Opts.MicrosoftExt) {
661 Builder.defineMacro("_MSC_EXTENSIONS");
662
663 if (Opts.CPlusPlus11) {
664 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
665 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
666 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
667 }
668 }
669
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000670 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000671 }
672
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000673public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000674 WindowsTargetInfo(const llvm::Triple &Triple)
675 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000676};
677
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000678template <typename Target>
679class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000680protected:
Craig Topper3164f332014-03-11 03:39:26 +0000681 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
682 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000683 if (Opts.POSIXThreads)
684 Builder.defineMacro("_REENTRANT");
685 if (Opts.CPlusPlus)
686 Builder.defineMacro("_GNU_SOURCE");
687
688 DefineStd(Builder, "unix", Opts);
689 Builder.defineMacro("__ELF__");
690 Builder.defineMacro("__native_client__");
691 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000692
693public:
694 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000695 this->UserLabelPrefix = "";
696 this->LongAlign = 32;
697 this->LongWidth = 32;
698 this->PointerAlign = 32;
699 this->PointerWidth = 32;
700 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000701 this->Int64Type = TargetInfo::SignedLongLong;
702 this->DoubleAlign = 64;
703 this->LongDoubleWidth = 64;
704 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000705 this->LongLongWidth = 64;
706 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000707 this->SizeType = TargetInfo::UnsignedInt;
708 this->PtrDiffType = TargetInfo::SignedInt;
709 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000710 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000711 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000712 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000713 this->DescriptionString =
714 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000715 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000716 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000717 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000718 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 } else if (Triple.getArch() == llvm::Triple::mipsel) {
720 // Handled on mips' setDescriptionString.
721 } else {
722 assert(Triple.getArch() == llvm::Triple::le32);
723 this->DescriptionString = "e-p:32:32-i64:64";
724 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000725 }
726};
Mike Stump11289f42009-09-09 15:08:12 +0000727} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000728
Chris Lattner09d98f52008-10-05 21:50:58 +0000729//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000730// Specific target implementations.
731//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000732
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000733namespace {
734// PPC abstract base class
735class PPCTargetInfo : public TargetInfo {
736 static const Builtin::Info BuiltinInfo[];
737 static const char * const GCCRegNames[];
738 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000739 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000740
741 // Target cpu features.
742 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000743 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000744 bool HasP8Crypto;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000745 bool HasQPX;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000746
Ulrich Weigand8afad612014-07-28 13:17:52 +0000747protected:
748 std::string ABI;
749
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000750public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000751 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000752 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000753 HasP8Crypto(false), HasQPX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000754 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000755 LongDoubleWidth = LongDoubleAlign = 128;
756 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
757 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000758
Hal Finkel6b984f02012-07-03 16:51:04 +0000759 /// \brief Flags for architecture specific defines.
760 typedef enum {
761 ArchDefineNone = 0,
762 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
763 ArchDefinePpcgr = 1 << 1,
764 ArchDefinePpcsq = 1 << 2,
765 ArchDefine440 = 1 << 3,
766 ArchDefine603 = 1 << 4,
767 ArchDefine604 = 1 << 5,
768 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000769 ArchDefinePwr5 = 1 << 7,
770 ArchDefinePwr5x = 1 << 8,
771 ArchDefinePwr6 = 1 << 9,
772 ArchDefinePwr6x = 1 << 10,
773 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000774 ArchDefinePwr8 = 1 << 12,
775 ArchDefineA2 = 1 << 13,
776 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000777 } ArchDefineTypes;
778
Bill Schmidt38378a02013-02-01 20:23:10 +0000779 // Note: GCC recognizes the following additional cpus:
780 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
781 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
782 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000783 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000784 bool CPUKnown = llvm::StringSwitch<bool>(Name)
785 .Case("generic", true)
786 .Case("440", true)
787 .Case("450", true)
788 .Case("601", true)
789 .Case("602", true)
790 .Case("603", true)
791 .Case("603e", true)
792 .Case("603ev", true)
793 .Case("604", true)
794 .Case("604e", true)
795 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000796 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000797 .Case("g3", true)
798 .Case("7400", true)
799 .Case("g4", true)
800 .Case("7450", true)
801 .Case("g4+", true)
802 .Case("750", true)
803 .Case("970", true)
804 .Case("g5", true)
805 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000806 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000807 .Case("e500mc", true)
808 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000809 .Case("power3", true)
810 .Case("pwr3", true)
811 .Case("power4", true)
812 .Case("pwr4", true)
813 .Case("power5", true)
814 .Case("pwr5", true)
815 .Case("power5x", true)
816 .Case("pwr5x", true)
817 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000818 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000819 .Case("power6x", true)
820 .Case("pwr6x", true)
821 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000822 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000823 .Case("power8", true)
824 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000825 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000826 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000827 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000828 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000829 .Case("powerpc64le", true)
830 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000831 .Default(false);
832
833 if (CPUKnown)
834 CPU = Name;
835
836 return CPUKnown;
837 }
838
Ulrich Weigand8afad612014-07-28 13:17:52 +0000839
840 StringRef getABI() const override { return ABI; }
841
Craig Topper3164f332014-03-11 03:39:26 +0000842 void getTargetBuiltins(const Builtin::Info *&Records,
843 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000844 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000845 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000846 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000847
Craig Topper3164f332014-03-11 03:39:26 +0000848 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000849
Craig Topper3164f332014-03-11 03:39:26 +0000850 void getTargetDefines(const LangOptions &Opts,
851 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000852
Craig Topper3164f332014-03-11 03:39:26 +0000853 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000854
Craig Topper3164f332014-03-11 03:39:26 +0000855 bool handleTargetFeatures(std::vector<std::string> &Features,
856 DiagnosticsEngine &Diags) override;
857 bool hasFeature(StringRef Feature) const override;
858
859 void getGCCRegNames(const char * const *&Names,
860 unsigned &NumNames) const override;
861 void getGCCRegAliases(const GCCRegAlias *&Aliases,
862 unsigned &NumAliases) const override;
863 bool validateAsmConstraint(const char *&Name,
864 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000865 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000866 default: return false;
867 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000868 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000869 case 'b': // Base register
870 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000871 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000872 break;
873 // FIXME: The following are added to allow parsing.
874 // I just took a guess at what the actions should be.
875 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000876 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000877 case 'v': // Altivec vector register
878 Info.setAllowsRegister();
879 break;
880 case 'w':
881 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000882 case 'd':// VSX vector register to hold vector double data
883 case 'f':// VSX vector register to hold vector float data
884 case 's':// VSX vector register to hold scalar float data
885 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000886 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000887 break;
888 default:
889 return false;
890 }
891 Info.setAllowsRegister();
892 Name++; // Skip over 'w'.
893 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000894 case 'h': // `MQ', `CTR', or `LINK' register
895 case 'q': // `MQ' register
896 case 'c': // `CTR' register
897 case 'l': // `LINK' register
898 case 'x': // `CR' register (condition register) number 0
899 case 'y': // `CR' register (condition register)
900 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000901 Info.setAllowsRegister();
902 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000903 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000904 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000905 // (use `L' instead for SImode constants)
906 case 'K': // Unsigned 16-bit constant
907 case 'L': // Signed 16-bit constant shifted left 16 bits
908 case 'M': // Constant larger than 31
909 case 'N': // Exact power of 2
910 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000911 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000912 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000913 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000914 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000915 break;
916 case 'm': // Memory operand. Note that on PowerPC targets, m can
917 // include addresses that update the base register. It
918 // is therefore only safe to use `m' in an asm statement
919 // if that asm statement accesses the operand exactly once.
920 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000921 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000922 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000923 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000924 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000925 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
926 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000927 // register to be updated.
928 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000929 if (Name[1] != 's')
930 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000931 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000932 // include any automodification of the base register. Unlike
933 // `m', this constraint can be used in asm statements that
934 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000935 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000936 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000937 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000938 break;
939 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000940 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000941 case 'Z': // Memory operand that is an indexed or indirect from a
942 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000943 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000944 Info.setAllowsMemory();
945 Info.setAllowsRegister();
946 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000947 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000948 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000949 // register (`p' is preferable for asm statements)
950 case 'S': // Constant suitable as a 64-bit mask operand
951 case 'T': // Constant suitable as a 32-bit mask operand
952 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000953 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000954 // instructions
955 case 'W': // Vector constant that does not require memory
956 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000957 break;
958 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000959 }
John Thompson07a61a42010-06-24 22:44:13 +0000960 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000961 }
Craig Topper3164f332014-03-11 03:39:26 +0000962 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000963 std::string R;
964 switch (*Constraint) {
965 case 'e':
966 case 'w':
967 // Two-character constraint; add "^" hint for later parsing.
968 R = std::string("^") + std::string(Constraint, 2);
969 Constraint++;
970 break;
971 default:
972 return TargetInfo::convertConstraint(Constraint);
973 }
974 return R;
975 }
Craig Topper3164f332014-03-11 03:39:26 +0000976 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000977 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000978 }
Craig Topper3164f332014-03-11 03:39:26 +0000979 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000980 if (RegNo == 0) return 3;
981 if (RegNo == 1) return 4;
982 return -1;
983 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000984};
Anders Carlssonf511f642007-11-27 04:11:28 +0000985
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000986const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000987#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000988#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000989 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000990#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000991};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000992
Eric Christopher917e9522014-11-18 22:36:15 +0000993/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000994/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000995bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000996 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000997 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
998 // Ignore disabled features.
999 if (Features[i][0] == '-')
1000 continue;
1001
1002 StringRef Feature = StringRef(Features[i]).substr(1);
1003
1004 if (Feature == "vsx") {
1005 HasVSX = true;
1006 continue;
1007 }
1008
Bill Schmidt59eb7672014-10-10 15:09:43 +00001009 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001010 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001011 continue;
1012 }
1013
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001014 if (Feature == "crypto") {
1015 HasP8Crypto = true;
1016 continue;
1017 }
1018
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001019 if (Feature == "qpx") {
1020 HasQPX = true;
1021 continue;
1022 }
1023
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001024 // TODO: Finish this list and add an assert that we've handled them
1025 // all.
1026 }
1027
1028 return true;
1029}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001030
Chris Lattnerecd49032009-03-02 22:27:17 +00001031/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1032/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001033void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001034 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001035 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001036 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001037 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001038 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001039 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001040 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001041 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001042 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001043 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001044 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001045 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001046 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001047
Chris Lattnerecd49032009-03-02 22:27:17 +00001048 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001049 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1050 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001051 } else {
1052 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1053 getTriple().getOS() != llvm::Triple::OpenBSD)
1054 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001055 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001056
Ulrich Weigand8afad612014-07-28 13:17:52 +00001057 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001058 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001059 Builder.defineMacro("_CALL_ELF", "1");
1060 if (ABI == "elfv2")
1061 Builder.defineMacro("_CALL_ELF", "2");
1062
Chris Lattnerecd49032009-03-02 22:27:17 +00001063 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001064 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1065 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001066
Chris Lattnerecd49032009-03-02 22:27:17 +00001067 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001068 if (LongDoubleWidth == 128)
1069 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070
John Thompsone467e192009-11-19 17:18:50 +00001071 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001072 Builder.defineMacro("__VEC__", "10206");
1073 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001074 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001075
1076 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001077 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1078 .Case("440", ArchDefineName)
1079 .Case("450", ArchDefineName | ArchDefine440)
1080 .Case("601", ArchDefineName)
1081 .Case("602", ArchDefineName | ArchDefinePpcgr)
1082 .Case("603", ArchDefineName | ArchDefinePpcgr)
1083 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1084 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1085 .Case("604", ArchDefineName | ArchDefinePpcgr)
1086 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1087 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001088 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001089 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1090 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1091 .Case("750", ArchDefineName | ArchDefinePpcgr)
1092 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1093 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001094 .Case("a2", ArchDefineA2)
1095 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001096 .Case("pwr3", ArchDefinePpcgr)
1097 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1098 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1099 | ArchDefinePpcsq)
1100 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1101 | ArchDefinePpcgr | ArchDefinePpcsq)
1102 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1103 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1104 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1105 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1106 | ArchDefinePpcsq)
1107 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1108 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001109 | ArchDefinePpcgr | ArchDefinePpcsq)
1110 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1111 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1112 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001113 .Case("power3", ArchDefinePpcgr)
1114 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1115 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1116 | ArchDefinePpcsq)
1117 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1118 | ArchDefinePpcgr | ArchDefinePpcsq)
1119 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1120 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1121 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1122 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1123 | ArchDefinePpcsq)
1124 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1125 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001126 | ArchDefinePpcgr | ArchDefinePpcsq)
1127 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1128 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1129 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001130 .Default(ArchDefineNone);
1131
1132 if (defs & ArchDefineName)
1133 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1134 if (defs & ArchDefinePpcgr)
1135 Builder.defineMacro("_ARCH_PPCGR");
1136 if (defs & ArchDefinePpcsq)
1137 Builder.defineMacro("_ARCH_PPCSQ");
1138 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001139 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001140 if (defs & ArchDefine603)
1141 Builder.defineMacro("_ARCH_603");
1142 if (defs & ArchDefine604)
1143 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001144 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001145 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001146 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001147 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001148 if (defs & ArchDefinePwr5x)
1149 Builder.defineMacro("_ARCH_PWR5X");
1150 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001151 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001152 if (defs & ArchDefinePwr6x)
1153 Builder.defineMacro("_ARCH_PWR6X");
1154 if (defs & ArchDefinePwr7)
1155 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001156 if (defs & ArchDefinePwr8)
1157 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001158 if (defs & ArchDefineA2)
1159 Builder.defineMacro("_ARCH_A2");
1160 if (defs & ArchDefineA2q) {
1161 Builder.defineMacro("_ARCH_A2Q");
1162 Builder.defineMacro("_ARCH_QP");
1163 }
1164
1165 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1166 Builder.defineMacro("__bg__");
1167 Builder.defineMacro("__THW_BLUEGENE__");
1168 Builder.defineMacro("__bgq__");
1169 Builder.defineMacro("__TOS_BGQ__");
1170 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001171
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001172 if (HasVSX)
1173 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001174 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001175 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001176 if (HasP8Crypto)
1177 Builder.defineMacro("__CRYPTO__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001178
Bill Schmidt38378a02013-02-01 20:23:10 +00001179 // FIXME: The following are not yet generated here by Clang, but are
1180 // generated by GCC:
1181 //
1182 // _SOFT_FLOAT_
1183 // __RECIP_PRECISION__
1184 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001185 // __RECIP__
1186 // __RECIPF__
1187 // __RSQRTE__
1188 // __RSQRTEF__
1189 // _SOFT_DOUBLE_
1190 // __NO_LWSYNC__
1191 // __HAVE_BSWAP__
1192 // __LONGDOUBLE128
1193 // __CMODEL_MEDIUM__
1194 // __CMODEL_LARGE__
1195 // _CALL_SYSV
1196 // _CALL_DARWIN
1197 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001198}
1199
1200void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1201 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1202 .Case("7400", true)
1203 .Case("g4", true)
1204 .Case("7450", true)
1205 .Case("g4+", true)
1206 .Case("970", true)
1207 .Case("g5", true)
1208 .Case("pwr6", true)
1209 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001210 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001211 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001212 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001213 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001214
1215 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001216 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1217 .Case("ppc64le", true)
1218 .Case("pwr8", true)
1219 .Default(false);
1220 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1221 .Case("ppc64le", true)
1222 .Case("pwr8", true)
1223 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001224}
1225
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001226bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001227 return llvm::StringSwitch<bool>(Feature)
1228 .Case("powerpc", true)
1229 .Case("vsx", HasVSX)
1230 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001231 .Case("crypto", HasP8Crypto)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001232 .Case("qpx", HasQPX)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001233 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001234}
Chris Lattner17df24e2008-04-21 18:56:49 +00001235
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001236const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001237 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1238 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1239 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1240 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1241 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1242 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1243 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1244 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001245 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001246 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001247 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001248 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1249 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1250 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1251 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001252 "vrsave", "vscr",
1253 "spe_acc", "spefscr",
1254 "sfp"
1255};
Chris Lattner10a5b382007-01-29 05:24:35 +00001256
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001257void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001258 unsigned &NumNames) const {
1259 Names = GCCRegNames;
1260 NumNames = llvm::array_lengthof(GCCRegNames);
1261}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001262
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001263const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1264 // While some of these aliases do map to different registers
1265 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001266 { { "0" }, "r0" },
1267 { { "1"}, "r1" },
1268 { { "2" }, "r2" },
1269 { { "3" }, "r3" },
1270 { { "4" }, "r4" },
1271 { { "5" }, "r5" },
1272 { { "6" }, "r6" },
1273 { { "7" }, "r7" },
1274 { { "8" }, "r8" },
1275 { { "9" }, "r9" },
1276 { { "10" }, "r10" },
1277 { { "11" }, "r11" },
1278 { { "12" }, "r12" },
1279 { { "13" }, "r13" },
1280 { { "14" }, "r14" },
1281 { { "15" }, "r15" },
1282 { { "16" }, "r16" },
1283 { { "17" }, "r17" },
1284 { { "18" }, "r18" },
1285 { { "19" }, "r19" },
1286 { { "20" }, "r20" },
1287 { { "21" }, "r21" },
1288 { { "22" }, "r22" },
1289 { { "23" }, "r23" },
1290 { { "24" }, "r24" },
1291 { { "25" }, "r25" },
1292 { { "26" }, "r26" },
1293 { { "27" }, "r27" },
1294 { { "28" }, "r28" },
1295 { { "29" }, "r29" },
1296 { { "30" }, "r30" },
1297 { { "31" }, "r31" },
1298 { { "fr0" }, "f0" },
1299 { { "fr1" }, "f1" },
1300 { { "fr2" }, "f2" },
1301 { { "fr3" }, "f3" },
1302 { { "fr4" }, "f4" },
1303 { { "fr5" }, "f5" },
1304 { { "fr6" }, "f6" },
1305 { { "fr7" }, "f7" },
1306 { { "fr8" }, "f8" },
1307 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001308 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001309 { { "fr11" }, "f11" },
1310 { { "fr12" }, "f12" },
1311 { { "fr13" }, "f13" },
1312 { { "fr14" }, "f14" },
1313 { { "fr15" }, "f15" },
1314 { { "fr16" }, "f16" },
1315 { { "fr17" }, "f17" },
1316 { { "fr18" }, "f18" },
1317 { { "fr19" }, "f19" },
1318 { { "fr20" }, "f20" },
1319 { { "fr21" }, "f21" },
1320 { { "fr22" }, "f22" },
1321 { { "fr23" }, "f23" },
1322 { { "fr24" }, "f24" },
1323 { { "fr25" }, "f25" },
1324 { { "fr26" }, "f26" },
1325 { { "fr27" }, "f27" },
1326 { { "fr28" }, "f28" },
1327 { { "fr29" }, "f29" },
1328 { { "fr30" }, "f30" },
1329 { { "fr31" }, "f31" },
1330 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001331};
1332
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001333void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001334 unsigned &NumAliases) const {
1335 Aliases = GCCRegAliases;
1336 NumAliases = llvm::array_lengthof(GCCRegAliases);
1337}
1338} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001339
Chris Lattner5ba61f02006-10-14 07:39:34 +00001340namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001341class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001342public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001343 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001344 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001345
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001346 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001347 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001348 case llvm::Triple::FreeBSD:
1349 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001350 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001351 PtrDiffType = SignedInt;
1352 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001353 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001354 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001355 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001356 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001357
Roman Divacky3ffe7462012-03-13 19:20:17 +00001358 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1359 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001360 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001361 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001362
1363 // PPC32 supports atomics up to 4 bytes.
1364 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001365 }
1366
Craig Topper3164f332014-03-11 03:39:26 +00001367 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001368 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001369 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001370 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001371};
1372} // end anonymous namespace.
1373
Bill Schmidt778d3872013-07-26 01:36:11 +00001374// Note: ABI differences may eventually require us to have a separate
1375// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001376namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001377class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001378public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001379 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001380 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001381 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001382 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001383
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001384 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1385 DescriptionString = "e-m:e-i64:64-n32:64";
1386 ABI = "elfv2";
1387 } else {
1388 DescriptionString = "E-m:e-i64:64-n32:64";
1389 ABI = "elfv1";
1390 }
1391
1392 switch (getTriple().getOS()) {
1393 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001394 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001395 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001396 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001397 case llvm::Triple::NetBSD:
1398 IntMaxType = SignedLongLong;
1399 Int64Type = SignedLongLong;
1400 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001401 default:
1402 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001403 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001404
1405 // PPC64 supports atomics up to 8 bytes.
1406 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001407 }
Craig Topper3164f332014-03-11 03:39:26 +00001408 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001409 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001410 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001411 // PPC64 Linux-specifc ABI options.
1412 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001413 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001414 ABI = Name;
1415 return true;
1416 }
1417 return false;
1418 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001419};
1420} // end anonymous namespace.
1421
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001422
1423namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001424class DarwinPPC32TargetInfo :
1425 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001426public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001427 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1428 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001429 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001430 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001431 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001432 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001433 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001434 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001435 }
Craig Topper3164f332014-03-11 03:39:26 +00001436 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001437 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001438 }
1439};
1440
1441class DarwinPPC64TargetInfo :
1442 public DarwinTargetInfo<PPC64TargetInfo> {
1443public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001444 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1445 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001446 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001447 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001448 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001449 }
1450};
1451} // end anonymous namespace.
1452
Chris Lattner5ba61f02006-10-14 07:39:34 +00001453namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001454 static const unsigned NVPTXAddrSpaceMap[] = {
1455 1, // opencl_global
1456 3, // opencl_local
1457 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001458 // FIXME: generic has to be added to the target
1459 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001460 1, // cuda_device
1461 4, // cuda_constant
1462 3, // cuda_shared
1463 };
1464 class NVPTXTargetInfo : public TargetInfo {
1465 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001466 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001467
1468 // The GPU profiles supported by the NVPTX backend
1469 enum GPUKind {
1470 GK_NONE,
1471 GK_SM20,
1472 GK_SM21,
1473 GK_SM30,
1474 GK_SM35,
1475 } GPU;
1476
Peter Collingbournec947aae2012-05-20 23:28:41 +00001477 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001478 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001479 BigEndian = false;
1480 TLSSupported = false;
1481 LongWidth = LongAlign = 64;
1482 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001483 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001484 // Define available target features
1485 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001486 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001487 // Set the default GPU to sm20
1488 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001489 }
Craig Topper3164f332014-03-11 03:39:26 +00001490 void getTargetDefines(const LangOptions &Opts,
1491 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001492 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001493 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001494 if (Opts.CUDAIsDevice) {
1495 // Set __CUDA_ARCH__ for the GPU specified.
1496 std::string CUDAArchCode;
1497 switch (GPU) {
1498 case GK_SM20:
1499 CUDAArchCode = "200";
1500 break;
1501 case GK_SM21:
1502 CUDAArchCode = "210";
1503 break;
1504 case GK_SM30:
1505 CUDAArchCode = "300";
1506 break;
1507 case GK_SM35:
1508 CUDAArchCode = "350";
1509 break;
1510 default:
1511 llvm_unreachable("Unhandled target CPU");
1512 }
1513 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1514 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001515 }
Craig Topper3164f332014-03-11 03:39:26 +00001516 void getTargetBuiltins(const Builtin::Info *&Records,
1517 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001518 Records = BuiltinInfo;
1519 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001520 }
Craig Topper3164f332014-03-11 03:39:26 +00001521 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001522 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001523 }
Craig Topper3164f332014-03-11 03:39:26 +00001524
1525 void getGCCRegNames(const char * const *&Names,
1526 unsigned &NumNames) const override;
1527 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1528 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001529 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001530 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001531 NumAliases = 0;
1532 }
Eric Christopher917e9522014-11-18 22:36:15 +00001533 bool
1534 validateAsmConstraint(const char *&Name,
1535 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001536 switch (*Name) {
1537 default: return false;
1538 case 'c':
1539 case 'h':
1540 case 'r':
1541 case 'l':
1542 case 'f':
1543 case 'd':
1544 Info.setAllowsRegister();
1545 return true;
1546 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001547 }
Craig Topper3164f332014-03-11 03:39:26 +00001548 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001549 // FIXME: Is this really right?
1550 return "";
1551 }
Craig Topper3164f332014-03-11 03:39:26 +00001552 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001553 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001554 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001555 }
Craig Topper3164f332014-03-11 03:39:26 +00001556 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001557 GPU = llvm::StringSwitch<GPUKind>(Name)
1558 .Case("sm_20", GK_SM20)
1559 .Case("sm_21", GK_SM21)
1560 .Case("sm_30", GK_SM30)
1561 .Case("sm_35", GK_SM35)
1562 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001563
Reid Klecknerbbc01782014-12-03 21:53:36 +00001564 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001565 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001566 };
1567
1568 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1569#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1570#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1571 ALL_LANGUAGES },
1572#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001573 };
1574
1575 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1576 "r0"
1577 };
1578
1579 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1580 unsigned &NumNames) const {
1581 Names = GCCRegNames;
1582 NumNames = llvm::array_lengthof(GCCRegNames);
1583 }
1584
1585 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1586 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001587 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001588 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001589 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1590 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001591 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001592 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001593 };
1594
1595 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1596 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001597 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001598 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001599 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1600 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001601 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001602 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001603 };
1604}
1605
1606namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001607
1608static const unsigned R600AddrSpaceMap[] = {
1609 1, // opencl_global
1610 3, // opencl_local
1611 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001612 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001613 1, // cuda_device
1614 2, // cuda_constant
1615 3 // cuda_shared
1616};
1617
Tom Stellarda96344b2014-08-21 13:58:40 +00001618// If you edit the description strings, make sure you update
1619// getPointerWidthV().
1620
Tom Stellardc74b1e02013-03-04 17:40:53 +00001621static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001622 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1623 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001624
1625static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001626 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1627 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001628
1629static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001630 "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 +00001631 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1632 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001633
Eli Friedmand13b41e2012-10-12 23:32:00 +00001634class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001635 static const Builtin::Info BuiltinInfo[];
1636
Tom Stellardc74b1e02013-03-04 17:40:53 +00001637 /// \brief The GPU profiles supported by the R600 target.
1638 enum GPUKind {
1639 GK_NONE,
1640 GK_R600,
1641 GK_R600_DOUBLE_OPS,
1642 GK_R700,
1643 GK_R700_DOUBLE_OPS,
1644 GK_EVERGREEN,
1645 GK_EVERGREEN_DOUBLE_OPS,
1646 GK_NORTHERN_ISLANDS,
1647 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001648 GK_SOUTHERN_ISLANDS,
1649 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001650 } GPU;
1651
Eli Friedmand13b41e2012-10-12 23:32:00 +00001652public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001653 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001654 : TargetInfo(Triple) {
1655
1656 if (Triple.getArch() == llvm::Triple::amdgcn) {
1657 DescriptionString = DescriptionStringSI;
1658 GPU = GK_SOUTHERN_ISLANDS;
1659 } else {
1660 DescriptionString = DescriptionStringR600;
1661 GPU = GK_R600;
1662 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001663 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001664 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001665 }
1666
Tom Stellarda96344b2014-08-21 13:58:40 +00001667 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1668 if (GPU <= GK_CAYMAN)
1669 return 32;
1670
1671 switch(AddrSpace) {
1672 default:
1673 return 64;
1674 case 0:
1675 case 3:
1676 case 5:
1677 return 32;
1678 }
1679 }
1680
Craig Topper3164f332014-03-11 03:39:26 +00001681 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001682 return "";
1683 }
1684
Craig Topper3164f332014-03-11 03:39:26 +00001685 void getGCCRegNames(const char * const *&Names,
1686 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001687 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001688 numNames = 0;
1689 }
1690
Craig Topper3164f332014-03-11 03:39:26 +00001691 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1692 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001693 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001694 NumAliases = 0;
1695 }
1696
Craig Topper3164f332014-03-11 03:39:26 +00001697 bool validateAsmConstraint(const char *&Name,
1698 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001699 return true;
1700 }
1701
Craig Topper3164f332014-03-11 03:39:26 +00001702 void getTargetBuiltins(const Builtin::Info *&Records,
1703 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001704 Records = BuiltinInfo;
1705 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001706 }
1707
Craig Topper3164f332014-03-11 03:39:26 +00001708 void getTargetDefines(const LangOptions &Opts,
1709 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001710 Builder.defineMacro("__R600__");
Tom Stellardfded50f2015-02-27 15:10:19 +00001711 if (GPU >= GK_SOUTHERN_ISLANDS && Opts.OpenCL)
1712 Builder.defineMacro("cl_khr_fp64");
Eli Friedmand13b41e2012-10-12 23:32:00 +00001713 }
1714
Craig Topper3164f332014-03-11 03:39:26 +00001715 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001716 return TargetInfo::CharPtrBuiltinVaList;
1717 }
1718
Craig Topper3164f332014-03-11 03:39:26 +00001719 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001720 GPU = llvm::StringSwitch<GPUKind>(Name)
1721 .Case("r600" , GK_R600)
1722 .Case("rv610", GK_R600)
1723 .Case("rv620", GK_R600)
1724 .Case("rv630", GK_R600)
1725 .Case("rv635", GK_R600)
1726 .Case("rs780", GK_R600)
1727 .Case("rs880", GK_R600)
1728 .Case("rv670", GK_R600_DOUBLE_OPS)
1729 .Case("rv710", GK_R700)
1730 .Case("rv730", GK_R700)
1731 .Case("rv740", GK_R700_DOUBLE_OPS)
1732 .Case("rv770", GK_R700_DOUBLE_OPS)
1733 .Case("palm", GK_EVERGREEN)
1734 .Case("cedar", GK_EVERGREEN)
1735 .Case("sumo", GK_EVERGREEN)
1736 .Case("sumo2", GK_EVERGREEN)
1737 .Case("redwood", GK_EVERGREEN)
1738 .Case("juniper", GK_EVERGREEN)
1739 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1740 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1741 .Case("barts", GK_NORTHERN_ISLANDS)
1742 .Case("turks", GK_NORTHERN_ISLANDS)
1743 .Case("caicos", GK_NORTHERN_ISLANDS)
1744 .Case("cayman", GK_CAYMAN)
1745 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001746 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001747 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1748 .Case("verde", GK_SOUTHERN_ISLANDS)
1749 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001750 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001751 .Case("bonaire", GK_SEA_ISLANDS)
1752 .Case("kabini", GK_SEA_ISLANDS)
1753 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001754 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001755 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001756 .Default(GK_NONE);
1757
1758 if (GPU == GK_NONE) {
1759 return false;
1760 }
1761
1762 // Set the correct data layout
1763 switch (GPU) {
1764 case GK_NONE:
1765 case GK_R600:
1766 case GK_R700:
1767 case GK_EVERGREEN:
1768 case GK_NORTHERN_ISLANDS:
1769 DescriptionString = DescriptionStringR600;
1770 break;
1771 case GK_R600_DOUBLE_OPS:
1772 case GK_R700_DOUBLE_OPS:
1773 case GK_EVERGREEN_DOUBLE_OPS:
1774 case GK_CAYMAN:
1775 DescriptionString = DescriptionStringR600DoubleOps;
1776 break;
1777 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001778 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001779 DescriptionString = DescriptionStringSI;
1780 break;
1781 }
1782
1783 return true;
1784 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001785};
1786
Matt Arsenault56f008d2014-06-24 20:45:01 +00001787const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1788#define BUILTIN(ID, TYPE, ATTRS) \
1789 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1790#include "clang/Basic/BuiltinsR600.def"
1791};
1792
Eli Friedmand13b41e2012-10-12 23:32:00 +00001793} // end anonymous namespace
1794
1795namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001796// Namespace for x86 abstract base class
1797const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001798#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001799#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001800 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001801#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001802};
Eli Friedmanb5366062008-05-20 14:21:01 +00001803
Nuno Lopescfca1f02009-12-23 17:49:57 +00001804static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001805 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1806 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001807 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001808 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1809 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1810 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001811 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001812 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1813 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001814};
1815
Eric Christophercdd36352011-06-21 00:05:20 +00001816const TargetInfo::AddlRegName AddlRegNames[] = {
1817 { { "al", "ah", "eax", "rax" }, 0 },
1818 { { "bl", "bh", "ebx", "rbx" }, 3 },
1819 { { "cl", "ch", "ecx", "rcx" }, 2 },
1820 { { "dl", "dh", "edx", "rdx" }, 1 },
1821 { { "esi", "rsi" }, 4 },
1822 { { "edi", "rdi" }, 5 },
1823 { { "esp", "rsp" }, 7 },
1824 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001825};
1826
1827// X86 target abstract base class; x86-32 and x86-64 are very close, so
1828// most of the implementation can be shared.
1829class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001830 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001831 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001832 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001833 enum MMX3DNowEnum {
1834 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1835 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001836 enum XOPEnum {
1837 NoXOP,
1838 SSE4A,
1839 FMA4,
1840 XOP
1841 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001842
Eric Christophere1ddaf92010-04-02 23:50:19 +00001843 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001844 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001845 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001846 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001847 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001848 bool HasBMI;
1849 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001850 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001851 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001852 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001853 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001854 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001855 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001856 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001857 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001858 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1859 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001860 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001861 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001862
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001863 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1864 ///
1865 /// Each enumeration represents a particular CPU supported by Clang. These
1866 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1867 enum CPUKind {
1868 CK_Generic,
1869
1870 /// \name i386
1871 /// i386-generation processors.
1872 //@{
1873 CK_i386,
1874 //@}
1875
1876 /// \name i486
1877 /// i486-generation processors.
1878 //@{
1879 CK_i486,
1880 CK_WinChipC6,
1881 CK_WinChip2,
1882 CK_C3,
1883 //@}
1884
1885 /// \name i586
1886 /// i586-generation processors, P5 microarchitecture based.
1887 //@{
1888 CK_i586,
1889 CK_Pentium,
1890 CK_PentiumMMX,
1891 //@}
1892
1893 /// \name i686
1894 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1895 //@{
1896 CK_i686,
1897 CK_PentiumPro,
1898 CK_Pentium2,
1899 CK_Pentium3,
1900 CK_Pentium3M,
1901 CK_PentiumM,
1902 CK_C3_2,
1903
1904 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1905 /// Clang however has some logic to suport this.
1906 // FIXME: Warn, deprecate, and potentially remove this.
1907 CK_Yonah,
1908 //@}
1909
1910 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001911 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001912 //@{
1913 CK_Pentium4,
1914 CK_Pentium4M,
1915 CK_Prescott,
1916 CK_Nocona,
1917 //@}
1918
1919 /// \name Core
1920 /// Core microarchitecture based processors.
1921 //@{
1922 CK_Core2,
1923
1924 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1925 /// codename which GCC no longer accepts as an option to -march, but Clang
1926 /// has some logic for recognizing it.
1927 // FIXME: Warn, deprecate, and potentially remove this.
1928 CK_Penryn,
1929 //@}
1930
1931 /// \name Atom
1932 /// Atom processors
1933 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001934 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001935 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001936 //@}
1937
1938 /// \name Nehalem
1939 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001940 CK_Nehalem,
1941
1942 /// \name Westmere
1943 /// Westmere microarchitecture based processors.
1944 CK_Westmere,
1945
1946 /// \name Sandy Bridge
1947 /// Sandy Bridge microarchitecture based processors.
1948 CK_SandyBridge,
1949
1950 /// \name Ivy Bridge
1951 /// Ivy Bridge microarchitecture based processors.
1952 CK_IvyBridge,
1953
1954 /// \name Haswell
1955 /// Haswell microarchitecture based processors.
1956 CK_Haswell,
1957
1958 /// \name Broadwell
1959 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001960 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001961
1962 /// \name Skylake
1963 /// Skylake microarchitecture based processors.
1964 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001965
Craig Topper449314e2013-08-20 07:09:39 +00001966 /// \name Knights Landing
1967 /// Knights Landing processor.
1968 CK_KNL,
1969
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001970 /// \name K6
1971 /// K6 architecture processors.
1972 //@{
1973 CK_K6,
1974 CK_K6_2,
1975 CK_K6_3,
1976 //@}
1977
1978 /// \name K7
1979 /// K7 architecture processors.
1980 //@{
1981 CK_Athlon,
1982 CK_AthlonThunderbird,
1983 CK_Athlon4,
1984 CK_AthlonXP,
1985 CK_AthlonMP,
1986 //@}
1987
1988 /// \name K8
1989 /// K8 architecture processors.
1990 //@{
1991 CK_Athlon64,
1992 CK_Athlon64SSE3,
1993 CK_AthlonFX,
1994 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001995 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001996 CK_Opteron,
1997 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001998 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001999 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002000
Benjamin Kramer569f2152012-01-10 11:50:18 +00002001 /// \name Bobcat
2002 /// Bobcat architecture processors.
2003 //@{
2004 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002005 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002006 //@}
2007
2008 /// \name Bulldozer
2009 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002010 //@{
2011 CK_BDVER1,
2012 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002013 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002014 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002015 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002016
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002017 /// This specification is deprecated and will be removed in the future.
2018 /// Users should prefer \see CK_K8.
2019 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002020 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002021 CK_x86_64,
2022 //@}
2023
2024 /// \name Geode
2025 /// Geode processors.
2026 //@{
2027 CK_Geode
2028 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002029 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002030
Rafael Espindolaeb265472013-08-21 21:59:03 +00002031 enum FPMathKind {
2032 FP_Default,
2033 FP_SSE,
2034 FP_387
2035 } FPMath;
2036
Eli Friedman3fd920a2008-08-20 02:34:37 +00002037public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002038 X86TargetInfo(const llvm::Triple &Triple)
2039 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002040 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002041 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2042 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2043 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2044 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2045 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2046 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002047 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002048 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002049 }
Craig Topper3164f332014-03-11 03:39:26 +00002050 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002051 // X87 evaluates with 80 bits "long double" precision.
2052 return SSELevel == NoSSE ? 2 : 0;
2053 }
Craig Topper3164f332014-03-11 03:39:26 +00002054 void getTargetBuiltins(const Builtin::Info *&Records,
2055 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002056 Records = BuiltinInfo;
2057 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002058 }
Craig Topper3164f332014-03-11 03:39:26 +00002059 void getGCCRegNames(const char * const *&Names,
2060 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002061 Names = GCCRegNames;
2062 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002063 }
Craig Topper3164f332014-03-11 03:39:26 +00002064 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2065 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002066 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002067 NumAliases = 0;
2068 }
Craig Topper3164f332014-03-11 03:39:26 +00002069 void getGCCAddlRegNames(const AddlRegName *&Names,
2070 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002071 Names = AddlRegNames;
2072 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002073 }
Craig Topper3164f332014-03-11 03:39:26 +00002074 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002075 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002076
Akira Hatanaka974131e2014-09-18 18:17:18 +00002077 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2078
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002079 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2080
Akira Hatanaka974131e2014-09-18 18:17:18 +00002081 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2082
Craig Topper3164f332014-03-11 03:39:26 +00002083 std::string convertConstraint(const char *&Constraint) const override;
2084 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002085 return "~{dirflag},~{fpsr},~{flags}";
2086 }
Craig Topper3164f332014-03-11 03:39:26 +00002087 void getTargetDefines(const LangOptions &Opts,
2088 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002089 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2090 bool Enabled);
2091 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2092 bool Enabled);
2093 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2094 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002095 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2096 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002097 setFeatureEnabledImpl(Features, Name, Enabled);
2098 }
2099 // This exists purely to cut down on the number of virtual calls in
2100 // getDefaultFeatures which calls this repeatedly.
2101 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2102 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002103 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2104 bool hasFeature(StringRef Feature) const override;
2105 bool handleTargetFeatures(std::vector<std::string> &Features,
2106 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002107 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002108 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002109 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002110 else if (getTriple().getArch() == llvm::Triple::x86 &&
2111 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002112 return "no-mmx";
2113 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002114 }
Craig Topper3164f332014-03-11 03:39:26 +00002115 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002116 CPU = llvm::StringSwitch<CPUKind>(Name)
2117 .Case("i386", CK_i386)
2118 .Case("i486", CK_i486)
2119 .Case("winchip-c6", CK_WinChipC6)
2120 .Case("winchip2", CK_WinChip2)
2121 .Case("c3", CK_C3)
2122 .Case("i586", CK_i586)
2123 .Case("pentium", CK_Pentium)
2124 .Case("pentium-mmx", CK_PentiumMMX)
2125 .Case("i686", CK_i686)
2126 .Case("pentiumpro", CK_PentiumPro)
2127 .Case("pentium2", CK_Pentium2)
2128 .Case("pentium3", CK_Pentium3)
2129 .Case("pentium3m", CK_Pentium3M)
2130 .Case("pentium-m", CK_PentiumM)
2131 .Case("c3-2", CK_C3_2)
2132 .Case("yonah", CK_Yonah)
2133 .Case("pentium4", CK_Pentium4)
2134 .Case("pentium4m", CK_Pentium4M)
2135 .Case("prescott", CK_Prescott)
2136 .Case("nocona", CK_Nocona)
2137 .Case("core2", CK_Core2)
2138 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002139 .Case("bonnell", CK_Bonnell)
2140 .Case("atom", CK_Bonnell) // Legacy name.
2141 .Case("silvermont", CK_Silvermont)
2142 .Case("slm", CK_Silvermont) // Legacy name.
2143 .Case("nehalem", CK_Nehalem)
2144 .Case("corei7", CK_Nehalem) // Legacy name.
2145 .Case("westmere", CK_Westmere)
2146 .Case("sandybridge", CK_SandyBridge)
2147 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2148 .Case("ivybridge", CK_IvyBridge)
2149 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2150 .Case("haswell", CK_Haswell)
2151 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002152 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002153 .Case("skylake", CK_Skylake)
2154 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002155 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002156 .Case("k6", CK_K6)
2157 .Case("k6-2", CK_K6_2)
2158 .Case("k6-3", CK_K6_3)
2159 .Case("athlon", CK_Athlon)
2160 .Case("athlon-tbird", CK_AthlonThunderbird)
2161 .Case("athlon-4", CK_Athlon4)
2162 .Case("athlon-xp", CK_AthlonXP)
2163 .Case("athlon-mp", CK_AthlonMP)
2164 .Case("athlon64", CK_Athlon64)
2165 .Case("athlon64-sse3", CK_Athlon64SSE3)
2166 .Case("athlon-fx", CK_AthlonFX)
2167 .Case("k8", CK_K8)
2168 .Case("k8-sse3", CK_K8SSE3)
2169 .Case("opteron", CK_Opteron)
2170 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002171 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002172 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002173 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002174 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002175 .Case("bdver1", CK_BDVER1)
2176 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002177 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002178 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002179 .Case("x86-64", CK_x86_64)
2180 .Case("geode", CK_Geode)
2181 .Default(CK_Generic);
2182
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002183 // Perform any per-CPU checks necessary to determine if this CPU is
2184 // acceptable.
2185 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2186 // invalid without explaining *why*.
2187 switch (CPU) {
2188 case CK_Generic:
2189 // No processor selected!
2190 return false;
2191
2192 case CK_i386:
2193 case CK_i486:
2194 case CK_WinChipC6:
2195 case CK_WinChip2:
2196 case CK_C3:
2197 case CK_i586:
2198 case CK_Pentium:
2199 case CK_PentiumMMX:
2200 case CK_i686:
2201 case CK_PentiumPro:
2202 case CK_Pentium2:
2203 case CK_Pentium3:
2204 case CK_Pentium3M:
2205 case CK_PentiumM:
2206 case CK_Yonah:
2207 case CK_C3_2:
2208 case CK_Pentium4:
2209 case CK_Pentium4M:
2210 case CK_Prescott:
2211 case CK_K6:
2212 case CK_K6_2:
2213 case CK_K6_3:
2214 case CK_Athlon:
2215 case CK_AthlonThunderbird:
2216 case CK_Athlon4:
2217 case CK_AthlonXP:
2218 case CK_AthlonMP:
2219 case CK_Geode:
2220 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002221 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002222 return false;
2223
2224 // Fallthrough
2225 case CK_Nocona:
2226 case CK_Core2:
2227 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002228 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002229 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002230 case CK_Nehalem:
2231 case CK_Westmere:
2232 case CK_SandyBridge:
2233 case CK_IvyBridge:
2234 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002235 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002236 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002237 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002238 case CK_Athlon64:
2239 case CK_Athlon64SSE3:
2240 case CK_AthlonFX:
2241 case CK_K8:
2242 case CK_K8SSE3:
2243 case CK_Opteron:
2244 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002245 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002246 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002247 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002248 case CK_BDVER1:
2249 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002250 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002251 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002252 case CK_x86_64:
2253 return true;
2254 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002255 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002256 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002257
Craig Topper3164f332014-03-11 03:39:26 +00002258 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002259
Craig Topper3164f332014-03-11 03:39:26 +00002260 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002261 // We accept all non-ARM calling conventions
2262 return (CC == CC_X86ThisCall ||
2263 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002264 CC == CC_X86StdCall ||
2265 CC == CC_X86VectorCall ||
2266 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002267 CC == CC_X86Pascal ||
2268 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002269 }
2270
Craig Topper3164f332014-03-11 03:39:26 +00002271 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002272 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002273 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002274};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002275
Rafael Espindolaeb265472013-08-21 21:59:03 +00002276bool X86TargetInfo::setFPMath(StringRef Name) {
2277 if (Name == "387") {
2278 FPMath = FP_387;
2279 return true;
2280 }
2281 if (Name == "sse") {
2282 FPMath = FP_SSE;
2283 return true;
2284 }
2285 return false;
2286}
2287
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002288void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002289 // FIXME: This *really* should not be here.
2290
2291 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002292 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002293 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002294
Chandler Carruth212334f2011-09-28 08:55:37 +00002295 switch (CPU) {
2296 case CK_Generic:
2297 case CK_i386:
2298 case CK_i486:
2299 case CK_i586:
2300 case CK_Pentium:
2301 case CK_i686:
2302 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002303 break;
2304 case CK_PentiumMMX:
2305 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002306 case CK_K6:
2307 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002308 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002309 break;
2310 case CK_Pentium3:
2311 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002312 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002313 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002314 break;
2315 case CK_PentiumM:
2316 case CK_Pentium4:
2317 case CK_Pentium4M:
2318 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002319 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002320 break;
2321 case CK_Yonah:
2322 case CK_Prescott:
2323 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002324 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002325 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002326 break;
2327 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002328 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002329 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002330 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002331 break;
2332 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002333 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002334 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002335 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002336 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002337 setFeatureEnabledImpl(Features, "avx512f", true);
2338 setFeatureEnabledImpl(Features, "avx512cd", true);
2339 setFeatureEnabledImpl(Features, "avx512dq", true);
2340 setFeatureEnabledImpl(Features, "avx512bw", true);
2341 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002342 // FALLTHROUGH
2343 case CK_Broadwell:
2344 setFeatureEnabledImpl(Features, "rdseed", true);
2345 setFeatureEnabledImpl(Features, "adx", true);
2346 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002347 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002348 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002349 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002350 setFeatureEnabledImpl(Features, "bmi", true);
2351 setFeatureEnabledImpl(Features, "bmi2", true);
2352 setFeatureEnabledImpl(Features, "rtm", true);
2353 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002354 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002355 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002356 setFeatureEnabledImpl(Features, "rdrnd", true);
2357 setFeatureEnabledImpl(Features, "f16c", true);
2358 setFeatureEnabledImpl(Features, "fsgsbase", true);
2359 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002360 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002361 setFeatureEnabledImpl(Features, "avx", true);
2362 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002363 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002364 case CK_Silvermont:
2365 setFeatureEnabledImpl(Features, "aes", true);
2366 setFeatureEnabledImpl(Features, "pclmul", true);
2367 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002368 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002369 setFeatureEnabledImpl(Features, "sse4.2", true);
2370 setFeatureEnabledImpl(Features, "cx16", true);
2371 break;
2372 case CK_KNL:
2373 setFeatureEnabledImpl(Features, "avx512f", true);
2374 setFeatureEnabledImpl(Features, "avx512cd", true);
2375 setFeatureEnabledImpl(Features, "avx512er", true);
2376 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002377 setFeatureEnabledImpl(Features, "rdseed", true);
2378 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002379 setFeatureEnabledImpl(Features, "lzcnt", true);
2380 setFeatureEnabledImpl(Features, "bmi", true);
2381 setFeatureEnabledImpl(Features, "bmi2", true);
2382 setFeatureEnabledImpl(Features, "rtm", true);
2383 setFeatureEnabledImpl(Features, "fma", true);
2384 setFeatureEnabledImpl(Features, "rdrnd", true);
2385 setFeatureEnabledImpl(Features, "f16c", true);
2386 setFeatureEnabledImpl(Features, "fsgsbase", true);
2387 setFeatureEnabledImpl(Features, "aes", true);
2388 setFeatureEnabledImpl(Features, "pclmul", true);
2389 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002390 break;
2391 case CK_K6_2:
2392 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002393 case CK_WinChip2:
2394 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002395 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002396 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002397 case CK_Athlon:
2398 case CK_AthlonThunderbird:
2399 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002400 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002401 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002402 case CK_Athlon4:
2403 case CK_AthlonXP:
2404 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002405 setFeatureEnabledImpl(Features, "sse", true);
2406 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002407 break;
2408 case CK_K8:
2409 case CK_Opteron:
2410 case CK_Athlon64:
2411 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002412 setFeatureEnabledImpl(Features, "sse2", true);
2413 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002414 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002415 case CK_AMDFAM10:
2416 setFeatureEnabledImpl(Features, "sse4a", true);
2417 setFeatureEnabledImpl(Features, "lzcnt", true);
2418 setFeatureEnabledImpl(Features, "popcnt", true);
2419 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002420 case CK_K8SSE3:
2421 case CK_OpteronSSE3:
2422 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002423 setFeatureEnabledImpl(Features, "sse3", true);
2424 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002425 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002426 case CK_BTVER2:
2427 setFeatureEnabledImpl(Features, "avx", true);
2428 setFeatureEnabledImpl(Features, "aes", true);
2429 setFeatureEnabledImpl(Features, "pclmul", true);
2430 setFeatureEnabledImpl(Features, "bmi", true);
2431 setFeatureEnabledImpl(Features, "f16c", true);
2432 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002433 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002434 setFeatureEnabledImpl(Features, "ssse3", true);
2435 setFeatureEnabledImpl(Features, "sse4a", true);
2436 setFeatureEnabledImpl(Features, "lzcnt", true);
2437 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002438 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002439 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002440 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002441 case CK_BDVER4:
2442 setFeatureEnabledImpl(Features, "avx2", true);
2443 setFeatureEnabledImpl(Features, "bmi2", true);
2444 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002445 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002446 setFeatureEnabledImpl(Features, "fsgsbase", true);
2447 // FALLTHROUGH
2448 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002449 setFeatureEnabledImpl(Features, "bmi", true);
2450 setFeatureEnabledImpl(Features, "fma", true);
2451 setFeatureEnabledImpl(Features, "f16c", true);
2452 setFeatureEnabledImpl(Features, "tbm", true);
2453 // FALLTHROUGH
2454 case CK_BDVER1:
2455 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002456 setFeatureEnabledImpl(Features, "xop", true);
2457 setFeatureEnabledImpl(Features, "lzcnt", true);
2458 setFeatureEnabledImpl(Features, "aes", true);
2459 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002460 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002461 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002462 break;
Eli Friedman33465822011-07-08 23:31:17 +00002463 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002464}
2465
Rafael Espindolae62e2792013-08-20 13:44:29 +00002466void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002467 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002468 if (Enabled) {
2469 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002470 case AVX512F:
2471 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002472 case AVX2:
2473 Features["avx2"] = true;
2474 case AVX:
2475 Features["avx"] = true;
2476 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002477 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002478 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002479 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002480 case SSSE3:
2481 Features["ssse3"] = true;
2482 case SSE3:
2483 Features["sse3"] = true;
2484 case SSE2:
2485 Features["sse2"] = true;
2486 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002487 Features["sse"] = true;
2488 case NoSSE:
2489 break;
2490 }
2491 return;
2492 }
2493
2494 switch (Level) {
2495 case NoSSE:
2496 case SSE1:
2497 Features["sse"] = false;
2498 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002499 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2500 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002501 case SSE3:
2502 Features["sse3"] = false;
2503 setXOPLevel(Features, NoXOP, false);
2504 case SSSE3:
2505 Features["ssse3"] = false;
2506 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002507 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002508 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002509 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002510 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002511 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002512 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002513 case AVX2:
2514 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002515 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002516 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002517 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2518 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002519 }
2520}
2521
2522void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002523 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002524 if (Enabled) {
2525 switch (Level) {
2526 case AMD3DNowAthlon:
2527 Features["3dnowa"] = true;
2528 case AMD3DNow:
2529 Features["3dnow"] = true;
2530 case MMX:
2531 Features["mmx"] = true;
2532 case NoMMX3DNow:
2533 break;
2534 }
2535 return;
2536 }
2537
2538 switch (Level) {
2539 case NoMMX3DNow:
2540 case MMX:
2541 Features["mmx"] = false;
2542 case AMD3DNow:
2543 Features["3dnow"] = false;
2544 case AMD3DNowAthlon:
2545 Features["3dnowa"] = false;
2546 }
2547}
2548
2549void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002550 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002551 if (Enabled) {
2552 switch (Level) {
2553 case XOP:
2554 Features["xop"] = true;
2555 case FMA4:
2556 Features["fma4"] = true;
2557 setSSELevel(Features, AVX, true);
2558 case SSE4A:
2559 Features["sse4a"] = true;
2560 setSSELevel(Features, SSE3, true);
2561 case NoXOP:
2562 break;
2563 }
2564 return;
2565 }
2566
2567 switch (Level) {
2568 case NoXOP:
2569 case SSE4A:
2570 Features["sse4a"] = false;
2571 case FMA4:
2572 Features["fma4"] = false;
2573 case XOP:
2574 Features["xop"] = false;
2575 }
2576}
2577
Craig Topper86d79ef2013-09-17 04:51:29 +00002578void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2579 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002580 // FIXME: This *really* should not be here. We need some way of translating
2581 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002582 if (Name == "sse4")
2583 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002584
Rafael Espindolae62e2792013-08-20 13:44:29 +00002585 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002586
Craig Topper29561122013-09-19 01:13:07 +00002587 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002588 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002589 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002590 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002591 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002592 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002593 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002594 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002595 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002596 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002597 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002598 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002599 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002600 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002601 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002602 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002603 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002604 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002605 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002606 if (Enabled)
2607 setSSELevel(Features, SSE2, Enabled);
2608 } else if (Name == "pclmul") {
2609 if (Enabled)
2610 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002611 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002612 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002613 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002614 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002615 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002616 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002617 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2618 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002619 if (Enabled)
2620 setSSELevel(Features, AVX512F, Enabled);
2621 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002622 if (Enabled)
2623 setSSELevel(Features, AVX, Enabled);
2624 } else if (Name == "fma4") {
2625 setXOPLevel(Features, FMA4, Enabled);
2626 } else if (Name == "xop") {
2627 setXOPLevel(Features, XOP, Enabled);
2628 } else if (Name == "sse4a") {
2629 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002630 } else if (Name == "f16c") {
2631 if (Enabled)
2632 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002633 } else if (Name == "sha") {
2634 if (Enabled)
2635 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002636 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002637}
2638
Eric Christopher3ff21b32013-10-16 21:26:26 +00002639/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002640/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002641bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002642 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002643 // Remember the maximum enabled sselevel.
2644 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2645 // Ignore disabled features.
2646 if (Features[i][0] == '-')
2647 continue;
2648
Benjamin Kramer27402c62012-03-05 15:10:44 +00002649 StringRef Feature = StringRef(Features[i]).substr(1);
2650
2651 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002652 HasAES = true;
2653 continue;
2654 }
2655
Craig Topper3f122a72012-05-31 05:18:48 +00002656 if (Feature == "pclmul") {
2657 HasPCLMUL = true;
2658 continue;
2659 }
2660
Benjamin Kramer27402c62012-03-05 15:10:44 +00002661 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002662 HasLZCNT = true;
2663 continue;
2664 }
2665
Rafael Espindola89049822013-08-23 20:21:37 +00002666 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002667 HasRDRND = true;
2668 continue;
2669 }
2670
Craig Topper8c7f2512014-11-03 06:51:41 +00002671 if (Feature == "fsgsbase") {
2672 HasFSGSBASE = true;
2673 continue;
2674 }
2675
Benjamin Kramer27402c62012-03-05 15:10:44 +00002676 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002677 HasBMI = true;
2678 continue;
2679 }
2680
Benjamin Kramer27402c62012-03-05 15:10:44 +00002681 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002682 HasBMI2 = true;
2683 continue;
2684 }
2685
Benjamin Kramer27402c62012-03-05 15:10:44 +00002686 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002687 HasPOPCNT = true;
2688 continue;
2689 }
2690
Michael Liao625a8752012-11-10 05:17:46 +00002691 if (Feature == "rtm") {
2692 HasRTM = true;
2693 continue;
2694 }
2695
Michael Liao74f4eaf2013-03-26 17:52:08 +00002696 if (Feature == "prfchw") {
2697 HasPRFCHW = true;
2698 continue;
2699 }
2700
Michael Liaoffaae352013-03-29 05:17:55 +00002701 if (Feature == "rdseed") {
2702 HasRDSEED = true;
2703 continue;
2704 }
2705
Robert Khasanov50e6f582014-09-19 09:53:48 +00002706 if (Feature == "adx") {
2707 HasADX = true;
2708 continue;
2709 }
2710
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002711 if (Feature == "tbm") {
2712 HasTBM = true;
2713 continue;
2714 }
2715
Craig Topperbba778b2012-06-03 21:46:30 +00002716 if (Feature == "fma") {
2717 HasFMA = true;
2718 continue;
2719 }
2720
Manman Rena45358c2012-10-11 00:59:55 +00002721 if (Feature == "f16c") {
2722 HasF16C = true;
2723 continue;
2724 }
2725
Craig Topper679b53a2013-08-21 05:29:10 +00002726 if (Feature == "avx512cd") {
2727 HasAVX512CD = true;
2728 continue;
2729 }
2730
2731 if (Feature == "avx512er") {
2732 HasAVX512ER = true;
2733 continue;
2734 }
2735
2736 if (Feature == "avx512pf") {
2737 HasAVX512PF = true;
2738 continue;
2739 }
2740
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002741 if (Feature == "avx512dq") {
2742 HasAVX512DQ = true;
2743 continue;
2744 }
2745
2746 if (Feature == "avx512bw") {
2747 HasAVX512BW = true;
2748 continue;
2749 }
2750
2751 if (Feature == "avx512vl") {
2752 HasAVX512VL = true;
2753 continue;
2754 }
2755
Ben Langmuir58078d02013-09-19 13:22:04 +00002756 if (Feature == "sha") {
2757 HasSHA = true;
2758 continue;
2759 }
2760
Nick Lewycky50e8f482013-10-05 20:14:27 +00002761 if (Feature == "cx16") {
2762 HasCX16 = true;
2763 continue;
2764 }
2765
Daniel Dunbar979586e2009-11-11 09:38:56 +00002766 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002767 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002768 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002769 .Case("avx2", AVX2)
2770 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002771 .Case("sse4.2", SSE42)
2772 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002773 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002774 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002775 .Case("sse2", SSE2)
2776 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002777 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002778 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002779
Eli Friedman33465822011-07-08 23:31:17 +00002780 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002781 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002782 .Case("3dnowa", AMD3DNowAthlon)
2783 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002784 .Case("mmx", MMX)
2785 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002786 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002787
2788 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2789 .Case("xop", XOP)
2790 .Case("fma4", FMA4)
2791 .Case("sse4a", SSE4A)
2792 .Default(NoXOP);
2793 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002794 }
Eli Friedman33465822011-07-08 23:31:17 +00002795
Craig Topper7481d8a2013-09-10 06:55:47 +00002796 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2797 // Can't do this earlier because we need to be able to explicitly enable
2798 // popcnt and still disable sse4.2.
2799 if (!HasPOPCNT && SSELevel >= SSE42 &&
2800 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2801 HasPOPCNT = true;
2802 Features.push_back("+popcnt");
2803 }
2804
Yunzhong Gao61089362013-10-16 19:07:02 +00002805 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2806 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2807 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2808 HasPRFCHW = true;
2809 Features.push_back("+prfchw");
2810 }
2811
Rafael Espindolaeb265472013-08-21 21:59:03 +00002812 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2813 // matches the selected sse level.
2814 if (FPMath == FP_SSE && SSELevel < SSE1) {
2815 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2816 return false;
2817 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2818 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2819 return false;
2820 }
2821
Eli Friedman33465822011-07-08 23:31:17 +00002822 // Don't tell the backend if we're turning off mmx; it will end up disabling
2823 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002824 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2825 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002826 std::vector<std::string>::iterator it;
2827 it = std::find(Features.begin(), Features.end(), "-mmx");
2828 if (it != Features.end())
2829 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002830 else if (SSELevel > NoSSE)
2831 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002832 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002833}
Chris Lattnerecd49032009-03-02 22:27:17 +00002834
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002835/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2836/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002837void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002838 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002839 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002840 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002841 Builder.defineMacro("__amd64__");
2842 Builder.defineMacro("__amd64");
2843 Builder.defineMacro("__x86_64");
2844 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002845 if (getTriple().getArchName() == "x86_64h") {
2846 Builder.defineMacro("__x86_64h");
2847 Builder.defineMacro("__x86_64h__");
2848 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002849 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002850 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002851 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002852
Chris Lattnerecd49032009-03-02 22:27:17 +00002853 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002854 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2855 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002856 switch (CPU) {
2857 case CK_Generic:
2858 break;
2859 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002860 // The rest are coming from the i386 define above.
2861 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002862 break;
2863 case CK_i486:
2864 case CK_WinChipC6:
2865 case CK_WinChip2:
2866 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002867 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002868 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002869 case CK_PentiumMMX:
2870 Builder.defineMacro("__pentium_mmx__");
2871 Builder.defineMacro("__tune_pentium_mmx__");
2872 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002873 case CK_i586:
2874 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002875 defineCPUMacros(Builder, "i586");
2876 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002877 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002878 case CK_Pentium3:
2879 case CK_Pentium3M:
2880 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002881 Builder.defineMacro("__tune_pentium3__");
2882 // Fallthrough
2883 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002884 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002885 Builder.defineMacro("__tune_pentium2__");
2886 // Fallthrough
2887 case CK_PentiumPro:
2888 Builder.defineMacro("__tune_i686__");
2889 Builder.defineMacro("__tune_pentiumpro__");
2890 // Fallthrough
2891 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002892 Builder.defineMacro("__i686");
2893 Builder.defineMacro("__i686__");
2894 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2895 Builder.defineMacro("__pentiumpro");
2896 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002897 break;
2898 case CK_Pentium4:
2899 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002900 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002901 break;
2902 case CK_Yonah:
2903 case CK_Prescott:
2904 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002905 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002906 break;
2907 case CK_Core2:
2908 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002909 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002910 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002911 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002912 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002913 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002914 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002915 defineCPUMacros(Builder, "slm");
2916 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002917 case CK_Nehalem:
2918 case CK_Westmere:
2919 case CK_SandyBridge:
2920 case CK_IvyBridge:
2921 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002922 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002923 // FIXME: Historically, we defined this legacy name, it would be nice to
2924 // remove it at some point. We've never exposed fine-grained names for
2925 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002926 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002927 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002928 case CK_Skylake:
2929 // FIXME: Historically, we defined this legacy name, it would be nice to
2930 // remove it at some point. This is the only fine-grained CPU macro in the
2931 // main intel CPU line, and it would be better to not have these and force
2932 // people to use ISA macros.
2933 defineCPUMacros(Builder, "skx");
2934 break;
Craig Topper449314e2013-08-20 07:09:39 +00002935 case CK_KNL:
2936 defineCPUMacros(Builder, "knl");
2937 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002938 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002939 Builder.defineMacro("__k6_2__");
2940 Builder.defineMacro("__tune_k6_2__");
2941 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002942 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002943 if (CPU != CK_K6_2) { // In case of fallthrough
2944 // FIXME: GCC may be enabling these in cases where some other k6
2945 // architecture is specified but -m3dnow is explicitly provided. The
2946 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002947 Builder.defineMacro("__k6_3__");
2948 Builder.defineMacro("__tune_k6_3__");
2949 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002950 // Fallthrough
2951 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002952 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002953 break;
2954 case CK_Athlon:
2955 case CK_AthlonThunderbird:
2956 case CK_Athlon4:
2957 case CK_AthlonXP:
2958 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002959 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002960 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002961 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002962 Builder.defineMacro("__tune_athlon_sse__");
2963 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002964 break;
2965 case CK_K8:
2966 case CK_K8SSE3:
2967 case CK_x86_64:
2968 case CK_Opteron:
2969 case CK_OpteronSSE3:
2970 case CK_Athlon64:
2971 case CK_Athlon64SSE3:
2972 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002973 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002974 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002975 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002976 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002977 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002978 case CK_BTVER1:
2979 defineCPUMacros(Builder, "btver1");
2980 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002981 case CK_BTVER2:
2982 defineCPUMacros(Builder, "btver2");
2983 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002984 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002985 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002986 break;
2987 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002988 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002989 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002990 case CK_BDVER3:
2991 defineCPUMacros(Builder, "bdver3");
2992 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002993 case CK_BDVER4:
2994 defineCPUMacros(Builder, "bdver4");
2995 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002996 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002997 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002998 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002999 }
Chris Lattner96e43572009-03-02 22:40:39 +00003000
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003001 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003002 Builder.defineMacro("__REGISTER_PREFIX__", "");
3003
Chris Lattner6df41af2009-04-19 17:32:33 +00003004 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3005 // functions in glibc header files that use FP Stack inline asm which the
3006 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003007 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003008
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003009 if (HasAES)
3010 Builder.defineMacro("__AES__");
3011
Craig Topper3f122a72012-05-31 05:18:48 +00003012 if (HasPCLMUL)
3013 Builder.defineMacro("__PCLMUL__");
3014
Craig Topper22967d42011-12-25 05:06:45 +00003015 if (HasLZCNT)
3016 Builder.defineMacro("__LZCNT__");
3017
Benjamin Kramer1e250392012-07-07 09:39:18 +00003018 if (HasRDRND)
3019 Builder.defineMacro("__RDRND__");
3020
Craig Topper8c7f2512014-11-03 06:51:41 +00003021 if (HasFSGSBASE)
3022 Builder.defineMacro("__FSGSBASE__");
3023
Craig Topper22967d42011-12-25 05:06:45 +00003024 if (HasBMI)
3025 Builder.defineMacro("__BMI__");
3026
3027 if (HasBMI2)
3028 Builder.defineMacro("__BMI2__");
3029
Craig Topper1de83482011-12-29 16:10:46 +00003030 if (HasPOPCNT)
3031 Builder.defineMacro("__POPCNT__");
3032
Michael Liao625a8752012-11-10 05:17:46 +00003033 if (HasRTM)
3034 Builder.defineMacro("__RTM__");
3035
Michael Liao74f4eaf2013-03-26 17:52:08 +00003036 if (HasPRFCHW)
3037 Builder.defineMacro("__PRFCHW__");
3038
Michael Liaoffaae352013-03-29 05:17:55 +00003039 if (HasRDSEED)
3040 Builder.defineMacro("__RDSEED__");
3041
Robert Khasanov50e6f582014-09-19 09:53:48 +00003042 if (HasADX)
3043 Builder.defineMacro("__ADX__");
3044
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003045 if (HasTBM)
3046 Builder.defineMacro("__TBM__");
3047
Rafael Espindolae62e2792013-08-20 13:44:29 +00003048 switch (XOPLevel) {
3049 case XOP:
3050 Builder.defineMacro("__XOP__");
3051 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003052 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003053 case SSE4A:
3054 Builder.defineMacro("__SSE4A__");
3055 case NoXOP:
3056 break;
3057 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003058
Craig Topperbba778b2012-06-03 21:46:30 +00003059 if (HasFMA)
3060 Builder.defineMacro("__FMA__");
3061
Manman Rena45358c2012-10-11 00:59:55 +00003062 if (HasF16C)
3063 Builder.defineMacro("__F16C__");
3064
Craig Topper679b53a2013-08-21 05:29:10 +00003065 if (HasAVX512CD)
3066 Builder.defineMacro("__AVX512CD__");
3067 if (HasAVX512ER)
3068 Builder.defineMacro("__AVX512ER__");
3069 if (HasAVX512PF)
3070 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003071 if (HasAVX512DQ)
3072 Builder.defineMacro("__AVX512DQ__");
3073 if (HasAVX512BW)
3074 Builder.defineMacro("__AVX512BW__");
3075 if (HasAVX512VL)
3076 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003077
Ben Langmuir58078d02013-09-19 13:22:04 +00003078 if (HasSHA)
3079 Builder.defineMacro("__SHA__");
3080
Nick Lewycky50e8f482013-10-05 20:14:27 +00003081 if (HasCX16)
3082 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3083
Chris Lattner96e43572009-03-02 22:40:39 +00003084 // Each case falls through to the previous one here.
3085 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003086 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003087 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003088 case AVX2:
3089 Builder.defineMacro("__AVX2__");
3090 case AVX:
3091 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003092 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003093 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003094 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003095 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003096 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003097 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003098 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003099 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003100 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003101 Builder.defineMacro("__SSE2__");
3102 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003103 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003104 Builder.defineMacro("__SSE__");
3105 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003106 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003107 break;
3108 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003109
Derek Schuffc7dd7222012-10-11 15:52:22 +00003110 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003111 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003112 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003113 case AVX2:
3114 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003115 case SSE42:
3116 case SSE41:
3117 case SSSE3:
3118 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003119 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003120 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003121 break;
3122 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003123 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003124 break;
3125 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003126 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003127 }
3128 }
3129
Anders Carlssone437c682010-01-27 03:47:49 +00003130 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003131 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003132 case AMD3DNowAthlon:
3133 Builder.defineMacro("__3dNOW_A__");
3134 case AMD3DNow:
3135 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003136 case MMX:
3137 Builder.defineMacro("__MMX__");
3138 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003139 break;
3140 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003141
3142 if (CPU >= CK_i486) {
3143 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3144 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3145 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3146 }
3147 if (CPU >= CK_i586)
3148 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003149}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003150
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003151bool X86TargetInfo::hasFeature(StringRef Feature) const {
3152 return llvm::StringSwitch<bool>(Feature)
3153 .Case("aes", HasAES)
3154 .Case("avx", SSELevel >= AVX)
3155 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003156 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003157 .Case("avx512cd", HasAVX512CD)
3158 .Case("avx512er", HasAVX512ER)
3159 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003160 .Case("avx512dq", HasAVX512DQ)
3161 .Case("avx512bw", HasAVX512BW)
3162 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003163 .Case("bmi", HasBMI)
3164 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003165 .Case("cx16", HasCX16)
3166 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003167 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003168 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003169 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003170 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003171 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3172 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3173 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003174 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003175 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003176 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003177 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003178 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003179 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003180 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003181 .Case("sse", SSELevel >= SSE1)
3182 .Case("sse2", SSELevel >= SSE2)
3183 .Case("sse3", SSELevel >= SSE3)
3184 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003185 .Case("sse4.1", SSELevel >= SSE41)
3186 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003187 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003188 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003189 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003190 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3191 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003192 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003193 .Default(false);
3194}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003195
Eli Friedman3fd920a2008-08-20 02:34:37 +00003196bool
Anders Carlsson58436352009-02-28 17:11:49 +00003197X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003198 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003199 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003200 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003201 case 'I':
3202 Info.setRequiresImmediate(0, 31);
3203 return true;
3204 case 'J':
3205 Info.setRequiresImmediate(0, 63);
3206 return true;
3207 case 'K':
3208 Info.setRequiresImmediate(-128, 127);
3209 return true;
3210 case 'L':
3211 // FIXME: properly analyze this constraint:
3212 // must be one of 0xff, 0xffff, or 0xffffffff
3213 return true;
3214 case 'M':
3215 Info.setRequiresImmediate(0, 3);
3216 return true;
3217 case 'N':
3218 Info.setRequiresImmediate(0, 255);
3219 return true;
3220 case 'O':
3221 Info.setRequiresImmediate(0, 127);
3222 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003223 case 'Y': // first letter of a pair:
3224 switch (*(Name+1)) {
3225 default: return false;
3226 case '0': // First SSE register.
3227 case 't': // Any SSE register, when SSE2 is enabled.
3228 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3229 case 'm': // any MMX register, when inter-unit moves enabled.
3230 break; // falls through to setAllowsRegister.
3231 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003232 case 'f': // any x87 floating point stack register.
3233 // Constraint 'f' cannot be used for output operands.
3234 if (Info.ConstraintStr[0] == '=')
3235 return false;
3236
3237 Info.setAllowsRegister();
3238 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003239 case 'a': // eax.
3240 case 'b': // ebx.
3241 case 'c': // ecx.
3242 case 'd': // edx.
3243 case 'S': // esi.
3244 case 'D': // edi.
3245 case 'A': // edx:eax.
3246 case 't': // top of floating point stack.
3247 case 'u': // second from top of floating point stack.
3248 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003249 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003250 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003251 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003252 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3253 case 'l': // "Index" registers: any general register that can be used as an
3254 // index in a base+index memory access.
3255 Info.setAllowsRegister();
3256 return true;
3257 case 'C': // SSE floating point constant.
3258 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003259 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003260 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003261 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003262 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003263 return true;
3264 }
3265}
3266
Akira Hatanaka974131e2014-09-18 18:17:18 +00003267bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3268 unsigned Size) const {
3269 // Strip off constraint modifiers.
3270 while (Constraint[0] == '=' ||
3271 Constraint[0] == '+' ||
3272 Constraint[0] == '&')
3273 Constraint = Constraint.substr(1);
3274
3275 return validateOperandSize(Constraint, Size);
3276}
3277
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003278bool X86TargetInfo::validateInputSize(StringRef Constraint,
3279 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003280 return validateOperandSize(Constraint, Size);
3281}
3282
3283bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3284 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003285 switch (Constraint[0]) {
3286 default: break;
3287 case 'y':
3288 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003289 case 'f':
3290 case 't':
3291 case 'u':
3292 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003293 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003294 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003295 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003296 }
3297
3298 return true;
3299}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003300
Eli Friedman3fd920a2008-08-20 02:34:37 +00003301std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003302X86TargetInfo::convertConstraint(const char *&Constraint) const {
3303 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003304 case 'a': return std::string("{ax}");
3305 case 'b': return std::string("{bx}");
3306 case 'c': return std::string("{cx}");
3307 case 'd': return std::string("{dx}");
3308 case 'S': return std::string("{si}");
3309 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003310 case 'p': // address
3311 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003312 case 't': // top of floating point stack.
3313 return std::string("{st}");
3314 case 'u': // second from top of floating point stack.
3315 return std::string("{st(1)}"); // second from top of floating point stack.
3316 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003317 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003318 }
3319}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003320} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003321
3322namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003323// X86-32 generic target
3324class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003325public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003326 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003327 DoubleAlign = LongLongAlign = 32;
3328 LongDoubleWidth = 96;
3329 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003330 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003331 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003332 SizeType = UnsignedInt;
3333 PtrDiffType = SignedInt;
3334 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003335 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003336
3337 // Use fpret for all types.
3338 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3339 (1 << TargetInfo::Double) |
3340 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003341
3342 // x86-32 has atomics up to 8 bytes
3343 // FIXME: Check that we actually have cmpxchg8b before setting
3344 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3345 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003346 }
Craig Topper3164f332014-03-11 03:39:26 +00003347 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003348 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003349 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003350
Craig Topper3164f332014-03-11 03:39:26 +00003351 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003352 if (RegNo == 0) return 0;
3353 if (RegNo == 1) return 2;
3354 return -1;
3355 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003356 bool validateOperandSize(StringRef Constraint,
3357 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003358 switch (Constraint[0]) {
3359 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003360 case 'R':
3361 case 'q':
3362 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003363 case 'a':
3364 case 'b':
3365 case 'c':
3366 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003367 case 'S':
3368 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003369 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003370 case 'A':
3371 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003372 }
3373
Akira Hatanaka974131e2014-09-18 18:17:18 +00003374 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003375 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003376};
3377} // end anonymous namespace
3378
3379namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003380class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3381public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003382 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3383 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003384
Craig Topper3164f332014-03-11 03:39:26 +00003385 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003386 unsigned Major, Minor, Micro;
3387 getTriple().getOSVersion(Major, Minor, Micro);
3388 // New NetBSD uses the default rounding mode.
3389 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3390 return X86_32TargetInfo::getFloatEvalMethod();
3391 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003392 return 1;
3393 }
3394};
3395} // end anonymous namespace
3396
3397namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003398class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3399public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003400 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3401 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003402 SizeType = UnsignedLong;
3403 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003404 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003405 }
3406};
3407} // end anonymous namespace
3408
3409namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003410class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3411public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003412 BitrigI386TargetInfo(const llvm::Triple &Triple)
3413 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003414 SizeType = UnsignedLong;
3415 IntPtrType = SignedLong;
3416 PtrDiffType = SignedLong;
3417 }
3418};
3419} // end anonymous namespace
3420
3421namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003422class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003423public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003424 DarwinI386TargetInfo(const llvm::Triple &Triple)
3425 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003426 LongDoubleWidth = 128;
3427 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003428 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003429 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003430 SizeType = UnsignedLong;
3431 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003432 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003433 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003434 }
3435
Eli Friedman3fd920a2008-08-20 02:34:37 +00003436};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003437} // end anonymous namespace
3438
3439namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003440// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003441class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003442public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003443 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3444 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003445 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003446 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003447 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003448 }
Craig Topper3164f332014-03-11 03:39:26 +00003449 void getTargetDefines(const LangOptions &Opts,
3450 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003451 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3452 }
3453};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003454
3455// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003456class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003457public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003458 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003459 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003460 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003461 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3462 }
Craig Topper3164f332014-03-11 03:39:26 +00003463 void getTargetDefines(const LangOptions &Opts,
3464 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003465 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3466 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3467 // The value of the following reflects processor type.
3468 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3469 // We lost the original triple, so we use the default.
3470 Builder.defineMacro("_M_IX86", "600");
3471 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003472};
3473} // end anonymous namespace
3474
Reid Kleckner47606832014-04-21 20:58:00 +00003475static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3476 Builder.defineMacro("__MSVCRT__");
3477 Builder.defineMacro("__MINGW32__");
3478
3479 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3480 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3481 // macro anyway for pre-processor compatibility.
3482 if (Opts.MicrosoftExt)
3483 Builder.defineMacro("__declspec", "__declspec");
3484 else
3485 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3486
3487 if (!Opts.MicrosoftExt) {
3488 // Provide macros for all the calling convention keywords. Provide both
3489 // single and double underscore prefixed variants. These are available on
3490 // x64 as well as x86, even though they have no effect.
3491 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3492 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003493 std::string GCCSpelling = "__attribute__((__";
3494 GCCSpelling += CC;
3495 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003496 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3497 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3498 }
3499 }
3500}
3501
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003502namespace {
3503// x86-32 MinGW target
3504class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3505public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003506 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3507 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003508 void getTargetDefines(const LangOptions &Opts,
3509 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003510 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003511 DefineStd(Builder, "WIN32", Opts);
3512 DefineStd(Builder, "WINNT", Opts);
3513 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003514 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003515 }
3516};
3517} // end anonymous namespace
3518
3519namespace {
3520// x86-32 Cygwin target
3521class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3522public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003523 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3524 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003525 TLSSupported = false;
3526 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003527 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003528 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003529 }
Craig Topper3164f332014-03-11 03:39:26 +00003530 void getTargetDefines(const LangOptions &Opts,
3531 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003532 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003533 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003534 Builder.defineMacro("__CYGWIN__");
3535 Builder.defineMacro("__CYGWIN32__");
3536 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003537 if (Opts.CPlusPlus)
3538 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003539 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003540};
3541} // end anonymous namespace
3542
3543namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003544// x86-32 Haiku target
3545class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3546public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003547 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003548 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003549 IntPtrType = SignedLong;
3550 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003551 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003552 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003553 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003554 }
Craig Topper3164f332014-03-11 03:39:26 +00003555 void getTargetDefines(const LangOptions &Opts,
3556 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003557 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3558 Builder.defineMacro("__INTEL__");
3559 Builder.defineMacro("__HAIKU__");
3560 }
3561};
3562} // end anonymous namespace
3563
Douglas Gregor9fabd852011-07-01 22:41:14 +00003564// RTEMS Target
3565template<typename Target>
3566class RTEMSTargetInfo : public OSTargetInfo<Target> {
3567protected:
Craig Topper3164f332014-03-11 03:39:26 +00003568 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3569 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003570 // RTEMS defines; list based off of gcc output
3571
Douglas Gregor9fabd852011-07-01 22:41:14 +00003572 Builder.defineMacro("__rtems__");
3573 Builder.defineMacro("__ELF__");
3574 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003575
Douglas Gregor9fabd852011-07-01 22:41:14 +00003576public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003577 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3578 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003579
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003580 switch (Triple.getArch()) {
3581 default:
3582 case llvm::Triple::x86:
3583 // this->MCountName = ".mcount";
3584 break;
3585 case llvm::Triple::mips:
3586 case llvm::Triple::mipsel:
3587 case llvm::Triple::ppc:
3588 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003589 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003590 // this->MCountName = "_mcount";
3591 break;
3592 case llvm::Triple::arm:
3593 // this->MCountName = "__mcount";
3594 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003595 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003596 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003597};
3598
3599namespace {
3600// x86-32 RTEMS target
3601class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3602public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003603 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003604 SizeType = UnsignedLong;
3605 IntPtrType = SignedLong;
3606 PtrDiffType = SignedLong;
3607 this->UserLabelPrefix = "";
3608 }
Craig Topper3164f332014-03-11 03:39:26 +00003609 void getTargetDefines(const LangOptions &Opts,
3610 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003611 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3612 Builder.defineMacro("__INTEL__");
3613 Builder.defineMacro("__rtems__");
3614 }
3615};
3616} // end anonymous namespace
3617
Chris Lattnerb986aba2010-04-11 19:29:39 +00003618namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003619// x86-64 generic target
3620class X86_64TargetInfo : public X86TargetInfo {
3621public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003622 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003623 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003624 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003625 LongDoubleWidth = 128;
3626 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003627 LargeArrayMinWidth = 128;
3628 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003629 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003630 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3631 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3632 IntPtrType = IsX32 ? SignedInt : SignedLong;
3633 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003634 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003635 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003636
Eric Christopher917e9522014-11-18 22:36:15 +00003637 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003638 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003639 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3640 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003641
3642 // Use fpret only for long double.
3643 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003644
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003645 // Use fp2ret for _Complex long double.
3646 ComplexLongDoubleUsesFP2Ret = true;
3647
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003648 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003649 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003650 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003651 }
Craig Topper3164f332014-03-11 03:39:26 +00003652 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003653 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003654 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003655
Craig Topper3164f332014-03-11 03:39:26 +00003656 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003657 if (RegNo == 0) return 0;
3658 if (RegNo == 1) return 1;
3659 return -1;
3660 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003661
Craig Topper3164f332014-03-11 03:39:26 +00003662 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003663 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003664 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003665 CC == CC_IntelOclBicc ||
3666 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003667 }
3668
Craig Topper3164f332014-03-11 03:39:26 +00003669 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003670 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003671 }
3672
Pavel Chupinfd223e12014-08-04 12:39:43 +00003673 // for x32 we need it here explicitly
3674 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003675};
3676} // end anonymous namespace
3677
3678namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003679// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003680class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003681public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003682 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3683 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003684 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003685 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003686 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003687 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003688 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003689 SizeType = UnsignedLongLong;
3690 PtrDiffType = SignedLongLong;
3691 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003692 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003693 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003694
Craig Topper3164f332014-03-11 03:39:26 +00003695 void getTargetDefines(const LangOptions &Opts,
3696 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003697 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003698 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003699 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003700
Craig Topper3164f332014-03-11 03:39:26 +00003701 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003702 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003703 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003704
Craig Topper3164f332014-03-11 03:39:26 +00003705 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003706 switch (CC) {
3707 case CC_X86StdCall:
3708 case CC_X86ThisCall:
3709 case CC_X86FastCall:
3710 return CCCR_Ignore;
3711 case CC_C:
3712 case CC_X86VectorCall:
3713 case CC_IntelOclBicc:
3714 case CC_X86_64SysV:
3715 return CCCR_OK;
3716 default:
3717 return CCCR_Warning;
3718 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003719 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003720};
3721} // end anonymous namespace
3722
3723namespace {
3724// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003725class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003726public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003727 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003728 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003729 LongDoubleWidth = LongDoubleAlign = 64;
3730 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003731 }
Craig Topper3164f332014-03-11 03:39:26 +00003732 void getTargetDefines(const LangOptions &Opts,
3733 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003734 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3735 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003736 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003737 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003738 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003739};
3740} // end anonymous namespace
3741
3742namespace {
3743// x86-64 MinGW target
3744class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3745public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003746 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3747 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003748 void getTargetDefines(const LangOptions &Opts,
3749 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003750 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003751 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003752 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003753 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003754
3755 // GCC defines this macro when it is using __gxx_personality_seh0.
3756 if (!Opts.SjLjExceptions)
3757 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003758 }
3759};
3760} // end anonymous namespace
3761
3762namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003763class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3764public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003765 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3766 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003767 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003768 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003769 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3770 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003771 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003772 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003773 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003774 }
3775};
3776} // end anonymous namespace
3777
3778namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003779class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3780public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003781 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3782 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003783 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003784 Int64Type = SignedLongLong;
3785 }
3786};
3787} // end anonymous namespace
3788
3789namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003790class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3791public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003792 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3793 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3794 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003795 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003796 }
3797};
Tim Northover9bb857a2013-01-31 12:13:10 +00003798}
3799
Eli Friedman9fa28852012-08-08 23:57:20 +00003800
3801namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003802class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003803 // Possible FPU choices.
3804 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003805 VFP2FPU = (1 << 0),
3806 VFP3FPU = (1 << 1),
3807 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003808 NeonFPU = (1 << 3),
3809 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003810 };
3811
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003812 // Possible HWDiv features.
3813 enum HWDivMode {
3814 HWDivThumb = (1 << 0),
3815 HWDivARM = (1 << 1)
3816 };
3817
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003818 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003819 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003820 }
3821
3822 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3823 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003824
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003825 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003826
Rafael Espindolaeb265472013-08-21 21:59:03 +00003827 enum {
3828 FP_Default,
3829 FP_VFP,
3830 FP_Neon
3831 } FPMath;
3832
Bernard Ogdenda13af32013-10-24 18:32:51 +00003833 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003834
Logan Chien57086ce2012-10-10 06:56:20 +00003835 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003836 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003837 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003838
3839 // Initialized via features.
3840 unsigned SoftFloat : 1;
3841 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003842
Bernard Ogden18b57012013-10-29 09:47:51 +00003843 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003844 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003845
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003846 // ACLE 6.5.1 Hardware floating point
3847 enum {
3848 HW_FP_HP = (1 << 1), /// half (16-bit)
3849 HW_FP_SP = (1 << 2), /// single (32-bit)
3850 HW_FP_DP = (1 << 3), /// double (64-bit)
3851 };
3852 uint32_t HW_FP;
3853
Chris Lattner5cc15e02010-03-03 19:03:45 +00003854 static const Builtin::Info BuiltinInfo[];
3855
Rafael Espindola101d5b92013-05-13 20:09:47 +00003856 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003857 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003858 if (T.getArch() == llvm::Triple::arm ||
3859 T.getArch() == llvm::Triple::armeb) {
3860 StringRef VersionStr;
3861 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003862 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003863 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003864 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003865 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003866 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003867 unsigned Version;
3868 if (VersionStr.getAsInteger(10, Version))
3869 return false;
3870 return Version >= 6;
3871 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003872 assert(T.getArch() == llvm::Triple::thumb ||
3873 T.getArch() == llvm::Triple::thumbeb);
3874 StringRef VersionStr;
3875 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003876 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003877 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003878 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003879 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003880 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003881 unsigned Version;
3882 if (VersionStr.getAsInteger(10, Version))
3883 return false;
3884 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003885 }
3886
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003887 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003888 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003889
3890 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003891 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003892
Renato Golin9ba39232015-02-27 16:35:48 +00003893 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3894 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3895 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003896 SizeType = UnsignedLong;
3897 else
3898 SizeType = UnsignedInt;
3899
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003900 switch (T.getOS()) {
3901 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003902 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003903 break;
3904 case llvm::Triple::Win32:
3905 WCharType = UnsignedShort;
3906 break;
3907 case llvm::Triple::Linux:
3908 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003909 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3910 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003911 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003912 }
3913
3914 UseBitFieldTypeAlignment = true;
3915
3916 ZeroLengthBitfieldBoundary = 0;
3917
Tim Northover147cd2f2014-10-14 22:12:21 +00003918 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3919 // so set preferred for small types to 32.
3920 if (T.isOSBinFormatMachO()) {
3921 DescriptionString =
3922 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3923 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3924 } else if (T.isOSWindows()) {
3925 // FIXME: this is invalid for WindowsCE
3926 assert(!BigEndian && "Windows on ARM does not support big endian");
3927 DescriptionString = "e"
3928 "-m:e"
3929 "-p:32:32"
3930 "-i64:64"
3931 "-v128:64:128"
3932 "-a:0:32"
3933 "-n32"
3934 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003935 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003936 DescriptionString =
3937 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3938 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003939 }
3940
3941 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003942 }
3943
3944 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003945 const llvm::Triple &T = getTriple();
3946
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003947 IsAAPCS = false;
3948
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003949 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003950
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003951 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003952 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003953 SizeType = UnsignedInt;
3954 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003955 SizeType = UnsignedLong;
3956
3957 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3958 WCharType = SignedInt;
3959
3960 // Do not respect the alignment of bit-field types when laying out
3961 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3962 UseBitFieldTypeAlignment = false;
3963
3964 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3965 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3966 /// gcc.
3967 ZeroLengthBitfieldBoundary = 32;
3968
Tim Northover147cd2f2014-10-14 22:12:21 +00003969 if (T.isOSBinFormatMachO())
3970 DescriptionString =
3971 BigEndian
3972 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3973 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3974 else
3975 DescriptionString =
3976 BigEndian
3977 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3978 : "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 +00003979
3980 // FIXME: Override "preferred align" for double and long long.
3981 }
3982
Chris Lattner17df24e2008-04-21 18:56:49 +00003983public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003984 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003985 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003986 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003987 BigEndian = IsBigEndian;
3988
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003989 switch (getTriple().getOS()) {
3990 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003991 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003992 break;
3993 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003994 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003995 break;
3996 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003997
Chris Lattner1a8f3942010-04-23 16:29:58 +00003998 // {} in inline assembly are neon specifiers, not assembly variant
3999 // specifiers.
4000 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004001
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004002 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00004003 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004004
Eric Christopher0e261882014-12-05 01:06:59 +00004005 // FIXME: This duplicates code from the driver that sets the -target-abi
4006 // option - this code is used if -target-abi isn't passed and should
4007 // be unified in some way.
4008 if (Triple.isOSBinFormatMachO()) {
4009 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4010 // the frontend matches that.
4011 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4012 Triple.getOS() == llvm::Triple::UnknownOS ||
4013 StringRef(CPU).startswith("cortex-m")) {
4014 setABI("aapcs");
4015 } else {
4016 setABI("apcs-gnu");
4017 }
4018 } else if (Triple.isOSWindows()) {
4019 // FIXME: this is invalid for WindowsCE
4020 setABI("aapcs");
4021 } else {
4022 // Select the default based on the platform.
4023 switch (Triple.getEnvironment()) {
4024 case llvm::Triple::Android:
4025 case llvm::Triple::GNUEABI:
4026 case llvm::Triple::GNUEABIHF:
4027 setABI("aapcs-linux");
4028 break;
4029 case llvm::Triple::EABIHF:
4030 case llvm::Triple::EABI:
4031 setABI("aapcs");
4032 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004033 case llvm::Triple::GNU:
4034 setABI("apcs-gnu");
4035 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004036 default:
4037 if (Triple.getOS() == llvm::Triple::NetBSD)
4038 setABI("apcs-gnu");
4039 else
4040 setABI("aapcs");
4041 break;
4042 }
4043 }
John McCall86353412010-08-21 22:46:04 +00004044
4045 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004046 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004047
4048 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004049 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004050 if (shouldUseInlineAtomic(getTriple()))
4051 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004052
4053 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004054 // the alignment of the zero-length bitfield is greater than the member
4055 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004056 // zero length bitfield.
4057 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004058 }
Alp Toker4925ba72014-06-07 23:30:42 +00004059 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004060 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004061 ABI = Name;
4062
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004063 // The defaults (above) are for AAPCS, check if we need to change them.
4064 //
4065 // FIXME: We need support for -meabi... we could just mangle it into the
4066 // name.
4067 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004068 setABIAPCS();
4069 return true;
4070 }
4071 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4072 setABIAAPCS();
4073 return true;
4074 }
4075 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004076 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004077
Craig Topper3164f332014-03-11 03:39:26 +00004078 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004079 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004080 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4081 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004082 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004083 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004084 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004085 }
4086 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004087 Features["vfp4"] = true;
4088 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004089 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4090 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004091 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004092 Features["vfp4"] = true;
4093 Features["neon"] = true;
4094 Features["hwdiv"] = true;
4095 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004096 } else if (CPU == "cyclone") {
4097 Features["v8fp"] = true;
4098 Features["neon"] = true;
4099 Features["hwdiv"] = true;
4100 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004101 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004102 Features["fp-armv8"] = true;
4103 Features["neon"] = true;
4104 Features["hwdiv"] = true;
4105 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004106 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004107 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004108 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004109 // Enable the hwdiv extension for all v8a AArch32 cores by
4110 // default.
4111 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004112 ArchName == "armebv8a" || ArchName == "armebv8" ||
4113 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4114 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004115 Features["hwdiv"] = true;
4116 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004117 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
4118 CPU == "sc300") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004119 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004120 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004121 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004122
Craig Topper3164f332014-03-11 03:39:26 +00004123 bool handleTargetFeatures(std::vector<std::string> &Features,
4124 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004125 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004126 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004127 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004128 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004129 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004130
4131 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004132 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004133 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004134 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004135 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004136 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004137 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004138 HW_FP = HW_FP_SP | HW_FP_DP;
4139 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004140 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004141 HW_FP = HW_FP_SP | HW_FP_DP;
4142 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004143 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004144 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4145 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004146 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004147 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4148 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004149 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004150 HW_FP = HW_FP_SP | HW_FP_DP;
4151 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004152 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004153 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004154 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004155 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004156 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004157 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004158 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004159 } else if (Feature == "+fp-only-sp") {
4160 HW_FP &= ~HW_FP_DP;
4161 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004162 }
4163
Rafael Espindolaeb265472013-08-21 21:59:03 +00004164 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4165 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4166 return false;
4167 }
4168
4169 if (FPMath == FP_Neon)
4170 Features.push_back("+neonfp");
4171 else if (FPMath == FP_VFP)
4172 Features.push_back("-neonfp");
4173
Daniel Dunbar893d4752009-12-19 04:15:38 +00004174 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004175 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4176 for (const auto &FEFeature : FrontEndFeatures) {
4177 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4178 if (Feature != Features.end())
4179 Features.erase(Feature);
4180 }
4181
Rafael Espindolaeb265472013-08-21 21:59:03 +00004182 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004183 }
4184
Craig Topper3164f332014-03-11 03:39:26 +00004185 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004186 return llvm::StringSwitch<bool>(Feature)
4187 .Case("arm", true)
4188 .Case("softfloat", SoftFloat)
4189 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004190 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004191 .Case("hwdiv", HWDiv & HWDivThumb)
4192 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004193 .Default(false);
4194 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004195 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004196 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004197 return llvm::StringSwitch<const char *>(Name)
4198 .Cases("arm8", "arm810", "4")
4199 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4200 "4")
4201 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4202 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4203 .Case("ep9312", "4T")
4204 .Cases("arm10tdmi", "arm1020t", "5T")
4205 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4206 .Case("arm926ej-s", "5TEJ")
4207 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4208 .Cases("xscale", "iwmmxt", "5TE")
4209 .Case("arm1136j-s", "6J")
4210 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4211 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4212 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4213 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4214 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4215 "7A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004216 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004217 .Case("swift", "7S")
4218 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004219 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004220 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004221 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004222 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004223 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004224 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004225 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004226 return llvm::StringSwitch<const char *>(Name)
4227 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4228 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4229 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004230 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004231 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4232 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
4233 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004234 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004235 }
Craig Topper3164f332014-03-11 03:39:26 +00004236 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004237 if (!getCPUDefineSuffix(Name))
4238 return false;
4239
Tim Northovere8c37212014-07-09 09:24:43 +00004240 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4241 StringRef Profile = getCPUProfile(Name);
4242 if (Profile == "M" && MaxAtomicInlineWidth) {
4243 MaxAtomicPromoteWidth = 32;
4244 MaxAtomicInlineWidth = 32;
4245 }
4246
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004247 CPU = Name;
4248 return true;
4249 }
Craig Topper3164f332014-03-11 03:39:26 +00004250 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004251 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4252 unsigned CPUArchVer) const {
4253 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4254 (CPUArch.find('M') != StringRef::npos);
4255 }
4256 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4257 unsigned CPUArchVer) const {
4258 // We check both CPUArchVer and ArchName because when only triple is
4259 // specified, the default CPU is arm1136j-s.
4260 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4261 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4262 }
Craig Topper3164f332014-03-11 03:39:26 +00004263 void getTargetDefines(const LangOptions &Opts,
4264 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004265 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004266 Builder.defineMacro("__arm");
4267 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004268
Chris Lattnerecd49032009-03-02 22:27:17 +00004269 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004270 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004271
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004272 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004273 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004274 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004275 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004276 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004277
4278 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004279 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004280 StringRef ArchName = getTriple().getArchName();
4281
4282 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4283 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004284 if (CPUArch[0] >= '8') {
4285 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4286 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004287 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004288
4289 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4290 // is not defined for the M-profile.
4291 // NOTE that the deffault profile is assumed to be 'A'
4292 if (CPUProfile.empty() || CPUProfile != "M")
4293 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4294
4295 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4296 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4297 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4298 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4299 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4300 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4301 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4302
4303 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4304 // instruction set such as ARM or Thumb.
4305 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4306
4307 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4308
4309 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004310 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004311 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004312
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004313 // ACLE 6.5.1 Hardware Floating Point
4314 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004315 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004316
Yi Konga44c4d72014-06-27 21:25:42 +00004317 // ACLE predefines.
4318 Builder.defineMacro("__ARM_ACLE", "200");
4319
Mike Stump9d54bd72009-04-08 02:07:04 +00004320 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004321
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004322 // FIXME: It's more complicated than this and we don't really support
4323 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004324 // Windows on ARM does not "support" interworking
4325 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004326 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004327
David Tweed8f676532012-10-25 13:33:01 +00004328 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004329 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004330 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4331 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004332 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004333 Builder.defineMacro("__ARM_PCS", "1");
4334
David Tweed8f676532012-10-25 13:33:01 +00004335 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004336 Builder.defineMacro("__ARM_PCS_VFP", "1");
4337 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004338
Daniel Dunbar893d4752009-12-19 04:15:38 +00004339 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004340 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004341
4342 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004343 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004344
4345 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004346 Builder.defineMacro("__THUMBEL__");
4347 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004348 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004349 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004350 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004351 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4352 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004353
4354 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004355 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004356
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004357 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004358 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004359 if (FPU & VFP2FPU)
4360 Builder.defineMacro("__ARM_VFPV2__");
4361 if (FPU & VFP3FPU)
4362 Builder.defineMacro("__ARM_VFPV3__");
4363 if (FPU & VFP4FPU)
4364 Builder.defineMacro("__ARM_VFPV4__");
4365 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004366
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004367 // This only gets set when Neon instructions are actually available, unlike
4368 // the VFP define, hence the soft float and arch check. This is subtly
4369 // different from gcc, we follow the intent which was that it should be set
4370 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004371 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4372 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004373 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004374 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004375
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004376 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4377 Opts.ShortWChar ? "2" : "4");
4378
4379 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4380 Opts.ShortEnums ? "1" : "4");
4381
Bernard Ogden18b57012013-10-29 09:47:51 +00004382 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004383 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004384
Tim Northover02e38602014-02-03 17:28:04 +00004385 if (Crypto)
4386 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4387
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004388 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004389 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4390 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4391 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4392 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4393 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004394
4395 bool is5EOrAbove = (CPUArchVer >= 6 ||
4396 (CPUArchVer == 5 &&
4397 CPUArch.find('E') != StringRef::npos));
4398 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4399 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4400 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004401 }
Craig Topper3164f332014-03-11 03:39:26 +00004402 void getTargetBuiltins(const Builtin::Info *&Records,
4403 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004404 Records = BuiltinInfo;
4405 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004406 }
Craig Topper3164f332014-03-11 03:39:26 +00004407 bool isCLZForZeroUndef() const override { return false; }
4408 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004409 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004410 }
Craig Topper3164f332014-03-11 03:39:26 +00004411 void getGCCRegNames(const char * const *&Names,
4412 unsigned &NumNames) const override;
4413 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4414 unsigned &NumAliases) const override;
4415 bool validateAsmConstraint(const char *&Name,
4416 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004417 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004418 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004419 case 'l': // r0-r7
4420 case 'h': // r8-r15
4421 case 'w': // VFP Floating point register single precision
4422 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004423 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004424 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004425 case 'I':
4426 case 'J':
4427 case 'K':
4428 case 'L':
4429 case 'M':
4430 // FIXME
4431 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004432 case 'Q': // A memory address that is a single base register.
4433 Info.setAllowsMemory();
4434 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004435 case 'U': // a memory reference...
4436 switch (Name[1]) {
4437 case 'q': // ...ARMV4 ldrsb
4438 case 'v': // ...VFP load/store (reg+constant offset)
4439 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004440 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004441 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004442 case 'n': // valid address for Neon doubleword vector load/store
4443 case 'm': // valid address for Neon element and structure load/store
4444 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004445 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004446 Info.setAllowsMemory();
4447 Name++;
4448 return true;
4449 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004450 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004451 return false;
4452 }
Craig Topper3164f332014-03-11 03:39:26 +00004453 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004454 std::string R;
4455 switch (*Constraint) {
4456 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004457 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004458 Constraint++;
4459 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004460 case 'p': // 'p' should be translated to 'r' by default.
4461 R = std::string("r");
4462 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004463 default:
4464 return std::string(1, *Constraint);
4465 }
4466 return R;
4467 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004468 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004469 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004470 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004471 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004472 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004473
Bill Wendling9d1ee112012-10-25 23:28:48 +00004474 // Strip off constraint modifiers.
4475 while (Constraint[0] == '=' ||
4476 Constraint[0] == '+' ||
4477 Constraint[0] == '&')
4478 Constraint = Constraint.substr(1);
4479
4480 switch (Constraint[0]) {
4481 default: break;
4482 case 'r': {
4483 switch (Modifier) {
4484 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004485 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004486 case 'q':
4487 // A register of size 32 cannot fit a vector type.
4488 return false;
4489 }
4490 }
4491 }
4492
4493 return true;
4494 }
Craig Topper3164f332014-03-11 03:39:26 +00004495 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004496 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004497 return "";
4498 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004499
Craig Topper3164f332014-03-11 03:39:26 +00004500 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004501 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4502 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004503
Craig Topper3164f332014-03-11 03:39:26 +00004504 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004505 if (RegNo == 0) return 0;
4506 if (RegNo == 1) return 1;
4507 return -1;
4508 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004509};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004510
Rafael Espindolaeb265472013-08-21 21:59:03 +00004511bool ARMTargetInfo::setFPMath(StringRef Name) {
4512 if (Name == "neon") {
4513 FPMath = FP_Neon;
4514 return true;
4515 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4516 Name == "vfp4") {
4517 FPMath = FP_VFP;
4518 return true;
4519 }
4520 return false;
4521}
4522
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004523const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004524 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004525 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004526 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4527
4528 // Float registers
4529 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4530 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4531 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004532 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004533
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004534 // Double registers
4535 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4536 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004537 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4538 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004539
4540 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004541 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4542 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004543};
4544
4545void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004546 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004547 Names = GCCRegNames;
4548 NumNames = llvm::array_lengthof(GCCRegNames);
4549}
4550
4551const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004552 { { "a1" }, "r0" },
4553 { { "a2" }, "r1" },
4554 { { "a3" }, "r2" },
4555 { { "a4" }, "r3" },
4556 { { "v1" }, "r4" },
4557 { { "v2" }, "r5" },
4558 { { "v3" }, "r6" },
4559 { { "v4" }, "r7" },
4560 { { "v5" }, "r8" },
4561 { { "v6", "rfp" }, "r9" },
4562 { { "sl" }, "r10" },
4563 { { "fp" }, "r11" },
4564 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004565 { { "r13" }, "sp" },
4566 { { "r14" }, "lr" },
4567 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004568 // The S, D and Q registers overlap, but aren't really aliases; we
4569 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004570};
4571
4572void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4573 unsigned &NumAliases) const {
4574 Aliases = GCCRegAliases;
4575 NumAliases = llvm::array_lengthof(GCCRegAliases);
4576}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004577
4578const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004579#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004580#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004581 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004582#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004583
4584#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004585#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004586#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4587 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004588#include "clang/Basic/BuiltinsARM.def"
4589};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004590
4591class ARMleTargetInfo : public ARMTargetInfo {
4592public:
4593 ARMleTargetInfo(const llvm::Triple &Triple)
4594 : ARMTargetInfo(Triple, false) { }
4595 virtual void getTargetDefines(const LangOptions &Opts,
4596 MacroBuilder &Builder) const {
4597 Builder.defineMacro("__ARMEL__");
4598 ARMTargetInfo::getTargetDefines(Opts, Builder);
4599 }
4600};
4601
4602class ARMbeTargetInfo : public ARMTargetInfo {
4603public:
4604 ARMbeTargetInfo(const llvm::Triple &Triple)
4605 : ARMTargetInfo(Triple, true) { }
4606 virtual void getTargetDefines(const LangOptions &Opts,
4607 MacroBuilder &Builder) const {
4608 Builder.defineMacro("__ARMEB__");
4609 Builder.defineMacro("__ARM_BIG_ENDIAN");
4610 ARMTargetInfo::getTargetDefines(Opts, Builder);
4611 }
4612};
Chris Lattner17df24e2008-04-21 18:56:49 +00004613} // end anonymous namespace.
4614
Eli Friedmanf05b7722008-08-20 07:44:10 +00004615namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004616class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4617 const llvm::Triple Triple;
4618public:
4619 WindowsARMTargetInfo(const llvm::Triple &Triple)
4620 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4621 TLSSupported = false;
4622 WCharType = UnsignedShort;
4623 SizeType = UnsignedInt;
4624 UserLabelPrefix = "";
4625 }
4626 void getVisualStudioDefines(const LangOptions &Opts,
4627 MacroBuilder &Builder) const {
4628 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4629
4630 // FIXME: this is invalid for WindowsCE
4631 Builder.defineMacro("_M_ARM_NT", "1");
4632 Builder.defineMacro("_M_ARMT", "_M_ARM");
4633 Builder.defineMacro("_M_THUMB", "_M_ARM");
4634
4635 assert((Triple.getArch() == llvm::Triple::arm ||
4636 Triple.getArch() == llvm::Triple::thumb) &&
4637 "invalid architecture for Windows ARM target info");
4638 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4639 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4640
4641 // TODO map the complete set of values
4642 // 31: VFPv3 40: VFPv4
4643 Builder.defineMacro("_M_ARM_FP", "31");
4644 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004645 BuiltinVaListKind getBuiltinVaListKind() const override {
4646 return TargetInfo::CharPtrBuiltinVaList;
4647 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004648};
4649
4650// Windows ARM + Itanium C++ ABI Target
4651class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4652public:
4653 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4654 : WindowsARMTargetInfo(Triple) {
4655 TheCXXABI.set(TargetCXXABI::GenericARM);
4656 }
4657
4658 void getTargetDefines(const LangOptions &Opts,
4659 MacroBuilder &Builder) const override {
4660 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4661
4662 if (Opts.MSVCCompat)
4663 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4664 }
4665};
4666
4667// Windows ARM, MS (C++) ABI
4668class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4669public:
4670 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4671 : WindowsARMTargetInfo(Triple) {
4672 TheCXXABI.set(TargetCXXABI::Microsoft);
4673 }
4674
4675 void getTargetDefines(const LangOptions &Opts,
4676 MacroBuilder &Builder) const override {
4677 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4678 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4679 }
4680};
4681}
4682
4683
4684namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004685class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004686 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004687protected:
Craig Topper3164f332014-03-11 03:39:26 +00004688 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4689 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004690 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004691 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004692
Torok Edwinb2b37c62009-06-30 17:10:35 +00004693public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004694 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004695 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004696 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004697 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004698 // FIXME: This should be based off of the target features in
4699 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004700 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004701
4702 // Darwin on iOS uses a variant of the ARM C++ ABI.
4703 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004704 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004705};
4706} // end anonymous namespace.
4707
Tony Linthicum76329bf2011-12-12 21:14:55 +00004708
4709namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004710class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004711 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004712 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4713 static const char *const GCCRegNames[];
4714
James Molloy75f5f9e2014-04-16 15:33:48 +00004715 enum FPUModeEnum {
4716 FPUMode,
4717 NeonMode
4718 };
4719
4720 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004721 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004722 unsigned Crypto;
4723
Tim Northovera2ee4332014-03-29 15:09:45 +00004724 static const Builtin::Info BuiltinInfo[];
4725
4726 std::string ABI;
4727
4728public:
Tim Northover573cbee2014-05-24 12:52:07 +00004729 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004730 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004731
4732 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4733 WCharType = SignedInt;
4734
4735 // NetBSD apparently prefers consistency across ARM targets to consistency
4736 // across 64-bit targets.
4737 Int64Type = SignedLongLong;
4738 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004739 } else {
4740 WCharType = UnsignedInt;
4741 Int64Type = SignedLong;
4742 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004743 }
4744
Tim Northovera2ee4332014-03-29 15:09:45 +00004745 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004746 MaxVectorAlign = 128;
4747 RegParmMax = 8;
4748 MaxAtomicInlineWidth = 128;
4749 MaxAtomicPromoteWidth = 128;
4750
Tim Northovera6a19f12015-02-06 01:25:07 +00004751 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004752 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4753
Tim Northovera2ee4332014-03-29 15:09:45 +00004754 // {} in inline assembly are neon specifiers, not assembly variant
4755 // specifiers.
4756 NoAsmVariants = true;
4757
Tim Northover7ad87af2015-01-16 18:44:04 +00004758 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4759 // contributes to the alignment of the containing aggregate in the same way
4760 // a plain (non bit-field) member of that type would, without exception for
4761 // zero-sized or anonymous bit-fields."
4762 UseBitFieldTypeAlignment = true;
4763 UseZeroLengthBitfieldAlignment = true;
4764
Tim Northover573cbee2014-05-24 12:52:07 +00004765 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004766 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4767 }
4768
Alp Toker4925ba72014-06-07 23:30:42 +00004769 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004770 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004771 if (Name != "aapcs" && Name != "darwinpcs")
4772 return false;
4773
4774 ABI = Name;
4775 return true;
4776 }
4777
David Blaikie1cbb9712014-11-14 19:09:44 +00004778 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004779 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004780 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004781 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004782 .Case("cyclone", true)
4783 .Default(false);
4784 return CPUKnown;
4785 }
4786
4787 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004788 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004789 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004790 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004791
4792 // Target properties.
4793 Builder.defineMacro("_LP64");
4794 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004795
4796 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4797 Builder.defineMacro("__ARM_ACLE", "200");
4798 Builder.defineMacro("__ARM_ARCH", "8");
4799 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4800
4801 Builder.defineMacro("__ARM_64BIT_STATE");
4802 Builder.defineMacro("__ARM_PCS_AAPCS64");
4803 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4804
4805 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4806 Builder.defineMacro("__ARM_FEATURE_CLZ");
4807 Builder.defineMacro("__ARM_FEATURE_FMA");
4808 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004809 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4810 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4811 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4812 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004813
4814 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4815
4816 // 0xe implies support for half, single and double precision operations.
4817 Builder.defineMacro("__ARM_FP", "0xe");
4818
4819 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4820 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4821 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4822
4823 if (Opts.FastMath || Opts.FiniteMathOnly)
4824 Builder.defineMacro("__ARM_FP_FAST");
4825
Richard Smithab506ad2014-10-20 23:26:58 +00004826 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004827 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4828
4829 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4830
4831 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4832 Opts.ShortEnums ? "1" : "4");
4833
James Molloy75f5f9e2014-04-16 15:33:48 +00004834 if (FPU == NeonMode) {
4835 Builder.defineMacro("__ARM_NEON");
4836 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004837 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004838 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004839
Bradley Smith418c5932014-05-02 15:17:51 +00004840 if (CRC)
4841 Builder.defineMacro("__ARM_FEATURE_CRC32");
4842
James Molloy75f5f9e2014-04-16 15:33:48 +00004843 if (Crypto)
4844 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004845 }
4846
4847 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004848 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004849 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004850 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004851 }
4852
David Blaikie1cbb9712014-11-14 19:09:44 +00004853 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004854 return Feature == "aarch64" ||
4855 Feature == "arm64" ||
4856 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004857 }
4858
James Molloy5e73df52014-04-16 15:06:20 +00004859 bool handleTargetFeatures(std::vector<std::string> &Features,
4860 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004861 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004862 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004863 Crypto = 0;
4864 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4865 if (Features[i] == "+neon")
4866 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004867 if (Features[i] == "+crc")
4868 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004869 if (Features[i] == "+crypto")
4870 Crypto = 1;
4871 }
4872
James Molloy5e73df52014-04-16 15:06:20 +00004873 setDescriptionString();
4874
4875 return true;
4876 }
4877
David Blaikie1cbb9712014-11-14 19:09:44 +00004878 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004879
David Blaikie1cbb9712014-11-14 19:09:44 +00004880 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004881 return TargetInfo::AArch64ABIBuiltinVaList;
4882 }
4883
4884 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004885 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004886 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004887 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004888
Eric Christopher917e9522014-11-18 22:36:15 +00004889 virtual bool
4890 validateAsmConstraint(const char *&Name,
4891 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004892 switch (*Name) {
4893 default:
4894 return false;
4895 case 'w': // Floating point and SIMD registers (V0-V31)
4896 Info.setAllowsRegister();
4897 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004898 case 'I': // Constant that can be used with an ADD instruction
4899 case 'J': // Constant that can be used with a SUB instruction
4900 case 'K': // Constant that can be used with a 32-bit logical instruction
4901 case 'L': // Constant that can be used with a 64-bit logical instruction
4902 case 'M': // Constant that can be used as a 32-bit MOV immediate
4903 case 'N': // Constant that can be used as a 64-bit MOV immediate
4904 case 'Y': // Floating point constant zero
4905 case 'Z': // Integer constant zero
4906 return true;
4907 case 'Q': // A memory reference with base register and no offset
4908 Info.setAllowsMemory();
4909 return true;
4910 case 'S': // A symbolic address
4911 Info.setAllowsRegister();
4912 return true;
4913 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004914 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4915 // Utf: A memory address suitable for ldp/stp in TF mode.
4916 // Usa: An absolute symbolic address.
4917 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4918 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004919 case 'z': // Zero register, wzr or xzr
4920 Info.setAllowsRegister();
4921 return true;
4922 case 'x': // Floating point and SIMD registers (V0-V15)
4923 Info.setAllowsRegister();
4924 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004925 }
4926 return false;
4927 }
4928
Akira Hatanaka987f1862014-08-22 06:05:21 +00004929 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004930 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004931 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004932 // Strip off constraint modifiers.
4933 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4934 Constraint = Constraint.substr(1);
4935
4936 switch (Constraint[0]) {
4937 default:
4938 return true;
4939 case 'z':
4940 case 'r': {
4941 switch (Modifier) {
4942 case 'x':
4943 case 'w':
4944 // For now assume that the person knows what they're
4945 // doing with the modifier.
4946 return true;
4947 default:
4948 // By default an 'r' constraint will be in the 'x'
4949 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004950 if (Size == 64)
4951 return true;
4952
4953 SuggestedModifier = "w";
4954 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004955 }
4956 }
4957 }
4958 }
4959
David Blaikie1cbb9712014-11-14 19:09:44 +00004960 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004961
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004962 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004963 if (RegNo == 0)
4964 return 0;
4965 if (RegNo == 1)
4966 return 1;
4967 return -1;
4968 }
4969};
4970
Tim Northover573cbee2014-05-24 12:52:07 +00004971const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004972 // 32-bit Integer registers
4973 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4974 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4975 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4976
4977 // 64-bit Integer registers
4978 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4979 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4980 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4981
4982 // 32-bit floating point regsisters
4983 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4984 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4985 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4986
4987 // 64-bit floating point regsisters
4988 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4989 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4990 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4991
4992 // Vector registers
4993 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4994 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4995 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4996};
4997
Tim Northover573cbee2014-05-24 12:52:07 +00004998void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004999 unsigned &NumNames) const {
5000 Names = GCCRegNames;
5001 NumNames = llvm::array_lengthof(GCCRegNames);
5002}
5003
Tim Northover573cbee2014-05-24 12:52:07 +00005004const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005005 { { "w31" }, "wsp" },
5006 { { "x29" }, "fp" },
5007 { { "x30" }, "lr" },
5008 { { "x31" }, "sp" },
5009 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5010 // don't want to substitute one of these for a different-sized one.
5011};
5012
Tim Northover573cbee2014-05-24 12:52:07 +00005013void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005014 unsigned &NumAliases) const {
5015 Aliases = GCCRegAliases;
5016 NumAliases = llvm::array_lengthof(GCCRegAliases);
5017}
5018
Tim Northover573cbee2014-05-24 12:52:07 +00005019const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005020#define BUILTIN(ID, TYPE, ATTRS) \
5021 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5022#include "clang/Basic/BuiltinsNEON.def"
5023
5024#define BUILTIN(ID, TYPE, ATTRS) \
5025 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005026#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005027};
James Molloy5e73df52014-04-16 15:06:20 +00005028
Tim Northover573cbee2014-05-24 12:52:07 +00005029class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005030 void setDescriptionString() override {
5031 if (getTriple().isOSBinFormatMachO())
5032 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5033 else
5034 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5035 }
5036
5037public:
Tim Northover573cbee2014-05-24 12:52:07 +00005038 AArch64leTargetInfo(const llvm::Triple &Triple)
5039 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005040 BigEndian = false;
5041 }
5042 void getTargetDefines(const LangOptions &Opts,
5043 MacroBuilder &Builder) const override {
5044 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005045 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005046 }
5047};
5048
Tim Northover573cbee2014-05-24 12:52:07 +00005049class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005050 void setDescriptionString() override {
5051 assert(!getTriple().isOSBinFormatMachO());
5052 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5053 }
5054
5055public:
Tim Northover573cbee2014-05-24 12:52:07 +00005056 AArch64beTargetInfo(const llvm::Triple &Triple)
5057 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005058 void getTargetDefines(const LangOptions &Opts,
5059 MacroBuilder &Builder) const override {
5060 Builder.defineMacro("__AARCH64EB__");
5061 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5062 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005063 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005064 }
5065};
Tim Northovera2ee4332014-03-29 15:09:45 +00005066} // end anonymous namespace.
5067
5068namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00005069class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005070protected:
5071 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5072 MacroBuilder &Builder) const override {
5073 Builder.defineMacro("__AARCH64_SIMD__");
5074 Builder.defineMacro("__ARM64_ARCH_8__");
5075 Builder.defineMacro("__ARM_NEON__");
5076 Builder.defineMacro("__LITTLE_ENDIAN__");
5077 Builder.defineMacro("__REGISTER_PREFIX__", "");
5078 Builder.defineMacro("__arm64", "1");
5079 Builder.defineMacro("__arm64__", "1");
5080
5081 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5082 }
5083
Tim Northovera2ee4332014-03-29 15:09:45 +00005084public:
Tim Northover573cbee2014-05-24 12:52:07 +00005085 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5086 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005087 Int64Type = SignedLongLong;
5088 WCharType = SignedInt;
5089 UseSignedCharForObjCBool = false;
5090
Tim Northovera6a19f12015-02-06 01:25:07 +00005091 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005092 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5093
5094 TheCXXABI.set(TargetCXXABI::iOS64);
5095 }
5096
David Blaikie1cbb9712014-11-14 19:09:44 +00005097 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005098 return TargetInfo::CharPtrBuiltinVaList;
5099 }
5100};
5101} // end anonymous namespace
5102
5103namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005104// Hexagon abstract base class
5105class HexagonTargetInfo : public TargetInfo {
5106 static const Builtin::Info BuiltinInfo[];
5107 static const char * const GCCRegNames[];
5108 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5109 std::string CPU;
5110public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005111 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005112 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005113 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005114
5115 // {} in inline assembly are packet specifiers, not assembly variant
5116 // specifiers.
5117 NoAsmVariants = true;
5118 }
5119
Craig Topper3164f332014-03-11 03:39:26 +00005120 void getTargetBuiltins(const Builtin::Info *&Records,
5121 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005122 Records = BuiltinInfo;
5123 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5124 }
5125
Craig Topper3164f332014-03-11 03:39:26 +00005126 bool validateAsmConstraint(const char *&Name,
5127 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005128 return true;
5129 }
5130
Craig Topper3164f332014-03-11 03:39:26 +00005131 void getTargetDefines(const LangOptions &Opts,
5132 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005133
Craig Topper3164f332014-03-11 03:39:26 +00005134 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005135 return Feature == "hexagon";
5136 }
Craig Topper3164f332014-03-11 03:39:26 +00005137
5138 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005139 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005140 }
Craig Topper3164f332014-03-11 03:39:26 +00005141 void getGCCRegNames(const char * const *&Names,
5142 unsigned &NumNames) const override;
5143 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5144 unsigned &NumAliases) const override;
5145 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005146 return "";
5147 }
Sebastian Pop86500282012-01-13 20:37:10 +00005148
5149 static const char *getHexagonCPUSuffix(StringRef Name) {
5150 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005151 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005152 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005153 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005154 }
5155
Craig Topper3164f332014-03-11 03:39:26 +00005156 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005157 if (!getHexagonCPUSuffix(Name))
5158 return false;
5159
Tony Linthicum76329bf2011-12-12 21:14:55 +00005160 CPU = Name;
5161 return true;
5162 }
5163};
5164
5165void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5166 MacroBuilder &Builder) const {
5167 Builder.defineMacro("qdsp6");
5168 Builder.defineMacro("__qdsp6", "1");
5169 Builder.defineMacro("__qdsp6__", "1");
5170
5171 Builder.defineMacro("hexagon");
5172 Builder.defineMacro("__hexagon", "1");
5173 Builder.defineMacro("__hexagon__", "1");
5174
5175 if(CPU == "hexagonv1") {
5176 Builder.defineMacro("__HEXAGON_V1__");
5177 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5178 if(Opts.HexagonQdsp6Compat) {
5179 Builder.defineMacro("__QDSP6_V1__");
5180 Builder.defineMacro("__QDSP6_ARCH__", "1");
5181 }
5182 }
5183 else if(CPU == "hexagonv2") {
5184 Builder.defineMacro("__HEXAGON_V2__");
5185 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5186 if(Opts.HexagonQdsp6Compat) {
5187 Builder.defineMacro("__QDSP6_V2__");
5188 Builder.defineMacro("__QDSP6_ARCH__", "2");
5189 }
5190 }
5191 else if(CPU == "hexagonv3") {
5192 Builder.defineMacro("__HEXAGON_V3__");
5193 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5194 if(Opts.HexagonQdsp6Compat) {
5195 Builder.defineMacro("__QDSP6_V3__");
5196 Builder.defineMacro("__QDSP6_ARCH__", "3");
5197 }
5198 }
5199 else if(CPU == "hexagonv4") {
5200 Builder.defineMacro("__HEXAGON_V4__");
5201 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5202 if(Opts.HexagonQdsp6Compat) {
5203 Builder.defineMacro("__QDSP6_V4__");
5204 Builder.defineMacro("__QDSP6_ARCH__", "4");
5205 }
5206 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005207 else if(CPU == "hexagonv5") {
5208 Builder.defineMacro("__HEXAGON_V5__");
5209 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5210 if(Opts.HexagonQdsp6Compat) {
5211 Builder.defineMacro("__QDSP6_V5__");
5212 Builder.defineMacro("__QDSP6_ARCH__", "5");
5213 }
5214 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005215}
5216
5217const char * const HexagonTargetInfo::GCCRegNames[] = {
5218 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5219 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5220 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5221 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5222 "p0", "p1", "p2", "p3",
5223 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5224};
5225
5226void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5227 unsigned &NumNames) const {
5228 Names = GCCRegNames;
5229 NumNames = llvm::array_lengthof(GCCRegNames);
5230}
5231
5232
5233const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5234 { { "sp" }, "r29" },
5235 { { "fp" }, "r30" },
5236 { { "lr" }, "r31" },
5237 };
5238
5239void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5240 unsigned &NumAliases) const {
5241 Aliases = GCCRegAliases;
5242 NumAliases = llvm::array_lengthof(GCCRegAliases);
5243}
5244
5245
5246const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5247#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5248#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5249 ALL_LANGUAGES },
5250#include "clang/Basic/BuiltinsHexagon.def"
5251};
5252}
5253
5254
Chris Lattner5ba61f02006-10-14 07:39:34 +00005255namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005256// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5257class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005258 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5259 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005260 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005262 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005263
Craig Topper3164f332014-03-11 03:39:26 +00005264 bool handleTargetFeatures(std::vector<std::string> &Features,
5265 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005266 SoftFloat = false;
5267 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5268 if (Features[i] == "+soft-float")
5269 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005270 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005271 }
Craig Topper3164f332014-03-11 03:39:26 +00005272 void getTargetDefines(const LangOptions &Opts,
5273 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005274 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005275 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005276
5277 if (SoftFloat)
5278 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005279 }
Craig Topper3164f332014-03-11 03:39:26 +00005280
5281 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005282 return llvm::StringSwitch<bool>(Feature)
5283 .Case("softfloat", SoftFloat)
5284 .Case("sparc", true)
5285 .Default(false);
5286 }
Craig Topper3164f332014-03-11 03:39:26 +00005287
5288 void getTargetBuiltins(const Builtin::Info *&Records,
5289 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005290 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005291 }
Craig Topper3164f332014-03-11 03:39:26 +00005292 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005293 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005294 }
Craig Topper3164f332014-03-11 03:39:26 +00005295 void getGCCRegNames(const char * const *&Names,
5296 unsigned &NumNames) const override;
5297 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5298 unsigned &NumAliases) const override;
5299 bool validateAsmConstraint(const char *&Name,
5300 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005301 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005302 switch (*Name) {
5303 case 'I': // Signed 13-bit constant
5304 case 'J': // Zero
5305 case 'K': // 32-bit constant with the low 12 bits clear
5306 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5307 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5308 case 'N': // Same as 'K' but zext (required for SIMode)
5309 case 'O': // The constant 4096
5310 return true;
5311 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005312 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005313 }
Craig Topper3164f332014-03-11 03:39:26 +00005314 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005315 // FIXME: Implement!
5316 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005317 }
5318};
5319
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005320const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005321 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5322 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5323 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5324 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5325};
5326
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005327void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5328 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005329 Names = GCCRegNames;
5330 NumNames = llvm::array_lengthof(GCCRegNames);
5331}
5332
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005333const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005334 { { "g0" }, "r0" },
5335 { { "g1" }, "r1" },
5336 { { "g2" }, "r2" },
5337 { { "g3" }, "r3" },
5338 { { "g4" }, "r4" },
5339 { { "g5" }, "r5" },
5340 { { "g6" }, "r6" },
5341 { { "g7" }, "r7" },
5342 { { "o0" }, "r8" },
5343 { { "o1" }, "r9" },
5344 { { "o2" }, "r10" },
5345 { { "o3" }, "r11" },
5346 { { "o4" }, "r12" },
5347 { { "o5" }, "r13" },
5348 { { "o6", "sp" }, "r14" },
5349 { { "o7" }, "r15" },
5350 { { "l0" }, "r16" },
5351 { { "l1" }, "r17" },
5352 { { "l2" }, "r18" },
5353 { { "l3" }, "r19" },
5354 { { "l4" }, "r20" },
5355 { { "l5" }, "r21" },
5356 { { "l6" }, "r22" },
5357 { { "l7" }, "r23" },
5358 { { "i0" }, "r24" },
5359 { { "i1" }, "r25" },
5360 { { "i2" }, "r26" },
5361 { { "i3" }, "r27" },
5362 { { "i4" }, "r28" },
5363 { { "i5" }, "r29" },
5364 { { "i6", "fp" }, "r30" },
5365 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005366};
5367
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005368void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5369 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005370 Aliases = GCCRegAliases;
5371 NumAliases = llvm::array_lengthof(GCCRegAliases);
5372}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005373
5374// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5375class SparcV8TargetInfo : public SparcTargetInfo {
5376public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005377 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005378 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005379 }
5380
Craig Topper3164f332014-03-11 03:39:26 +00005381 void getTargetDefines(const LangOptions &Opts,
5382 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005383 SparcTargetInfo::getTargetDefines(Opts, Builder);
5384 Builder.defineMacro("__sparcv8");
5385 }
5386};
5387
5388// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5389class SparcV9TargetInfo : public SparcTargetInfo {
5390public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005391 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005392 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005393 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005394 // This is an LP64 platform.
5395 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005396
5397 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005398 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005399 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005400 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005401 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005402 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005403
5404 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5405 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5406 LongDoubleWidth = 128;
5407 LongDoubleAlign = 128;
5408 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005409 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005410 }
5411
Craig Topper3164f332014-03-11 03:39:26 +00005412 void getTargetDefines(const LangOptions &Opts,
5413 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005414 SparcTargetInfo::getTargetDefines(Opts, Builder);
5415 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005416 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005417 // Solaris doesn't need these variants, but the BSDs do.
5418 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005419 Builder.defineMacro("__sparc64__");
5420 Builder.defineMacro("__sparc_v9__");
5421 Builder.defineMacro("__sparcv9__");
5422 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005423 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005424
Craig Topper3164f332014-03-11 03:39:26 +00005425 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005426 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5427 .Case("v9", true)
5428 .Case("ultrasparc", true)
5429 .Case("ultrasparc3", true)
5430 .Case("niagara", true)
5431 .Case("niagara2", true)
5432 .Case("niagara3", true)
5433 .Case("niagara4", true)
5434 .Default(false);
5435
5436 // No need to store the CPU yet. There aren't any CPU-specific
5437 // macros to define.
5438 return CPUKnown;
5439 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005440};
5441
Gabor Greif49991682008-02-21 16:29:08 +00005442} // end anonymous namespace.
5443
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005444namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005445class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005446public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005447 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5448 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005449 SizeType = UnsignedInt;
5450 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005451 }
5452};
5453} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005454
Chris Lattnerb781dc792008-05-08 05:58:21 +00005455namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005456class SystemZTargetInfo : public TargetInfo {
5457 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005458
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005459public:
5460 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5461 TLSSupported = true;
5462 IntWidth = IntAlign = 32;
5463 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5464 PointerWidth = PointerAlign = 64;
5465 LongDoubleWidth = 128;
5466 LongDoubleAlign = 64;
5467 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5468 MinGlobalAlign = 16;
5469 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5470 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5471 }
5472 void getTargetDefines(const LangOptions &Opts,
5473 MacroBuilder &Builder) const override {
5474 Builder.defineMacro("__s390__");
5475 Builder.defineMacro("__s390x__");
5476 Builder.defineMacro("__zarch__");
5477 Builder.defineMacro("__LONG_DOUBLE_128__");
5478 }
5479 void getTargetBuiltins(const Builtin::Info *&Records,
5480 unsigned &NumRecords) const override {
5481 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005482 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005483 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005484 }
5485
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005486 void getGCCRegNames(const char *const *&Names,
5487 unsigned &NumNames) const override;
5488 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5489 unsigned &NumAliases) const override {
5490 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005491 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005492 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005493 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005494 bool validateAsmConstraint(const char *&Name,
5495 TargetInfo::ConstraintInfo &info) const override;
5496 const char *getClobbers() const override {
5497 // FIXME: Is this really right?
5498 return "";
5499 }
5500 BuiltinVaListKind getBuiltinVaListKind() const override {
5501 return TargetInfo::SystemZBuiltinVaList;
5502 }
5503 bool setCPU(const std::string &Name) override {
5504 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5505 .Case("z10", true)
5506 .Case("z196", true)
5507 .Case("zEC12", true)
5508 .Default(false);
5509
5510 // No need to store the CPU yet. There aren't any CPU-specific
5511 // macros to define.
5512 return CPUKnown;
5513 }
5514};
5515
5516const char *const SystemZTargetInfo::GCCRegNames[] = {
5517 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5518 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5519 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5520 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5521};
5522
5523void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5524 unsigned &NumNames) const {
5525 Names = GCCRegNames;
5526 NumNames = llvm::array_lengthof(GCCRegNames);
5527}
5528
5529bool SystemZTargetInfo::
5530validateAsmConstraint(const char *&Name,
5531 TargetInfo::ConstraintInfo &Info) const {
5532 switch (*Name) {
5533 default:
5534 return false;
5535
5536 case 'a': // Address register
5537 case 'd': // Data register (equivalent to 'r')
5538 case 'f': // Floating-point register
5539 Info.setAllowsRegister();
5540 return true;
5541
5542 case 'I': // Unsigned 8-bit constant
5543 case 'J': // Unsigned 12-bit constant
5544 case 'K': // Signed 16-bit constant
5545 case 'L': // Signed 20-bit displacement (on all targets we support)
5546 case 'M': // 0x7fffffff
5547 return true;
5548
5549 case 'Q': // Memory with base and unsigned 12-bit displacement
5550 case 'R': // Likewise, plus an index
5551 case 'S': // Memory with base and signed 20-bit displacement
5552 case 'T': // Likewise, plus an index
5553 Info.setAllowsMemory();
5554 return true;
5555 }
5556}
Ulrich Weigand47445072013-05-06 16:26:41 +00005557}
5558
5559namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005560 class MSP430TargetInfo : public TargetInfo {
5561 static const char * const GCCRegNames[];
5562 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005563 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005564 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005565 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005566 IntWidth = 16; IntAlign = 16;
5567 LongWidth = 32; LongLongWidth = 64;
5568 LongAlign = LongLongAlign = 16;
5569 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005570 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005571 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005572 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005573 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005574 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005575 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005576 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005577 }
5578 void getTargetDefines(const LangOptions &Opts,
5579 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005580 Builder.defineMacro("MSP430");
5581 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005582 // FIXME: defines for different 'flavours' of MCU
5583 }
Craig Topper3164f332014-03-11 03:39:26 +00005584 void getTargetBuiltins(const Builtin::Info *&Records,
5585 unsigned &NumRecords) const override {
5586 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005587 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005588 NumRecords = 0;
5589 }
Craig Topper3164f332014-03-11 03:39:26 +00005590 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005591 return Feature == "msp430";
5592 }
Craig Topper3164f332014-03-11 03:39:26 +00005593 void getGCCRegNames(const char * const *&Names,
5594 unsigned &NumNames) const override;
5595 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5596 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005597 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005598 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005599 NumAliases = 0;
5600 }
Eric Christopher917e9522014-11-18 22:36:15 +00005601 bool
5602 validateAsmConstraint(const char *&Name,
5603 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005604 // FIXME: implement
5605 switch (*Name) {
5606 case 'K': // the constant 1
5607 case 'L': // constant -1^20 .. 1^19
5608 case 'M': // constant 1-4:
5609 return true;
5610 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005611 // No target constraints for now.
5612 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005613 }
Craig Topper3164f332014-03-11 03:39:26 +00005614 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005615 // FIXME: Is this really right?
5616 return "";
5617 }
Craig Topper3164f332014-03-11 03:39:26 +00005618 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005619 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005620 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005621 }
5622 };
5623
5624 const char * const MSP430TargetInfo::GCCRegNames[] = {
5625 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5626 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5627 };
5628
5629 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5630 unsigned &NumNames) const {
5631 Names = GCCRegNames;
5632 NumNames = llvm::array_lengthof(GCCRegNames);
5633 }
5634}
5635
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005636namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005637
Mike Stump11289f42009-09-09 15:08:12 +00005638 // LLVM and Clang cannot be used directly to output native binaries for
5639 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005640 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005641 //
5642 // TCE uses the llvm bitcode as input and uses it for generating customized
5643 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005644 // publicly available in http://tce.cs.tut.fi
5645
Eli Friedman1f191002011-10-07 19:51:42 +00005646 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5647 3, // opencl_global
5648 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005649 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005650 // FIXME: generic has to be added to the target
5651 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005652 0, // cuda_device
5653 0, // cuda_constant
5654 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005655 };
5656
Eli Friedmana9c3d712009-08-19 20:47:07 +00005657 class TCETargetInfo : public TargetInfo{
5658 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005659 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005660 TLSSupported = false;
5661 IntWidth = 32;
5662 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005663 PointerWidth = 32;
5664 IntAlign = 32;
5665 LongAlign = LongLongAlign = 32;
5666 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005667 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005668 SizeType = UnsignedInt;
5669 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005670 IntPtrType = SignedInt;
5671 PtrDiffType = SignedInt;
5672 FloatWidth = 32;
5673 FloatAlign = 32;
5674 DoubleWidth = 32;
5675 DoubleAlign = 32;
5676 LongDoubleWidth = 32;
5677 LongDoubleAlign = 32;
5678 FloatFormat = &llvm::APFloat::IEEEsingle;
5679 DoubleFormat = &llvm::APFloat::IEEEsingle;
5680 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005681 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5682 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005683 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005684 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005685 }
5686
Craig Topper3164f332014-03-11 03:39:26 +00005687 void getTargetDefines(const LangOptions &Opts,
5688 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005689 DefineStd(Builder, "tce", Opts);
5690 Builder.defineMacro("__TCE__");
5691 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005692 }
Craig Topper3164f332014-03-11 03:39:26 +00005693 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005694 return Feature == "tce";
5695 }
Craig Topper3164f332014-03-11 03:39:26 +00005696
5697 void getTargetBuiltins(const Builtin::Info *&Records,
5698 unsigned &NumRecords) const override {}
5699 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005700 return "";
5701 }
Craig Topper3164f332014-03-11 03:39:26 +00005702 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005703 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005704 }
Craig Topper3164f332014-03-11 03:39:26 +00005705 void getGCCRegNames(const char * const *&Names,
5706 unsigned &NumNames) const override {}
5707 bool validateAsmConstraint(const char *&Name,
5708 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005709 return true;
5710 }
Craig Topper3164f332014-03-11 03:39:26 +00005711 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5712 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005713 };
5714}
5715
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005716namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005717class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005718 virtual void setDescriptionString() = 0;
5719
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005720 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005721 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005722 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005723 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005724 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005725 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005726 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005727 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005728 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005729 enum DspRevEnum {
5730 NoDSP, DSP1, DSP2
5731 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005732 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005733
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005734protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005735 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005736 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005737
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005738public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005739 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5740 const std::string &CPUStr)
5741 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005742 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005743 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5744 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5745 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005746
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005747 bool isNaN2008Default() const {
5748 return CPU == "mips32r6" || CPU == "mips64r6";
5749 }
5750
5751 bool isFP64Default() const {
5752 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5753 }
5754
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005755 bool isNan2008() const override {
5756 return IsNan2008;
5757 }
5758
Alp Toker4925ba72014-06-07 23:30:42 +00005759 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005760 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005761 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5762 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005763 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005764 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005765 .Case("mips1", IsMips32)
5766 .Case("mips2", IsMips32)
5767 .Case("mips3", true)
5768 .Case("mips4", true)
5769 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005770 .Case("mips32", IsMips32)
5771 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005772 .Case("mips32r3", IsMips32)
5773 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005774 .Case("mips32r6", IsMips32)
5775 .Case("mips64", true)
5776 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005777 .Case("mips64r3", true)
5778 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005779 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005780 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005781 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005782 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005783 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005784 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005785 if (CPU == "octeon")
5786 Features["mips64r2"] = Features["cnmips"] = true;
5787 else
5788 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005789 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005790
Craig Topper3164f332014-03-11 03:39:26 +00005791 void getTargetDefines(const LangOptions &Opts,
5792 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005793 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005794 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005795 if (Opts.GNUMode)
5796 Builder.defineMacro("mips");
5797
Simon Atanasyan683535b2012-08-29 19:14:58 +00005798 Builder.defineMacro("__REGISTER_PREFIX__", "");
5799
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005800 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005801 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005802 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005803 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005804 case SoftFloat:
5805 Builder.defineMacro("__mips_soft_float", Twine(1));
5806 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005807 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005808
Simon Atanasyan16071912013-04-14 14:07:30 +00005809 if (IsSingleFloat)
5810 Builder.defineMacro("__mips_single_float", Twine(1));
5811
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005812 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5813 Builder.defineMacro("_MIPS_FPSET",
5814 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5815
Simon Atanasyan72244b62012-07-05 16:06:06 +00005816 if (IsMips16)
5817 Builder.defineMacro("__mips16", Twine(1));
5818
Simon Atanasyan60777612013-04-14 14:07:51 +00005819 if (IsMicromips)
5820 Builder.defineMacro("__mips_micromips", Twine(1));
5821
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005822 if (IsNan2008)
5823 Builder.defineMacro("__mips_nan2008", Twine(1));
5824
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005825 switch (DspRev) {
5826 default:
5827 break;
5828 case DSP1:
5829 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5830 Builder.defineMacro("__mips_dsp", Twine(1));
5831 break;
5832 case DSP2:
5833 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5834 Builder.defineMacro("__mips_dspr2", Twine(1));
5835 Builder.defineMacro("__mips_dsp", Twine(1));
5836 break;
5837 }
5838
Jack Carter44ff1e52013-08-12 17:20:29 +00005839 if (HasMSA)
5840 Builder.defineMacro("__mips_msa", Twine(1));
5841
Simon Atanasyan26f19672012-04-05 19:28:31 +00005842 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5843 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5844 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005845
5846 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5847 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005848 }
5849
Craig Topper3164f332014-03-11 03:39:26 +00005850 void getTargetBuiltins(const Builtin::Info *&Records,
5851 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005852 Records = BuiltinInfo;
5853 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005854 }
Craig Topper3164f332014-03-11 03:39:26 +00005855 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005856 return llvm::StringSwitch<bool>(Feature)
5857 .Case("mips", true)
5858 .Case("fp64", HasFP64)
5859 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005860 }
Craig Topper3164f332014-03-11 03:39:26 +00005861 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005862 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005863 }
Craig Topper3164f332014-03-11 03:39:26 +00005864 void getGCCRegNames(const char * const *&Names,
5865 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005866 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005867 // CPU register names
5868 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005869 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5870 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5871 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005872 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5873 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005874 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5875 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5876 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5877 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005878 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005879 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005880 "$fcc5","$fcc6","$fcc7",
5881 // MSA register names
5882 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5883 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5884 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5885 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5886 // MSA control register names
5887 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5888 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005889 };
5890 Names = GCCRegNames;
5891 NumNames = llvm::array_lengthof(GCCRegNames);
5892 }
Craig Topper3164f332014-03-11 03:39:26 +00005893 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5894 unsigned &NumAliases) const override = 0;
5895 bool validateAsmConstraint(const char *&Name,
5896 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005897 switch (*Name) {
5898 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005899 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005900 case 'r': // CPU registers.
5901 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005902 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005903 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005904 case 'c': // $25 for indirect jumps
5905 case 'l': // lo register
5906 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005907 Info.setAllowsRegister();
5908 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005909 case 'I': // Signed 16-bit constant
5910 case 'J': // Integer 0
5911 case 'K': // Unsigned 16-bit constant
5912 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5913 case 'M': // Constants not loadable via lui, addiu, or ori
5914 case 'N': // Constant -1 to -65535
5915 case 'O': // A signed 15-bit constant
5916 case 'P': // A constant between 1 go 65535
5917 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005918 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005919 Info.setAllowsMemory();
5920 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005921 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005922 }
5923
Craig Topper3164f332014-03-11 03:39:26 +00005924 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005925 // In GCC, $1 is not widely used in generated code (it's used only in a few
5926 // specific situations), so there is no real need for users to add it to
5927 // the clobbers list if they want to use it in their inline assembly code.
5928 //
5929 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5930 // code generation, so using it in inline assembly without adding it to the
5931 // clobbers list can cause conflicts between the inline assembly code and
5932 // the surrounding generated code.
5933 //
5934 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5935 // operands, which will conflict with the ".set at" assembler option (which
5936 // we use only for inline assembly, in order to maintain compatibility with
5937 // GCC) and will also conflict with the user's usage of $1.
5938 //
5939 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5940 // register for generated code is to automatically clobber $1 for all inline
5941 // assembly code.
5942 //
5943 // FIXME: We should automatically clobber $1 only for inline assembly code
5944 // which actually uses it. This would allow LLVM to use $1 for inline
5945 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005946 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005947 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005948
Craig Topper3164f332014-03-11 03:39:26 +00005949 bool handleTargetFeatures(std::vector<std::string> &Features,
5950 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005951 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005952 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005953 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005954 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005955 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005956 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005957 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005958
5959 for (std::vector<std::string>::iterator it = Features.begin(),
5960 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005961 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005962 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005963 else if (*it == "+soft-float")
5964 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005965 else if (*it == "+mips16")
5966 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005967 else if (*it == "+micromips")
5968 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005969 else if (*it == "+dsp")
5970 DspRev = std::max(DspRev, DSP1);
5971 else if (*it == "+dspr2")
5972 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005973 else if (*it == "+msa")
5974 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005975 else if (*it == "+fp64")
5976 HasFP64 = true;
5977 else if (*it == "-fp64")
5978 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005979 else if (*it == "+nan2008")
5980 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005981 else if (*it == "-nan2008")
5982 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005983 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005984
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005985 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005986 std::vector<std::string>::iterator it =
5987 std::find(Features.begin(), Features.end(), "+soft-float");
5988 if (it != Features.end())
5989 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005990
Akira Hatanaka9064e362013-10-29 18:30:33 +00005991 setDescriptionString();
5992
Rafael Espindolaeb265472013-08-21 21:59:03 +00005993 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005994 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005995
Craig Topper3164f332014-03-11 03:39:26 +00005996 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005997 if (RegNo == 0) return 4;
5998 if (RegNo == 1) return 5;
5999 return -1;
6000 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006001
6002 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006003};
6004
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006005const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6006#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6007#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6008 ALL_LANGUAGES },
6009#include "clang/Basic/BuiltinsMips.def"
6010};
6011
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006012class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006013public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006014 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006015 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006016 SizeType = UnsignedInt;
6017 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006018 Int64Type = SignedLongLong;
6019 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006020 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006021 }
Craig Topper3164f332014-03-11 03:39:26 +00006022 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006023 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006024 ABI = Name;
6025 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006026 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006027 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006028 }
Craig Topper3164f332014-03-11 03:39:26 +00006029 void getTargetDefines(const LangOptions &Opts,
6030 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006031 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006032
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006033 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006034 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6035
6036 const std::string& CPUStr = getCPU();
6037 if (CPUStr == "mips32")
6038 Builder.defineMacro("__mips_isa_rev", "1");
6039 else if (CPUStr == "mips32r2")
6040 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006041 else if (CPUStr == "mips32r3")
6042 Builder.defineMacro("__mips_isa_rev", "3");
6043 else if (CPUStr == "mips32r5")
6044 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006045 else if (CPUStr == "mips32r6")
6046 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006047
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006048 if (ABI == "o32") {
6049 Builder.defineMacro("__mips_o32");
6050 Builder.defineMacro("_ABIO32", "1");
6051 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6052 }
6053 else if (ABI == "eabi")
6054 Builder.defineMacro("__mips_eabi");
6055 else
David Blaikie83d382b2011-09-23 05:06:16 +00006056 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006057 }
Craig Topper3164f332014-03-11 03:39:26 +00006058 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6059 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006060 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6061 { { "at" }, "$1" },
6062 { { "v0" }, "$2" },
6063 { { "v1" }, "$3" },
6064 { { "a0" }, "$4" },
6065 { { "a1" }, "$5" },
6066 { { "a2" }, "$6" },
6067 { { "a3" }, "$7" },
6068 { { "t0" }, "$8" },
6069 { { "t1" }, "$9" },
6070 { { "t2" }, "$10" },
6071 { { "t3" }, "$11" },
6072 { { "t4" }, "$12" },
6073 { { "t5" }, "$13" },
6074 { { "t6" }, "$14" },
6075 { { "t7" }, "$15" },
6076 { { "s0" }, "$16" },
6077 { { "s1" }, "$17" },
6078 { { "s2" }, "$18" },
6079 { { "s3" }, "$19" },
6080 { { "s4" }, "$20" },
6081 { { "s5" }, "$21" },
6082 { { "s6" }, "$22" },
6083 { { "s7" }, "$23" },
6084 { { "t8" }, "$24" },
6085 { { "t9" }, "$25" },
6086 { { "k0" }, "$26" },
6087 { { "k1" }, "$27" },
6088 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006089 { { "sp","$sp" }, "$29" },
6090 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006091 { { "ra" }, "$31" }
6092 };
6093 Aliases = GCCRegAliases;
6094 NumAliases = llvm::array_lengthof(GCCRegAliases);
6095 }
6096};
6097
6098class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006099 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006100 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006101 }
6102
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006103public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006104 Mips32EBTargetInfo(const llvm::Triple &Triple)
6105 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006106 }
Craig Topper3164f332014-03-11 03:39:26 +00006107 void getTargetDefines(const LangOptions &Opts,
6108 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006109 DefineStd(Builder, "MIPSEB", Opts);
6110 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006111 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006112 }
6113};
6114
6115class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006116 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006117 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006118 }
6119
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006120public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006121 Mips32ELTargetInfo(const llvm::Triple &Triple)
6122 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006123 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006124 }
Craig Topper3164f332014-03-11 03:39:26 +00006125 void getTargetDefines(const LangOptions &Opts,
6126 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006127 DefineStd(Builder, "MIPSEL", Opts);
6128 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006129 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006130 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006131};
Akira Hatanakabef17452011-09-20 19:21:49 +00006132
6133class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006134public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006135 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006136 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006137 LongDoubleWidth = LongDoubleAlign = 128;
6138 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006139 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6140 LongDoubleWidth = LongDoubleAlign = 64;
6141 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6142 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006143 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006144 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006145 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006146 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006147
6148 void setN64ABITypes() {
6149 LongWidth = LongAlign = 64;
6150 PointerWidth = PointerAlign = 64;
6151 SizeType = UnsignedLong;
6152 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006153 Int64Type = SignedLong;
6154 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006155 }
6156
6157 void setN32ABITypes() {
6158 LongWidth = LongAlign = 32;
6159 PointerWidth = PointerAlign = 32;
6160 SizeType = UnsignedInt;
6161 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006162 Int64Type = SignedLongLong;
6163 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006164 }
6165
Craig Topper3164f332014-03-11 03:39:26 +00006166 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006167 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006168 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006169 ABI = Name;
6170 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006171 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006172 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006173 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006174 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006175 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006176 }
6177 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006178 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006179
Craig Topper3164f332014-03-11 03:39:26 +00006180 void getTargetDefines(const LangOptions &Opts,
6181 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006182 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006183
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006184 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006185 Builder.defineMacro("__mips64");
6186 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006187 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6188
6189 const std::string& CPUStr = getCPU();
6190 if (CPUStr == "mips64")
6191 Builder.defineMacro("__mips_isa_rev", "1");
6192 else if (CPUStr == "mips64r2")
6193 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006194 else if (CPUStr == "mips64r3")
6195 Builder.defineMacro("__mips_isa_rev", "3");
6196 else if (CPUStr == "mips64r5")
6197 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006198 else if (CPUStr == "mips64r6")
6199 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006200
Akira Hatanakabef17452011-09-20 19:21:49 +00006201 if (ABI == "n32") {
6202 Builder.defineMacro("__mips_n32");
6203 Builder.defineMacro("_ABIN32", "2");
6204 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6205 }
6206 else if (ABI == "n64") {
6207 Builder.defineMacro("__mips_n64");
6208 Builder.defineMacro("_ABI64", "3");
6209 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6210 }
6211 else
David Blaikie83d382b2011-09-23 05:06:16 +00006212 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006213 }
Craig Topper3164f332014-03-11 03:39:26 +00006214 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6215 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006216 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6217 { { "at" }, "$1" },
6218 { { "v0" }, "$2" },
6219 { { "v1" }, "$3" },
6220 { { "a0" }, "$4" },
6221 { { "a1" }, "$5" },
6222 { { "a2" }, "$6" },
6223 { { "a3" }, "$7" },
6224 { { "a4" }, "$8" },
6225 { { "a5" }, "$9" },
6226 { { "a6" }, "$10" },
6227 { { "a7" }, "$11" },
6228 { { "t0" }, "$12" },
6229 { { "t1" }, "$13" },
6230 { { "t2" }, "$14" },
6231 { { "t3" }, "$15" },
6232 { { "s0" }, "$16" },
6233 { { "s1" }, "$17" },
6234 { { "s2" }, "$18" },
6235 { { "s3" }, "$19" },
6236 { { "s4" }, "$20" },
6237 { { "s5" }, "$21" },
6238 { { "s6" }, "$22" },
6239 { { "s7" }, "$23" },
6240 { { "t8" }, "$24" },
6241 { { "t9" }, "$25" },
6242 { { "k0" }, "$26" },
6243 { { "k1" }, "$27" },
6244 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006245 { { "sp","$sp" }, "$29" },
6246 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006247 { { "ra" }, "$31" }
6248 };
6249 Aliases = GCCRegAliases;
6250 NumAliases = llvm::array_lengthof(GCCRegAliases);
6251 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006252
6253 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006254};
6255
6256class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006257 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006258 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006259 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 +00006260 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006261 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006262
Akira Hatanakabef17452011-09-20 19:21:49 +00006263 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006264
Akira Hatanakabef17452011-09-20 19:21:49 +00006265public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006266 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006267 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006268 void getTargetDefines(const LangOptions &Opts,
6269 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006270 DefineStd(Builder, "MIPSEB", Opts);
6271 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006272 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006273 }
6274};
6275
6276class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006277 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006278 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006279 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 +00006280 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006281 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006282 }
6283public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006284 Mips64ELTargetInfo(const llvm::Triple &Triple)
6285 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006286 // Default ABI is n64.
6287 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006288 }
Craig Topper3164f332014-03-11 03:39:26 +00006289 void getTargetDefines(const LangOptions &Opts,
6290 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006291 DefineStd(Builder, "MIPSEL", Opts);
6292 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006293 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006294 }
6295};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006296} // end anonymous namespace.
6297
Ivan Krasindd7403e2011-08-24 20:22:22 +00006298namespace {
6299class PNaClTargetInfo : public TargetInfo {
6300public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006301 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006302 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006303 this->UserLabelPrefix = "";
6304 this->LongAlign = 32;
6305 this->LongWidth = 32;
6306 this->PointerAlign = 32;
6307 this->PointerWidth = 32;
6308 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006309 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006310 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006311 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006312 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006313 this->SizeType = TargetInfo::UnsignedInt;
6314 this->PtrDiffType = TargetInfo::SignedInt;
6315 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006316 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006317 }
6318
Craig Topper3164f332014-03-11 03:39:26 +00006319 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006320 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006321 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006322 Builder.defineMacro("__le32__");
6323 Builder.defineMacro("__pnacl__");
6324 }
Craig Topper3164f332014-03-11 03:39:26 +00006325 void getTargetDefines(const LangOptions &Opts,
6326 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006327 getArchDefines(Opts, Builder);
6328 }
Craig Topper3164f332014-03-11 03:39:26 +00006329 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006330 return Feature == "pnacl";
6331 }
Craig Topper3164f332014-03-11 03:39:26 +00006332 void getTargetBuiltins(const Builtin::Info *&Records,
6333 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006334 }
Craig Topper3164f332014-03-11 03:39:26 +00006335 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006336 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006337 }
Craig Topper3164f332014-03-11 03:39:26 +00006338 void getGCCRegNames(const char * const *&Names,
6339 unsigned &NumNames) const override;
6340 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6341 unsigned &NumAliases) const override;
6342 bool validateAsmConstraint(const char *&Name,
6343 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006344 return false;
6345 }
6346
Craig Topper3164f332014-03-11 03:39:26 +00006347 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006348 return "";
6349 }
6350};
6351
6352void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6353 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006354 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006355 NumNames = 0;
6356}
6357
6358void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6359 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006360 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006361 NumAliases = 0;
6362}
6363} // end anonymous namespace.
6364
Guy Benyeib798fc92012-12-11 21:38:14 +00006365namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006366class Le64TargetInfo : public TargetInfo {
6367 static const Builtin::Info BuiltinInfo[];
6368
6369public:
6370 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6371 BigEndian = false;
6372 NoAsmVariants = true;
6373 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6374 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6375 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006376 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006377 }
6378
6379 void getTargetDefines(const LangOptions &Opts,
6380 MacroBuilder &Builder) const override {
6381 DefineStd(Builder, "unix", Opts);
6382 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6383 Builder.defineMacro("__ELF__");
6384 }
6385 void getTargetBuiltins(const Builtin::Info *&Records,
6386 unsigned &NumRecords) const override {
6387 Records = BuiltinInfo;
6388 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6389 }
6390 BuiltinVaListKind getBuiltinVaListKind() const override {
6391 return TargetInfo::PNaClABIBuiltinVaList;
6392 }
6393 const char *getClobbers() const override { return ""; }
6394 void getGCCRegNames(const char *const *&Names,
6395 unsigned &NumNames) const override {
6396 Names = nullptr;
6397 NumNames = 0;
6398 }
6399 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6400 unsigned &NumAliases) const override {
6401 Aliases = nullptr;
6402 NumAliases = 0;
6403 }
6404 bool validateAsmConstraint(const char *&Name,
6405 TargetInfo::ConstraintInfo &Info) const override {
6406 return false;
6407 }
6408
6409 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006410};
6411} // end anonymous namespace.
6412
6413const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6414#define BUILTIN(ID, TYPE, ATTRS) \
6415 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6416#include "clang/Basic/BuiltinsLe64.def"
6417};
6418
6419namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006420 static const unsigned SPIRAddrSpaceMap[] = {
6421 1, // opencl_global
6422 3, // opencl_local
6423 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006424 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006425 0, // cuda_device
6426 0, // cuda_constant
6427 0 // cuda_shared
6428 };
6429 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006430 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006431 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006432 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6433 "SPIR target must use unknown OS");
6434 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6435 "SPIR target must use unknown environment type");
6436 BigEndian = false;
6437 TLSSupported = false;
6438 LongWidth = LongAlign = 64;
6439 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006440 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006441 // Define available target features
6442 // These must be defined in sorted order!
6443 NoAsmVariants = true;
6444 }
Craig Topper3164f332014-03-11 03:39:26 +00006445 void getTargetDefines(const LangOptions &Opts,
6446 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006447 DefineStd(Builder, "SPIR", Opts);
6448 }
Craig Topper3164f332014-03-11 03:39:26 +00006449 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006450 return Feature == "spir";
6451 }
Craig Topper3164f332014-03-11 03:39:26 +00006452
6453 void getTargetBuiltins(const Builtin::Info *&Records,
6454 unsigned &NumRecords) const override {}
6455 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006456 return "";
6457 }
Craig Topper3164f332014-03-11 03:39:26 +00006458 void getGCCRegNames(const char * const *&Names,
6459 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006460 bool
6461 validateAsmConstraint(const char *&Name,
6462 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006463 return true;
6464 }
Craig Topper3164f332014-03-11 03:39:26 +00006465 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6466 unsigned &NumAliases) const override {}
6467 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006468 return TargetInfo::VoidPtrBuiltinVaList;
6469 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006470
6471 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6472 return (CC == CC_SpirFunction ||
6473 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6474 }
6475
6476 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6477 return CC_SpirFunction;
6478 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006479 };
6480
6481
6482 class SPIR32TargetInfo : public SPIRTargetInfo {
6483 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006484 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006485 PointerWidth = PointerAlign = 32;
6486 SizeType = TargetInfo::UnsignedInt;
6487 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6488 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006489 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6490 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006491 }
Craig Topper3164f332014-03-11 03:39:26 +00006492 void getTargetDefines(const LangOptions &Opts,
6493 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006494 DefineStd(Builder, "SPIR32", Opts);
6495 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006496 };
6497
6498 class SPIR64TargetInfo : public SPIRTargetInfo {
6499 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006500 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006501 PointerWidth = PointerAlign = 64;
6502 SizeType = TargetInfo::UnsignedLong;
6503 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006504 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6505 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006506 }
Craig Topper3164f332014-03-11 03:39:26 +00006507 void getTargetDefines(const LangOptions &Opts,
6508 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006509 DefineStd(Builder, "SPIR64", Opts);
6510 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006511 };
6512}
6513
Robert Lytton0e076492013-08-13 09:43:10 +00006514namespace {
6515class XCoreTargetInfo : public TargetInfo {
6516 static const Builtin::Info BuiltinInfo[];
6517public:
6518 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6519 BigEndian = false;
6520 NoAsmVariants = true;
6521 LongLongAlign = 32;
6522 SuitableAlign = 32;
6523 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006524 SizeType = UnsignedInt;
6525 PtrDiffType = SignedInt;
6526 IntPtrType = SignedInt;
6527 WCharType = UnsignedChar;
6528 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006529 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006530 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 +00006531 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006532 }
Craig Topper3164f332014-03-11 03:39:26 +00006533 void getTargetDefines(const LangOptions &Opts,
6534 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006535 Builder.defineMacro("__XS1B__");
6536 }
Craig Topper3164f332014-03-11 03:39:26 +00006537 void getTargetBuiltins(const Builtin::Info *&Records,
6538 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006539 Records = BuiltinInfo;
6540 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6541 }
Craig Topper3164f332014-03-11 03:39:26 +00006542 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006543 return TargetInfo::VoidPtrBuiltinVaList;
6544 }
Craig Topper3164f332014-03-11 03:39:26 +00006545 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006546 return "";
6547 }
Craig Topper3164f332014-03-11 03:39:26 +00006548 void getGCCRegNames(const char * const *&Names,
6549 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006550 static const char * const GCCRegNames[] = {
6551 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6552 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6553 };
6554 Names = GCCRegNames;
6555 NumNames = llvm::array_lengthof(GCCRegNames);
6556 }
Craig Topper3164f332014-03-11 03:39:26 +00006557 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6558 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006559 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006560 NumAliases = 0;
6561 }
Craig Topper3164f332014-03-11 03:39:26 +00006562 bool validateAsmConstraint(const char *&Name,
6563 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006564 return false;
6565 }
Craig Topper3164f332014-03-11 03:39:26 +00006566 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006567 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6568 return (RegNo < 2)? RegNo : -1;
6569 }
Robert Lytton0e076492013-08-13 09:43:10 +00006570};
6571
6572const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6573#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6574#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6575 ALL_LANGUAGES },
6576#include "clang/Basic/BuiltinsXCore.def"
6577};
6578} // end anonymous namespace.
6579
Ivan Krasindd7403e2011-08-24 20:22:22 +00006580
Chris Lattner5ba61f02006-10-14 07:39:34 +00006581//===----------------------------------------------------------------------===//
6582// Driver code
6583//===----------------------------------------------------------------------===//
6584
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006585static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006586 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006587
Daniel Dunbar52322032009-08-18 05:47:58 +00006588 switch (Triple.getArch()) {
6589 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006590 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006591
Tim Northover2a0783d2014-05-30 14:14:07 +00006592 case llvm::Triple::xcore:
6593 return new XCoreTargetInfo(Triple);
6594
6595 case llvm::Triple::hexagon:
6596 return new HexagonTargetInfo(Triple);
6597
6598 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006599 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006600 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006601
6602 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006603 case llvm::Triple::FreeBSD:
6604 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006605 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006606 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006607 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006608 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006609 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006610 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006611 }
6612
Christian Pirker9b019ae2014-02-25 13:51:00 +00006613 case llvm::Triple::aarch64_be:
6614 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006615 case llvm::Triple::FreeBSD:
6616 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006617 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006618 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006619 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006620 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006621 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006622 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006623 }
6624
Daniel Dunbar52322032009-08-18 05:47:58 +00006625 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006626 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006627 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006628 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006629
Daniel Dunbar52322032009-08-18 05:47:58 +00006630 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006631 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006632 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006633 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006634 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006635 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006636 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006637 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006638 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006639 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006640 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006641 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006642 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006643 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006644 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006645 case llvm::Triple::Win32:
6646 switch (Triple.getEnvironment()) {
6647 default:
6648 return new ARMleTargetInfo(Triple);
6649 case llvm::Triple::Itanium:
6650 return new ItaniumWindowsARMleTargetInfo(Triple);
6651 case llvm::Triple::MSVC:
6652 return new MicrosoftARMleTargetInfo(Triple);
6653 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006654 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006655 return new ARMleTargetInfo(Triple);
6656 }
6657
6658 case llvm::Triple::armeb:
6659 case llvm::Triple::thumbeb:
6660 if (Triple.isOSDarwin())
6661 return new DarwinARMTargetInfo(Triple);
6662
6663 switch (os) {
6664 case llvm::Triple::Linux:
6665 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6666 case llvm::Triple::FreeBSD:
6667 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6668 case llvm::Triple::NetBSD:
6669 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6670 case llvm::Triple::OpenBSD:
6671 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6672 case llvm::Triple::Bitrig:
6673 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6674 case llvm::Triple::RTEMS:
6675 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6676 case llvm::Triple::NaCl:
6677 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6678 default:
6679 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006680 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006681
Daniel Dunbar52322032009-08-18 05:47:58 +00006682 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006683 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006684
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006685 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006686 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006687 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006688 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006689 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006690 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006691 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006692 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006693 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006694 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006695 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006696 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006697 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006698
6699 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006700 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006701 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006702 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006703 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006704 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006705 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006706 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006707 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006708 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006709 case llvm::Triple::NaCl:
6710 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006711 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006712 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006713 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006714
Akira Hatanakabef17452011-09-20 19:21:49 +00006715 case llvm::Triple::mips64:
6716 switch (os) {
6717 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006718 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006719 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006720 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006721 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006722 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006723 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006724 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006725 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006726 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006727 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006728 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006729 }
6730
6731 case llvm::Triple::mips64el:
6732 switch (os) {
6733 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006734 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006735 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006736 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006737 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006738 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006739 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006740 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006741 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006742 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006743 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006744 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006745 }
6746
Ivan Krasindd7403e2011-08-24 20:22:22 +00006747 case llvm::Triple::le32:
6748 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006749 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006750 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006751 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006752 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006753 }
6754
JF Bastien643817d2014-09-12 17:52:47 +00006755 case llvm::Triple::le64:
6756 return new Le64TargetInfo(Triple);
6757
Daniel Dunbar52322032009-08-18 05:47:58 +00006758 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006759 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006760 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006761 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006762 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006763 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006764 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006765 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006766 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006767 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006768 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006769 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006770 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006771 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006772 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006773 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006774 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006775
6776 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006777 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006778 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006779 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006780 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006781 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006782 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006783 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006784 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006785 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006786 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006787 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006788 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006789 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006790 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006791
Bill Schmidt778d3872013-07-26 01:36:11 +00006792 case llvm::Triple::ppc64le:
6793 switch (os) {
6794 case llvm::Triple::Linux:
6795 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6796 default:
6797 return new PPC64TargetInfo(Triple);
6798 }
6799
Peter Collingbournec947aae2012-05-20 23:28:41 +00006800 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006801 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006802 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006803 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006804
Tom Stellardd8e38a32015-01-06 20:34:47 +00006805 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006806 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006807 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006808
Daniel Dunbar52322032009-08-18 05:47:58 +00006809 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006810 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006811 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006812 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006813 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006814 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006815 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006816 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006817 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006818 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006819 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006820 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006821 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006822 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006823 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006824
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006825 case llvm::Triple::sparcv9:
6826 switch (os) {
6827 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006828 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006829 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006830 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006831 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006832 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006833 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006834 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006835 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006836 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006837 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006838 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006839 }
6840
Ulrich Weigand47445072013-05-06 16:26:41 +00006841 case llvm::Triple::systemz:
6842 switch (os) {
6843 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006844 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006845 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006846 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006847 }
6848
Eli Friedmana9c3d712009-08-19 20:47:07 +00006849 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006850 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006851
Daniel Dunbar52322032009-08-18 05:47:58 +00006852 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006853 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006854 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006855
Daniel Dunbar52322032009-08-18 05:47:58 +00006856 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006857 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006858 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006859 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006860 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006861 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006862 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006863 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006864 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006865 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006866 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006867 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006868 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006869 case llvm::Triple::KFreeBSD:
6870 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006871 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006872 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006873 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006874 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006875 case llvm::Triple::Win32: {
6876 switch (Triple.getEnvironment()) {
6877 default:
6878 return new X86_32TargetInfo(Triple);
6879 case llvm::Triple::Cygnus:
6880 return new CygwinX86_32TargetInfo(Triple);
6881 case llvm::Triple::GNU:
6882 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006883 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006884 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006885 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006886 }
6887 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006888 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006889 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006890 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006891 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006892 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006893 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006894 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006895 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006896 }
6897
6898 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006899 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006900 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006901
Daniel Dunbar52322032009-08-18 05:47:58 +00006902 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00006903 case llvm::Triple::CloudABI:
6904 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006905 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006906 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006907 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006908 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006909 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006910 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006911 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006912 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006913 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006914 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006915 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006916 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006917 case llvm::Triple::KFreeBSD:
6918 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006919 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006920 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006921 case llvm::Triple::Win32: {
6922 switch (Triple.getEnvironment()) {
6923 default:
6924 return new X86_64TargetInfo(Triple);
6925 case llvm::Triple::GNU:
6926 return new MinGWX86_64TargetInfo(Triple);
6927 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006928 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006929 }
6930 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006931 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006932 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006933 case llvm::Triple::PS4:
6934 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006935 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006936 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006937 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006938
6939 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006940 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006941 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006942 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006943 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006944 }
6945 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006946 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006947 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006948 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006949 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006950 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006951 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006952}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006953
6954/// CreateTargetInfo - Return the target info object for the specified target
6955/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006956TargetInfo *
6957TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6958 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006959 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006960
6961 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006962 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006963 if (!Target) {
6964 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006965 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006966 }
Alp Toker80758082014-07-06 05:26:44 +00006967 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006968
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006969 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006970 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6971 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006972 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006973 }
6974
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006975 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006976 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6977 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006978 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006979 }
6980
Rafael Espindolaeb265472013-08-21 21:59:03 +00006981 // Set the fp math unit.
6982 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6983 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006984 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006985 }
6986
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006987 // Compute the default target features, we need the target to handle this
6988 // because features may have dependencies on one another.
6989 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006990 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006991
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006992 // Apply the user specified deltas.
6993 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6994 I < N; ++I) {
6995 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006996 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006997 bool Enabled = Name[0] == '+';
6998 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006999 }
7000
7001 // Add the features to the compile options.
7002 //
7003 // FIXME: If we are completely confident that we have the right set, we only
7004 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007005 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007006 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7007 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007008 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007009 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007010 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007011
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007012 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007013}