blob: 0034ed83846f990061ffa9be64ac338ca52ba9ed [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000031#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000032using namespace clang;
33
Chris Lattner5ba61f02006-10-14 07:39:34 +000034//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000035// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
37
Chris Lattner1e1c0b92009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000044
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055}
56
Benjamin Kramere3b442d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000096 if (Opts.Sanitize.has(SanitizerKind::Address))
97 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Evan Cheng31dd9a62014-01-26 23:12:43 +0000141 // Set the appropriate OS version define.
142 if (Triple.isiOS()) {
143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 Str);
153 } else if (Triple.isMacOSX()) {
154 // Note that the Driver allows versions which aren't representable in the
155 // define (because we only get a single digit for the minor and micro
156 // revision numbers). So, we limit them to the maximum representable
157 // version.
158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000159 char Str[7];
160 if (Maj < 10 || (Maj == 10 && Min < 10)) {
161 Str[0] = '0' + (Maj / 10);
162 Str[1] = '0' + (Maj % 10);
163 Str[2] = '0' + std::min(Min, 9U);
164 Str[3] = '0' + std::min(Rev, 9U);
165 Str[4] = '\0';
166 } else {
167 // Handle versions > 10.9.
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
170 Str[2] = '0' + (Min / 10);
171 Str[3] = '0' + (Min % 10);
172 Str[4] = '0' + (Rev / 10);
173 Str[5] = '0' + (Rev % 10);
174 Str[6] = '\0';
175 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000176 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000177 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 // Tell users about the kernel if there is one.
180 if (Triple.isOSDarwin())
181 Builder.defineMacro("__MACH__");
182
Daniel Dunbarecf13562011-04-19 21:40:34 +0000183 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000184}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000185
Benjamin Kramerd5748c72015-03-23 12:31:05 +0000186namespace {
Ed Schoutenf33c6072015-03-11 08:42:46 +0000187// CloudABI Target
188template <typename Target>
189class CloudABITargetInfo : public OSTargetInfo<Target> {
190protected:
191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
193 Builder.defineMacro("__CloudABI__");
194 Builder.defineMacro("__ELF__");
195
196 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
197 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
198 Builder.defineMacro("__STDC_UTF_16__");
199 Builder.defineMacro("__STDC_UTF_32__");
200 }
201
202public:
203 CloudABITargetInfo(const llvm::Triple &Triple)
204 : OSTargetInfo<Target>(Triple) {
205 this->UserLabelPrefix = "";
206 }
207};
208
Torok Edwinb2b37c62009-06-30 17:10:35 +0000209template<typename Target>
210class DarwinTargetInfo : public OSTargetInfo<Target> {
211protected:
Craig Topper3164f332014-03-11 03:39:26 +0000212 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
213 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000214 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000215 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216 }
Mike Stump11289f42009-09-09 15:08:12 +0000217
Torok Edwinb2b37c62009-06-30 17:10:35 +0000218public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000219 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
220 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
221 this->MCountName = "\01mcount";
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223
Craig Topper3164f332014-03-11 03:39:26 +0000224 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000225 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000226 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000228 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000230 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000231 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000232
Craig Topper3164f332014-03-11 03:39:26 +0000233 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000234 // FIXME: We should return 0 when building kexts.
235 return "__TEXT,__StaticInit,regular,pure_instructions";
236 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000237
John McCalleed64c72012-01-29 01:20:30 +0000238 /// Darwin does not support protected visibility. Darwin's "default"
239 /// is very similar to ELF's "protected"; Darwin requires a "weak"
240 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000241 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000242 return false;
243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244};
245
Chris Lattner30ba6742009-08-10 19:03:04 +0000246
Torok Edwinb2b37c62009-06-30 17:10:35 +0000247// DragonFlyBSD Target
248template<typename Target>
249class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
250protected:
Craig Topper3164f332014-03-11 03:39:26 +0000251 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
252 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000254 Builder.defineMacro("__DragonFly__");
255 Builder.defineMacro("__DragonFly_cc_version", "100001");
256 Builder.defineMacro("__ELF__");
257 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
258 Builder.defineMacro("__tune_i386__");
259 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260 }
261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000262 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
263 : OSTargetInfo<Target>(Triple) {
264 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000265
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000273 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274};
275
276// FreeBSD Target
277template<typename Target>
278class FreeBSDTargetInfo : public OSTargetInfo<Target> {
279protected:
Craig Topper3164f332014-03-11 03:39:26 +0000280 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
281 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282 // FreeBSD defines; list based off of gcc output
283
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000284 unsigned Release = Triple.getOSMajorVersion();
285 if (Release == 0U)
286 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000287
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000288 Builder.defineMacro("__FreeBSD__", Twine(Release));
289 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000290 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
291 DefineStd(Builder, "unix", Opts);
292 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000293
294 // On FreeBSD, wchar_t contains the number of the code point as
295 // used by the character set of the locale. These character sets are
296 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000297 //
298 // FIXME: This is wrong; the macro refers to the numerical values
299 // of wchar_t *literals*, which are not locale-dependent. However,
300 // FreeBSD systems apparently depend on us getting this wrong, and
301 // setting this to 1 is conforming even if all the basic source
302 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000303 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000304 }
305public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000306 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
307 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000308
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000309 switch (Triple.getArch()) {
310 default:
311 case llvm::Triple::x86:
312 case llvm::Triple::x86_64:
313 this->MCountName = ".mcount";
314 break;
315 case llvm::Triple::mips:
316 case llvm::Triple::mipsel:
317 case llvm::Triple::ppc:
318 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000319 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000320 this->MCountName = "_mcount";
321 break;
322 case llvm::Triple::arm:
323 this->MCountName = "__mcount";
324 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000325 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000326 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000327};
328
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000329// GNU/kFreeBSD Target
330template<typename Target>
331class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
332protected:
Craig Topper3164f332014-03-11 03:39:26 +0000333 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
334 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000335 // GNU/kFreeBSD defines; list based off of gcc output
336
337 DefineStd(Builder, "unix", Opts);
338 Builder.defineMacro("__FreeBSD_kernel__");
339 Builder.defineMacro("__GLIBC__");
340 Builder.defineMacro("__ELF__");
341 if (Opts.POSIXThreads)
342 Builder.defineMacro("_REENTRANT");
343 if (Opts.CPlusPlus)
344 Builder.defineMacro("_GNU_SOURCE");
345 }
346public:
Eric Christopher917e9522014-11-18 22:36:15 +0000347 KFreeBSDTargetInfo(const llvm::Triple &Triple)
348 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000349 this->UserLabelPrefix = "";
350 }
351};
352
Chris Lattner3e2ee142010-07-07 16:01:42 +0000353// Minix Target
354template<typename Target>
355class MinixTargetInfo : public OSTargetInfo<Target> {
356protected:
Craig Topper3164f332014-03-11 03:39:26 +0000357 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
358 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000359 // Minix defines
360
361 Builder.defineMacro("__minix", "3");
362 Builder.defineMacro("_EM_WSIZE", "4");
363 Builder.defineMacro("_EM_PSIZE", "4");
364 Builder.defineMacro("_EM_SSIZE", "2");
365 Builder.defineMacro("_EM_LSIZE", "4");
366 Builder.defineMacro("_EM_FSIZE", "4");
367 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000368 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000369 DefineStd(Builder, "unix", Opts);
370 }
371public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000372 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
373 this->UserLabelPrefix = "";
374 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000375};
376
Torok Edwinb2b37c62009-06-30 17:10:35 +0000377// Linux target
378template<typename Target>
379class LinuxTargetInfo : public OSTargetInfo<Target> {
380protected:
Craig Topper3164f332014-03-11 03:39:26 +0000381 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
382 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000383 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000384 DefineStd(Builder, "unix", Opts);
385 DefineStd(Builder, "linux", Opts);
386 Builder.defineMacro("__gnu_linux__");
387 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000388 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000389 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000390 unsigned Maj, Min, Rev;
391 Triple.getOSVersion(Maj, Min, Rev);
392 this->PlatformName = "android";
393 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
394 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000395 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000396 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000399 }
400public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000401 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000402 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000403 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000404
405 switch (Triple.getArch()) {
406 default:
407 break;
408 case llvm::Triple::ppc:
409 case llvm::Triple::ppc64:
410 case llvm::Triple::ppc64le:
411 this->MCountName = "_mcount";
412 break;
413 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000414 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000415
Craig Topper3164f332014-03-11 03:39:26 +0000416 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000417 return ".text.startup";
418 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419};
420
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000421// NetBSD Target
422template<typename Target>
423class NetBSDTargetInfo : public OSTargetInfo<Target> {
424protected:
Craig Topper3164f332014-03-11 03:39:26 +0000425 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
426 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000427 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000428 Builder.defineMacro("__NetBSD__");
429 Builder.defineMacro("__unix__");
430 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000431 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000432 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000433
434 switch (Triple.getArch()) {
435 default:
436 break;
437 case llvm::Triple::arm:
438 case llvm::Triple::armeb:
439 case llvm::Triple::thumb:
440 case llvm::Triple::thumbeb:
441 Builder.defineMacro("__ARM_DWARF_EH__");
442 break;
443 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000444 }
445public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000446 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
447 this->UserLabelPrefix = "";
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));
David Majnemeraaf2b842015-03-18 07:53:18 +0000658
659 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(19))
660 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000661 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000662
663 if (Opts.MicrosoftExt) {
664 Builder.defineMacro("_MSC_EXTENSIONS");
665
666 if (Opts.CPlusPlus11) {
667 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
668 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
669 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
670 }
671 }
672
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000673 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000674 }
675
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000676public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000677 WindowsTargetInfo(const llvm::Triple &Triple)
678 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000679};
680
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000681template <typename Target>
682class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000683protected:
Craig Topper3164f332014-03-11 03:39:26 +0000684 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
685 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000686 if (Opts.POSIXThreads)
687 Builder.defineMacro("_REENTRANT");
688 if (Opts.CPlusPlus)
689 Builder.defineMacro("_GNU_SOURCE");
690
691 DefineStd(Builder, "unix", Opts);
692 Builder.defineMacro("__ELF__");
693 Builder.defineMacro("__native_client__");
694 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000695
696public:
697 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000698 this->UserLabelPrefix = "";
699 this->LongAlign = 32;
700 this->LongWidth = 32;
701 this->PointerAlign = 32;
702 this->PointerWidth = 32;
703 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000704 this->Int64Type = TargetInfo::SignedLongLong;
705 this->DoubleAlign = 64;
706 this->LongDoubleWidth = 64;
707 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000708 this->LongLongWidth = 64;
709 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000710 this->SizeType = TargetInfo::UnsignedInt;
711 this->PtrDiffType = TargetInfo::SignedInt;
712 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000713 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000714 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000715 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000716 this->DescriptionString =
717 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000718 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000719 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000720 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000721 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000722 } else if (Triple.getArch() == llvm::Triple::mipsel) {
723 // Handled on mips' setDescriptionString.
724 } else {
725 assert(Triple.getArch() == llvm::Triple::le32);
726 this->DescriptionString = "e-p:32:32-i64:64";
727 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000728 }
729};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000730
Chris Lattner09d98f52008-10-05 21:50:58 +0000731//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000732// Specific target implementations.
733//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000734
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000735// PPC abstract base class
736class PPCTargetInfo : public TargetInfo {
737 static const Builtin::Info BuiltinInfo[];
738 static const char * const GCCRegNames[];
739 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000740 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000741
742 // Target cpu features.
743 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000744 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000745 bool HasP8Crypto;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000746 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000747 bool HasHTM;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000748
Ulrich Weigand8afad612014-07-28 13:17:52 +0000749protected:
750 std::string ABI;
751
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000752public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000753 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000754 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Kit Barton8246f282015-03-25 19:41:41 +0000755 HasP8Crypto(false), HasQPX(false), HasHTM(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000756 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000757 LongDoubleWidth = LongDoubleAlign = 128;
758 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
759 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000760
Hal Finkel6b984f02012-07-03 16:51:04 +0000761 /// \brief Flags for architecture specific defines.
762 typedef enum {
763 ArchDefineNone = 0,
764 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
765 ArchDefinePpcgr = 1 << 1,
766 ArchDefinePpcsq = 1 << 2,
767 ArchDefine440 = 1 << 3,
768 ArchDefine603 = 1 << 4,
769 ArchDefine604 = 1 << 5,
770 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000771 ArchDefinePwr5 = 1 << 7,
772 ArchDefinePwr5x = 1 << 8,
773 ArchDefinePwr6 = 1 << 9,
774 ArchDefinePwr6x = 1 << 10,
775 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000776 ArchDefinePwr8 = 1 << 12,
777 ArchDefineA2 = 1 << 13,
778 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000779 } ArchDefineTypes;
780
Bill Schmidt38378a02013-02-01 20:23:10 +0000781 // Note: GCC recognizes the following additional cpus:
782 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
783 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
784 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000785 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000786 bool CPUKnown = llvm::StringSwitch<bool>(Name)
787 .Case("generic", true)
788 .Case("440", true)
789 .Case("450", true)
790 .Case("601", true)
791 .Case("602", true)
792 .Case("603", true)
793 .Case("603e", true)
794 .Case("603ev", true)
795 .Case("604", true)
796 .Case("604e", true)
797 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000798 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000799 .Case("g3", true)
800 .Case("7400", true)
801 .Case("g4", true)
802 .Case("7450", true)
803 .Case("g4+", true)
804 .Case("750", true)
805 .Case("970", true)
806 .Case("g5", true)
807 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000808 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000809 .Case("e500mc", true)
810 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000811 .Case("power3", true)
812 .Case("pwr3", true)
813 .Case("power4", true)
814 .Case("pwr4", true)
815 .Case("power5", true)
816 .Case("pwr5", true)
817 .Case("power5x", true)
818 .Case("pwr5x", true)
819 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000820 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000821 .Case("power6x", true)
822 .Case("pwr6x", true)
823 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000824 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000825 .Case("power8", true)
826 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000827 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000828 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000829 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000830 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000831 .Case("powerpc64le", true)
832 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000833 .Default(false);
834
835 if (CPUKnown)
836 CPU = Name;
837
838 return CPUKnown;
839 }
840
Ulrich Weigand8afad612014-07-28 13:17:52 +0000841
842 StringRef getABI() const override { return ABI; }
843
Craig Topper3164f332014-03-11 03:39:26 +0000844 void getTargetBuiltins(const Builtin::Info *&Records,
845 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000846 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000847 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000848 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000849
Craig Topper3164f332014-03-11 03:39:26 +0000850 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000851
Craig Topper3164f332014-03-11 03:39:26 +0000852 void getTargetDefines(const LangOptions &Opts,
853 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000854
Craig Topper3164f332014-03-11 03:39:26 +0000855 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000856
Craig Topper3164f332014-03-11 03:39:26 +0000857 bool handleTargetFeatures(std::vector<std::string> &Features,
858 DiagnosticsEngine &Diags) override;
859 bool hasFeature(StringRef Feature) const override;
860
861 void getGCCRegNames(const char * const *&Names,
862 unsigned &NumNames) const override;
863 void getGCCRegAliases(const GCCRegAlias *&Aliases,
864 unsigned &NumAliases) const override;
865 bool validateAsmConstraint(const char *&Name,
866 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000867 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000868 default: return false;
869 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000870 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000871 case 'b': // Base register
872 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000873 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000874 break;
875 // FIXME: The following are added to allow parsing.
876 // I just took a guess at what the actions should be.
877 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000878 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000879 case 'v': // Altivec vector register
880 Info.setAllowsRegister();
881 break;
882 case 'w':
883 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000884 case 'd':// VSX vector register to hold vector double data
885 case 'f':// VSX vector register to hold vector float data
886 case 's':// VSX vector register to hold scalar float data
887 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000888 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000889 break;
890 default:
891 return false;
892 }
893 Info.setAllowsRegister();
894 Name++; // Skip over 'w'.
895 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000896 case 'h': // `MQ', `CTR', or `LINK' register
897 case 'q': // `MQ' register
898 case 'c': // `CTR' register
899 case 'l': // `LINK' register
900 case 'x': // `CR' register (condition register) number 0
901 case 'y': // `CR' register (condition register)
902 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000903 Info.setAllowsRegister();
904 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000905 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000906 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000907 // (use `L' instead for SImode constants)
908 case 'K': // Unsigned 16-bit constant
909 case 'L': // Signed 16-bit constant shifted left 16 bits
910 case 'M': // Constant larger than 31
911 case 'N': // Exact power of 2
912 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000913 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000914 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000915 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000916 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000917 break;
918 case 'm': // Memory operand. Note that on PowerPC targets, m can
919 // include addresses that update the base register. It
920 // is therefore only safe to use `m' in an asm statement
921 // if that asm statement accesses the operand exactly once.
922 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000923 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000924 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000925 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000926 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000927 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
928 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000929 // register to be updated.
930 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000931 if (Name[1] != 's')
932 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000933 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000934 // include any automodification of the base register. Unlike
935 // `m', this constraint can be used in asm statements that
936 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000937 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000938 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000939 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000940 break;
941 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000942 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000943 case 'Z': // Memory operand that is an indexed or indirect from a
944 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000945 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000946 Info.setAllowsMemory();
947 Info.setAllowsRegister();
948 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000949 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000950 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000951 // register (`p' is preferable for asm statements)
952 case 'S': // Constant suitable as a 64-bit mask operand
953 case 'T': // Constant suitable as a 32-bit mask operand
954 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000955 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000956 // instructions
957 case 'W': // Vector constant that does not require memory
958 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000959 break;
960 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000961 }
John Thompson07a61a42010-06-24 22:44:13 +0000962 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000963 }
Craig Topper3164f332014-03-11 03:39:26 +0000964 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000965 std::string R;
966 switch (*Constraint) {
967 case 'e':
968 case 'w':
969 // Two-character constraint; add "^" hint for later parsing.
970 R = std::string("^") + std::string(Constraint, 2);
971 Constraint++;
972 break;
973 default:
974 return TargetInfo::convertConstraint(Constraint);
975 }
976 return R;
977 }
Craig Topper3164f332014-03-11 03:39:26 +0000978 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000979 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000980 }
Craig Topper3164f332014-03-11 03:39:26 +0000981 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000982 if (RegNo == 0) return 3;
983 if (RegNo == 1) return 4;
984 return -1;
985 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +0000986
987 bool hasSjLjLowering() const override {
988 return true;
989 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000990};
Anders Carlssonf511f642007-11-27 04:11:28 +0000991
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000992const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000993#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000994#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000995 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000996#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000997};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000998
Eric Christopher917e9522014-11-18 22:36:15 +0000999/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001000/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001001bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001002 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001003 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1004 // Ignore disabled features.
1005 if (Features[i][0] == '-')
1006 continue;
1007
1008 StringRef Feature = StringRef(Features[i]).substr(1);
1009
1010 if (Feature == "vsx") {
1011 HasVSX = true;
1012 continue;
1013 }
1014
Bill Schmidt59eb7672014-10-10 15:09:43 +00001015 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001016 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001017 continue;
1018 }
1019
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001020 if (Feature == "crypto") {
1021 HasP8Crypto = true;
1022 continue;
1023 }
1024
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001025 if (Feature == "qpx") {
1026 HasQPX = true;
1027 continue;
1028 }
1029
Kit Barton8246f282015-03-25 19:41:41 +00001030 if (Feature == "htm") {
1031 HasHTM = true;
1032 continue;
1033 }
1034
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001035 // TODO: Finish this list and add an assert that we've handled them
1036 // all.
1037 }
1038
1039 return true;
1040}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001041
Chris Lattnerecd49032009-03-02 22:27:17 +00001042/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1043/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001044void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001045 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001046 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001047 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001048 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001049 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001050 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001051 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001052 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001053 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001054 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001055 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001056 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001057 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001058
Chris Lattnerecd49032009-03-02 22:27:17 +00001059 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001060 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1061 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001062 } else {
1063 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1064 getTriple().getOS() != llvm::Triple::OpenBSD)
1065 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001066 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001067
Ulrich Weigand8afad612014-07-28 13:17:52 +00001068 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001069 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001070 Builder.defineMacro("_CALL_ELF", "1");
1071 if (ABI == "elfv2")
1072 Builder.defineMacro("_CALL_ELF", "2");
1073
Chris Lattnerecd49032009-03-02 22:27:17 +00001074 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001075 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1076 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001077
Chris Lattnerecd49032009-03-02 22:27:17 +00001078 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001079 if (LongDoubleWidth == 128)
1080 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081
John Thompsone467e192009-11-19 17:18:50 +00001082 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001083 Builder.defineMacro("__VEC__", "10206");
1084 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001085 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001086
1087 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001088 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1089 .Case("440", ArchDefineName)
1090 .Case("450", ArchDefineName | ArchDefine440)
1091 .Case("601", ArchDefineName)
1092 .Case("602", ArchDefineName | ArchDefinePpcgr)
1093 .Case("603", ArchDefineName | ArchDefinePpcgr)
1094 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1095 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1096 .Case("604", ArchDefineName | ArchDefinePpcgr)
1097 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1098 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001099 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001100 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1101 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1102 .Case("750", ArchDefineName | ArchDefinePpcgr)
1103 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1104 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001105 .Case("a2", ArchDefineA2)
1106 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001107 .Case("pwr3", ArchDefinePpcgr)
1108 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1109 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1110 | ArchDefinePpcsq)
1111 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1112 | ArchDefinePpcgr | ArchDefinePpcsq)
1113 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1114 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1115 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1116 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1117 | ArchDefinePpcsq)
1118 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1119 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001120 | ArchDefinePpcgr | ArchDefinePpcsq)
1121 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1122 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1123 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001124 .Case("power3", ArchDefinePpcgr)
1125 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1126 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1127 | ArchDefinePpcsq)
1128 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1129 | ArchDefinePpcgr | ArchDefinePpcsq)
1130 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1131 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1132 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1133 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1134 | ArchDefinePpcsq)
1135 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1136 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001137 | ArchDefinePpcgr | ArchDefinePpcsq)
1138 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1139 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1140 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001141 .Default(ArchDefineNone);
1142
1143 if (defs & ArchDefineName)
1144 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1145 if (defs & ArchDefinePpcgr)
1146 Builder.defineMacro("_ARCH_PPCGR");
1147 if (defs & ArchDefinePpcsq)
1148 Builder.defineMacro("_ARCH_PPCSQ");
1149 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001150 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001151 if (defs & ArchDefine603)
1152 Builder.defineMacro("_ARCH_603");
1153 if (defs & ArchDefine604)
1154 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001155 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001156 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001157 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001158 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001159 if (defs & ArchDefinePwr5x)
1160 Builder.defineMacro("_ARCH_PWR5X");
1161 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001162 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001163 if (defs & ArchDefinePwr6x)
1164 Builder.defineMacro("_ARCH_PWR6X");
1165 if (defs & ArchDefinePwr7)
1166 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001167 if (defs & ArchDefinePwr8)
1168 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001169 if (defs & ArchDefineA2)
1170 Builder.defineMacro("_ARCH_A2");
1171 if (defs & ArchDefineA2q) {
1172 Builder.defineMacro("_ARCH_A2Q");
1173 Builder.defineMacro("_ARCH_QP");
1174 }
1175
1176 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1177 Builder.defineMacro("__bg__");
1178 Builder.defineMacro("__THW_BLUEGENE__");
1179 Builder.defineMacro("__bgq__");
1180 Builder.defineMacro("__TOS_BGQ__");
1181 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001182
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001183 if (HasVSX)
1184 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001185 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001186 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001187 if (HasP8Crypto)
1188 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001189 if (HasHTM)
1190 Builder.defineMacro("__HTM__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001191
Bill Schmidt38378a02013-02-01 20:23:10 +00001192 // FIXME: The following are not yet generated here by Clang, but are
1193 // generated by GCC:
1194 //
1195 // _SOFT_FLOAT_
1196 // __RECIP_PRECISION__
1197 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001198 // __RECIP__
1199 // __RECIPF__
1200 // __RSQRTE__
1201 // __RSQRTEF__
1202 // _SOFT_DOUBLE_
1203 // __NO_LWSYNC__
1204 // __HAVE_BSWAP__
1205 // __LONGDOUBLE128
1206 // __CMODEL_MEDIUM__
1207 // __CMODEL_LARGE__
1208 // _CALL_SYSV
1209 // _CALL_DARWIN
1210 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001211}
1212
1213void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1214 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1215 .Case("7400", true)
1216 .Case("g4", true)
1217 .Case("7450", true)
1218 .Case("g4+", true)
1219 .Case("970", true)
1220 .Case("g5", true)
1221 .Case("pwr6", true)
1222 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001223 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001224 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001225 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001226 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001227
1228 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001229 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1230 .Case("ppc64le", true)
1231 .Case("pwr8", true)
1232 .Default(false);
1233 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1234 .Case("ppc64le", true)
1235 .Case("pwr8", true)
1236 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001237}
1238
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001239bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001240 return llvm::StringSwitch<bool>(Feature)
1241 .Case("powerpc", true)
1242 .Case("vsx", HasVSX)
1243 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001244 .Case("crypto", HasP8Crypto)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001245 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001246 .Case("htm", HasHTM)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001247 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001248}
Chris Lattner17df24e2008-04-21 18:56:49 +00001249
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001250const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001251 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1252 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1253 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1254 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1255 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1256 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1257 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1258 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001259 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001260 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001261 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001262 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1263 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1264 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1265 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001266 "vrsave", "vscr",
1267 "spe_acc", "spefscr",
1268 "sfp"
1269};
Chris Lattner10a5b382007-01-29 05:24:35 +00001270
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001271void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001272 unsigned &NumNames) const {
1273 Names = GCCRegNames;
1274 NumNames = llvm::array_lengthof(GCCRegNames);
1275}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001276
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001277const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1278 // While some of these aliases do map to different registers
1279 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001280 { { "0" }, "r0" },
1281 { { "1"}, "r1" },
1282 { { "2" }, "r2" },
1283 { { "3" }, "r3" },
1284 { { "4" }, "r4" },
1285 { { "5" }, "r5" },
1286 { { "6" }, "r6" },
1287 { { "7" }, "r7" },
1288 { { "8" }, "r8" },
1289 { { "9" }, "r9" },
1290 { { "10" }, "r10" },
1291 { { "11" }, "r11" },
1292 { { "12" }, "r12" },
1293 { { "13" }, "r13" },
1294 { { "14" }, "r14" },
1295 { { "15" }, "r15" },
1296 { { "16" }, "r16" },
1297 { { "17" }, "r17" },
1298 { { "18" }, "r18" },
1299 { { "19" }, "r19" },
1300 { { "20" }, "r20" },
1301 { { "21" }, "r21" },
1302 { { "22" }, "r22" },
1303 { { "23" }, "r23" },
1304 { { "24" }, "r24" },
1305 { { "25" }, "r25" },
1306 { { "26" }, "r26" },
1307 { { "27" }, "r27" },
1308 { { "28" }, "r28" },
1309 { { "29" }, "r29" },
1310 { { "30" }, "r30" },
1311 { { "31" }, "r31" },
1312 { { "fr0" }, "f0" },
1313 { { "fr1" }, "f1" },
1314 { { "fr2" }, "f2" },
1315 { { "fr3" }, "f3" },
1316 { { "fr4" }, "f4" },
1317 { { "fr5" }, "f5" },
1318 { { "fr6" }, "f6" },
1319 { { "fr7" }, "f7" },
1320 { { "fr8" }, "f8" },
1321 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001322 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001323 { { "fr11" }, "f11" },
1324 { { "fr12" }, "f12" },
1325 { { "fr13" }, "f13" },
1326 { { "fr14" }, "f14" },
1327 { { "fr15" }, "f15" },
1328 { { "fr16" }, "f16" },
1329 { { "fr17" }, "f17" },
1330 { { "fr18" }, "f18" },
1331 { { "fr19" }, "f19" },
1332 { { "fr20" }, "f20" },
1333 { { "fr21" }, "f21" },
1334 { { "fr22" }, "f22" },
1335 { { "fr23" }, "f23" },
1336 { { "fr24" }, "f24" },
1337 { { "fr25" }, "f25" },
1338 { { "fr26" }, "f26" },
1339 { { "fr27" }, "f27" },
1340 { { "fr28" }, "f28" },
1341 { { "fr29" }, "f29" },
1342 { { "fr30" }, "f30" },
1343 { { "fr31" }, "f31" },
1344 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001345};
1346
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001347void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001348 unsigned &NumAliases) const {
1349 Aliases = GCCRegAliases;
1350 NumAliases = llvm::array_lengthof(GCCRegAliases);
1351}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001352
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001353class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001354public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001355 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001356 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001357
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001358 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001359 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001360 case llvm::Triple::FreeBSD:
1361 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001362 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001363 PtrDiffType = SignedInt;
1364 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001365 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001366 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001367 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001368 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001369
Roman Divacky3ffe7462012-03-13 19:20:17 +00001370 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1371 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001372 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001373 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001374
1375 // PPC32 supports atomics up to 4 bytes.
1376 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001377 }
1378
Craig Topper3164f332014-03-11 03:39:26 +00001379 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001380 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001381 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001382 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001383};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001384
Bill Schmidt778d3872013-07-26 01:36:11 +00001385// Note: ABI differences may eventually require us to have a separate
1386// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001387class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001388public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001389 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001390 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001391 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001392 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001393
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001394 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1395 DescriptionString = "e-m:e-i64:64-n32:64";
1396 ABI = "elfv2";
1397 } else {
1398 DescriptionString = "E-m:e-i64:64-n32:64";
1399 ABI = "elfv1";
1400 }
1401
1402 switch (getTriple().getOS()) {
1403 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001404 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001405 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001406 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001407 case llvm::Triple::NetBSD:
1408 IntMaxType = SignedLongLong;
1409 Int64Type = SignedLongLong;
1410 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001411 default:
1412 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001413 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001414
1415 // PPC64 supports atomics up to 8 bytes.
1416 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001417 }
Craig Topper3164f332014-03-11 03:39:26 +00001418 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001419 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001420 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001421 // PPC64 Linux-specifc ABI options.
1422 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001423 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001424 ABI = Name;
1425 return true;
1426 }
1427 return false;
1428 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001429};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001430
Roman Divacky965b0b72011-01-06 08:27:10 +00001431class DarwinPPC32TargetInfo :
1432 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001433public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001434 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1435 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001436 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001437 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001438 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001439 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001440 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001441 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001442 }
Craig Topper3164f332014-03-11 03:39:26 +00001443 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001444 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001445 }
1446};
1447
1448class DarwinPPC64TargetInfo :
1449 public DarwinTargetInfo<PPC64TargetInfo> {
1450public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001451 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1452 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001453 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001454 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001455 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001456 }
1457};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001458
Peter Collingbournec947aae2012-05-20 23:28:41 +00001459 static const unsigned NVPTXAddrSpaceMap[] = {
1460 1, // opencl_global
1461 3, // opencl_local
1462 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001463 // FIXME: generic has to be added to the target
1464 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001465 1, // cuda_device
1466 4, // cuda_constant
1467 3, // cuda_shared
1468 };
1469 class NVPTXTargetInfo : public TargetInfo {
1470 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001471 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001472
1473 // The GPU profiles supported by the NVPTX backend
1474 enum GPUKind {
1475 GK_NONE,
1476 GK_SM20,
1477 GK_SM21,
1478 GK_SM30,
1479 GK_SM35,
1480 } GPU;
1481
Peter Collingbournec947aae2012-05-20 23:28:41 +00001482 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001483 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001484 BigEndian = false;
1485 TLSSupported = false;
1486 LongWidth = LongAlign = 64;
1487 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001488 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001489 // Define available target features
1490 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001491 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001492 // Set the default GPU to sm20
1493 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001494 }
Craig Topper3164f332014-03-11 03:39:26 +00001495 void getTargetDefines(const LangOptions &Opts,
1496 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001497 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001498 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001499 if (Opts.CUDAIsDevice) {
1500 // Set __CUDA_ARCH__ for the GPU specified.
1501 std::string CUDAArchCode;
1502 switch (GPU) {
1503 case GK_SM20:
1504 CUDAArchCode = "200";
1505 break;
1506 case GK_SM21:
1507 CUDAArchCode = "210";
1508 break;
1509 case GK_SM30:
1510 CUDAArchCode = "300";
1511 break;
1512 case GK_SM35:
1513 CUDAArchCode = "350";
1514 break;
1515 default:
1516 llvm_unreachable("Unhandled target CPU");
1517 }
1518 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1519 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001520 }
Craig Topper3164f332014-03-11 03:39:26 +00001521 void getTargetBuiltins(const Builtin::Info *&Records,
1522 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001523 Records = BuiltinInfo;
1524 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001525 }
Craig Topper3164f332014-03-11 03:39:26 +00001526 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001527 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001528 }
Craig Topper3164f332014-03-11 03:39:26 +00001529
1530 void getGCCRegNames(const char * const *&Names,
1531 unsigned &NumNames) const override;
1532 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1533 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001534 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001535 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001536 NumAliases = 0;
1537 }
Eric Christopher917e9522014-11-18 22:36:15 +00001538 bool
1539 validateAsmConstraint(const char *&Name,
1540 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001541 switch (*Name) {
1542 default: return false;
1543 case 'c':
1544 case 'h':
1545 case 'r':
1546 case 'l':
1547 case 'f':
1548 case 'd':
1549 Info.setAllowsRegister();
1550 return true;
1551 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001552 }
Craig Topper3164f332014-03-11 03:39:26 +00001553 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001554 // FIXME: Is this really right?
1555 return "";
1556 }
Craig Topper3164f332014-03-11 03:39:26 +00001557 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001558 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001559 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001560 }
Craig Topper3164f332014-03-11 03:39:26 +00001561 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001562 GPU = llvm::StringSwitch<GPUKind>(Name)
1563 .Case("sm_20", GK_SM20)
1564 .Case("sm_21", GK_SM21)
1565 .Case("sm_30", GK_SM30)
1566 .Case("sm_35", GK_SM35)
1567 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001568
Reid Klecknerbbc01782014-12-03 21:53:36 +00001569 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001570 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001571 };
1572
1573 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1574#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1575#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1576 ALL_LANGUAGES },
1577#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001578 };
1579
1580 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1581 "r0"
1582 };
1583
1584 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1585 unsigned &NumNames) const {
1586 Names = GCCRegNames;
1587 NumNames = llvm::array_lengthof(GCCRegNames);
1588 }
1589
1590 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1591 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001592 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001593 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001594 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1595 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001596 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001597 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001598 };
1599
1600 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1601 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001602 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001603 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001604 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1605 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001606 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001607 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001608 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001609
1610static const unsigned R600AddrSpaceMap[] = {
1611 1, // opencl_global
1612 3, // opencl_local
1613 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001614 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001615 1, // cuda_device
1616 2, // cuda_constant
1617 3 // cuda_shared
1618};
1619
Tom Stellarda96344b2014-08-21 13:58:40 +00001620// If you edit the description strings, make sure you update
1621// getPointerWidthV().
1622
Tom Stellardc74b1e02013-03-04 17:40:53 +00001623static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001624 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1625 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001626
1627static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001628 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1629 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001630
1631static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001632 "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 +00001633 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1634 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001635
Eli Friedmand13b41e2012-10-12 23:32:00 +00001636class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001637 static const Builtin::Info BuiltinInfo[];
1638
Tom Stellardc74b1e02013-03-04 17:40:53 +00001639 /// \brief The GPU profiles supported by the R600 target.
1640 enum GPUKind {
1641 GK_NONE,
1642 GK_R600,
1643 GK_R600_DOUBLE_OPS,
1644 GK_R700,
1645 GK_R700_DOUBLE_OPS,
1646 GK_EVERGREEN,
1647 GK_EVERGREEN_DOUBLE_OPS,
1648 GK_NORTHERN_ISLANDS,
1649 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001650 GK_SOUTHERN_ISLANDS,
1651 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001652 } GPU;
1653
Eli Friedmand13b41e2012-10-12 23:32:00 +00001654public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001655 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001656 : TargetInfo(Triple) {
1657
1658 if (Triple.getArch() == llvm::Triple::amdgcn) {
1659 DescriptionString = DescriptionStringSI;
1660 GPU = GK_SOUTHERN_ISLANDS;
1661 } else {
1662 DescriptionString = DescriptionStringR600;
1663 GPU = GK_R600;
1664 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001665 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001666 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001667 }
1668
Tom Stellarda96344b2014-08-21 13:58:40 +00001669 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1670 if (GPU <= GK_CAYMAN)
1671 return 32;
1672
1673 switch(AddrSpace) {
1674 default:
1675 return 64;
1676 case 0:
1677 case 3:
1678 case 5:
1679 return 32;
1680 }
1681 }
1682
Craig Topper3164f332014-03-11 03:39:26 +00001683 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001684 return "";
1685 }
1686
Craig Topper3164f332014-03-11 03:39:26 +00001687 void getGCCRegNames(const char * const *&Names,
1688 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001689 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001690 numNames = 0;
1691 }
1692
Craig Topper3164f332014-03-11 03:39:26 +00001693 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1694 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001695 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001696 NumAliases = 0;
1697 }
1698
Craig Topper3164f332014-03-11 03:39:26 +00001699 bool validateAsmConstraint(const char *&Name,
1700 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001701 return true;
1702 }
1703
Craig Topper3164f332014-03-11 03:39:26 +00001704 void getTargetBuiltins(const Builtin::Info *&Records,
1705 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001706 Records = BuiltinInfo;
1707 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001708 }
1709
Craig Topper3164f332014-03-11 03:39:26 +00001710 void getTargetDefines(const LangOptions &Opts,
1711 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001712 Builder.defineMacro("__R600__");
Tom Stellardfded50f2015-02-27 15:10:19 +00001713 if (GPU >= GK_SOUTHERN_ISLANDS && Opts.OpenCL)
1714 Builder.defineMacro("cl_khr_fp64");
Eli Friedmand13b41e2012-10-12 23:32:00 +00001715 }
1716
Craig Topper3164f332014-03-11 03:39:26 +00001717 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001718 return TargetInfo::CharPtrBuiltinVaList;
1719 }
1720
Craig Topper3164f332014-03-11 03:39:26 +00001721 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001722 GPU = llvm::StringSwitch<GPUKind>(Name)
1723 .Case("r600" , GK_R600)
1724 .Case("rv610", GK_R600)
1725 .Case("rv620", GK_R600)
1726 .Case("rv630", GK_R600)
1727 .Case("rv635", GK_R600)
1728 .Case("rs780", GK_R600)
1729 .Case("rs880", GK_R600)
1730 .Case("rv670", GK_R600_DOUBLE_OPS)
1731 .Case("rv710", GK_R700)
1732 .Case("rv730", GK_R700)
1733 .Case("rv740", GK_R700_DOUBLE_OPS)
1734 .Case("rv770", GK_R700_DOUBLE_OPS)
1735 .Case("palm", GK_EVERGREEN)
1736 .Case("cedar", GK_EVERGREEN)
1737 .Case("sumo", GK_EVERGREEN)
1738 .Case("sumo2", GK_EVERGREEN)
1739 .Case("redwood", GK_EVERGREEN)
1740 .Case("juniper", GK_EVERGREEN)
1741 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1742 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1743 .Case("barts", GK_NORTHERN_ISLANDS)
1744 .Case("turks", GK_NORTHERN_ISLANDS)
1745 .Case("caicos", GK_NORTHERN_ISLANDS)
1746 .Case("cayman", GK_CAYMAN)
1747 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001748 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001749 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1750 .Case("verde", GK_SOUTHERN_ISLANDS)
1751 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001752 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001753 .Case("bonaire", GK_SEA_ISLANDS)
1754 .Case("kabini", GK_SEA_ISLANDS)
1755 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001756 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001757 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001758 .Default(GK_NONE);
1759
1760 if (GPU == GK_NONE) {
1761 return false;
1762 }
1763
1764 // Set the correct data layout
1765 switch (GPU) {
1766 case GK_NONE:
1767 case GK_R600:
1768 case GK_R700:
1769 case GK_EVERGREEN:
1770 case GK_NORTHERN_ISLANDS:
1771 DescriptionString = DescriptionStringR600;
1772 break;
1773 case GK_R600_DOUBLE_OPS:
1774 case GK_R700_DOUBLE_OPS:
1775 case GK_EVERGREEN_DOUBLE_OPS:
1776 case GK_CAYMAN:
1777 DescriptionString = DescriptionStringR600DoubleOps;
1778 break;
1779 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001780 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001781 DescriptionString = DescriptionStringSI;
1782 break;
1783 }
1784
1785 return true;
1786 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001787};
1788
Matt Arsenault56f008d2014-06-24 20:45:01 +00001789const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1790#define BUILTIN(ID, TYPE, ATTRS) \
1791 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1792#include "clang/Basic/BuiltinsR600.def"
1793};
1794
Eli Friedman3fd920a2008-08-20 02:34:37 +00001795// Namespace for x86 abstract base class
1796const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001797#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001798#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001799 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001800#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001801};
Eli Friedmanb5366062008-05-20 14:21:01 +00001802
Nuno Lopescfca1f02009-12-23 17:49:57 +00001803static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001804 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1805 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001806 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001807 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1808 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1809 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001810 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001811 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1812 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001813};
1814
Eric Christophercdd36352011-06-21 00:05:20 +00001815const TargetInfo::AddlRegName AddlRegNames[] = {
1816 { { "al", "ah", "eax", "rax" }, 0 },
1817 { { "bl", "bh", "ebx", "rbx" }, 3 },
1818 { { "cl", "ch", "ecx", "rcx" }, 2 },
1819 { { "dl", "dh", "edx", "rdx" }, 1 },
1820 { { "esi", "rsi" }, 4 },
1821 { { "edi", "rdi" }, 5 },
1822 { { "esp", "rsp" }, 7 },
1823 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001824};
1825
1826// X86 target abstract base class; x86-32 and x86-64 are very close, so
1827// most of the implementation can be shared.
1828class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001829 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001830 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001831 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001832 enum MMX3DNowEnum {
1833 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1834 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001835 enum XOPEnum {
1836 NoXOP,
1837 SSE4A,
1838 FMA4,
1839 XOP
1840 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001841
Eric Christophere1ddaf92010-04-02 23:50:19 +00001842 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001843 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001844 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001845 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001846 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001847 bool HasBMI;
1848 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001849 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001850 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001851 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001852 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001853 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001854 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001855 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001856 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001857 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1858 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001859 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001860 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001861
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001862 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1863 ///
1864 /// Each enumeration represents a particular CPU supported by Clang. These
1865 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1866 enum CPUKind {
1867 CK_Generic,
1868
1869 /// \name i386
1870 /// i386-generation processors.
1871 //@{
1872 CK_i386,
1873 //@}
1874
1875 /// \name i486
1876 /// i486-generation processors.
1877 //@{
1878 CK_i486,
1879 CK_WinChipC6,
1880 CK_WinChip2,
1881 CK_C3,
1882 //@}
1883
1884 /// \name i586
1885 /// i586-generation processors, P5 microarchitecture based.
1886 //@{
1887 CK_i586,
1888 CK_Pentium,
1889 CK_PentiumMMX,
1890 //@}
1891
1892 /// \name i686
1893 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1894 //@{
1895 CK_i686,
1896 CK_PentiumPro,
1897 CK_Pentium2,
1898 CK_Pentium3,
1899 CK_Pentium3M,
1900 CK_PentiumM,
1901 CK_C3_2,
1902
1903 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1904 /// Clang however has some logic to suport this.
1905 // FIXME: Warn, deprecate, and potentially remove this.
1906 CK_Yonah,
1907 //@}
1908
1909 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001910 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001911 //@{
1912 CK_Pentium4,
1913 CK_Pentium4M,
1914 CK_Prescott,
1915 CK_Nocona,
1916 //@}
1917
1918 /// \name Core
1919 /// Core microarchitecture based processors.
1920 //@{
1921 CK_Core2,
1922
1923 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1924 /// codename which GCC no longer accepts as an option to -march, but Clang
1925 /// has some logic for recognizing it.
1926 // FIXME: Warn, deprecate, and potentially remove this.
1927 CK_Penryn,
1928 //@}
1929
1930 /// \name Atom
1931 /// Atom processors
1932 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001933 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001934 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001935 //@}
1936
1937 /// \name Nehalem
1938 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001939 CK_Nehalem,
1940
1941 /// \name Westmere
1942 /// Westmere microarchitecture based processors.
1943 CK_Westmere,
1944
1945 /// \name Sandy Bridge
1946 /// Sandy Bridge microarchitecture based processors.
1947 CK_SandyBridge,
1948
1949 /// \name Ivy Bridge
1950 /// Ivy Bridge microarchitecture based processors.
1951 CK_IvyBridge,
1952
1953 /// \name Haswell
1954 /// Haswell microarchitecture based processors.
1955 CK_Haswell,
1956
1957 /// \name Broadwell
1958 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001959 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001960
1961 /// \name Skylake
1962 /// Skylake microarchitecture based processors.
1963 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001964
Craig Topper449314e2013-08-20 07:09:39 +00001965 /// \name Knights Landing
1966 /// Knights Landing processor.
1967 CK_KNL,
1968
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001969 /// \name K6
1970 /// K6 architecture processors.
1971 //@{
1972 CK_K6,
1973 CK_K6_2,
1974 CK_K6_3,
1975 //@}
1976
1977 /// \name K7
1978 /// K7 architecture processors.
1979 //@{
1980 CK_Athlon,
1981 CK_AthlonThunderbird,
1982 CK_Athlon4,
1983 CK_AthlonXP,
1984 CK_AthlonMP,
1985 //@}
1986
1987 /// \name K8
1988 /// K8 architecture processors.
1989 //@{
1990 CK_Athlon64,
1991 CK_Athlon64SSE3,
1992 CK_AthlonFX,
1993 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001994 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001995 CK_Opteron,
1996 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001997 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001998 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001999
Benjamin Kramer569f2152012-01-10 11:50:18 +00002000 /// \name Bobcat
2001 /// Bobcat architecture processors.
2002 //@{
2003 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002004 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002005 //@}
2006
2007 /// \name Bulldozer
2008 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002009 //@{
2010 CK_BDVER1,
2011 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002012 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002013 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002014 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002015
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002016 /// This specification is deprecated and will be removed in the future.
2017 /// Users should prefer \see CK_K8.
2018 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002019 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002020 CK_x86_64,
2021 //@}
2022
2023 /// \name Geode
2024 /// Geode processors.
2025 //@{
2026 CK_Geode
2027 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002028 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002029
Rafael Espindolaeb265472013-08-21 21:59:03 +00002030 enum FPMathKind {
2031 FP_Default,
2032 FP_SSE,
2033 FP_387
2034 } FPMath;
2035
Eli Friedman3fd920a2008-08-20 02:34:37 +00002036public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002037 X86TargetInfo(const llvm::Triple &Triple)
2038 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002039 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002040 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2041 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2042 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2043 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2044 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2045 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002046 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002047 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002048 }
Craig Topper3164f332014-03-11 03:39:26 +00002049 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002050 // X87 evaluates with 80 bits "long double" precision.
2051 return SSELevel == NoSSE ? 2 : 0;
2052 }
Craig Topper3164f332014-03-11 03:39:26 +00002053 void getTargetBuiltins(const Builtin::Info *&Records,
2054 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002055 Records = BuiltinInfo;
2056 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002057 }
Craig Topper3164f332014-03-11 03:39:26 +00002058 void getGCCRegNames(const char * const *&Names,
2059 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002060 Names = GCCRegNames;
2061 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002062 }
Craig Topper3164f332014-03-11 03:39:26 +00002063 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2064 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002065 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002066 NumAliases = 0;
2067 }
Craig Topper3164f332014-03-11 03:39:26 +00002068 void getGCCAddlRegNames(const AddlRegName *&Names,
2069 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002070 Names = AddlRegNames;
2071 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002072 }
Craig Topper3164f332014-03-11 03:39:26 +00002073 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002074 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002075
Akira Hatanaka974131e2014-09-18 18:17:18 +00002076 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2077
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002078 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2079
Akira Hatanaka974131e2014-09-18 18:17:18 +00002080 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2081
Craig Topper3164f332014-03-11 03:39:26 +00002082 std::string convertConstraint(const char *&Constraint) const override;
2083 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002084 return "~{dirflag},~{fpsr},~{flags}";
2085 }
Craig Topper3164f332014-03-11 03:39:26 +00002086 void getTargetDefines(const LangOptions &Opts,
2087 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002088 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2089 bool Enabled);
2090 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2091 bool Enabled);
2092 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2093 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002094 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2095 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002096 setFeatureEnabledImpl(Features, Name, Enabled);
2097 }
2098 // This exists purely to cut down on the number of virtual calls in
2099 // getDefaultFeatures which calls this repeatedly.
2100 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2101 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002102 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2103 bool hasFeature(StringRef Feature) const override;
2104 bool handleTargetFeatures(std::vector<std::string> &Features,
2105 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002106 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002107 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002108 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002109 else if (getTriple().getArch() == llvm::Triple::x86 &&
2110 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002111 return "no-mmx";
2112 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002113 }
Craig Topper3164f332014-03-11 03:39:26 +00002114 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002115 CPU = llvm::StringSwitch<CPUKind>(Name)
2116 .Case("i386", CK_i386)
2117 .Case("i486", CK_i486)
2118 .Case("winchip-c6", CK_WinChipC6)
2119 .Case("winchip2", CK_WinChip2)
2120 .Case("c3", CK_C3)
2121 .Case("i586", CK_i586)
2122 .Case("pentium", CK_Pentium)
2123 .Case("pentium-mmx", CK_PentiumMMX)
2124 .Case("i686", CK_i686)
2125 .Case("pentiumpro", CK_PentiumPro)
2126 .Case("pentium2", CK_Pentium2)
2127 .Case("pentium3", CK_Pentium3)
2128 .Case("pentium3m", CK_Pentium3M)
2129 .Case("pentium-m", CK_PentiumM)
2130 .Case("c3-2", CK_C3_2)
2131 .Case("yonah", CK_Yonah)
2132 .Case("pentium4", CK_Pentium4)
2133 .Case("pentium4m", CK_Pentium4M)
2134 .Case("prescott", CK_Prescott)
2135 .Case("nocona", CK_Nocona)
2136 .Case("core2", CK_Core2)
2137 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002138 .Case("bonnell", CK_Bonnell)
2139 .Case("atom", CK_Bonnell) // Legacy name.
2140 .Case("silvermont", CK_Silvermont)
2141 .Case("slm", CK_Silvermont) // Legacy name.
2142 .Case("nehalem", CK_Nehalem)
2143 .Case("corei7", CK_Nehalem) // Legacy name.
2144 .Case("westmere", CK_Westmere)
2145 .Case("sandybridge", CK_SandyBridge)
2146 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2147 .Case("ivybridge", CK_IvyBridge)
2148 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2149 .Case("haswell", CK_Haswell)
2150 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002151 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002152 .Case("skylake", CK_Skylake)
2153 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002154 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002155 .Case("k6", CK_K6)
2156 .Case("k6-2", CK_K6_2)
2157 .Case("k6-3", CK_K6_3)
2158 .Case("athlon", CK_Athlon)
2159 .Case("athlon-tbird", CK_AthlonThunderbird)
2160 .Case("athlon-4", CK_Athlon4)
2161 .Case("athlon-xp", CK_AthlonXP)
2162 .Case("athlon-mp", CK_AthlonMP)
2163 .Case("athlon64", CK_Athlon64)
2164 .Case("athlon64-sse3", CK_Athlon64SSE3)
2165 .Case("athlon-fx", CK_AthlonFX)
2166 .Case("k8", CK_K8)
2167 .Case("k8-sse3", CK_K8SSE3)
2168 .Case("opteron", CK_Opteron)
2169 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002170 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002171 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002172 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002173 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002174 .Case("bdver1", CK_BDVER1)
2175 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002176 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002177 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002178 .Case("x86-64", CK_x86_64)
2179 .Case("geode", CK_Geode)
2180 .Default(CK_Generic);
2181
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002182 // Perform any per-CPU checks necessary to determine if this CPU is
2183 // acceptable.
2184 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2185 // invalid without explaining *why*.
2186 switch (CPU) {
2187 case CK_Generic:
2188 // No processor selected!
2189 return false;
2190
2191 case CK_i386:
2192 case CK_i486:
2193 case CK_WinChipC6:
2194 case CK_WinChip2:
2195 case CK_C3:
2196 case CK_i586:
2197 case CK_Pentium:
2198 case CK_PentiumMMX:
2199 case CK_i686:
2200 case CK_PentiumPro:
2201 case CK_Pentium2:
2202 case CK_Pentium3:
2203 case CK_Pentium3M:
2204 case CK_PentiumM:
2205 case CK_Yonah:
2206 case CK_C3_2:
2207 case CK_Pentium4:
2208 case CK_Pentium4M:
2209 case CK_Prescott:
2210 case CK_K6:
2211 case CK_K6_2:
2212 case CK_K6_3:
2213 case CK_Athlon:
2214 case CK_AthlonThunderbird:
2215 case CK_Athlon4:
2216 case CK_AthlonXP:
2217 case CK_AthlonMP:
2218 case CK_Geode:
2219 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002220 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002221 return false;
2222
2223 // Fallthrough
2224 case CK_Nocona:
2225 case CK_Core2:
2226 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002227 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002228 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002229 case CK_Nehalem:
2230 case CK_Westmere:
2231 case CK_SandyBridge:
2232 case CK_IvyBridge:
2233 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002234 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002235 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002236 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002237 case CK_Athlon64:
2238 case CK_Athlon64SSE3:
2239 case CK_AthlonFX:
2240 case CK_K8:
2241 case CK_K8SSE3:
2242 case CK_Opteron:
2243 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002244 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002245 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002246 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002247 case CK_BDVER1:
2248 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002249 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002250 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002251 case CK_x86_64:
2252 return true;
2253 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002254 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002255 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002256
Craig Topper3164f332014-03-11 03:39:26 +00002257 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002258
Craig Topper3164f332014-03-11 03:39:26 +00002259 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002260 // We accept all non-ARM calling conventions
2261 return (CC == CC_X86ThisCall ||
2262 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002263 CC == CC_X86StdCall ||
2264 CC == CC_X86VectorCall ||
2265 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002266 CC == CC_X86Pascal ||
2267 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002268 }
2269
Craig Topper3164f332014-03-11 03:39:26 +00002270 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002271 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002272 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002273
2274 bool hasSjLjLowering() const override {
2275 return true;
2276 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002277};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002278
Rafael Espindolaeb265472013-08-21 21:59:03 +00002279bool X86TargetInfo::setFPMath(StringRef Name) {
2280 if (Name == "387") {
2281 FPMath = FP_387;
2282 return true;
2283 }
2284 if (Name == "sse") {
2285 FPMath = FP_SSE;
2286 return true;
2287 }
2288 return false;
2289}
2290
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002291void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002292 // FIXME: This *really* should not be here.
2293
2294 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002295 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002296 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002297
Chandler Carruth212334f2011-09-28 08:55:37 +00002298 switch (CPU) {
2299 case CK_Generic:
2300 case CK_i386:
2301 case CK_i486:
2302 case CK_i586:
2303 case CK_Pentium:
2304 case CK_i686:
2305 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002306 break;
2307 case CK_PentiumMMX:
2308 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002309 case CK_K6:
2310 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002311 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002312 break;
2313 case CK_Pentium3:
2314 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002315 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002316 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002317 break;
2318 case CK_PentiumM:
2319 case CK_Pentium4:
2320 case CK_Pentium4M:
2321 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002322 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002323 break;
2324 case CK_Yonah:
2325 case CK_Prescott:
2326 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002327 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002328 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002329 break;
2330 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002331 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002332 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002333 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002334 break;
2335 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002336 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002337 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002338 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002339 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002340 setFeatureEnabledImpl(Features, "avx512f", true);
2341 setFeatureEnabledImpl(Features, "avx512cd", true);
2342 setFeatureEnabledImpl(Features, "avx512dq", true);
2343 setFeatureEnabledImpl(Features, "avx512bw", true);
2344 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002345 // FALLTHROUGH
2346 case CK_Broadwell:
2347 setFeatureEnabledImpl(Features, "rdseed", true);
2348 setFeatureEnabledImpl(Features, "adx", true);
2349 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002350 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002351 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002352 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002353 setFeatureEnabledImpl(Features, "bmi", true);
2354 setFeatureEnabledImpl(Features, "bmi2", true);
2355 setFeatureEnabledImpl(Features, "rtm", true);
2356 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002357 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002358 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002359 setFeatureEnabledImpl(Features, "rdrnd", true);
2360 setFeatureEnabledImpl(Features, "f16c", true);
2361 setFeatureEnabledImpl(Features, "fsgsbase", true);
2362 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002363 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002364 setFeatureEnabledImpl(Features, "avx", true);
2365 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002366 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002367 case CK_Silvermont:
2368 setFeatureEnabledImpl(Features, "aes", true);
2369 setFeatureEnabledImpl(Features, "pclmul", true);
2370 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002371 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002372 setFeatureEnabledImpl(Features, "sse4.2", true);
2373 setFeatureEnabledImpl(Features, "cx16", true);
2374 break;
2375 case CK_KNL:
2376 setFeatureEnabledImpl(Features, "avx512f", true);
2377 setFeatureEnabledImpl(Features, "avx512cd", true);
2378 setFeatureEnabledImpl(Features, "avx512er", true);
2379 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002380 setFeatureEnabledImpl(Features, "rdseed", true);
2381 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002382 setFeatureEnabledImpl(Features, "lzcnt", true);
2383 setFeatureEnabledImpl(Features, "bmi", true);
2384 setFeatureEnabledImpl(Features, "bmi2", true);
2385 setFeatureEnabledImpl(Features, "rtm", true);
2386 setFeatureEnabledImpl(Features, "fma", true);
2387 setFeatureEnabledImpl(Features, "rdrnd", true);
2388 setFeatureEnabledImpl(Features, "f16c", true);
2389 setFeatureEnabledImpl(Features, "fsgsbase", true);
2390 setFeatureEnabledImpl(Features, "aes", true);
2391 setFeatureEnabledImpl(Features, "pclmul", true);
2392 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002393 break;
2394 case CK_K6_2:
2395 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002396 case CK_WinChip2:
2397 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002398 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002399 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002400 case CK_Athlon:
2401 case CK_AthlonThunderbird:
2402 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002403 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002404 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002405 case CK_Athlon4:
2406 case CK_AthlonXP:
2407 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002408 setFeatureEnabledImpl(Features, "sse", true);
2409 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002410 break;
2411 case CK_K8:
2412 case CK_Opteron:
2413 case CK_Athlon64:
2414 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002415 setFeatureEnabledImpl(Features, "sse2", true);
2416 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002417 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002418 case CK_AMDFAM10:
2419 setFeatureEnabledImpl(Features, "sse4a", true);
2420 setFeatureEnabledImpl(Features, "lzcnt", true);
2421 setFeatureEnabledImpl(Features, "popcnt", true);
2422 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002423 case CK_K8SSE3:
2424 case CK_OpteronSSE3:
2425 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002426 setFeatureEnabledImpl(Features, "sse3", true);
2427 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002428 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002429 case CK_BTVER2:
2430 setFeatureEnabledImpl(Features, "avx", true);
2431 setFeatureEnabledImpl(Features, "aes", true);
2432 setFeatureEnabledImpl(Features, "pclmul", true);
2433 setFeatureEnabledImpl(Features, "bmi", true);
2434 setFeatureEnabledImpl(Features, "f16c", true);
2435 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002436 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002437 setFeatureEnabledImpl(Features, "ssse3", true);
2438 setFeatureEnabledImpl(Features, "sse4a", true);
2439 setFeatureEnabledImpl(Features, "lzcnt", true);
2440 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002441 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002442 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002443 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002444 case CK_BDVER4:
2445 setFeatureEnabledImpl(Features, "avx2", true);
2446 setFeatureEnabledImpl(Features, "bmi2", true);
2447 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002448 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002449 setFeatureEnabledImpl(Features, "fsgsbase", true);
2450 // FALLTHROUGH
2451 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002452 setFeatureEnabledImpl(Features, "bmi", true);
2453 setFeatureEnabledImpl(Features, "fma", true);
2454 setFeatureEnabledImpl(Features, "f16c", true);
2455 setFeatureEnabledImpl(Features, "tbm", true);
2456 // FALLTHROUGH
2457 case CK_BDVER1:
2458 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002459 setFeatureEnabledImpl(Features, "xop", true);
2460 setFeatureEnabledImpl(Features, "lzcnt", true);
2461 setFeatureEnabledImpl(Features, "aes", true);
2462 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002463 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002464 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002465 break;
Eli Friedman33465822011-07-08 23:31:17 +00002466 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002467}
2468
Rafael Espindolae62e2792013-08-20 13:44:29 +00002469void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002470 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002471 if (Enabled) {
2472 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002473 case AVX512F:
2474 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002475 case AVX2:
2476 Features["avx2"] = true;
2477 case AVX:
2478 Features["avx"] = true;
2479 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002480 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002481 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002482 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002483 case SSSE3:
2484 Features["ssse3"] = true;
2485 case SSE3:
2486 Features["sse3"] = true;
2487 case SSE2:
2488 Features["sse2"] = true;
2489 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002490 Features["sse"] = true;
2491 case NoSSE:
2492 break;
2493 }
2494 return;
2495 }
2496
2497 switch (Level) {
2498 case NoSSE:
2499 case SSE1:
2500 Features["sse"] = false;
2501 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002502 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2503 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002504 case SSE3:
2505 Features["sse3"] = false;
2506 setXOPLevel(Features, NoXOP, false);
2507 case SSSE3:
2508 Features["ssse3"] = false;
2509 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002510 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002511 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002512 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002513 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002514 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002515 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002516 case AVX2:
2517 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002518 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002519 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002520 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2521 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002522 }
2523}
2524
2525void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002526 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002527 if (Enabled) {
2528 switch (Level) {
2529 case AMD3DNowAthlon:
2530 Features["3dnowa"] = true;
2531 case AMD3DNow:
2532 Features["3dnow"] = true;
2533 case MMX:
2534 Features["mmx"] = true;
2535 case NoMMX3DNow:
2536 break;
2537 }
2538 return;
2539 }
2540
2541 switch (Level) {
2542 case NoMMX3DNow:
2543 case MMX:
2544 Features["mmx"] = false;
2545 case AMD3DNow:
2546 Features["3dnow"] = false;
2547 case AMD3DNowAthlon:
2548 Features["3dnowa"] = false;
2549 }
2550}
2551
2552void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002553 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002554 if (Enabled) {
2555 switch (Level) {
2556 case XOP:
2557 Features["xop"] = true;
2558 case FMA4:
2559 Features["fma4"] = true;
2560 setSSELevel(Features, AVX, true);
2561 case SSE4A:
2562 Features["sse4a"] = true;
2563 setSSELevel(Features, SSE3, true);
2564 case NoXOP:
2565 break;
2566 }
2567 return;
2568 }
2569
2570 switch (Level) {
2571 case NoXOP:
2572 case SSE4A:
2573 Features["sse4a"] = false;
2574 case FMA4:
2575 Features["fma4"] = false;
2576 case XOP:
2577 Features["xop"] = false;
2578 }
2579}
2580
Craig Topper86d79ef2013-09-17 04:51:29 +00002581void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2582 StringRef Name, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002583 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002584
Craig Topper29561122013-09-19 01:13:07 +00002585 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002586 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002587 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002588 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002589 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002590 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002591 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002592 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002593 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002594 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002595 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002596 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002597 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002598 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002599 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002600 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002601 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002602 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002603 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002604 if (Enabled)
2605 setSSELevel(Features, SSE2, Enabled);
2606 } else if (Name == "pclmul") {
2607 if (Enabled)
2608 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002609 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002610 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002611 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002612 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002613 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002614 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002615 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2616 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002617 if (Enabled)
2618 setSSELevel(Features, AVX512F, Enabled);
2619 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002620 if (Enabled)
2621 setSSELevel(Features, AVX, Enabled);
2622 } else if (Name == "fma4") {
2623 setXOPLevel(Features, FMA4, Enabled);
2624 } else if (Name == "xop") {
2625 setXOPLevel(Features, XOP, Enabled);
2626 } else if (Name == "sse4a") {
2627 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002628 } else if (Name == "f16c") {
2629 if (Enabled)
2630 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002631 } else if (Name == "sha") {
2632 if (Enabled)
2633 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002634 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002635}
2636
Eric Christopher3ff21b32013-10-16 21:26:26 +00002637/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002638/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002639bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002640 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002641 // Remember the maximum enabled sselevel.
2642 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2643 // Ignore disabled features.
2644 if (Features[i][0] == '-')
2645 continue;
2646
Benjamin Kramer27402c62012-03-05 15:10:44 +00002647 StringRef Feature = StringRef(Features[i]).substr(1);
2648
2649 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002650 HasAES = true;
2651 continue;
2652 }
2653
Craig Topper3f122a72012-05-31 05:18:48 +00002654 if (Feature == "pclmul") {
2655 HasPCLMUL = true;
2656 continue;
2657 }
2658
Benjamin Kramer27402c62012-03-05 15:10:44 +00002659 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002660 HasLZCNT = true;
2661 continue;
2662 }
2663
Rafael Espindola89049822013-08-23 20:21:37 +00002664 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002665 HasRDRND = true;
2666 continue;
2667 }
2668
Craig Topper8c7f2512014-11-03 06:51:41 +00002669 if (Feature == "fsgsbase") {
2670 HasFSGSBASE = true;
2671 continue;
2672 }
2673
Benjamin Kramer27402c62012-03-05 15:10:44 +00002674 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002675 HasBMI = true;
2676 continue;
2677 }
2678
Benjamin Kramer27402c62012-03-05 15:10:44 +00002679 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002680 HasBMI2 = true;
2681 continue;
2682 }
2683
Benjamin Kramer27402c62012-03-05 15:10:44 +00002684 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002685 HasPOPCNT = true;
2686 continue;
2687 }
2688
Michael Liao625a8752012-11-10 05:17:46 +00002689 if (Feature == "rtm") {
2690 HasRTM = true;
2691 continue;
2692 }
2693
Michael Liao74f4eaf2013-03-26 17:52:08 +00002694 if (Feature == "prfchw") {
2695 HasPRFCHW = true;
2696 continue;
2697 }
2698
Michael Liaoffaae352013-03-29 05:17:55 +00002699 if (Feature == "rdseed") {
2700 HasRDSEED = true;
2701 continue;
2702 }
2703
Robert Khasanov50e6f582014-09-19 09:53:48 +00002704 if (Feature == "adx") {
2705 HasADX = true;
2706 continue;
2707 }
2708
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002709 if (Feature == "tbm") {
2710 HasTBM = true;
2711 continue;
2712 }
2713
Craig Topperbba778b2012-06-03 21:46:30 +00002714 if (Feature == "fma") {
2715 HasFMA = true;
2716 continue;
2717 }
2718
Manman Rena45358c2012-10-11 00:59:55 +00002719 if (Feature == "f16c") {
2720 HasF16C = true;
2721 continue;
2722 }
2723
Craig Topper679b53a2013-08-21 05:29:10 +00002724 if (Feature == "avx512cd") {
2725 HasAVX512CD = true;
2726 continue;
2727 }
2728
2729 if (Feature == "avx512er") {
2730 HasAVX512ER = true;
2731 continue;
2732 }
2733
2734 if (Feature == "avx512pf") {
2735 HasAVX512PF = true;
2736 continue;
2737 }
2738
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002739 if (Feature == "avx512dq") {
2740 HasAVX512DQ = true;
2741 continue;
2742 }
2743
2744 if (Feature == "avx512bw") {
2745 HasAVX512BW = true;
2746 continue;
2747 }
2748
2749 if (Feature == "avx512vl") {
2750 HasAVX512VL = true;
2751 continue;
2752 }
2753
Ben Langmuir58078d02013-09-19 13:22:04 +00002754 if (Feature == "sha") {
2755 HasSHA = true;
2756 continue;
2757 }
2758
Nick Lewycky50e8f482013-10-05 20:14:27 +00002759 if (Feature == "cx16") {
2760 HasCX16 = true;
2761 continue;
2762 }
2763
Daniel Dunbar979586e2009-11-11 09:38:56 +00002764 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002765 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002766 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002767 .Case("avx2", AVX2)
2768 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002769 .Case("sse4.2", SSE42)
2770 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002771 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002772 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002773 .Case("sse2", SSE2)
2774 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002775 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002776 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002777
Eli Friedman33465822011-07-08 23:31:17 +00002778 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002779 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002780 .Case("3dnowa", AMD3DNowAthlon)
2781 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002782 .Case("mmx", MMX)
2783 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002784 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002785
2786 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2787 .Case("xop", XOP)
2788 .Case("fma4", FMA4)
2789 .Case("sse4a", SSE4A)
2790 .Default(NoXOP);
2791 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002792 }
Eli Friedman33465822011-07-08 23:31:17 +00002793
Craig Topper7481d8a2013-09-10 06:55:47 +00002794 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2795 // Can't do this earlier because we need to be able to explicitly enable
2796 // popcnt and still disable sse4.2.
2797 if (!HasPOPCNT && SSELevel >= SSE42 &&
2798 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2799 HasPOPCNT = true;
2800 Features.push_back("+popcnt");
2801 }
2802
Yunzhong Gao61089362013-10-16 19:07:02 +00002803 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2804 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2805 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2806 HasPRFCHW = true;
2807 Features.push_back("+prfchw");
2808 }
2809
Rafael Espindolaeb265472013-08-21 21:59:03 +00002810 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2811 // matches the selected sse level.
2812 if (FPMath == FP_SSE && SSELevel < SSE1) {
2813 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2814 return false;
2815 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2816 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2817 return false;
2818 }
2819
Eli Friedman33465822011-07-08 23:31:17 +00002820 // Don't tell the backend if we're turning off mmx; it will end up disabling
2821 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002822 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2823 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002824 std::vector<std::string>::iterator it;
2825 it = std::find(Features.begin(), Features.end(), "-mmx");
2826 if (it != Features.end())
2827 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002828 else if (SSELevel > NoSSE)
2829 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002830 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002831}
Chris Lattnerecd49032009-03-02 22:27:17 +00002832
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002833/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2834/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002835void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002836 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002837 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002838 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002839 Builder.defineMacro("__amd64__");
2840 Builder.defineMacro("__amd64");
2841 Builder.defineMacro("__x86_64");
2842 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002843 if (getTriple().getArchName() == "x86_64h") {
2844 Builder.defineMacro("__x86_64h");
2845 Builder.defineMacro("__x86_64h__");
2846 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002847 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002848 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002849 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002850
Chris Lattnerecd49032009-03-02 22:27:17 +00002851 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002852 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2853 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002854 switch (CPU) {
2855 case CK_Generic:
2856 break;
2857 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002858 // The rest are coming from the i386 define above.
2859 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002860 break;
2861 case CK_i486:
2862 case CK_WinChipC6:
2863 case CK_WinChip2:
2864 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002865 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002866 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002867 case CK_PentiumMMX:
2868 Builder.defineMacro("__pentium_mmx__");
2869 Builder.defineMacro("__tune_pentium_mmx__");
2870 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002871 case CK_i586:
2872 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002873 defineCPUMacros(Builder, "i586");
2874 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002875 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002876 case CK_Pentium3:
2877 case CK_Pentium3M:
2878 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002879 Builder.defineMacro("__tune_pentium3__");
2880 // Fallthrough
2881 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002882 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002883 Builder.defineMacro("__tune_pentium2__");
2884 // Fallthrough
2885 case CK_PentiumPro:
2886 Builder.defineMacro("__tune_i686__");
2887 Builder.defineMacro("__tune_pentiumpro__");
2888 // Fallthrough
2889 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002890 Builder.defineMacro("__i686");
2891 Builder.defineMacro("__i686__");
2892 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2893 Builder.defineMacro("__pentiumpro");
2894 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002895 break;
2896 case CK_Pentium4:
2897 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002898 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002899 break;
2900 case CK_Yonah:
2901 case CK_Prescott:
2902 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002903 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002904 break;
2905 case CK_Core2:
2906 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002907 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002908 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002909 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002910 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002911 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002912 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002913 defineCPUMacros(Builder, "slm");
2914 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002915 case CK_Nehalem:
2916 case CK_Westmere:
2917 case CK_SandyBridge:
2918 case CK_IvyBridge:
2919 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002920 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002921 // FIXME: Historically, we defined this legacy name, it would be nice to
2922 // remove it at some point. We've never exposed fine-grained names for
2923 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002924 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002925 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002926 case CK_Skylake:
2927 // FIXME: Historically, we defined this legacy name, it would be nice to
2928 // remove it at some point. This is the only fine-grained CPU macro in the
2929 // main intel CPU line, and it would be better to not have these and force
2930 // people to use ISA macros.
2931 defineCPUMacros(Builder, "skx");
2932 break;
Craig Topper449314e2013-08-20 07:09:39 +00002933 case CK_KNL:
2934 defineCPUMacros(Builder, "knl");
2935 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002936 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002937 Builder.defineMacro("__k6_2__");
2938 Builder.defineMacro("__tune_k6_2__");
2939 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002940 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002941 if (CPU != CK_K6_2) { // In case of fallthrough
2942 // FIXME: GCC may be enabling these in cases where some other k6
2943 // architecture is specified but -m3dnow is explicitly provided. The
2944 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002945 Builder.defineMacro("__k6_3__");
2946 Builder.defineMacro("__tune_k6_3__");
2947 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002948 // Fallthrough
2949 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002950 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002951 break;
2952 case CK_Athlon:
2953 case CK_AthlonThunderbird:
2954 case CK_Athlon4:
2955 case CK_AthlonXP:
2956 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002957 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002958 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002959 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002960 Builder.defineMacro("__tune_athlon_sse__");
2961 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002962 break;
2963 case CK_K8:
2964 case CK_K8SSE3:
2965 case CK_x86_64:
2966 case CK_Opteron:
2967 case CK_OpteronSSE3:
2968 case CK_Athlon64:
2969 case CK_Athlon64SSE3:
2970 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002971 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002972 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002973 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002974 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002975 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002976 case CK_BTVER1:
2977 defineCPUMacros(Builder, "btver1");
2978 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002979 case CK_BTVER2:
2980 defineCPUMacros(Builder, "btver2");
2981 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002982 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002983 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002984 break;
2985 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002986 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002987 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002988 case CK_BDVER3:
2989 defineCPUMacros(Builder, "bdver3");
2990 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002991 case CK_BDVER4:
2992 defineCPUMacros(Builder, "bdver4");
2993 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002994 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002995 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002996 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002997 }
Chris Lattner96e43572009-03-02 22:40:39 +00002998
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002999 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003000 Builder.defineMacro("__REGISTER_PREFIX__", "");
3001
Chris Lattner6df41af2009-04-19 17:32:33 +00003002 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3003 // functions in glibc header files that use FP Stack inline asm which the
3004 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003005 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003006
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003007 if (HasAES)
3008 Builder.defineMacro("__AES__");
3009
Craig Topper3f122a72012-05-31 05:18:48 +00003010 if (HasPCLMUL)
3011 Builder.defineMacro("__PCLMUL__");
3012
Craig Topper22967d42011-12-25 05:06:45 +00003013 if (HasLZCNT)
3014 Builder.defineMacro("__LZCNT__");
3015
Benjamin Kramer1e250392012-07-07 09:39:18 +00003016 if (HasRDRND)
3017 Builder.defineMacro("__RDRND__");
3018
Craig Topper8c7f2512014-11-03 06:51:41 +00003019 if (HasFSGSBASE)
3020 Builder.defineMacro("__FSGSBASE__");
3021
Craig Topper22967d42011-12-25 05:06:45 +00003022 if (HasBMI)
3023 Builder.defineMacro("__BMI__");
3024
3025 if (HasBMI2)
3026 Builder.defineMacro("__BMI2__");
3027
Craig Topper1de83482011-12-29 16:10:46 +00003028 if (HasPOPCNT)
3029 Builder.defineMacro("__POPCNT__");
3030
Michael Liao625a8752012-11-10 05:17:46 +00003031 if (HasRTM)
3032 Builder.defineMacro("__RTM__");
3033
Michael Liao74f4eaf2013-03-26 17:52:08 +00003034 if (HasPRFCHW)
3035 Builder.defineMacro("__PRFCHW__");
3036
Michael Liaoffaae352013-03-29 05:17:55 +00003037 if (HasRDSEED)
3038 Builder.defineMacro("__RDSEED__");
3039
Robert Khasanov50e6f582014-09-19 09:53:48 +00003040 if (HasADX)
3041 Builder.defineMacro("__ADX__");
3042
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003043 if (HasTBM)
3044 Builder.defineMacro("__TBM__");
3045
Rafael Espindolae62e2792013-08-20 13:44:29 +00003046 switch (XOPLevel) {
3047 case XOP:
3048 Builder.defineMacro("__XOP__");
3049 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003050 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003051 case SSE4A:
3052 Builder.defineMacro("__SSE4A__");
3053 case NoXOP:
3054 break;
3055 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003056
Craig Topperbba778b2012-06-03 21:46:30 +00003057 if (HasFMA)
3058 Builder.defineMacro("__FMA__");
3059
Manman Rena45358c2012-10-11 00:59:55 +00003060 if (HasF16C)
3061 Builder.defineMacro("__F16C__");
3062
Craig Topper679b53a2013-08-21 05:29:10 +00003063 if (HasAVX512CD)
3064 Builder.defineMacro("__AVX512CD__");
3065 if (HasAVX512ER)
3066 Builder.defineMacro("__AVX512ER__");
3067 if (HasAVX512PF)
3068 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003069 if (HasAVX512DQ)
3070 Builder.defineMacro("__AVX512DQ__");
3071 if (HasAVX512BW)
3072 Builder.defineMacro("__AVX512BW__");
3073 if (HasAVX512VL)
3074 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003075
Ben Langmuir58078d02013-09-19 13:22:04 +00003076 if (HasSHA)
3077 Builder.defineMacro("__SHA__");
3078
Nick Lewycky50e8f482013-10-05 20:14:27 +00003079 if (HasCX16)
3080 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3081
Chris Lattner96e43572009-03-02 22:40:39 +00003082 // Each case falls through to the previous one here.
3083 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003084 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003085 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003086 case AVX2:
3087 Builder.defineMacro("__AVX2__");
3088 case AVX:
3089 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003090 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003091 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003092 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003093 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003094 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003095 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003096 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003097 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003098 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003099 Builder.defineMacro("__SSE2__");
3100 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003101 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003102 Builder.defineMacro("__SSE__");
3103 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003104 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003105 break;
3106 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003107
Derek Schuffc7dd7222012-10-11 15:52:22 +00003108 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003109 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003110 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003111 case AVX2:
3112 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003113 case SSE42:
3114 case SSE41:
3115 case SSSE3:
3116 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003117 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003118 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003119 break;
3120 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003121 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003122 break;
3123 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003124 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003125 }
3126 }
3127
Anders Carlssone437c682010-01-27 03:47:49 +00003128 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003129 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003130 case AMD3DNowAthlon:
3131 Builder.defineMacro("__3dNOW_A__");
3132 case AMD3DNow:
3133 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003134 case MMX:
3135 Builder.defineMacro("__MMX__");
3136 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003137 break;
3138 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003139
3140 if (CPU >= CK_i486) {
3141 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3142 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3143 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3144 }
3145 if (CPU >= CK_i586)
3146 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003147}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003148
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003149bool X86TargetInfo::hasFeature(StringRef Feature) const {
3150 return llvm::StringSwitch<bool>(Feature)
3151 .Case("aes", HasAES)
3152 .Case("avx", SSELevel >= AVX)
3153 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003154 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003155 .Case("avx512cd", HasAVX512CD)
3156 .Case("avx512er", HasAVX512ER)
3157 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003158 .Case("avx512dq", HasAVX512DQ)
3159 .Case("avx512bw", HasAVX512BW)
3160 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003161 .Case("bmi", HasBMI)
3162 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003163 .Case("cx16", HasCX16)
3164 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003165 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003166 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003167 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003168 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003169 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3170 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3171 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003172 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003173 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003174 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003175 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003176 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003177 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003178 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003179 .Case("sse", SSELevel >= SSE1)
3180 .Case("sse2", SSELevel >= SSE2)
3181 .Case("sse3", SSELevel >= SSE3)
3182 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003183 .Case("sse4.1", SSELevel >= SSE41)
3184 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003185 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003186 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003187 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003188 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3189 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003190 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003191 .Default(false);
3192}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003193
Eli Friedman3fd920a2008-08-20 02:34:37 +00003194bool
Anders Carlsson58436352009-02-28 17:11:49 +00003195X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003196 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003197 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003198 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003199 case 'I':
3200 Info.setRequiresImmediate(0, 31);
3201 return true;
3202 case 'J':
3203 Info.setRequiresImmediate(0, 63);
3204 return true;
3205 case 'K':
3206 Info.setRequiresImmediate(-128, 127);
3207 return true;
3208 case 'L':
3209 // FIXME: properly analyze this constraint:
3210 // must be one of 0xff, 0xffff, or 0xffffffff
3211 return true;
3212 case 'M':
3213 Info.setRequiresImmediate(0, 3);
3214 return true;
3215 case 'N':
3216 Info.setRequiresImmediate(0, 255);
3217 return true;
3218 case 'O':
3219 Info.setRequiresImmediate(0, 127);
3220 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003221 case 'Y': // first letter of a pair:
3222 switch (*(Name+1)) {
3223 default: return false;
3224 case '0': // First SSE register.
3225 case 't': // Any SSE register, when SSE2 is enabled.
3226 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3227 case 'm': // any MMX register, when inter-unit moves enabled.
3228 break; // falls through to setAllowsRegister.
3229 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003230 case 'f': // any x87 floating point stack register.
3231 // Constraint 'f' cannot be used for output operands.
3232 if (Info.ConstraintStr[0] == '=')
3233 return false;
3234
3235 Info.setAllowsRegister();
3236 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003237 case 'a': // eax.
3238 case 'b': // ebx.
3239 case 'c': // ecx.
3240 case 'd': // edx.
3241 case 'S': // esi.
3242 case 'D': // edi.
3243 case 'A': // edx:eax.
3244 case 't': // top of floating point stack.
3245 case 'u': // second from top of floating point stack.
3246 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003247 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003248 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003249 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003250 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3251 case 'l': // "Index" registers: any general register that can be used as an
3252 // index in a base+index memory access.
3253 Info.setAllowsRegister();
3254 return true;
3255 case 'C': // SSE floating point constant.
3256 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003257 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003258 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003259 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003260 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003261 return true;
3262 }
3263}
3264
Akira Hatanaka974131e2014-09-18 18:17:18 +00003265bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3266 unsigned Size) const {
3267 // Strip off constraint modifiers.
3268 while (Constraint[0] == '=' ||
3269 Constraint[0] == '+' ||
3270 Constraint[0] == '&')
3271 Constraint = Constraint.substr(1);
3272
3273 return validateOperandSize(Constraint, Size);
3274}
3275
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003276bool X86TargetInfo::validateInputSize(StringRef Constraint,
3277 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003278 return validateOperandSize(Constraint, Size);
3279}
3280
3281bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3282 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003283 switch (Constraint[0]) {
3284 default: break;
3285 case 'y':
3286 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003287 case 'f':
3288 case 't':
3289 case 'u':
3290 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003291 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003292 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003293 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003294 }
3295
3296 return true;
3297}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003298
Eli Friedman3fd920a2008-08-20 02:34:37 +00003299std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003300X86TargetInfo::convertConstraint(const char *&Constraint) const {
3301 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003302 case 'a': return std::string("{ax}");
3303 case 'b': return std::string("{bx}");
3304 case 'c': return std::string("{cx}");
3305 case 'd': return std::string("{dx}");
3306 case 'S': return std::string("{si}");
3307 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003308 case 'p': // address
3309 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003310 case 't': // top of floating point stack.
3311 return std::string("{st}");
3312 case 'u': // second from top of floating point stack.
3313 return std::string("{st(1)}"); // second from top of floating point stack.
3314 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003315 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003316 }
3317}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003318
Eli Friedman3fd920a2008-08-20 02:34:37 +00003319// X86-32 generic target
3320class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003321public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003322 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003323 DoubleAlign = LongLongAlign = 32;
3324 LongDoubleWidth = 96;
3325 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003326 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003327 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003328 SizeType = UnsignedInt;
3329 PtrDiffType = SignedInt;
3330 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003331 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003332
3333 // Use fpret for all types.
3334 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3335 (1 << TargetInfo::Double) |
3336 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003337
3338 // x86-32 has atomics up to 8 bytes
3339 // FIXME: Check that we actually have cmpxchg8b before setting
3340 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3341 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003342 }
Craig Topper3164f332014-03-11 03:39:26 +00003343 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003344 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003345 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003346
Craig Topper3164f332014-03-11 03:39:26 +00003347 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003348 if (RegNo == 0) return 0;
3349 if (RegNo == 1) return 2;
3350 return -1;
3351 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003352 bool validateOperandSize(StringRef Constraint,
3353 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003354 switch (Constraint[0]) {
3355 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003356 case 'R':
3357 case 'q':
3358 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003359 case 'a':
3360 case 'b':
3361 case 'c':
3362 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003363 case 'S':
3364 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003365 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003366 case 'A':
3367 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003368 }
3369
Akira Hatanaka974131e2014-09-18 18:17:18 +00003370 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003371 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003372};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003373
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003374class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3375public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003376 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3377 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003378
Craig Topper3164f332014-03-11 03:39:26 +00003379 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003380 unsigned Major, Minor, Micro;
3381 getTriple().getOSVersion(Major, Minor, Micro);
3382 // New NetBSD uses the default rounding mode.
3383 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3384 return X86_32TargetInfo::getFloatEvalMethod();
3385 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003386 return 1;
3387 }
3388};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003389
Eli Friedmane3aa4542009-07-05 18:47:56 +00003390class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3391public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003392 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3393 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003394 SizeType = UnsignedLong;
3395 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003396 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003397 }
3398};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003399
Eli Friedman9fa28852012-08-08 23:57:20 +00003400class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3401public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003402 BitrigI386TargetInfo(const llvm::Triple &Triple)
3403 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003404 SizeType = UnsignedLong;
3405 IntPtrType = SignedLong;
3406 PtrDiffType = SignedLong;
3407 }
3408};
Eli Friedman9fa28852012-08-08 23:57:20 +00003409
Torok Edwinb2b37c62009-06-30 17:10:35 +00003410class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003411public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003412 DarwinI386TargetInfo(const llvm::Triple &Triple)
3413 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003414 LongDoubleWidth = 128;
3415 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003416 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003417 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003418 SizeType = UnsignedLong;
3419 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003420 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003421 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003422 }
3423
Eli Friedman3fd920a2008-08-20 02:34:37 +00003424};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003425
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003426// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003427class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003428public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003429 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3430 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003431 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003432 DoubleAlign = LongLongAlign = 64;
David Majnemer8fa8c382015-03-17 23:55:00 +00003433 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003434 }
Craig Topper3164f332014-03-11 03:39:26 +00003435 void getTargetDefines(const LangOptions &Opts,
3436 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003437 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3438 }
3439};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003440
3441// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003442class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003443public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003444 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003445 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003446 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003447 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3448 }
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 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3452 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3453 // The value of the following reflects processor type.
3454 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3455 // We lost the original triple, so we use the default.
3456 Builder.defineMacro("_M_IX86", "600");
3457 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003458};
3459} // end anonymous namespace
3460
Reid Kleckner47606832014-04-21 20:58:00 +00003461static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3462 Builder.defineMacro("__MSVCRT__");
3463 Builder.defineMacro("__MINGW32__");
3464
3465 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3466 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3467 // macro anyway for pre-processor compatibility.
3468 if (Opts.MicrosoftExt)
3469 Builder.defineMacro("__declspec", "__declspec");
3470 else
3471 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3472
3473 if (!Opts.MicrosoftExt) {
3474 // Provide macros for all the calling convention keywords. Provide both
3475 // single and double underscore prefixed variants. These are available on
3476 // x64 as well as x86, even though they have no effect.
3477 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3478 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003479 std::string GCCSpelling = "__attribute__((__";
3480 GCCSpelling += CC;
3481 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003482 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3483 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3484 }
3485 }
3486}
3487
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003488namespace {
3489// x86-32 MinGW target
3490class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3491public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003492 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3493 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003494 void getTargetDefines(const LangOptions &Opts,
3495 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003496 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003497 DefineStd(Builder, "WIN32", Opts);
3498 DefineStd(Builder, "WINNT", Opts);
3499 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003500 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003501 }
3502};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003503
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003504// x86-32 Cygwin target
3505class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3506public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003507 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3508 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003509 TLSSupported = false;
3510 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003511 DoubleAlign = LongLongAlign = 64;
David Majnemer8fa8c382015-03-17 23:55:00 +00003512 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003513 }
Craig Topper3164f332014-03-11 03:39:26 +00003514 void getTargetDefines(const LangOptions &Opts,
3515 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003516 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003517 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003518 Builder.defineMacro("__CYGWIN__");
3519 Builder.defineMacro("__CYGWIN32__");
3520 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003521 if (Opts.CPlusPlus)
3522 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003523 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003524};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003525
Chris Lattnerb986aba2010-04-11 19:29:39 +00003526// x86-32 Haiku target
3527class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3528public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003529 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003530 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003531 IntPtrType = SignedLong;
3532 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003533 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003534 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003535 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003536 }
Craig Topper3164f332014-03-11 03:39:26 +00003537 void getTargetDefines(const LangOptions &Opts,
3538 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003539 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3540 Builder.defineMacro("__INTEL__");
3541 Builder.defineMacro("__HAIKU__");
3542 }
3543};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003544
Douglas Gregor9fabd852011-07-01 22:41:14 +00003545// RTEMS Target
3546template<typename Target>
3547class RTEMSTargetInfo : public OSTargetInfo<Target> {
3548protected:
Craig Topper3164f332014-03-11 03:39:26 +00003549 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3550 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003551 // RTEMS defines; list based off of gcc output
3552
Douglas Gregor9fabd852011-07-01 22:41:14 +00003553 Builder.defineMacro("__rtems__");
3554 Builder.defineMacro("__ELF__");
3555 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003556
Douglas Gregor9fabd852011-07-01 22:41:14 +00003557public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003558 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3559 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003560
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003561 switch (Triple.getArch()) {
3562 default:
3563 case llvm::Triple::x86:
3564 // this->MCountName = ".mcount";
3565 break;
3566 case llvm::Triple::mips:
3567 case llvm::Triple::mipsel:
3568 case llvm::Triple::ppc:
3569 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003570 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003571 // this->MCountName = "_mcount";
3572 break;
3573 case llvm::Triple::arm:
3574 // this->MCountName = "__mcount";
3575 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003576 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003577 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003578};
3579
Douglas Gregor9fabd852011-07-01 22:41:14 +00003580// x86-32 RTEMS target
3581class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3582public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003583 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003584 SizeType = UnsignedLong;
3585 IntPtrType = SignedLong;
3586 PtrDiffType = SignedLong;
3587 this->UserLabelPrefix = "";
3588 }
Craig Topper3164f332014-03-11 03:39:26 +00003589 void getTargetDefines(const LangOptions &Opts,
3590 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003591 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3592 Builder.defineMacro("__INTEL__");
3593 Builder.defineMacro("__rtems__");
3594 }
3595};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003596
Eli Friedman3fd920a2008-08-20 02:34:37 +00003597// x86-64 generic target
3598class X86_64TargetInfo : public X86TargetInfo {
3599public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003600 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003601 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003602 bool IsWinCOFF =
3603 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003604 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003605 LongDoubleWidth = 128;
3606 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003607 LargeArrayMinWidth = 128;
3608 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003609 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003610 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3611 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3612 IntPtrType = IsX32 ? SignedInt : SignedLong;
3613 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003614 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003615 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003616
Eric Christopher917e9522014-11-18 22:36:15 +00003617 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003618 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3619 : IsWinCOFF
3620 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3621 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003622
3623 // Use fpret only for long double.
3624 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003625
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003626 // Use fp2ret for _Complex long double.
3627 ComplexLongDoubleUsesFP2Ret = true;
3628
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003629 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003630 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003631 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003632 }
Craig Topper3164f332014-03-11 03:39:26 +00003633 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003634 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003635 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003636
Craig Topper3164f332014-03-11 03:39:26 +00003637 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003638 if (RegNo == 0) return 0;
3639 if (RegNo == 1) return 1;
3640 return -1;
3641 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003642
Craig Topper3164f332014-03-11 03:39:26 +00003643 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003644 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003645 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003646 CC == CC_IntelOclBicc ||
3647 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003648 }
3649
Craig Topper3164f332014-03-11 03:39:26 +00003650 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003651 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003652 }
3653
Pavel Chupinfd223e12014-08-04 12:39:43 +00003654 // for x32 we need it here explicitly
3655 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003656};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003657
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003658// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003659class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003660public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003661 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3662 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003663 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003664 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003665 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003666 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003667 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003668 SizeType = UnsignedLongLong;
3669 PtrDiffType = SignedLongLong;
3670 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003671 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003672 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003673
Craig Topper3164f332014-03-11 03:39:26 +00003674 void getTargetDefines(const LangOptions &Opts,
3675 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003676 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003677 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003678 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003679
Craig Topper3164f332014-03-11 03:39:26 +00003680 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003681 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003682 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003683
Craig Topper3164f332014-03-11 03:39:26 +00003684 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003685 switch (CC) {
3686 case CC_X86StdCall:
3687 case CC_X86ThisCall:
3688 case CC_X86FastCall:
3689 return CCCR_Ignore;
3690 case CC_C:
3691 case CC_X86VectorCall:
3692 case CC_IntelOclBicc:
3693 case CC_X86_64SysV:
3694 return CCCR_OK;
3695 default:
3696 return CCCR_Warning;
3697 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003698 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003699};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003700
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003701// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003702class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003703public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003704 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003705 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003706 LongDoubleWidth = LongDoubleAlign = 64;
3707 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003708 }
Craig Topper3164f332014-03-11 03:39:26 +00003709 void getTargetDefines(const LangOptions &Opts,
3710 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003711 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3712 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003713 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003714 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003715 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003716};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003717
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003718// x86-64 MinGW target
3719class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3720public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003721 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3722 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003723 void getTargetDefines(const LangOptions &Opts,
3724 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003725 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003726 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003727 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003728 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003729
3730 // GCC defines this macro when it is using __gxx_personality_seh0.
3731 if (!Opts.SjLjExceptions)
3732 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003733 }
3734};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003735
Eli Friedman2857ccb2009-07-01 03:36:11 +00003736class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3737public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003738 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3739 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003740 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003741 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003742 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3743 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003744 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003745 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003746 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003747 }
3748};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003749
Eli Friedman245f2292009-07-05 22:31:18 +00003750class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3751public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003752 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3753 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003754 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003755 Int64Type = SignedLongLong;
3756 }
3757};
Eli Friedman245f2292009-07-05 22:31:18 +00003758
Eli Friedman9fa28852012-08-08 23:57:20 +00003759class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3760public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003761 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3762 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3763 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003764 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003765 }
3766};
Tim Northover9bb857a2013-01-31 12:13:10 +00003767
Eli Friedmanf05b7722008-08-20 07:44:10 +00003768class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003769 // Possible FPU choices.
3770 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003771 VFP2FPU = (1 << 0),
3772 VFP3FPU = (1 << 1),
3773 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003774 NeonFPU = (1 << 3),
3775 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003776 };
3777
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003778 // Possible HWDiv features.
3779 enum HWDivMode {
3780 HWDivThumb = (1 << 0),
3781 HWDivARM = (1 << 1)
3782 };
3783
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003784 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003785 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003786 }
3787
3788 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3789 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003790
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003791 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003792
Rafael Espindolaeb265472013-08-21 21:59:03 +00003793 enum {
3794 FP_Default,
3795 FP_VFP,
3796 FP_Neon
3797 } FPMath;
3798
Bernard Ogdenda13af32013-10-24 18:32:51 +00003799 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003800
Logan Chien57086ce2012-10-10 06:56:20 +00003801 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003802 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003803 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003804
3805 // Initialized via features.
3806 unsigned SoftFloat : 1;
3807 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003808
Bernard Ogden18b57012013-10-29 09:47:51 +00003809 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003810 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003811
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003812 // ACLE 6.5.1 Hardware floating point
3813 enum {
3814 HW_FP_HP = (1 << 1), /// half (16-bit)
3815 HW_FP_SP = (1 << 2), /// single (32-bit)
3816 HW_FP_DP = (1 << 3), /// double (64-bit)
3817 };
3818 uint32_t HW_FP;
3819
Chris Lattner5cc15e02010-03-03 19:03:45 +00003820 static const Builtin::Info BuiltinInfo[];
3821
Rafael Espindola101d5b92013-05-13 20:09:47 +00003822 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003823 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003824 if (T.getArch() == llvm::Triple::arm ||
3825 T.getArch() == llvm::Triple::armeb) {
3826 StringRef VersionStr;
3827 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003828 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003829 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003830 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003831 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003832 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003833 unsigned Version;
3834 if (VersionStr.getAsInteger(10, Version))
3835 return false;
3836 return Version >= 6;
3837 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003838 assert(T.getArch() == llvm::Triple::thumb ||
3839 T.getArch() == llvm::Triple::thumbeb);
3840 StringRef VersionStr;
3841 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003842 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003843 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003844 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003845 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003846 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003847 unsigned Version;
3848 if (VersionStr.getAsInteger(10, Version))
3849 return false;
3850 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003851 }
3852
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003853 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003854 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003855
3856 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003857 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003858
Renato Golin9ba39232015-02-27 16:35:48 +00003859 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3860 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3861 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003862 SizeType = UnsignedLong;
3863 else
3864 SizeType = UnsignedInt;
3865
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003866 switch (T.getOS()) {
3867 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003868 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003869 break;
3870 case llvm::Triple::Win32:
3871 WCharType = UnsignedShort;
3872 break;
3873 case llvm::Triple::Linux:
3874 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003875 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3876 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003877 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003878 }
3879
3880 UseBitFieldTypeAlignment = true;
3881
3882 ZeroLengthBitfieldBoundary = 0;
3883
Tim Northover147cd2f2014-10-14 22:12:21 +00003884 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3885 // so set preferred for small types to 32.
3886 if (T.isOSBinFormatMachO()) {
3887 DescriptionString =
3888 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3889 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3890 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00003891 assert(!BigEndian && "Windows on ARM does not support big endian");
3892 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00003893 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00003894 "-p:32:32"
3895 "-i64:64"
3896 "-v128:64:128"
3897 "-a:0:32"
3898 "-n32"
3899 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003900 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003901 DescriptionString =
3902 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3903 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003904 }
3905
3906 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003907 }
3908
3909 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003910 const llvm::Triple &T = getTriple();
3911
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003912 IsAAPCS = false;
3913
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003914 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003915
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003916 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003917 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003918 SizeType = UnsignedInt;
3919 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003920 SizeType = UnsignedLong;
3921
3922 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3923 WCharType = SignedInt;
3924
3925 // Do not respect the alignment of bit-field types when laying out
3926 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3927 UseBitFieldTypeAlignment = false;
3928
3929 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3930 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3931 /// gcc.
3932 ZeroLengthBitfieldBoundary = 32;
3933
Tim Northover147cd2f2014-10-14 22:12:21 +00003934 if (T.isOSBinFormatMachO())
3935 DescriptionString =
3936 BigEndian
3937 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3938 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3939 else
3940 DescriptionString =
3941 BigEndian
3942 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3943 : "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 +00003944
3945 // FIXME: Override "preferred align" for double and long long.
3946 }
3947
Chris Lattner17df24e2008-04-21 18:56:49 +00003948public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003949 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003950 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003951 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003952 BigEndian = IsBigEndian;
3953
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003954 switch (getTriple().getOS()) {
3955 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003956 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003957 break;
3958 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003959 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003960 break;
3961 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003962
Chris Lattner1a8f3942010-04-23 16:29:58 +00003963 // {} in inline assembly are neon specifiers, not assembly variant
3964 // specifiers.
3965 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003966
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003967 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003968 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003969
Eric Christopher0e261882014-12-05 01:06:59 +00003970 // FIXME: This duplicates code from the driver that sets the -target-abi
3971 // option - this code is used if -target-abi isn't passed and should
3972 // be unified in some way.
3973 if (Triple.isOSBinFormatMachO()) {
3974 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3975 // the frontend matches that.
3976 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3977 Triple.getOS() == llvm::Triple::UnknownOS ||
3978 StringRef(CPU).startswith("cortex-m")) {
3979 setABI("aapcs");
3980 } else {
3981 setABI("apcs-gnu");
3982 }
3983 } else if (Triple.isOSWindows()) {
3984 // FIXME: this is invalid for WindowsCE
3985 setABI("aapcs");
3986 } else {
3987 // Select the default based on the platform.
3988 switch (Triple.getEnvironment()) {
3989 case llvm::Triple::Android:
3990 case llvm::Triple::GNUEABI:
3991 case llvm::Triple::GNUEABIHF:
3992 setABI("aapcs-linux");
3993 break;
3994 case llvm::Triple::EABIHF:
3995 case llvm::Triple::EABI:
3996 setABI("aapcs");
3997 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00003998 case llvm::Triple::GNU:
3999 setABI("apcs-gnu");
4000 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004001 default:
4002 if (Triple.getOS() == llvm::Triple::NetBSD)
4003 setABI("apcs-gnu");
4004 else
4005 setABI("aapcs");
4006 break;
4007 }
4008 }
John McCall86353412010-08-21 22:46:04 +00004009
4010 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004011 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004012
4013 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004014 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004015 if (shouldUseInlineAtomic(getTriple()))
4016 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004017
4018 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004019 // the alignment of the zero-length bitfield is greater than the member
4020 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004021 // zero length bitfield.
4022 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004023 }
Alp Toker4925ba72014-06-07 23:30:42 +00004024 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004025 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004026 ABI = Name;
4027
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004028 // The defaults (above) are for AAPCS, check if we need to change them.
4029 //
4030 // FIXME: We need support for -meabi... we could just mangle it into the
4031 // name.
4032 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004033 setABIAPCS();
4034 return true;
4035 }
4036 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4037 setABIAAPCS();
4038 return true;
4039 }
4040 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004041 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004042
Craig Topper3164f332014-03-11 03:39:26 +00004043 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004044 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004045 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4046 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004047 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004048 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004049 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004050 }
4051 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004052 Features["vfp4"] = true;
4053 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004054 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4055 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004056 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004057 Features["vfp4"] = true;
4058 Features["neon"] = true;
4059 Features["hwdiv"] = true;
4060 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004061 } else if (CPU == "cyclone") {
4062 Features["v8fp"] = true;
4063 Features["neon"] = true;
4064 Features["hwdiv"] = true;
4065 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004066 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004067 Features["fp-armv8"] = true;
4068 Features["neon"] = true;
4069 Features["hwdiv"] = true;
4070 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004071 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004072 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004073 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004074 // Enable the hwdiv extension for all v8a AArch32 cores by
4075 // default.
4076 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004077 ArchName == "armebv8a" || ArchName == "armebv8" ||
4078 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4079 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004080 Features["hwdiv"] = true;
4081 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004082 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
4083 CPU == "sc300") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004084 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004085 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004086 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004087
Craig Topper3164f332014-03-11 03:39:26 +00004088 bool handleTargetFeatures(std::vector<std::string> &Features,
4089 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004090 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004091 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004092 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004093 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004094 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004095
4096 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004097 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004098 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004099 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004100 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004101 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004102 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004103 HW_FP = HW_FP_SP | HW_FP_DP;
4104 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004105 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004106 HW_FP = HW_FP_SP | HW_FP_DP;
4107 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004108 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004109 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4110 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004111 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004112 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4113 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004114 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004115 HW_FP = HW_FP_SP | HW_FP_DP;
4116 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004117 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004118 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004119 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004120 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004121 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004122 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004123 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004124 } else if (Feature == "+fp-only-sp") {
4125 HW_FP &= ~HW_FP_DP;
4126 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004127 }
4128
Rafael Espindolaeb265472013-08-21 21:59:03 +00004129 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4130 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4131 return false;
4132 }
4133
4134 if (FPMath == FP_Neon)
4135 Features.push_back("+neonfp");
4136 else if (FPMath == FP_VFP)
4137 Features.push_back("-neonfp");
4138
Daniel Dunbar893d4752009-12-19 04:15:38 +00004139 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004140 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4141 for (const auto &FEFeature : FrontEndFeatures) {
4142 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4143 if (Feature != Features.end())
4144 Features.erase(Feature);
4145 }
4146
Rafael Espindolaeb265472013-08-21 21:59:03 +00004147 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004148 }
4149
Craig Topper3164f332014-03-11 03:39:26 +00004150 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004151 return llvm::StringSwitch<bool>(Feature)
4152 .Case("arm", true)
4153 .Case("softfloat", SoftFloat)
4154 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004155 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004156 .Case("hwdiv", HWDiv & HWDivThumb)
4157 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004158 .Default(false);
4159 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004160 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004161 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004162 return llvm::StringSwitch<const char *>(Name)
4163 .Cases("arm8", "arm810", "4")
4164 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4165 "4")
4166 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4167 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4168 .Case("ep9312", "4T")
4169 .Cases("arm10tdmi", "arm1020t", "5T")
4170 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4171 .Case("arm926ej-s", "5TEJ")
4172 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4173 .Cases("xscale", "iwmmxt", "5TE")
4174 .Case("arm1136j-s", "6J")
Renato Goline11531f2015-03-17 11:55:43 +00004175 .Case("arm1136jf-s", "6")
4176 .Cases("mpcorenovfp", "mpcore", "6K")
4177 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Eric Christopher917e9522014-11-18 22:36:15 +00004178 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4179 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4180 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4181 "7A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004182 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004183 .Case("swift", "7S")
4184 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004185 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004186 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004187 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004188 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004189 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004190 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004191 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004192 return llvm::StringSwitch<const char *>(Name)
4193 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4194 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4195 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004196 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004197 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4198 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
4199 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004200 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004201 }
Craig Topper3164f332014-03-11 03:39:26 +00004202 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004203 if (!getCPUDefineSuffix(Name))
4204 return false;
4205
Tim Northovere8c37212014-07-09 09:24:43 +00004206 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4207 StringRef Profile = getCPUProfile(Name);
4208 if (Profile == "M" && MaxAtomicInlineWidth) {
4209 MaxAtomicPromoteWidth = 32;
4210 MaxAtomicInlineWidth = 32;
4211 }
4212
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004213 CPU = Name;
4214 return true;
4215 }
Craig Topper3164f332014-03-11 03:39:26 +00004216 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004217 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4218 unsigned CPUArchVer) const {
4219 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4220 (CPUArch.find('M') != StringRef::npos);
4221 }
4222 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4223 unsigned CPUArchVer) const {
4224 // We check both CPUArchVer and ArchName because when only triple is
4225 // specified, the default CPU is arm1136j-s.
4226 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4227 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4228 }
Craig Topper3164f332014-03-11 03:39:26 +00004229 void getTargetDefines(const LangOptions &Opts,
4230 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004231 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004232 Builder.defineMacro("__arm");
4233 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004234
Chris Lattnerecd49032009-03-02 22:27:17 +00004235 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004236 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004237
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004238 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004239 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004240 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004241 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004242 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004243
4244 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004245 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004246 StringRef ArchName = getTriple().getArchName();
4247
4248 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4249 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004250 if (CPUArch[0] >= '8') {
4251 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4252 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004253 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004254
4255 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4256 // is not defined for the M-profile.
4257 // NOTE that the deffault profile is assumed to be 'A'
4258 if (CPUProfile.empty() || CPUProfile != "M")
4259 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4260
4261 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4262 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4263 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4264 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4265 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4266 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4267 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4268
4269 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4270 // instruction set such as ARM or Thumb.
4271 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4272
4273 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4274
4275 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004276 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004277 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004278
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004279 // ACLE 6.5.1 Hardware Floating Point
4280 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004281 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004282
Yi Konga44c4d72014-06-27 21:25:42 +00004283 // ACLE predefines.
4284 Builder.defineMacro("__ARM_ACLE", "200");
4285
Mike Stump9d54bd72009-04-08 02:07:04 +00004286 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004287
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004288 // FIXME: It's more complicated than this and we don't really support
4289 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004290 // Windows on ARM does not "support" interworking
4291 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004292 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004293
David Tweed8f676532012-10-25 13:33:01 +00004294 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004295 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004296 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4297 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004298 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004299 Builder.defineMacro("__ARM_PCS", "1");
4300
David Tweed8f676532012-10-25 13:33:01 +00004301 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004302 Builder.defineMacro("__ARM_PCS_VFP", "1");
4303 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004304
Daniel Dunbar893d4752009-12-19 04:15:38 +00004305 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004306 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004307
4308 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004309 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004310
4311 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004312 Builder.defineMacro("__THUMBEL__");
4313 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004314 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004315 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004316 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004317 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4318 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004319
4320 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004321 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004322
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004323 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004324 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004325 if (FPU & VFP2FPU)
4326 Builder.defineMacro("__ARM_VFPV2__");
4327 if (FPU & VFP3FPU)
4328 Builder.defineMacro("__ARM_VFPV3__");
4329 if (FPU & VFP4FPU)
4330 Builder.defineMacro("__ARM_VFPV4__");
4331 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004332
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004333 // This only gets set when Neon instructions are actually available, unlike
4334 // the VFP define, hence the soft float and arch check. This is subtly
4335 // different from gcc, we follow the intent which was that it should be set
4336 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004337 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4338 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004339 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004340 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004341
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004342 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4343 Opts.ShortWChar ? "2" : "4");
4344
4345 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4346 Opts.ShortEnums ? "1" : "4");
4347
Bernard Ogden18b57012013-10-29 09:47:51 +00004348 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004349 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004350
Tim Northover02e38602014-02-03 17:28:04 +00004351 if (Crypto)
4352 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4353
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004354 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004355 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4356 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4357 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4358 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4359 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004360
4361 bool is5EOrAbove = (CPUArchVer >= 6 ||
4362 (CPUArchVer == 5 &&
4363 CPUArch.find('E') != StringRef::npos));
4364 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4365 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4366 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004367 }
Craig Topper3164f332014-03-11 03:39:26 +00004368 void getTargetBuiltins(const Builtin::Info *&Records,
4369 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004370 Records = BuiltinInfo;
4371 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004372 }
Craig Topper3164f332014-03-11 03:39:26 +00004373 bool isCLZForZeroUndef() const override { return false; }
4374 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004375 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004376 }
Craig Topper3164f332014-03-11 03:39:26 +00004377 void getGCCRegNames(const char * const *&Names,
4378 unsigned &NumNames) const override;
4379 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4380 unsigned &NumAliases) const override;
4381 bool validateAsmConstraint(const char *&Name,
4382 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004383 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004384 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004385 case 'l': // r0-r7
4386 case 'h': // r8-r15
4387 case 'w': // VFP Floating point register single precision
4388 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004389 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004390 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004391 case 'I':
4392 case 'J':
4393 case 'K':
4394 case 'L':
4395 case 'M':
4396 // FIXME
4397 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004398 case 'Q': // A memory address that is a single base register.
4399 Info.setAllowsMemory();
4400 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004401 case 'U': // a memory reference...
4402 switch (Name[1]) {
4403 case 'q': // ...ARMV4 ldrsb
4404 case 'v': // ...VFP load/store (reg+constant offset)
4405 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004406 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004407 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004408 case 'n': // valid address for Neon doubleword vector load/store
4409 case 'm': // valid address for Neon element and structure load/store
4410 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004411 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004412 Info.setAllowsMemory();
4413 Name++;
4414 return true;
4415 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004416 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004417 return false;
4418 }
Craig Topper3164f332014-03-11 03:39:26 +00004419 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004420 std::string R;
4421 switch (*Constraint) {
4422 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004423 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004424 Constraint++;
4425 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004426 case 'p': // 'p' should be translated to 'r' by default.
4427 R = std::string("r");
4428 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004429 default:
4430 return std::string(1, *Constraint);
4431 }
4432 return R;
4433 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004434 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004435 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004436 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004437 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004438 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004439
Bill Wendling9d1ee112012-10-25 23:28:48 +00004440 // Strip off constraint modifiers.
4441 while (Constraint[0] == '=' ||
4442 Constraint[0] == '+' ||
4443 Constraint[0] == '&')
4444 Constraint = Constraint.substr(1);
4445
4446 switch (Constraint[0]) {
4447 default: break;
4448 case 'r': {
4449 switch (Modifier) {
4450 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004451 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004452 case 'q':
4453 // A register of size 32 cannot fit a vector type.
4454 return false;
4455 }
4456 }
4457 }
4458
4459 return true;
4460 }
Craig Topper3164f332014-03-11 03:39:26 +00004461 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004462 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004463 return "";
4464 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004465
Craig Topper3164f332014-03-11 03:39:26 +00004466 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004467 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4468 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004469
Craig Topper3164f332014-03-11 03:39:26 +00004470 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004471 if (RegNo == 0) return 0;
4472 if (RegNo == 1) return 1;
4473 return -1;
4474 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004475};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004476
Rafael Espindolaeb265472013-08-21 21:59:03 +00004477bool ARMTargetInfo::setFPMath(StringRef Name) {
4478 if (Name == "neon") {
4479 FPMath = FP_Neon;
4480 return true;
4481 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4482 Name == "vfp4") {
4483 FPMath = FP_VFP;
4484 return true;
4485 }
4486 return false;
4487}
4488
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004489const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004490 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004491 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004492 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4493
4494 // Float registers
4495 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4496 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4497 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004498 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004499
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004500 // Double registers
4501 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4502 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004503 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4504 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004505
4506 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004507 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4508 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004509};
4510
4511void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004512 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004513 Names = GCCRegNames;
4514 NumNames = llvm::array_lengthof(GCCRegNames);
4515}
4516
4517const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004518 { { "a1" }, "r0" },
4519 { { "a2" }, "r1" },
4520 { { "a3" }, "r2" },
4521 { { "a4" }, "r3" },
4522 { { "v1" }, "r4" },
4523 { { "v2" }, "r5" },
4524 { { "v3" }, "r6" },
4525 { { "v4" }, "r7" },
4526 { { "v5" }, "r8" },
4527 { { "v6", "rfp" }, "r9" },
4528 { { "sl" }, "r10" },
4529 { { "fp" }, "r11" },
4530 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004531 { { "r13" }, "sp" },
4532 { { "r14" }, "lr" },
4533 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004534 // The S, D and Q registers overlap, but aren't really aliases; we
4535 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004536};
4537
4538void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4539 unsigned &NumAliases) const {
4540 Aliases = GCCRegAliases;
4541 NumAliases = llvm::array_lengthof(GCCRegAliases);
4542}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004543
4544const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004545#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004546#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004547 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004548#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004549
4550#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004551#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004552#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4553 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004554#include "clang/Basic/BuiltinsARM.def"
4555};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004556
4557class ARMleTargetInfo : public ARMTargetInfo {
4558public:
4559 ARMleTargetInfo(const llvm::Triple &Triple)
4560 : ARMTargetInfo(Triple, false) { }
4561 virtual void getTargetDefines(const LangOptions &Opts,
4562 MacroBuilder &Builder) const {
4563 Builder.defineMacro("__ARMEL__");
4564 ARMTargetInfo::getTargetDefines(Opts, Builder);
4565 }
4566};
4567
4568class ARMbeTargetInfo : public ARMTargetInfo {
4569public:
4570 ARMbeTargetInfo(const llvm::Triple &Triple)
4571 : ARMTargetInfo(Triple, true) { }
4572 virtual void getTargetDefines(const LangOptions &Opts,
4573 MacroBuilder &Builder) const {
4574 Builder.defineMacro("__ARMEB__");
4575 Builder.defineMacro("__ARM_BIG_ENDIAN");
4576 ARMTargetInfo::getTargetDefines(Opts, Builder);
4577 }
4578};
Chris Lattner17df24e2008-04-21 18:56:49 +00004579
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004580class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4581 const llvm::Triple Triple;
4582public:
4583 WindowsARMTargetInfo(const llvm::Triple &Triple)
4584 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4585 TLSSupported = false;
4586 WCharType = UnsignedShort;
4587 SizeType = UnsignedInt;
4588 UserLabelPrefix = "";
4589 }
4590 void getVisualStudioDefines(const LangOptions &Opts,
4591 MacroBuilder &Builder) const {
4592 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4593
4594 // FIXME: this is invalid for WindowsCE
4595 Builder.defineMacro("_M_ARM_NT", "1");
4596 Builder.defineMacro("_M_ARMT", "_M_ARM");
4597 Builder.defineMacro("_M_THUMB", "_M_ARM");
4598
4599 assert((Triple.getArch() == llvm::Triple::arm ||
4600 Triple.getArch() == llvm::Triple::thumb) &&
4601 "invalid architecture for Windows ARM target info");
4602 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4603 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4604
4605 // TODO map the complete set of values
4606 // 31: VFPv3 40: VFPv4
4607 Builder.defineMacro("_M_ARM_FP", "31");
4608 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004609 BuiltinVaListKind getBuiltinVaListKind() const override {
4610 return TargetInfo::CharPtrBuiltinVaList;
4611 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004612};
4613
4614// Windows ARM + Itanium C++ ABI Target
4615class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4616public:
4617 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4618 : WindowsARMTargetInfo(Triple) {
4619 TheCXXABI.set(TargetCXXABI::GenericARM);
4620 }
4621
4622 void getTargetDefines(const LangOptions &Opts,
4623 MacroBuilder &Builder) const override {
4624 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4625
4626 if (Opts.MSVCCompat)
4627 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4628 }
4629};
4630
4631// Windows ARM, MS (C++) ABI
4632class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4633public:
4634 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4635 : WindowsARMTargetInfo(Triple) {
4636 TheCXXABI.set(TargetCXXABI::Microsoft);
4637 }
4638
4639 void getTargetDefines(const LangOptions &Opts,
4640 MacroBuilder &Builder) const override {
4641 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4642 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4643 }
4644};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004645
Mike Stump11289f42009-09-09 15:08:12 +00004646class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004647 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004648protected:
Craig Topper3164f332014-03-11 03:39:26 +00004649 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4650 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004651 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004652 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004653
Torok Edwinb2b37c62009-06-30 17:10:35 +00004654public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004655 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004656 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004657 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004658 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004659 // FIXME: This should be based off of the target features in
4660 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004661 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004662
4663 // Darwin on iOS uses a variant of the ARM C++ ABI.
4664 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004665 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004666};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004667
Tim Northover573cbee2014-05-24 12:52:07 +00004668class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004669 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004670 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4671 static const char *const GCCRegNames[];
4672
James Molloy75f5f9e2014-04-16 15:33:48 +00004673 enum FPUModeEnum {
4674 FPUMode,
4675 NeonMode
4676 };
4677
4678 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004679 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004680 unsigned Crypto;
4681
Tim Northovera2ee4332014-03-29 15:09:45 +00004682 static const Builtin::Info BuiltinInfo[];
4683
4684 std::string ABI;
4685
4686public:
Tim Northover573cbee2014-05-24 12:52:07 +00004687 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004688 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004689
4690 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4691 WCharType = SignedInt;
4692
4693 // NetBSD apparently prefers consistency across ARM targets to consistency
4694 // across 64-bit targets.
4695 Int64Type = SignedLongLong;
4696 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004697 } else {
4698 WCharType = UnsignedInt;
4699 Int64Type = SignedLong;
4700 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004701 }
4702
Tim Northovera2ee4332014-03-29 15:09:45 +00004703 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004704 MaxVectorAlign = 128;
4705 RegParmMax = 8;
4706 MaxAtomicInlineWidth = 128;
4707 MaxAtomicPromoteWidth = 128;
4708
Tim Northovera6a19f12015-02-06 01:25:07 +00004709 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004710 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4711
Tim Northovera2ee4332014-03-29 15:09:45 +00004712 // {} in inline assembly are neon specifiers, not assembly variant
4713 // specifiers.
4714 NoAsmVariants = true;
4715
Tim Northover7ad87af2015-01-16 18:44:04 +00004716 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4717 // contributes to the alignment of the containing aggregate in the same way
4718 // a plain (non bit-field) member of that type would, without exception for
4719 // zero-sized or anonymous bit-fields."
4720 UseBitFieldTypeAlignment = true;
4721 UseZeroLengthBitfieldAlignment = true;
4722
Tim Northover573cbee2014-05-24 12:52:07 +00004723 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004724 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4725 }
4726
Alp Toker4925ba72014-06-07 23:30:42 +00004727 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004728 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004729 if (Name != "aapcs" && Name != "darwinpcs")
4730 return false;
4731
4732 ABI = Name;
4733 return true;
4734 }
4735
David Blaikie1cbb9712014-11-14 19:09:44 +00004736 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004737 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004738 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004739 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004740 .Case("cyclone", true)
4741 .Default(false);
4742 return CPUKnown;
4743 }
4744
4745 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004746 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004747 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004748 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004749
4750 // Target properties.
4751 Builder.defineMacro("_LP64");
4752 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004753
4754 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4755 Builder.defineMacro("__ARM_ACLE", "200");
4756 Builder.defineMacro("__ARM_ARCH", "8");
4757 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4758
4759 Builder.defineMacro("__ARM_64BIT_STATE");
4760 Builder.defineMacro("__ARM_PCS_AAPCS64");
4761 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4762
4763 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4764 Builder.defineMacro("__ARM_FEATURE_CLZ");
4765 Builder.defineMacro("__ARM_FEATURE_FMA");
4766 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004767 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4768 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4769 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4770 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004771
4772 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4773
4774 // 0xe implies support for half, single and double precision operations.
4775 Builder.defineMacro("__ARM_FP", "0xe");
4776
4777 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4778 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4779 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4780
4781 if (Opts.FastMath || Opts.FiniteMathOnly)
4782 Builder.defineMacro("__ARM_FP_FAST");
4783
Richard Smithab506ad2014-10-20 23:26:58 +00004784 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004785 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4786
4787 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4788
4789 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4790 Opts.ShortEnums ? "1" : "4");
4791
James Molloy75f5f9e2014-04-16 15:33:48 +00004792 if (FPU == NeonMode) {
4793 Builder.defineMacro("__ARM_NEON");
4794 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004795 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004796 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004797
Bradley Smith418c5932014-05-02 15:17:51 +00004798 if (CRC)
4799 Builder.defineMacro("__ARM_FEATURE_CRC32");
4800
James Molloy75f5f9e2014-04-16 15:33:48 +00004801 if (Crypto)
4802 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004803 }
4804
4805 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004806 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004807 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004808 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004809 }
4810
David Blaikie1cbb9712014-11-14 19:09:44 +00004811 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004812 return Feature == "aarch64" ||
4813 Feature == "arm64" ||
4814 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004815 }
4816
James Molloy5e73df52014-04-16 15:06:20 +00004817 bool handleTargetFeatures(std::vector<std::string> &Features,
4818 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004819 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004820 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004821 Crypto = 0;
4822 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4823 if (Features[i] == "+neon")
4824 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004825 if (Features[i] == "+crc")
4826 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004827 if (Features[i] == "+crypto")
4828 Crypto = 1;
4829 }
4830
James Molloy5e73df52014-04-16 15:06:20 +00004831 setDescriptionString();
4832
4833 return true;
4834 }
4835
David Blaikie1cbb9712014-11-14 19:09:44 +00004836 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004837
David Blaikie1cbb9712014-11-14 19:09:44 +00004838 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004839 return TargetInfo::AArch64ABIBuiltinVaList;
4840 }
4841
4842 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004843 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004844 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004845 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004846
Eric Christopher917e9522014-11-18 22:36:15 +00004847 virtual bool
4848 validateAsmConstraint(const char *&Name,
4849 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004850 switch (*Name) {
4851 default:
4852 return false;
4853 case 'w': // Floating point and SIMD registers (V0-V31)
4854 Info.setAllowsRegister();
4855 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004856 case 'I': // Constant that can be used with an ADD instruction
4857 case 'J': // Constant that can be used with a SUB instruction
4858 case 'K': // Constant that can be used with a 32-bit logical instruction
4859 case 'L': // Constant that can be used with a 64-bit logical instruction
4860 case 'M': // Constant that can be used as a 32-bit MOV immediate
4861 case 'N': // Constant that can be used as a 64-bit MOV immediate
4862 case 'Y': // Floating point constant zero
4863 case 'Z': // Integer constant zero
4864 return true;
4865 case 'Q': // A memory reference with base register and no offset
4866 Info.setAllowsMemory();
4867 return true;
4868 case 'S': // A symbolic address
4869 Info.setAllowsRegister();
4870 return true;
4871 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004872 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4873 // Utf: A memory address suitable for ldp/stp in TF mode.
4874 // Usa: An absolute symbolic address.
4875 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4876 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004877 case 'z': // Zero register, wzr or xzr
4878 Info.setAllowsRegister();
4879 return true;
4880 case 'x': // Floating point and SIMD registers (V0-V15)
4881 Info.setAllowsRegister();
4882 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004883 }
4884 return false;
4885 }
4886
Akira Hatanaka987f1862014-08-22 06:05:21 +00004887 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004888 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004889 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004890 // Strip off constraint modifiers.
4891 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4892 Constraint = Constraint.substr(1);
4893
4894 switch (Constraint[0]) {
4895 default:
4896 return true;
4897 case 'z':
4898 case 'r': {
4899 switch (Modifier) {
4900 case 'x':
4901 case 'w':
4902 // For now assume that the person knows what they're
4903 // doing with the modifier.
4904 return true;
4905 default:
4906 // By default an 'r' constraint will be in the 'x'
4907 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004908 if (Size == 64)
4909 return true;
4910
4911 SuggestedModifier = "w";
4912 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004913 }
4914 }
4915 }
4916 }
4917
David Blaikie1cbb9712014-11-14 19:09:44 +00004918 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004919
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004920 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004921 if (RegNo == 0)
4922 return 0;
4923 if (RegNo == 1)
4924 return 1;
4925 return -1;
4926 }
4927};
4928
Tim Northover573cbee2014-05-24 12:52:07 +00004929const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004930 // 32-bit Integer registers
4931 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4932 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4933 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4934
4935 // 64-bit Integer registers
4936 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4937 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4938 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4939
4940 // 32-bit floating point regsisters
4941 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4942 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4943 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4944
4945 // 64-bit floating point regsisters
4946 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4947 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4948 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4949
4950 // Vector registers
4951 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4952 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4953 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4954};
4955
Tim Northover573cbee2014-05-24 12:52:07 +00004956void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004957 unsigned &NumNames) const {
4958 Names = GCCRegNames;
4959 NumNames = llvm::array_lengthof(GCCRegNames);
4960}
4961
Tim Northover573cbee2014-05-24 12:52:07 +00004962const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004963 { { "w31" }, "wsp" },
4964 { { "x29" }, "fp" },
4965 { { "x30" }, "lr" },
4966 { { "x31" }, "sp" },
4967 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4968 // don't want to substitute one of these for a different-sized one.
4969};
4970
Tim Northover573cbee2014-05-24 12:52:07 +00004971void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004972 unsigned &NumAliases) const {
4973 Aliases = GCCRegAliases;
4974 NumAliases = llvm::array_lengthof(GCCRegAliases);
4975}
4976
Tim Northover573cbee2014-05-24 12:52:07 +00004977const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004978#define BUILTIN(ID, TYPE, ATTRS) \
4979 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4980#include "clang/Basic/BuiltinsNEON.def"
4981
4982#define BUILTIN(ID, TYPE, ATTRS) \
4983 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004984#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004985};
James Molloy5e73df52014-04-16 15:06:20 +00004986
Tim Northover573cbee2014-05-24 12:52:07 +00004987class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004988 void setDescriptionString() override {
4989 if (getTriple().isOSBinFormatMachO())
4990 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4991 else
4992 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4993 }
4994
4995public:
Tim Northover573cbee2014-05-24 12:52:07 +00004996 AArch64leTargetInfo(const llvm::Triple &Triple)
4997 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004998 BigEndian = false;
4999 }
5000 void getTargetDefines(const LangOptions &Opts,
5001 MacroBuilder &Builder) const override {
5002 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005003 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005004 }
5005};
5006
Tim Northover573cbee2014-05-24 12:52:07 +00005007class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005008 void setDescriptionString() override {
5009 assert(!getTriple().isOSBinFormatMachO());
5010 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5011 }
5012
5013public:
Tim Northover573cbee2014-05-24 12:52:07 +00005014 AArch64beTargetInfo(const llvm::Triple &Triple)
5015 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005016 void getTargetDefines(const LangOptions &Opts,
5017 MacroBuilder &Builder) const override {
5018 Builder.defineMacro("__AARCH64EB__");
5019 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5020 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005021 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005022 }
5023};
Tim Northovera2ee4332014-03-29 15:09:45 +00005024
Tim Northover573cbee2014-05-24 12:52:07 +00005025class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005026protected:
5027 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5028 MacroBuilder &Builder) const override {
5029 Builder.defineMacro("__AARCH64_SIMD__");
5030 Builder.defineMacro("__ARM64_ARCH_8__");
5031 Builder.defineMacro("__ARM_NEON__");
5032 Builder.defineMacro("__LITTLE_ENDIAN__");
5033 Builder.defineMacro("__REGISTER_PREFIX__", "");
5034 Builder.defineMacro("__arm64", "1");
5035 Builder.defineMacro("__arm64__", "1");
5036
5037 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5038 }
5039
Tim Northovera2ee4332014-03-29 15:09:45 +00005040public:
Tim Northover573cbee2014-05-24 12:52:07 +00005041 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5042 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005043 Int64Type = SignedLongLong;
5044 WCharType = SignedInt;
5045 UseSignedCharForObjCBool = false;
5046
Tim Northovera6a19f12015-02-06 01:25:07 +00005047 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005048 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5049
5050 TheCXXABI.set(TargetCXXABI::iOS64);
5051 }
5052
David Blaikie1cbb9712014-11-14 19:09:44 +00005053 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005054 return TargetInfo::CharPtrBuiltinVaList;
5055 }
5056};
Tim Northovera2ee4332014-03-29 15:09:45 +00005057
Tony Linthicum76329bf2011-12-12 21:14:55 +00005058// Hexagon abstract base class
5059class HexagonTargetInfo : public TargetInfo {
5060 static const Builtin::Info BuiltinInfo[];
5061 static const char * const GCCRegNames[];
5062 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5063 std::string CPU;
5064public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005065 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005066 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005067 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005068
5069 // {} in inline assembly are packet specifiers, not assembly variant
5070 // specifiers.
5071 NoAsmVariants = true;
5072 }
5073
Craig Topper3164f332014-03-11 03:39:26 +00005074 void getTargetBuiltins(const Builtin::Info *&Records,
5075 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005076 Records = BuiltinInfo;
5077 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5078 }
5079
Craig Topper3164f332014-03-11 03:39:26 +00005080 bool validateAsmConstraint(const char *&Name,
5081 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005082 return true;
5083 }
5084
Craig Topper3164f332014-03-11 03:39:26 +00005085 void getTargetDefines(const LangOptions &Opts,
5086 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005087
Craig Topper3164f332014-03-11 03:39:26 +00005088 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005089 return Feature == "hexagon";
5090 }
Craig Topper3164f332014-03-11 03:39:26 +00005091
5092 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005093 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005094 }
Craig Topper3164f332014-03-11 03:39:26 +00005095 void getGCCRegNames(const char * const *&Names,
5096 unsigned &NumNames) const override;
5097 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5098 unsigned &NumAliases) const override;
5099 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005100 return "";
5101 }
Sebastian Pop86500282012-01-13 20:37:10 +00005102
5103 static const char *getHexagonCPUSuffix(StringRef Name) {
5104 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005105 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005106 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005107 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005108 }
5109
Craig Topper3164f332014-03-11 03:39:26 +00005110 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005111 if (!getHexagonCPUSuffix(Name))
5112 return false;
5113
Tony Linthicum76329bf2011-12-12 21:14:55 +00005114 CPU = Name;
5115 return true;
5116 }
5117};
5118
5119void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5120 MacroBuilder &Builder) const {
5121 Builder.defineMacro("qdsp6");
5122 Builder.defineMacro("__qdsp6", "1");
5123 Builder.defineMacro("__qdsp6__", "1");
5124
5125 Builder.defineMacro("hexagon");
5126 Builder.defineMacro("__hexagon", "1");
5127 Builder.defineMacro("__hexagon__", "1");
5128
5129 if(CPU == "hexagonv1") {
5130 Builder.defineMacro("__HEXAGON_V1__");
5131 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5132 if(Opts.HexagonQdsp6Compat) {
5133 Builder.defineMacro("__QDSP6_V1__");
5134 Builder.defineMacro("__QDSP6_ARCH__", "1");
5135 }
5136 }
5137 else if(CPU == "hexagonv2") {
5138 Builder.defineMacro("__HEXAGON_V2__");
5139 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5140 if(Opts.HexagonQdsp6Compat) {
5141 Builder.defineMacro("__QDSP6_V2__");
5142 Builder.defineMacro("__QDSP6_ARCH__", "2");
5143 }
5144 }
5145 else if(CPU == "hexagonv3") {
5146 Builder.defineMacro("__HEXAGON_V3__");
5147 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5148 if(Opts.HexagonQdsp6Compat) {
5149 Builder.defineMacro("__QDSP6_V3__");
5150 Builder.defineMacro("__QDSP6_ARCH__", "3");
5151 }
5152 }
5153 else if(CPU == "hexagonv4") {
5154 Builder.defineMacro("__HEXAGON_V4__");
5155 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5156 if(Opts.HexagonQdsp6Compat) {
5157 Builder.defineMacro("__QDSP6_V4__");
5158 Builder.defineMacro("__QDSP6_ARCH__", "4");
5159 }
5160 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005161 else if(CPU == "hexagonv5") {
5162 Builder.defineMacro("__HEXAGON_V5__");
5163 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5164 if(Opts.HexagonQdsp6Compat) {
5165 Builder.defineMacro("__QDSP6_V5__");
5166 Builder.defineMacro("__QDSP6_ARCH__", "5");
5167 }
5168 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005169}
5170
5171const char * const HexagonTargetInfo::GCCRegNames[] = {
5172 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5173 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5174 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5175 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5176 "p0", "p1", "p2", "p3",
5177 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5178};
5179
5180void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5181 unsigned &NumNames) const {
5182 Names = GCCRegNames;
5183 NumNames = llvm::array_lengthof(GCCRegNames);
5184}
5185
5186
5187const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5188 { { "sp" }, "r29" },
5189 { { "fp" }, "r30" },
5190 { { "lr" }, "r31" },
5191 };
5192
5193void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5194 unsigned &NumAliases) const {
5195 Aliases = GCCRegAliases;
5196 NumAliases = llvm::array_lengthof(GCCRegAliases);
5197}
5198
5199
5200const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5201#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5202#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5203 ALL_LANGUAGES },
5204#include "clang/Basic/BuiltinsHexagon.def"
5205};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005206
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005207// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5208class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005209 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5210 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005211 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005212public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005213 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005214
Craig Topper3164f332014-03-11 03:39:26 +00005215 bool handleTargetFeatures(std::vector<std::string> &Features,
5216 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005217 SoftFloat = false;
5218 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5219 if (Features[i] == "+soft-float")
5220 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005221 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005222 }
Craig Topper3164f332014-03-11 03:39:26 +00005223 void getTargetDefines(const LangOptions &Opts,
5224 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005225 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005226 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005227
5228 if (SoftFloat)
5229 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005230 }
Craig Topper3164f332014-03-11 03:39:26 +00005231
5232 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005233 return llvm::StringSwitch<bool>(Feature)
5234 .Case("softfloat", SoftFloat)
5235 .Case("sparc", true)
5236 .Default(false);
5237 }
Craig Topper3164f332014-03-11 03:39:26 +00005238
5239 void getTargetBuiltins(const Builtin::Info *&Records,
5240 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005241 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005242 }
Craig Topper3164f332014-03-11 03:39:26 +00005243 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005244 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005245 }
Craig Topper3164f332014-03-11 03:39:26 +00005246 void getGCCRegNames(const char * const *&Names,
5247 unsigned &NumNames) const override;
5248 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5249 unsigned &NumAliases) const override;
5250 bool validateAsmConstraint(const char *&Name,
5251 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005252 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005253 switch (*Name) {
5254 case 'I': // Signed 13-bit constant
5255 case 'J': // Zero
5256 case 'K': // 32-bit constant with the low 12 bits clear
5257 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5258 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5259 case 'N': // Same as 'K' but zext (required for SIMode)
5260 case 'O': // The constant 4096
5261 return true;
5262 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005263 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005264 }
Craig Topper3164f332014-03-11 03:39:26 +00005265 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005266 // FIXME: Implement!
5267 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005268 }
5269};
5270
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005271const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005272 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5273 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5274 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5275 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5276};
5277
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005278void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5279 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005280 Names = GCCRegNames;
5281 NumNames = llvm::array_lengthof(GCCRegNames);
5282}
5283
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005284const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005285 { { "g0" }, "r0" },
5286 { { "g1" }, "r1" },
5287 { { "g2" }, "r2" },
5288 { { "g3" }, "r3" },
5289 { { "g4" }, "r4" },
5290 { { "g5" }, "r5" },
5291 { { "g6" }, "r6" },
5292 { { "g7" }, "r7" },
5293 { { "o0" }, "r8" },
5294 { { "o1" }, "r9" },
5295 { { "o2" }, "r10" },
5296 { { "o3" }, "r11" },
5297 { { "o4" }, "r12" },
5298 { { "o5" }, "r13" },
5299 { { "o6", "sp" }, "r14" },
5300 { { "o7" }, "r15" },
5301 { { "l0" }, "r16" },
5302 { { "l1" }, "r17" },
5303 { { "l2" }, "r18" },
5304 { { "l3" }, "r19" },
5305 { { "l4" }, "r20" },
5306 { { "l5" }, "r21" },
5307 { { "l6" }, "r22" },
5308 { { "l7" }, "r23" },
5309 { { "i0" }, "r24" },
5310 { { "i1" }, "r25" },
5311 { { "i2" }, "r26" },
5312 { { "i3" }, "r27" },
5313 { { "i4" }, "r28" },
5314 { { "i5" }, "r29" },
5315 { { "i6", "fp" }, "r30" },
5316 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005317};
5318
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005319void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5320 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005321 Aliases = GCCRegAliases;
5322 NumAliases = llvm::array_lengthof(GCCRegAliases);
5323}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005324
5325// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5326class SparcV8TargetInfo : public SparcTargetInfo {
5327public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005328 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005329 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005330 }
5331
Craig Topper3164f332014-03-11 03:39:26 +00005332 void getTargetDefines(const LangOptions &Opts,
5333 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005334 SparcTargetInfo::getTargetDefines(Opts, Builder);
5335 Builder.defineMacro("__sparcv8");
5336 }
5337};
5338
5339// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5340class SparcV9TargetInfo : public SparcTargetInfo {
5341public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005342 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005343 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005344 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005345 // This is an LP64 platform.
5346 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005347
5348 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005349 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005350 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005351 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005352 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005353 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005354
5355 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5356 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5357 LongDoubleWidth = 128;
5358 LongDoubleAlign = 128;
5359 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005360 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005361 }
5362
Craig Topper3164f332014-03-11 03:39:26 +00005363 void getTargetDefines(const LangOptions &Opts,
5364 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005365 SparcTargetInfo::getTargetDefines(Opts, Builder);
5366 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005367 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005368 // Solaris doesn't need these variants, but the BSDs do.
5369 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005370 Builder.defineMacro("__sparc64__");
5371 Builder.defineMacro("__sparc_v9__");
5372 Builder.defineMacro("__sparcv9__");
5373 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005374 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005375
Craig Topper3164f332014-03-11 03:39:26 +00005376 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005377 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5378 .Case("v9", true)
5379 .Case("ultrasparc", true)
5380 .Case("ultrasparc3", true)
5381 .Case("niagara", true)
5382 .Case("niagara2", true)
5383 .Case("niagara3", true)
5384 .Case("niagara4", true)
5385 .Default(false);
5386
5387 // No need to store the CPU yet. There aren't any CPU-specific
5388 // macros to define.
5389 return CPUKnown;
5390 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005391};
5392
Torok Edwinb2b37c62009-06-30 17:10:35 +00005393class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005394public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005395 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5396 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005397 SizeType = UnsignedInt;
5398 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005399 }
5400};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005401
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005402class SystemZTargetInfo : public TargetInfo {
5403 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005404
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005405public:
5406 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005407 IntMaxType = SignedLong;
5408 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005409 TLSSupported = true;
5410 IntWidth = IntAlign = 32;
5411 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5412 PointerWidth = PointerAlign = 64;
5413 LongDoubleWidth = 128;
5414 LongDoubleAlign = 64;
5415 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5416 MinGlobalAlign = 16;
5417 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5418 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5419 }
5420 void getTargetDefines(const LangOptions &Opts,
5421 MacroBuilder &Builder) const override {
5422 Builder.defineMacro("__s390__");
5423 Builder.defineMacro("__s390x__");
5424 Builder.defineMacro("__zarch__");
5425 Builder.defineMacro("__LONG_DOUBLE_128__");
5426 }
5427 void getTargetBuiltins(const Builtin::Info *&Records,
5428 unsigned &NumRecords) const override {
5429 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005430 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005431 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005432 }
5433
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005434 void getGCCRegNames(const char *const *&Names,
5435 unsigned &NumNames) const override;
5436 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5437 unsigned &NumAliases) const override {
5438 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005439 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005440 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005441 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005442 bool validateAsmConstraint(const char *&Name,
5443 TargetInfo::ConstraintInfo &info) const override;
5444 const char *getClobbers() const override {
5445 // FIXME: Is this really right?
5446 return "";
5447 }
5448 BuiltinVaListKind getBuiltinVaListKind() const override {
5449 return TargetInfo::SystemZBuiltinVaList;
5450 }
5451 bool setCPU(const std::string &Name) override {
5452 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5453 .Case("z10", true)
5454 .Case("z196", true)
5455 .Case("zEC12", true)
5456 .Default(false);
5457
5458 // No need to store the CPU yet. There aren't any CPU-specific
5459 // macros to define.
5460 return CPUKnown;
5461 }
5462};
5463
5464const char *const SystemZTargetInfo::GCCRegNames[] = {
5465 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5466 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5467 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5468 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5469};
5470
5471void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5472 unsigned &NumNames) const {
5473 Names = GCCRegNames;
5474 NumNames = llvm::array_lengthof(GCCRegNames);
5475}
5476
5477bool SystemZTargetInfo::
5478validateAsmConstraint(const char *&Name,
5479 TargetInfo::ConstraintInfo &Info) const {
5480 switch (*Name) {
5481 default:
5482 return false;
5483
5484 case 'a': // Address register
5485 case 'd': // Data register (equivalent to 'r')
5486 case 'f': // Floating-point register
5487 Info.setAllowsRegister();
5488 return true;
5489
5490 case 'I': // Unsigned 8-bit constant
5491 case 'J': // Unsigned 12-bit constant
5492 case 'K': // Signed 16-bit constant
5493 case 'L': // Signed 20-bit displacement (on all targets we support)
5494 case 'M': // 0x7fffffff
5495 return true;
5496
5497 case 'Q': // Memory with base and unsigned 12-bit displacement
5498 case 'R': // Likewise, plus an index
5499 case 'S': // Memory with base and signed 20-bit displacement
5500 case 'T': // Likewise, plus an index
5501 Info.setAllowsMemory();
5502 return true;
5503 }
5504}
Ulrich Weigand47445072013-05-06 16:26:41 +00005505
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005506 class MSP430TargetInfo : public TargetInfo {
5507 static const char * const GCCRegNames[];
5508 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005509 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005510 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005511 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005512 IntWidth = 16; IntAlign = 16;
5513 LongWidth = 32; LongLongWidth = 64;
5514 LongAlign = LongLongAlign = 16;
5515 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005516 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005517 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005518 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005519 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005520 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005521 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005522 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005523 }
5524 void getTargetDefines(const LangOptions &Opts,
5525 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005526 Builder.defineMacro("MSP430");
5527 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005528 // FIXME: defines for different 'flavours' of MCU
5529 }
Craig Topper3164f332014-03-11 03:39:26 +00005530 void getTargetBuiltins(const Builtin::Info *&Records,
5531 unsigned &NumRecords) const override {
5532 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005533 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005534 NumRecords = 0;
5535 }
Craig Topper3164f332014-03-11 03:39:26 +00005536 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005537 return Feature == "msp430";
5538 }
Craig Topper3164f332014-03-11 03:39:26 +00005539 void getGCCRegNames(const char * const *&Names,
5540 unsigned &NumNames) const override;
5541 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5542 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005543 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005544 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005545 NumAliases = 0;
5546 }
Eric Christopher917e9522014-11-18 22:36:15 +00005547 bool
5548 validateAsmConstraint(const char *&Name,
5549 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005550 // FIXME: implement
5551 switch (*Name) {
5552 case 'K': // the constant 1
5553 case 'L': // constant -1^20 .. 1^19
5554 case 'M': // constant 1-4:
5555 return true;
5556 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005557 // No target constraints for now.
5558 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005559 }
Craig Topper3164f332014-03-11 03:39:26 +00005560 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005561 // FIXME: Is this really right?
5562 return "";
5563 }
Craig Topper3164f332014-03-11 03:39:26 +00005564 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005565 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005566 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005567 }
5568 };
5569
5570 const char * const MSP430TargetInfo::GCCRegNames[] = {
5571 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5572 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5573 };
5574
5575 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5576 unsigned &NumNames) const {
5577 Names = GCCRegNames;
5578 NumNames = llvm::array_lengthof(GCCRegNames);
5579 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005580
Mike Stump11289f42009-09-09 15:08:12 +00005581 // LLVM and Clang cannot be used directly to output native binaries for
5582 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005583 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005584 //
5585 // TCE uses the llvm bitcode as input and uses it for generating customized
5586 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005587 // publicly available in http://tce.cs.tut.fi
5588
Eli Friedman1f191002011-10-07 19:51:42 +00005589 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5590 3, // opencl_global
5591 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005592 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005593 // FIXME: generic has to be added to the target
5594 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005595 0, // cuda_device
5596 0, // cuda_constant
5597 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005598 };
5599
Eli Friedmana9c3d712009-08-19 20:47:07 +00005600 class TCETargetInfo : public TargetInfo{
5601 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005602 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005603 TLSSupported = false;
5604 IntWidth = 32;
5605 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005606 PointerWidth = 32;
5607 IntAlign = 32;
5608 LongAlign = LongLongAlign = 32;
5609 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005610 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005611 SizeType = UnsignedInt;
5612 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005613 IntPtrType = SignedInt;
5614 PtrDiffType = SignedInt;
5615 FloatWidth = 32;
5616 FloatAlign = 32;
5617 DoubleWidth = 32;
5618 DoubleAlign = 32;
5619 LongDoubleWidth = 32;
5620 LongDoubleAlign = 32;
5621 FloatFormat = &llvm::APFloat::IEEEsingle;
5622 DoubleFormat = &llvm::APFloat::IEEEsingle;
5623 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005624 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5625 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005626 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005627 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005628 }
5629
Craig Topper3164f332014-03-11 03:39:26 +00005630 void getTargetDefines(const LangOptions &Opts,
5631 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005632 DefineStd(Builder, "tce", Opts);
5633 Builder.defineMacro("__TCE__");
5634 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005635 }
Craig Topper3164f332014-03-11 03:39:26 +00005636 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005637 return Feature == "tce";
5638 }
Craig Topper3164f332014-03-11 03:39:26 +00005639
5640 void getTargetBuiltins(const Builtin::Info *&Records,
5641 unsigned &NumRecords) const override {}
5642 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005643 return "";
5644 }
Craig Topper3164f332014-03-11 03:39:26 +00005645 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005646 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005647 }
Craig Topper3164f332014-03-11 03:39:26 +00005648 void getGCCRegNames(const char * const *&Names,
5649 unsigned &NumNames) const override {}
5650 bool validateAsmConstraint(const char *&Name,
5651 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005652 return true;
5653 }
Craig Topper3164f332014-03-11 03:39:26 +00005654 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5655 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005656 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005657
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005658class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005659 virtual void setDescriptionString() = 0;
5660
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005661 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005662 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005663 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005664 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005665 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005666 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005667 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005668 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005669 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005670 enum DspRevEnum {
5671 NoDSP, DSP1, DSP2
5672 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005673 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005674
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005675protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005676 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005677 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005678
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005679public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005680 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5681 const std::string &CPUStr)
5682 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005683 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005684 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5685 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5686 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005687
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005688 bool isNaN2008Default() const {
5689 return CPU == "mips32r6" || CPU == "mips64r6";
5690 }
5691
5692 bool isFP64Default() const {
5693 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5694 }
5695
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005696 bool isNan2008() const override {
5697 return IsNan2008;
5698 }
5699
Alp Toker4925ba72014-06-07 23:30:42 +00005700 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005701 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005702 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5703 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005704 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005705 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005706 .Case("mips1", IsMips32)
5707 .Case("mips2", IsMips32)
5708 .Case("mips3", true)
5709 .Case("mips4", true)
5710 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005711 .Case("mips32", IsMips32)
5712 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005713 .Case("mips32r3", IsMips32)
5714 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005715 .Case("mips32r6", IsMips32)
5716 .Case("mips64", true)
5717 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005718 .Case("mips64r3", true)
5719 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005720 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005721 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005722 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005723 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005724 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005725 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005726 if (CPU == "octeon")
5727 Features["mips64r2"] = Features["cnmips"] = true;
5728 else
5729 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005730 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005731
Craig Topper3164f332014-03-11 03:39:26 +00005732 void getTargetDefines(const LangOptions &Opts,
5733 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005734 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005735 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005736 if (Opts.GNUMode)
5737 Builder.defineMacro("mips");
5738
Simon Atanasyan683535b2012-08-29 19:14:58 +00005739 Builder.defineMacro("__REGISTER_PREFIX__", "");
5740
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005741 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005742 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005743 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005744 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005745 case SoftFloat:
5746 Builder.defineMacro("__mips_soft_float", Twine(1));
5747 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005748 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005749
Simon Atanasyan16071912013-04-14 14:07:30 +00005750 if (IsSingleFloat)
5751 Builder.defineMacro("__mips_single_float", Twine(1));
5752
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005753 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5754 Builder.defineMacro("_MIPS_FPSET",
5755 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5756
Simon Atanasyan72244b62012-07-05 16:06:06 +00005757 if (IsMips16)
5758 Builder.defineMacro("__mips16", Twine(1));
5759
Simon Atanasyan60777612013-04-14 14:07:51 +00005760 if (IsMicromips)
5761 Builder.defineMacro("__mips_micromips", Twine(1));
5762
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005763 if (IsNan2008)
5764 Builder.defineMacro("__mips_nan2008", Twine(1));
5765
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005766 switch (DspRev) {
5767 default:
5768 break;
5769 case DSP1:
5770 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5771 Builder.defineMacro("__mips_dsp", Twine(1));
5772 break;
5773 case DSP2:
5774 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5775 Builder.defineMacro("__mips_dspr2", Twine(1));
5776 Builder.defineMacro("__mips_dsp", Twine(1));
5777 break;
5778 }
5779
Jack Carter44ff1e52013-08-12 17:20:29 +00005780 if (HasMSA)
5781 Builder.defineMacro("__mips_msa", Twine(1));
5782
Simon Atanasyan26f19672012-04-05 19:28:31 +00005783 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5784 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5785 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005786
5787 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5788 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005789 }
5790
Craig Topper3164f332014-03-11 03:39:26 +00005791 void getTargetBuiltins(const Builtin::Info *&Records,
5792 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005793 Records = BuiltinInfo;
5794 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005795 }
Craig Topper3164f332014-03-11 03:39:26 +00005796 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005797 return llvm::StringSwitch<bool>(Feature)
5798 .Case("mips", true)
5799 .Case("fp64", HasFP64)
5800 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005801 }
Craig Topper3164f332014-03-11 03:39:26 +00005802 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005803 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005804 }
Craig Topper3164f332014-03-11 03:39:26 +00005805 void getGCCRegNames(const char * const *&Names,
5806 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005807 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005808 // CPU register names
5809 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005810 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5811 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5812 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005813 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5814 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005815 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5816 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5817 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5818 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005819 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005820 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005821 "$fcc5","$fcc6","$fcc7",
5822 // MSA register names
5823 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5824 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5825 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5826 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5827 // MSA control register names
5828 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5829 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005830 };
5831 Names = GCCRegNames;
5832 NumNames = llvm::array_lengthof(GCCRegNames);
5833 }
Craig Topper3164f332014-03-11 03:39:26 +00005834 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5835 unsigned &NumAliases) const override = 0;
5836 bool validateAsmConstraint(const char *&Name,
5837 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005838 switch (*Name) {
5839 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005840 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005841 case 'r': // CPU registers.
5842 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005843 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005844 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005845 case 'c': // $25 for indirect jumps
5846 case 'l': // lo register
5847 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005848 Info.setAllowsRegister();
5849 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005850 case 'I': // Signed 16-bit constant
5851 case 'J': // Integer 0
5852 case 'K': // Unsigned 16-bit constant
5853 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5854 case 'M': // Constants not loadable via lui, addiu, or ori
5855 case 'N': // Constant -1 to -65535
5856 case 'O': // A signed 15-bit constant
5857 case 'P': // A constant between 1 go 65535
5858 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005859 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005860 Info.setAllowsMemory();
5861 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00005862 case 'Z':
5863 if (Name[1] == 'C') { // An address usable by ll, and sc.
5864 Info.setAllowsMemory();
5865 Name++; // Skip over 'Z'.
5866 return true;
5867 }
5868 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005869 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005870 }
5871
Daniel Sanders48fa39e2015-03-30 13:47:23 +00005872 std::string convertConstraint(const char *&Constraint) const override {
5873 std::string R;
5874 switch (*Constraint) {
5875 case 'Z': // Two-character constraint; add "^" hint for later parsing.
5876 if (Constraint[1] == 'C') {
5877 R = std::string("^") + std::string(Constraint, 2);
5878 Constraint++;
5879 return R;
5880 }
5881 break;
5882 }
5883 return TargetInfo::convertConstraint(Constraint);
5884 }
5885
Craig Topper3164f332014-03-11 03:39:26 +00005886 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005887 // In GCC, $1 is not widely used in generated code (it's used only in a few
5888 // specific situations), so there is no real need for users to add it to
5889 // the clobbers list if they want to use it in their inline assembly code.
5890 //
5891 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5892 // code generation, so using it in inline assembly without adding it to the
5893 // clobbers list can cause conflicts between the inline assembly code and
5894 // the surrounding generated code.
5895 //
5896 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5897 // operands, which will conflict with the ".set at" assembler option (which
5898 // we use only for inline assembly, in order to maintain compatibility with
5899 // GCC) and will also conflict with the user's usage of $1.
5900 //
5901 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5902 // register for generated code is to automatically clobber $1 for all inline
5903 // assembly code.
5904 //
5905 // FIXME: We should automatically clobber $1 only for inline assembly code
5906 // which actually uses it. This would allow LLVM to use $1 for inline
5907 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005908 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005909 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005910
Craig Topper3164f332014-03-11 03:39:26 +00005911 bool handleTargetFeatures(std::vector<std::string> &Features,
5912 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005913 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005914 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005915 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005916 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005917 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005918 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005919 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005920
5921 for (std::vector<std::string>::iterator it = Features.begin(),
5922 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005923 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005924 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005925 else if (*it == "+soft-float")
5926 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005927 else if (*it == "+mips16")
5928 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005929 else if (*it == "+micromips")
5930 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005931 else if (*it == "+dsp")
5932 DspRev = std::max(DspRev, DSP1);
5933 else if (*it == "+dspr2")
5934 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005935 else if (*it == "+msa")
5936 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005937 else if (*it == "+fp64")
5938 HasFP64 = true;
5939 else if (*it == "-fp64")
5940 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005941 else if (*it == "+nan2008")
5942 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005943 else if (*it == "-nan2008")
5944 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005945 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005946
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005947 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005948 std::vector<std::string>::iterator it =
5949 std::find(Features.begin(), Features.end(), "+soft-float");
5950 if (it != Features.end())
5951 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005952
Akira Hatanaka9064e362013-10-29 18:30:33 +00005953 setDescriptionString();
5954
Rafael Espindolaeb265472013-08-21 21:59:03 +00005955 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005956 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005957
Craig Topper3164f332014-03-11 03:39:26 +00005958 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005959 if (RegNo == 0) return 4;
5960 if (RegNo == 1) return 5;
5961 return -1;
5962 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005963
5964 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005965};
5966
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005967const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5968#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5969#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5970 ALL_LANGUAGES },
5971#include "clang/Basic/BuiltinsMips.def"
5972};
5973
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005974class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005975public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005976 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005977 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005978 SizeType = UnsignedInt;
5979 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00005980 Int64Type = SignedLongLong;
5981 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005982 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005983 }
Craig Topper3164f332014-03-11 03:39:26 +00005984 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005985 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005986 ABI = Name;
5987 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005988 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005989 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005990 }
Craig Topper3164f332014-03-11 03:39:26 +00005991 void getTargetDefines(const LangOptions &Opts,
5992 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005993 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005994
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005995 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005996 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5997
5998 const std::string& CPUStr = getCPU();
5999 if (CPUStr == "mips32")
6000 Builder.defineMacro("__mips_isa_rev", "1");
6001 else if (CPUStr == "mips32r2")
6002 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006003 else if (CPUStr == "mips32r3")
6004 Builder.defineMacro("__mips_isa_rev", "3");
6005 else if (CPUStr == "mips32r5")
6006 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006007 else if (CPUStr == "mips32r6")
6008 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006009
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006010 if (ABI == "o32") {
6011 Builder.defineMacro("__mips_o32");
6012 Builder.defineMacro("_ABIO32", "1");
6013 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6014 }
6015 else if (ABI == "eabi")
6016 Builder.defineMacro("__mips_eabi");
6017 else
David Blaikie83d382b2011-09-23 05:06:16 +00006018 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006019 }
Craig Topper3164f332014-03-11 03:39:26 +00006020 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6021 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006022 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6023 { { "at" }, "$1" },
6024 { { "v0" }, "$2" },
6025 { { "v1" }, "$3" },
6026 { { "a0" }, "$4" },
6027 { { "a1" }, "$5" },
6028 { { "a2" }, "$6" },
6029 { { "a3" }, "$7" },
6030 { { "t0" }, "$8" },
6031 { { "t1" }, "$9" },
6032 { { "t2" }, "$10" },
6033 { { "t3" }, "$11" },
6034 { { "t4" }, "$12" },
6035 { { "t5" }, "$13" },
6036 { { "t6" }, "$14" },
6037 { { "t7" }, "$15" },
6038 { { "s0" }, "$16" },
6039 { { "s1" }, "$17" },
6040 { { "s2" }, "$18" },
6041 { { "s3" }, "$19" },
6042 { { "s4" }, "$20" },
6043 { { "s5" }, "$21" },
6044 { { "s6" }, "$22" },
6045 { { "s7" }, "$23" },
6046 { { "t8" }, "$24" },
6047 { { "t9" }, "$25" },
6048 { { "k0" }, "$26" },
6049 { { "k1" }, "$27" },
6050 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006051 { { "sp","$sp" }, "$29" },
6052 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006053 { { "ra" }, "$31" }
6054 };
6055 Aliases = GCCRegAliases;
6056 NumAliases = llvm::array_lengthof(GCCRegAliases);
6057 }
6058};
6059
6060class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006061 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006062 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006063 }
6064
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006065public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006066 Mips32EBTargetInfo(const llvm::Triple &Triple)
6067 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006068 }
Craig Topper3164f332014-03-11 03:39:26 +00006069 void getTargetDefines(const LangOptions &Opts,
6070 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006071 DefineStd(Builder, "MIPSEB", Opts);
6072 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006073 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006074 }
6075};
6076
6077class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006078 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006079 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006080 }
6081
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006082public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006083 Mips32ELTargetInfo(const llvm::Triple &Triple)
6084 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006085 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006086 }
Craig Topper3164f332014-03-11 03:39:26 +00006087 void getTargetDefines(const LangOptions &Opts,
6088 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006089 DefineStd(Builder, "MIPSEL", Opts);
6090 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006091 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006092 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006093};
Akira Hatanakabef17452011-09-20 19:21:49 +00006094
6095class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006096public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006097 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006098 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006099 LongDoubleWidth = LongDoubleAlign = 128;
6100 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006101 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6102 LongDoubleWidth = LongDoubleAlign = 64;
6103 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6104 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006105 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006106 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006107 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006108 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006109
6110 void setN64ABITypes() {
6111 LongWidth = LongAlign = 64;
6112 PointerWidth = PointerAlign = 64;
6113 SizeType = UnsignedLong;
6114 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006115 Int64Type = SignedLong;
6116 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006117 }
6118
6119 void setN32ABITypes() {
6120 LongWidth = LongAlign = 32;
6121 PointerWidth = PointerAlign = 32;
6122 SizeType = UnsignedInt;
6123 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006124 Int64Type = SignedLongLong;
6125 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006126 }
6127
Craig Topper3164f332014-03-11 03:39:26 +00006128 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006129 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006130 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006131 ABI = Name;
6132 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006133 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006134 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006135 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006136 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006137 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006138 }
6139 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006140 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006141
Craig Topper3164f332014-03-11 03:39:26 +00006142 void getTargetDefines(const LangOptions &Opts,
6143 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006144 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006145
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006146 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006147 Builder.defineMacro("__mips64");
6148 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006149 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6150
6151 const std::string& CPUStr = getCPU();
6152 if (CPUStr == "mips64")
6153 Builder.defineMacro("__mips_isa_rev", "1");
6154 else if (CPUStr == "mips64r2")
6155 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006156 else if (CPUStr == "mips64r3")
6157 Builder.defineMacro("__mips_isa_rev", "3");
6158 else if (CPUStr == "mips64r5")
6159 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006160 else if (CPUStr == "mips64r6")
6161 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006162
Akira Hatanakabef17452011-09-20 19:21:49 +00006163 if (ABI == "n32") {
6164 Builder.defineMacro("__mips_n32");
6165 Builder.defineMacro("_ABIN32", "2");
6166 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6167 }
6168 else if (ABI == "n64") {
6169 Builder.defineMacro("__mips_n64");
6170 Builder.defineMacro("_ABI64", "3");
6171 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6172 }
6173 else
David Blaikie83d382b2011-09-23 05:06:16 +00006174 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006175 }
Craig Topper3164f332014-03-11 03:39:26 +00006176 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6177 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006178 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6179 { { "at" }, "$1" },
6180 { { "v0" }, "$2" },
6181 { { "v1" }, "$3" },
6182 { { "a0" }, "$4" },
6183 { { "a1" }, "$5" },
6184 { { "a2" }, "$6" },
6185 { { "a3" }, "$7" },
6186 { { "a4" }, "$8" },
6187 { { "a5" }, "$9" },
6188 { { "a6" }, "$10" },
6189 { { "a7" }, "$11" },
6190 { { "t0" }, "$12" },
6191 { { "t1" }, "$13" },
6192 { { "t2" }, "$14" },
6193 { { "t3" }, "$15" },
6194 { { "s0" }, "$16" },
6195 { { "s1" }, "$17" },
6196 { { "s2" }, "$18" },
6197 { { "s3" }, "$19" },
6198 { { "s4" }, "$20" },
6199 { { "s5" }, "$21" },
6200 { { "s6" }, "$22" },
6201 { { "s7" }, "$23" },
6202 { { "t8" }, "$24" },
6203 { { "t9" }, "$25" },
6204 { { "k0" }, "$26" },
6205 { { "k1" }, "$27" },
6206 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006207 { { "sp","$sp" }, "$29" },
6208 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006209 { { "ra" }, "$31" }
6210 };
6211 Aliases = GCCRegAliases;
6212 NumAliases = llvm::array_lengthof(GCCRegAliases);
6213 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006214
6215 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006216};
6217
6218class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006219 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006220 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006221 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 +00006222 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006223 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006224
Akira Hatanakabef17452011-09-20 19:21:49 +00006225 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006226
Akira Hatanakabef17452011-09-20 19:21:49 +00006227public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006228 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006229 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006230 void getTargetDefines(const LangOptions &Opts,
6231 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006232 DefineStd(Builder, "MIPSEB", Opts);
6233 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006234 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006235 }
6236};
6237
6238class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006239 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006240 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006241 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 +00006242 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006243 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006244 }
6245public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006246 Mips64ELTargetInfo(const llvm::Triple &Triple)
6247 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006248 // Default ABI is n64.
6249 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006250 }
Craig Topper3164f332014-03-11 03:39:26 +00006251 void getTargetDefines(const LangOptions &Opts,
6252 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006253 DefineStd(Builder, "MIPSEL", Opts);
6254 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006255 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006256 }
6257};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006258
Ivan Krasindd7403e2011-08-24 20:22:22 +00006259class PNaClTargetInfo : public TargetInfo {
6260public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006261 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006262 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006263 this->UserLabelPrefix = "";
6264 this->LongAlign = 32;
6265 this->LongWidth = 32;
6266 this->PointerAlign = 32;
6267 this->PointerWidth = 32;
6268 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006269 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006270 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006271 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006272 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006273 this->SizeType = TargetInfo::UnsignedInt;
6274 this->PtrDiffType = TargetInfo::SignedInt;
6275 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006276 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006277 }
6278
Craig Topper3164f332014-03-11 03:39:26 +00006279 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006280 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006281 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006282 Builder.defineMacro("__le32__");
6283 Builder.defineMacro("__pnacl__");
6284 }
Craig Topper3164f332014-03-11 03:39:26 +00006285 void getTargetDefines(const LangOptions &Opts,
6286 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006287 getArchDefines(Opts, Builder);
6288 }
Craig Topper3164f332014-03-11 03:39:26 +00006289 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006290 return Feature == "pnacl";
6291 }
Craig Topper3164f332014-03-11 03:39:26 +00006292 void getTargetBuiltins(const Builtin::Info *&Records,
6293 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006294 }
Craig Topper3164f332014-03-11 03:39:26 +00006295 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006296 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006297 }
Craig Topper3164f332014-03-11 03:39:26 +00006298 void getGCCRegNames(const char * const *&Names,
6299 unsigned &NumNames) const override;
6300 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6301 unsigned &NumAliases) const override;
6302 bool validateAsmConstraint(const char *&Name,
6303 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006304 return false;
6305 }
6306
Craig Topper3164f332014-03-11 03:39:26 +00006307 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006308 return "";
6309 }
6310};
6311
6312void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6313 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006314 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006315 NumNames = 0;
6316}
6317
6318void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6319 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006320 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006321 NumAliases = 0;
6322}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006323
JF Bastien643817d2014-09-12 17:52:47 +00006324class Le64TargetInfo : public TargetInfo {
6325 static const Builtin::Info BuiltinInfo[];
6326
6327public:
6328 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6329 BigEndian = false;
6330 NoAsmVariants = true;
6331 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6332 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6333 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006334 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006335 }
6336
6337 void getTargetDefines(const LangOptions &Opts,
6338 MacroBuilder &Builder) const override {
6339 DefineStd(Builder, "unix", Opts);
6340 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6341 Builder.defineMacro("__ELF__");
6342 }
6343 void getTargetBuiltins(const Builtin::Info *&Records,
6344 unsigned &NumRecords) const override {
6345 Records = BuiltinInfo;
6346 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6347 }
6348 BuiltinVaListKind getBuiltinVaListKind() const override {
6349 return TargetInfo::PNaClABIBuiltinVaList;
6350 }
6351 const char *getClobbers() const override { return ""; }
6352 void getGCCRegNames(const char *const *&Names,
6353 unsigned &NumNames) const override {
6354 Names = nullptr;
6355 NumNames = 0;
6356 }
6357 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6358 unsigned &NumAliases) const override {
6359 Aliases = nullptr;
6360 NumAliases = 0;
6361 }
6362 bool validateAsmConstraint(const char *&Name,
6363 TargetInfo::ConstraintInfo &Info) const override {
6364 return false;
6365 }
6366
6367 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006368};
6369} // end anonymous namespace.
6370
6371const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6372#define BUILTIN(ID, TYPE, ATTRS) \
6373 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6374#include "clang/Basic/BuiltinsLe64.def"
6375};
6376
6377namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006378 static const unsigned SPIRAddrSpaceMap[] = {
6379 1, // opencl_global
6380 3, // opencl_local
6381 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006382 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006383 0, // cuda_device
6384 0, // cuda_constant
6385 0 // cuda_shared
6386 };
6387 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006388 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006389 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006390 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6391 "SPIR target must use unknown OS");
6392 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6393 "SPIR target must use unknown environment type");
6394 BigEndian = false;
6395 TLSSupported = false;
6396 LongWidth = LongAlign = 64;
6397 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006398 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006399 // Define available target features
6400 // These must be defined in sorted order!
6401 NoAsmVariants = true;
6402 }
Craig Topper3164f332014-03-11 03:39:26 +00006403 void getTargetDefines(const LangOptions &Opts,
6404 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006405 DefineStd(Builder, "SPIR", Opts);
6406 }
Craig Topper3164f332014-03-11 03:39:26 +00006407 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006408 return Feature == "spir";
6409 }
Craig Topper3164f332014-03-11 03:39:26 +00006410
6411 void getTargetBuiltins(const Builtin::Info *&Records,
6412 unsigned &NumRecords) const override {}
6413 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006414 return "";
6415 }
Craig Topper3164f332014-03-11 03:39:26 +00006416 void getGCCRegNames(const char * const *&Names,
6417 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006418 bool
6419 validateAsmConstraint(const char *&Name,
6420 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006421 return true;
6422 }
Craig Topper3164f332014-03-11 03:39:26 +00006423 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6424 unsigned &NumAliases) const override {}
6425 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006426 return TargetInfo::VoidPtrBuiltinVaList;
6427 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006428
6429 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6430 return (CC == CC_SpirFunction ||
6431 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6432 }
6433
6434 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6435 return CC_SpirFunction;
6436 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006437 };
6438
6439
6440 class SPIR32TargetInfo : public SPIRTargetInfo {
6441 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006442 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006443 PointerWidth = PointerAlign = 32;
6444 SizeType = TargetInfo::UnsignedInt;
6445 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6446 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006447 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6448 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006449 }
Craig Topper3164f332014-03-11 03:39:26 +00006450 void getTargetDefines(const LangOptions &Opts,
6451 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006452 DefineStd(Builder, "SPIR32", Opts);
6453 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006454 };
6455
6456 class SPIR64TargetInfo : public SPIRTargetInfo {
6457 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006458 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006459 PointerWidth = PointerAlign = 64;
6460 SizeType = TargetInfo::UnsignedLong;
6461 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006462 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6463 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006464 }
Craig Topper3164f332014-03-11 03:39:26 +00006465 void getTargetDefines(const LangOptions &Opts,
6466 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006467 DefineStd(Builder, "SPIR64", Opts);
6468 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006469 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006470
Robert Lytton0e076492013-08-13 09:43:10 +00006471class XCoreTargetInfo : public TargetInfo {
6472 static const Builtin::Info BuiltinInfo[];
6473public:
6474 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6475 BigEndian = false;
6476 NoAsmVariants = true;
6477 LongLongAlign = 32;
6478 SuitableAlign = 32;
6479 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006480 SizeType = UnsignedInt;
6481 PtrDiffType = SignedInt;
6482 IntPtrType = SignedInt;
6483 WCharType = UnsignedChar;
6484 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006485 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006486 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 +00006487 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006488 }
Craig Topper3164f332014-03-11 03:39:26 +00006489 void getTargetDefines(const LangOptions &Opts,
6490 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006491 Builder.defineMacro("__XS1B__");
6492 }
Craig Topper3164f332014-03-11 03:39:26 +00006493 void getTargetBuiltins(const Builtin::Info *&Records,
6494 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006495 Records = BuiltinInfo;
6496 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6497 }
Craig Topper3164f332014-03-11 03:39:26 +00006498 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006499 return TargetInfo::VoidPtrBuiltinVaList;
6500 }
Craig Topper3164f332014-03-11 03:39:26 +00006501 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006502 return "";
6503 }
Craig Topper3164f332014-03-11 03:39:26 +00006504 void getGCCRegNames(const char * const *&Names,
6505 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006506 static const char * const GCCRegNames[] = {
6507 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6508 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6509 };
6510 Names = GCCRegNames;
6511 NumNames = llvm::array_lengthof(GCCRegNames);
6512 }
Craig Topper3164f332014-03-11 03:39:26 +00006513 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6514 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006515 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006516 NumAliases = 0;
6517 }
Craig Topper3164f332014-03-11 03:39:26 +00006518 bool validateAsmConstraint(const char *&Name,
6519 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006520 return false;
6521 }
Craig Topper3164f332014-03-11 03:39:26 +00006522 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006523 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6524 return (RegNo < 2)? RegNo : -1;
6525 }
Robert Lytton0e076492013-08-13 09:43:10 +00006526};
6527
6528const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6529#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6530#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6531 ALL_LANGUAGES },
6532#include "clang/Basic/BuiltinsXCore.def"
6533};
6534} // end anonymous namespace.
6535
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006536namespace {
6537// x86_32 Android target
6538class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6539public:
6540 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6541 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6542 SuitableAlign = 32;
6543 LongDoubleWidth = 64;
6544 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6545 }
6546};
6547} // end anonymous namespace
6548
6549namespace {
6550// x86_64 Android target
6551class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6552public:
6553 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6554 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6555 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6556 }
6557};
6558} // end anonymous namespace
6559
Ivan Krasindd7403e2011-08-24 20:22:22 +00006560
Chris Lattner5ba61f02006-10-14 07:39:34 +00006561//===----------------------------------------------------------------------===//
6562// Driver code
6563//===----------------------------------------------------------------------===//
6564
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006565static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006566 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006567
Daniel Dunbar52322032009-08-18 05:47:58 +00006568 switch (Triple.getArch()) {
6569 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006570 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006571
Tim Northover2a0783d2014-05-30 14:14:07 +00006572 case llvm::Triple::xcore:
6573 return new XCoreTargetInfo(Triple);
6574
6575 case llvm::Triple::hexagon:
6576 return new HexagonTargetInfo(Triple);
6577
6578 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006579 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006580 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006581
6582 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006583 case llvm::Triple::FreeBSD:
6584 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006585 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006586 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006587 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006588 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006589 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006590 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006591 }
6592
Christian Pirker9b019ae2014-02-25 13:51:00 +00006593 case llvm::Triple::aarch64_be:
6594 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006595 case llvm::Triple::FreeBSD:
6596 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006597 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006598 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006599 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006600 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006601 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006602 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006603 }
6604
Daniel Dunbar52322032009-08-18 05:47:58 +00006605 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006606 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006607 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006608 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006609
Daniel Dunbar52322032009-08-18 05:47:58 +00006610 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006611 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006612 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006613 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006614 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006615 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006616 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006617 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006618 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006619 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006620 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006621 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006622 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006623 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006624 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006625 case llvm::Triple::Win32:
6626 switch (Triple.getEnvironment()) {
6627 default:
6628 return new ARMleTargetInfo(Triple);
6629 case llvm::Triple::Itanium:
6630 return new ItaniumWindowsARMleTargetInfo(Triple);
6631 case llvm::Triple::MSVC:
6632 return new MicrosoftARMleTargetInfo(Triple);
6633 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006634 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006635 return new ARMleTargetInfo(Triple);
6636 }
6637
6638 case llvm::Triple::armeb:
6639 case llvm::Triple::thumbeb:
6640 if (Triple.isOSDarwin())
6641 return new DarwinARMTargetInfo(Triple);
6642
6643 switch (os) {
6644 case llvm::Triple::Linux:
6645 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6646 case llvm::Triple::FreeBSD:
6647 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6648 case llvm::Triple::NetBSD:
6649 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6650 case llvm::Triple::OpenBSD:
6651 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6652 case llvm::Triple::Bitrig:
6653 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6654 case llvm::Triple::RTEMS:
6655 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6656 case llvm::Triple::NaCl:
6657 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6658 default:
6659 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006660 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006661
Daniel Dunbar52322032009-08-18 05:47:58 +00006662 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006663 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006664
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006665 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006666 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006667 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006668 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006669 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006670 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006671 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006672 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006673 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006674 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006675 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006676 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006677 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006678
6679 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006680 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006681 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006682 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006683 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006684 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006685 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006686 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006687 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006688 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006689 case llvm::Triple::NaCl:
6690 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006691 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006692 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006693 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006694
Akira Hatanakabef17452011-09-20 19:21:49 +00006695 case llvm::Triple::mips64:
6696 switch (os) {
6697 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006698 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006699 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006700 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006701 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006702 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006703 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006704 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006705 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006706 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006707 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006708 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006709 }
6710
6711 case llvm::Triple::mips64el:
6712 switch (os) {
6713 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006714 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006715 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006716 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006717 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006718 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006719 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006720 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006721 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006722 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006723 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006724 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006725 }
6726
Ivan Krasindd7403e2011-08-24 20:22:22 +00006727 case llvm::Triple::le32:
6728 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006729 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006730 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006731 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006732 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006733 }
6734
JF Bastien643817d2014-09-12 17:52:47 +00006735 case llvm::Triple::le64:
6736 return new Le64TargetInfo(Triple);
6737
Daniel Dunbar52322032009-08-18 05:47:58 +00006738 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006739 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006740 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006741 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006742 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006743 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006744 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006745 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006746 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006747 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006748 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006749 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006750 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006751 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006752 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006753 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006754 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006755
6756 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006757 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006758 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006759 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006760 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006761 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006762 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006763 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006764 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006765 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006766 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006767 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006768 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006769 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006770 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006771
Bill Schmidt778d3872013-07-26 01:36:11 +00006772 case llvm::Triple::ppc64le:
6773 switch (os) {
6774 case llvm::Triple::Linux:
6775 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6776 default:
6777 return new PPC64TargetInfo(Triple);
6778 }
6779
Peter Collingbournec947aae2012-05-20 23:28:41 +00006780 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006781 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006782 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006783 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006784
Tom Stellardd8e38a32015-01-06 20:34:47 +00006785 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006786 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006787 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006788
Daniel Dunbar52322032009-08-18 05:47:58 +00006789 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006790 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006791 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006792 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006793 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006794 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006795 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006796 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006797 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006798 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006799 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006800 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006801 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006802 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006803 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006804
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006805 case llvm::Triple::sparcv9:
6806 switch (os) {
6807 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006808 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006809 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006810 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006811 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006812 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006813 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006814 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006815 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006816 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006817 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006818 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006819 }
6820
Ulrich Weigand47445072013-05-06 16:26:41 +00006821 case llvm::Triple::systemz:
6822 switch (os) {
6823 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006824 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006825 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006826 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006827 }
6828
Eli Friedmana9c3d712009-08-19 20:47:07 +00006829 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006830 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006831
Daniel Dunbar52322032009-08-18 05:47:58 +00006832 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006833 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006834 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006835
Daniel Dunbar52322032009-08-18 05:47:58 +00006836 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006837 case llvm::Triple::Linux: {
6838 switch (Triple.getEnvironment()) {
6839 default:
6840 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6841 case llvm::Triple::Android:
6842 return new AndroidX86_32TargetInfo(Triple);
6843 }
6844 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006845 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006846 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006847 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006848 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006849 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006850 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006851 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006852 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006853 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006854 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006855 case llvm::Triple::KFreeBSD:
6856 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006857 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006858 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006859 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006860 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006861 case llvm::Triple::Win32: {
6862 switch (Triple.getEnvironment()) {
6863 default:
6864 return new X86_32TargetInfo(Triple);
6865 case llvm::Triple::Cygnus:
6866 return new CygwinX86_32TargetInfo(Triple);
6867 case llvm::Triple::GNU:
6868 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006869 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006870 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006871 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006872 }
6873 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006874 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006875 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006876 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006877 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006878 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006879 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006880 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006881 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006882 }
6883
6884 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006885 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006886 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006887
Daniel Dunbar52322032009-08-18 05:47:58 +00006888 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00006889 case llvm::Triple::CloudABI:
6890 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006891 case llvm::Triple::Linux: {
6892 switch (Triple.getEnvironment()) {
6893 default:
6894 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
6895 case llvm::Triple::Android:
6896 return new AndroidX86_64TargetInfo(Triple);
6897 }
6898 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00006899 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006900 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006901 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006902 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006903 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006904 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006905 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006906 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006907 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006908 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006909 case llvm::Triple::KFreeBSD:
6910 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006911 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006912 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006913 case llvm::Triple::Win32: {
6914 switch (Triple.getEnvironment()) {
6915 default:
6916 return new X86_64TargetInfo(Triple);
6917 case llvm::Triple::GNU:
6918 return new MinGWX86_64TargetInfo(Triple);
6919 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006920 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006921 }
6922 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006923 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006924 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006925 case llvm::Triple::PS4:
6926 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006927 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006928 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006929 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006930
6931 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006932 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006933 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006934 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006935 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006936 }
6937 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006938 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006939 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006940 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006941 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006942 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006943 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006944}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006945
6946/// CreateTargetInfo - Return the target info object for the specified target
6947/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006948TargetInfo *
6949TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6950 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006951 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006952
6953 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006954 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006955 if (!Target) {
6956 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006957 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006958 }
Alp Toker80758082014-07-06 05:26:44 +00006959 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006960
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006961 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006962 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6963 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006964 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006965 }
6966
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006967 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006968 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6969 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006970 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006971 }
6972
Rafael Espindolaeb265472013-08-21 21:59:03 +00006973 // Set the fp math unit.
6974 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6975 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006976 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006977 }
6978
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006979 // Compute the default target features, we need the target to handle this
6980 // because features may have dependencies on one another.
6981 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006982 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006983
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006984 // Apply the user specified deltas.
6985 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6986 I < N; ++I) {
6987 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006988 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006989 bool Enabled = Name[0] == '+';
6990 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006991 }
6992
6993 // Add the features to the compile options.
6994 //
6995 // FIXME: If we are completely confident that we have the right set, we only
6996 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006997 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006998 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6999 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007000 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007001 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007002 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007003
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007004 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007005}