blob: b1a245e1b20d85e8a3a127fb8d65b1c1d878196f [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) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002583 // FIXME: This *really* should not be here. We need some way of translating
2584 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002585 if (Name == "sse4")
2586 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002587
Rafael Espindolae62e2792013-08-20 13:44:29 +00002588 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002589
Craig Topper29561122013-09-19 01:13:07 +00002590 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002591 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002592 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002593 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002594 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002595 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002596 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002597 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002598 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002599 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002600 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002601 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002602 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002603 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002604 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002605 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002606 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002607 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002608 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002609 if (Enabled)
2610 setSSELevel(Features, SSE2, Enabled);
2611 } else if (Name == "pclmul") {
2612 if (Enabled)
2613 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002614 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002615 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002616 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002617 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002618 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002619 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002620 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2621 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002622 if (Enabled)
2623 setSSELevel(Features, AVX512F, Enabled);
2624 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002625 if (Enabled)
2626 setSSELevel(Features, AVX, Enabled);
2627 } else if (Name == "fma4") {
2628 setXOPLevel(Features, FMA4, Enabled);
2629 } else if (Name == "xop") {
2630 setXOPLevel(Features, XOP, Enabled);
2631 } else if (Name == "sse4a") {
2632 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002633 } else if (Name == "f16c") {
2634 if (Enabled)
2635 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002636 } else if (Name == "sha") {
2637 if (Enabled)
2638 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002639 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002640}
2641
Eric Christopher3ff21b32013-10-16 21:26:26 +00002642/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002643/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002644bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002645 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002646 // Remember the maximum enabled sselevel.
2647 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2648 // Ignore disabled features.
2649 if (Features[i][0] == '-')
2650 continue;
2651
Benjamin Kramer27402c62012-03-05 15:10:44 +00002652 StringRef Feature = StringRef(Features[i]).substr(1);
2653
2654 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002655 HasAES = true;
2656 continue;
2657 }
2658
Craig Topper3f122a72012-05-31 05:18:48 +00002659 if (Feature == "pclmul") {
2660 HasPCLMUL = true;
2661 continue;
2662 }
2663
Benjamin Kramer27402c62012-03-05 15:10:44 +00002664 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002665 HasLZCNT = true;
2666 continue;
2667 }
2668
Rafael Espindola89049822013-08-23 20:21:37 +00002669 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002670 HasRDRND = true;
2671 continue;
2672 }
2673
Craig Topper8c7f2512014-11-03 06:51:41 +00002674 if (Feature == "fsgsbase") {
2675 HasFSGSBASE = true;
2676 continue;
2677 }
2678
Benjamin Kramer27402c62012-03-05 15:10:44 +00002679 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002680 HasBMI = true;
2681 continue;
2682 }
2683
Benjamin Kramer27402c62012-03-05 15:10:44 +00002684 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002685 HasBMI2 = true;
2686 continue;
2687 }
2688
Benjamin Kramer27402c62012-03-05 15:10:44 +00002689 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002690 HasPOPCNT = true;
2691 continue;
2692 }
2693
Michael Liao625a8752012-11-10 05:17:46 +00002694 if (Feature == "rtm") {
2695 HasRTM = true;
2696 continue;
2697 }
2698
Michael Liao74f4eaf2013-03-26 17:52:08 +00002699 if (Feature == "prfchw") {
2700 HasPRFCHW = true;
2701 continue;
2702 }
2703
Michael Liaoffaae352013-03-29 05:17:55 +00002704 if (Feature == "rdseed") {
2705 HasRDSEED = true;
2706 continue;
2707 }
2708
Robert Khasanov50e6f582014-09-19 09:53:48 +00002709 if (Feature == "adx") {
2710 HasADX = true;
2711 continue;
2712 }
2713
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002714 if (Feature == "tbm") {
2715 HasTBM = true;
2716 continue;
2717 }
2718
Craig Topperbba778b2012-06-03 21:46:30 +00002719 if (Feature == "fma") {
2720 HasFMA = true;
2721 continue;
2722 }
2723
Manman Rena45358c2012-10-11 00:59:55 +00002724 if (Feature == "f16c") {
2725 HasF16C = true;
2726 continue;
2727 }
2728
Craig Topper679b53a2013-08-21 05:29:10 +00002729 if (Feature == "avx512cd") {
2730 HasAVX512CD = true;
2731 continue;
2732 }
2733
2734 if (Feature == "avx512er") {
2735 HasAVX512ER = true;
2736 continue;
2737 }
2738
2739 if (Feature == "avx512pf") {
2740 HasAVX512PF = true;
2741 continue;
2742 }
2743
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002744 if (Feature == "avx512dq") {
2745 HasAVX512DQ = true;
2746 continue;
2747 }
2748
2749 if (Feature == "avx512bw") {
2750 HasAVX512BW = true;
2751 continue;
2752 }
2753
2754 if (Feature == "avx512vl") {
2755 HasAVX512VL = true;
2756 continue;
2757 }
2758
Ben Langmuir58078d02013-09-19 13:22:04 +00002759 if (Feature == "sha") {
2760 HasSHA = true;
2761 continue;
2762 }
2763
Nick Lewycky50e8f482013-10-05 20:14:27 +00002764 if (Feature == "cx16") {
2765 HasCX16 = true;
2766 continue;
2767 }
2768
Daniel Dunbar979586e2009-11-11 09:38:56 +00002769 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002770 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002771 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002772 .Case("avx2", AVX2)
2773 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002774 .Case("sse4.2", SSE42)
2775 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002776 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002777 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002778 .Case("sse2", SSE2)
2779 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002780 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002781 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002782
Eli Friedman33465822011-07-08 23:31:17 +00002783 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002784 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002785 .Case("3dnowa", AMD3DNowAthlon)
2786 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002787 .Case("mmx", MMX)
2788 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002789 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002790
2791 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2792 .Case("xop", XOP)
2793 .Case("fma4", FMA4)
2794 .Case("sse4a", SSE4A)
2795 .Default(NoXOP);
2796 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002797 }
Eli Friedman33465822011-07-08 23:31:17 +00002798
Craig Topper7481d8a2013-09-10 06:55:47 +00002799 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2800 // Can't do this earlier because we need to be able to explicitly enable
2801 // popcnt and still disable sse4.2.
2802 if (!HasPOPCNT && SSELevel >= SSE42 &&
2803 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2804 HasPOPCNT = true;
2805 Features.push_back("+popcnt");
2806 }
2807
Yunzhong Gao61089362013-10-16 19:07:02 +00002808 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2809 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2810 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2811 HasPRFCHW = true;
2812 Features.push_back("+prfchw");
2813 }
2814
Rafael Espindolaeb265472013-08-21 21:59:03 +00002815 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2816 // matches the selected sse level.
2817 if (FPMath == FP_SSE && SSELevel < SSE1) {
2818 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2819 return false;
2820 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2821 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2822 return false;
2823 }
2824
Eli Friedman33465822011-07-08 23:31:17 +00002825 // Don't tell the backend if we're turning off mmx; it will end up disabling
2826 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002827 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2828 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002829 std::vector<std::string>::iterator it;
2830 it = std::find(Features.begin(), Features.end(), "-mmx");
2831 if (it != Features.end())
2832 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002833 else if (SSELevel > NoSSE)
2834 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002835 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002836}
Chris Lattnerecd49032009-03-02 22:27:17 +00002837
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002838/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2839/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002840void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002841 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002842 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002843 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002844 Builder.defineMacro("__amd64__");
2845 Builder.defineMacro("__amd64");
2846 Builder.defineMacro("__x86_64");
2847 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002848 if (getTriple().getArchName() == "x86_64h") {
2849 Builder.defineMacro("__x86_64h");
2850 Builder.defineMacro("__x86_64h__");
2851 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002852 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002853 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002854 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002855
Chris Lattnerecd49032009-03-02 22:27:17 +00002856 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002857 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2858 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002859 switch (CPU) {
2860 case CK_Generic:
2861 break;
2862 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002863 // The rest are coming from the i386 define above.
2864 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002865 break;
2866 case CK_i486:
2867 case CK_WinChipC6:
2868 case CK_WinChip2:
2869 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002870 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002871 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002872 case CK_PentiumMMX:
2873 Builder.defineMacro("__pentium_mmx__");
2874 Builder.defineMacro("__tune_pentium_mmx__");
2875 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002876 case CK_i586:
2877 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002878 defineCPUMacros(Builder, "i586");
2879 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002880 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002881 case CK_Pentium3:
2882 case CK_Pentium3M:
2883 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002884 Builder.defineMacro("__tune_pentium3__");
2885 // Fallthrough
2886 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002887 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002888 Builder.defineMacro("__tune_pentium2__");
2889 // Fallthrough
2890 case CK_PentiumPro:
2891 Builder.defineMacro("__tune_i686__");
2892 Builder.defineMacro("__tune_pentiumpro__");
2893 // Fallthrough
2894 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002895 Builder.defineMacro("__i686");
2896 Builder.defineMacro("__i686__");
2897 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2898 Builder.defineMacro("__pentiumpro");
2899 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002900 break;
2901 case CK_Pentium4:
2902 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002903 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002904 break;
2905 case CK_Yonah:
2906 case CK_Prescott:
2907 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002908 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002909 break;
2910 case CK_Core2:
2911 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002912 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002913 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002914 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002915 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002916 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002917 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002918 defineCPUMacros(Builder, "slm");
2919 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002920 case CK_Nehalem:
2921 case CK_Westmere:
2922 case CK_SandyBridge:
2923 case CK_IvyBridge:
2924 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002925 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002926 // FIXME: Historically, we defined this legacy name, it would be nice to
2927 // remove it at some point. We've never exposed fine-grained names for
2928 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002929 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002930 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002931 case CK_Skylake:
2932 // FIXME: Historically, we defined this legacy name, it would be nice to
2933 // remove it at some point. This is the only fine-grained CPU macro in the
2934 // main intel CPU line, and it would be better to not have these and force
2935 // people to use ISA macros.
2936 defineCPUMacros(Builder, "skx");
2937 break;
Craig Topper449314e2013-08-20 07:09:39 +00002938 case CK_KNL:
2939 defineCPUMacros(Builder, "knl");
2940 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002941 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002942 Builder.defineMacro("__k6_2__");
2943 Builder.defineMacro("__tune_k6_2__");
2944 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002945 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002946 if (CPU != CK_K6_2) { // In case of fallthrough
2947 // FIXME: GCC may be enabling these in cases where some other k6
2948 // architecture is specified but -m3dnow is explicitly provided. The
2949 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002950 Builder.defineMacro("__k6_3__");
2951 Builder.defineMacro("__tune_k6_3__");
2952 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002953 // Fallthrough
2954 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002955 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002956 break;
2957 case CK_Athlon:
2958 case CK_AthlonThunderbird:
2959 case CK_Athlon4:
2960 case CK_AthlonXP:
2961 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002962 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002963 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002964 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002965 Builder.defineMacro("__tune_athlon_sse__");
2966 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002967 break;
2968 case CK_K8:
2969 case CK_K8SSE3:
2970 case CK_x86_64:
2971 case CK_Opteron:
2972 case CK_OpteronSSE3:
2973 case CK_Athlon64:
2974 case CK_Athlon64SSE3:
2975 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002976 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002977 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002978 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002979 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002980 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002981 case CK_BTVER1:
2982 defineCPUMacros(Builder, "btver1");
2983 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002984 case CK_BTVER2:
2985 defineCPUMacros(Builder, "btver2");
2986 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002987 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002988 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002989 break;
2990 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002991 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002992 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002993 case CK_BDVER3:
2994 defineCPUMacros(Builder, "bdver3");
2995 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002996 case CK_BDVER4:
2997 defineCPUMacros(Builder, "bdver4");
2998 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002999 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003000 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003001 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003002 }
Chris Lattner96e43572009-03-02 22:40:39 +00003003
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003004 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003005 Builder.defineMacro("__REGISTER_PREFIX__", "");
3006
Chris Lattner6df41af2009-04-19 17:32:33 +00003007 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3008 // functions in glibc header files that use FP Stack inline asm which the
3009 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003010 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003011
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003012 if (HasAES)
3013 Builder.defineMacro("__AES__");
3014
Craig Topper3f122a72012-05-31 05:18:48 +00003015 if (HasPCLMUL)
3016 Builder.defineMacro("__PCLMUL__");
3017
Craig Topper22967d42011-12-25 05:06:45 +00003018 if (HasLZCNT)
3019 Builder.defineMacro("__LZCNT__");
3020
Benjamin Kramer1e250392012-07-07 09:39:18 +00003021 if (HasRDRND)
3022 Builder.defineMacro("__RDRND__");
3023
Craig Topper8c7f2512014-11-03 06:51:41 +00003024 if (HasFSGSBASE)
3025 Builder.defineMacro("__FSGSBASE__");
3026
Craig Topper22967d42011-12-25 05:06:45 +00003027 if (HasBMI)
3028 Builder.defineMacro("__BMI__");
3029
3030 if (HasBMI2)
3031 Builder.defineMacro("__BMI2__");
3032
Craig Topper1de83482011-12-29 16:10:46 +00003033 if (HasPOPCNT)
3034 Builder.defineMacro("__POPCNT__");
3035
Michael Liao625a8752012-11-10 05:17:46 +00003036 if (HasRTM)
3037 Builder.defineMacro("__RTM__");
3038
Michael Liao74f4eaf2013-03-26 17:52:08 +00003039 if (HasPRFCHW)
3040 Builder.defineMacro("__PRFCHW__");
3041
Michael Liaoffaae352013-03-29 05:17:55 +00003042 if (HasRDSEED)
3043 Builder.defineMacro("__RDSEED__");
3044
Robert Khasanov50e6f582014-09-19 09:53:48 +00003045 if (HasADX)
3046 Builder.defineMacro("__ADX__");
3047
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003048 if (HasTBM)
3049 Builder.defineMacro("__TBM__");
3050
Rafael Espindolae62e2792013-08-20 13:44:29 +00003051 switch (XOPLevel) {
3052 case XOP:
3053 Builder.defineMacro("__XOP__");
3054 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003055 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003056 case SSE4A:
3057 Builder.defineMacro("__SSE4A__");
3058 case NoXOP:
3059 break;
3060 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003061
Craig Topperbba778b2012-06-03 21:46:30 +00003062 if (HasFMA)
3063 Builder.defineMacro("__FMA__");
3064
Manman Rena45358c2012-10-11 00:59:55 +00003065 if (HasF16C)
3066 Builder.defineMacro("__F16C__");
3067
Craig Topper679b53a2013-08-21 05:29:10 +00003068 if (HasAVX512CD)
3069 Builder.defineMacro("__AVX512CD__");
3070 if (HasAVX512ER)
3071 Builder.defineMacro("__AVX512ER__");
3072 if (HasAVX512PF)
3073 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003074 if (HasAVX512DQ)
3075 Builder.defineMacro("__AVX512DQ__");
3076 if (HasAVX512BW)
3077 Builder.defineMacro("__AVX512BW__");
3078 if (HasAVX512VL)
3079 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003080
Ben Langmuir58078d02013-09-19 13:22:04 +00003081 if (HasSHA)
3082 Builder.defineMacro("__SHA__");
3083
Nick Lewycky50e8f482013-10-05 20:14:27 +00003084 if (HasCX16)
3085 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3086
Chris Lattner96e43572009-03-02 22:40:39 +00003087 // Each case falls through to the previous one here.
3088 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003089 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003090 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003091 case AVX2:
3092 Builder.defineMacro("__AVX2__");
3093 case AVX:
3094 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003095 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003096 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003097 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003098 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003099 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003100 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003101 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003102 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003103 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003104 Builder.defineMacro("__SSE2__");
3105 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003106 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003107 Builder.defineMacro("__SSE__");
3108 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003109 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003110 break;
3111 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003112
Derek Schuffc7dd7222012-10-11 15:52:22 +00003113 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003114 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003115 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003116 case AVX2:
3117 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003118 case SSE42:
3119 case SSE41:
3120 case SSSE3:
3121 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003122 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003123 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003124 break;
3125 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003126 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003127 break;
3128 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003129 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003130 }
3131 }
3132
Anders Carlssone437c682010-01-27 03:47:49 +00003133 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003134 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003135 case AMD3DNowAthlon:
3136 Builder.defineMacro("__3dNOW_A__");
3137 case AMD3DNow:
3138 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003139 case MMX:
3140 Builder.defineMacro("__MMX__");
3141 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003142 break;
3143 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003144
3145 if (CPU >= CK_i486) {
3146 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3147 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3148 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3149 }
3150 if (CPU >= CK_i586)
3151 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003152}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003153
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003154bool X86TargetInfo::hasFeature(StringRef Feature) const {
3155 return llvm::StringSwitch<bool>(Feature)
3156 .Case("aes", HasAES)
3157 .Case("avx", SSELevel >= AVX)
3158 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003159 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003160 .Case("avx512cd", HasAVX512CD)
3161 .Case("avx512er", HasAVX512ER)
3162 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003163 .Case("avx512dq", HasAVX512DQ)
3164 .Case("avx512bw", HasAVX512BW)
3165 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003166 .Case("bmi", HasBMI)
3167 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003168 .Case("cx16", HasCX16)
3169 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003170 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003171 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003172 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003173 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003174 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3175 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3176 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003177 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003178 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003179 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003180 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003181 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003182 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003183 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003184 .Case("sse", SSELevel >= SSE1)
3185 .Case("sse2", SSELevel >= SSE2)
3186 .Case("sse3", SSELevel >= SSE3)
3187 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003188 .Case("sse4.1", SSELevel >= SSE41)
3189 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003190 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003191 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003192 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003193 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3194 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003195 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003196 .Default(false);
3197}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003198
Eli Friedman3fd920a2008-08-20 02:34:37 +00003199bool
Anders Carlsson58436352009-02-28 17:11:49 +00003200X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003201 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003202 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003203 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003204 case 'I':
3205 Info.setRequiresImmediate(0, 31);
3206 return true;
3207 case 'J':
3208 Info.setRequiresImmediate(0, 63);
3209 return true;
3210 case 'K':
3211 Info.setRequiresImmediate(-128, 127);
3212 return true;
3213 case 'L':
3214 // FIXME: properly analyze this constraint:
3215 // must be one of 0xff, 0xffff, or 0xffffffff
3216 return true;
3217 case 'M':
3218 Info.setRequiresImmediate(0, 3);
3219 return true;
3220 case 'N':
3221 Info.setRequiresImmediate(0, 255);
3222 return true;
3223 case 'O':
3224 Info.setRequiresImmediate(0, 127);
3225 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003226 case 'Y': // first letter of a pair:
3227 switch (*(Name+1)) {
3228 default: return false;
3229 case '0': // First SSE register.
3230 case 't': // Any SSE register, when SSE2 is enabled.
3231 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3232 case 'm': // any MMX register, when inter-unit moves enabled.
3233 break; // falls through to setAllowsRegister.
3234 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003235 case 'f': // any x87 floating point stack register.
3236 // Constraint 'f' cannot be used for output operands.
3237 if (Info.ConstraintStr[0] == '=')
3238 return false;
3239
3240 Info.setAllowsRegister();
3241 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003242 case 'a': // eax.
3243 case 'b': // ebx.
3244 case 'c': // ecx.
3245 case 'd': // edx.
3246 case 'S': // esi.
3247 case 'D': // edi.
3248 case 'A': // edx:eax.
3249 case 't': // top of floating point stack.
3250 case 'u': // second from top of floating point stack.
3251 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003252 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003253 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003254 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003255 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3256 case 'l': // "Index" registers: any general register that can be used as an
3257 // index in a base+index memory access.
3258 Info.setAllowsRegister();
3259 return true;
3260 case 'C': // SSE floating point constant.
3261 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003262 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003263 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003264 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003265 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003266 return true;
3267 }
3268}
3269
Akira Hatanaka974131e2014-09-18 18:17:18 +00003270bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3271 unsigned Size) const {
3272 // Strip off constraint modifiers.
3273 while (Constraint[0] == '=' ||
3274 Constraint[0] == '+' ||
3275 Constraint[0] == '&')
3276 Constraint = Constraint.substr(1);
3277
3278 return validateOperandSize(Constraint, Size);
3279}
3280
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003281bool X86TargetInfo::validateInputSize(StringRef Constraint,
3282 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003283 return validateOperandSize(Constraint, Size);
3284}
3285
3286bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3287 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003288 switch (Constraint[0]) {
3289 default: break;
3290 case 'y':
3291 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003292 case 'f':
3293 case 't':
3294 case 'u':
3295 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003296 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003297 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003298 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003299 }
3300
3301 return true;
3302}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003303
Eli Friedman3fd920a2008-08-20 02:34:37 +00003304std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003305X86TargetInfo::convertConstraint(const char *&Constraint) const {
3306 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003307 case 'a': return std::string("{ax}");
3308 case 'b': return std::string("{bx}");
3309 case 'c': return std::string("{cx}");
3310 case 'd': return std::string("{dx}");
3311 case 'S': return std::string("{si}");
3312 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003313 case 'p': // address
3314 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003315 case 't': // top of floating point stack.
3316 return std::string("{st}");
3317 case 'u': // second from top of floating point stack.
3318 return std::string("{st(1)}"); // second from top of floating point stack.
3319 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003320 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003321 }
3322}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003323
Eli Friedman3fd920a2008-08-20 02:34:37 +00003324// X86-32 generic target
3325class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003326public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003327 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003328 DoubleAlign = LongLongAlign = 32;
3329 LongDoubleWidth = 96;
3330 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003331 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003332 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003333 SizeType = UnsignedInt;
3334 PtrDiffType = SignedInt;
3335 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003336 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003337
3338 // Use fpret for all types.
3339 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3340 (1 << TargetInfo::Double) |
3341 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003342
3343 // x86-32 has atomics up to 8 bytes
3344 // FIXME: Check that we actually have cmpxchg8b before setting
3345 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3346 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003347 }
Craig Topper3164f332014-03-11 03:39:26 +00003348 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003349 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003350 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003351
Craig Topper3164f332014-03-11 03:39:26 +00003352 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003353 if (RegNo == 0) return 0;
3354 if (RegNo == 1) return 2;
3355 return -1;
3356 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003357 bool validateOperandSize(StringRef Constraint,
3358 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003359 switch (Constraint[0]) {
3360 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003361 case 'R':
3362 case 'q':
3363 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003364 case 'a':
3365 case 'b':
3366 case 'c':
3367 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003368 case 'S':
3369 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003370 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003371 case 'A':
3372 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003373 }
3374
Akira Hatanaka974131e2014-09-18 18:17:18 +00003375 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003376 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003377};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003378
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003379class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3380public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003381 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3382 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003383
Craig Topper3164f332014-03-11 03:39:26 +00003384 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003385 unsigned Major, Minor, Micro;
3386 getTriple().getOSVersion(Major, Minor, Micro);
3387 // New NetBSD uses the default rounding mode.
3388 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3389 return X86_32TargetInfo::getFloatEvalMethod();
3390 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003391 return 1;
3392 }
3393};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003394
Eli Friedmane3aa4542009-07-05 18:47:56 +00003395class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3396public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003397 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3398 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003399 SizeType = UnsignedLong;
3400 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003401 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003402 }
3403};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003404
Eli Friedman9fa28852012-08-08 23:57:20 +00003405class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3406public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003407 BitrigI386TargetInfo(const llvm::Triple &Triple)
3408 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003409 SizeType = UnsignedLong;
3410 IntPtrType = SignedLong;
3411 PtrDiffType = SignedLong;
3412 }
3413};
Eli Friedman9fa28852012-08-08 23:57:20 +00003414
Torok Edwinb2b37c62009-06-30 17:10:35 +00003415class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003416public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003417 DarwinI386TargetInfo(const llvm::Triple &Triple)
3418 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003419 LongDoubleWidth = 128;
3420 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003421 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003422 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003423 SizeType = UnsignedLong;
3424 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003425 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003426 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003427 }
3428
Eli Friedman3fd920a2008-08-20 02:34:37 +00003429};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003430
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003431// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003432class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003433public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003434 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3435 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003436 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003437 DoubleAlign = LongLongAlign = 64;
David Majnemer8fa8c382015-03-17 23:55:00 +00003438 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003439 }
Craig Topper3164f332014-03-11 03:39:26 +00003440 void getTargetDefines(const LangOptions &Opts,
3441 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003442 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3443 }
3444};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003445
3446// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003447class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003448public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003449 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003450 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003451 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003452 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3453 }
Craig Topper3164f332014-03-11 03:39:26 +00003454 void getTargetDefines(const LangOptions &Opts,
3455 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003456 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3457 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3458 // The value of the following reflects processor type.
3459 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3460 // We lost the original triple, so we use the default.
3461 Builder.defineMacro("_M_IX86", "600");
3462 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003463};
3464} // end anonymous namespace
3465
Reid Kleckner47606832014-04-21 20:58:00 +00003466static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3467 Builder.defineMacro("__MSVCRT__");
3468 Builder.defineMacro("__MINGW32__");
3469
3470 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3471 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3472 // macro anyway for pre-processor compatibility.
3473 if (Opts.MicrosoftExt)
3474 Builder.defineMacro("__declspec", "__declspec");
3475 else
3476 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3477
3478 if (!Opts.MicrosoftExt) {
3479 // Provide macros for all the calling convention keywords. Provide both
3480 // single and double underscore prefixed variants. These are available on
3481 // x64 as well as x86, even though they have no effect.
3482 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3483 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003484 std::string GCCSpelling = "__attribute__((__";
3485 GCCSpelling += CC;
3486 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003487 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3488 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3489 }
3490 }
3491}
3492
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003493namespace {
3494// x86-32 MinGW target
3495class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3496public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003497 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3498 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003499 void getTargetDefines(const LangOptions &Opts,
3500 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003501 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003502 DefineStd(Builder, "WIN32", Opts);
3503 DefineStd(Builder, "WINNT", Opts);
3504 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003505 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003506 }
3507};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003508
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003509// x86-32 Cygwin target
3510class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3511public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003512 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3513 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003514 TLSSupported = false;
3515 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003516 DoubleAlign = LongLongAlign = 64;
David Majnemer8fa8c382015-03-17 23:55:00 +00003517 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003518 }
Craig Topper3164f332014-03-11 03:39:26 +00003519 void getTargetDefines(const LangOptions &Opts,
3520 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003521 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003522 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003523 Builder.defineMacro("__CYGWIN__");
3524 Builder.defineMacro("__CYGWIN32__");
3525 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003526 if (Opts.CPlusPlus)
3527 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003528 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003529};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003530
Chris Lattnerb986aba2010-04-11 19:29:39 +00003531// x86-32 Haiku target
3532class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3533public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003534 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003535 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003536 IntPtrType = SignedLong;
3537 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003538 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003539 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003540 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003541 }
Craig Topper3164f332014-03-11 03:39:26 +00003542 void getTargetDefines(const LangOptions &Opts,
3543 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003544 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3545 Builder.defineMacro("__INTEL__");
3546 Builder.defineMacro("__HAIKU__");
3547 }
3548};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003549
Douglas Gregor9fabd852011-07-01 22:41:14 +00003550// RTEMS Target
3551template<typename Target>
3552class RTEMSTargetInfo : public OSTargetInfo<Target> {
3553protected:
Craig Topper3164f332014-03-11 03:39:26 +00003554 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3555 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003556 // RTEMS defines; list based off of gcc output
3557
Douglas Gregor9fabd852011-07-01 22:41:14 +00003558 Builder.defineMacro("__rtems__");
3559 Builder.defineMacro("__ELF__");
3560 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003561
Douglas Gregor9fabd852011-07-01 22:41:14 +00003562public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003563 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3564 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003565
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003566 switch (Triple.getArch()) {
3567 default:
3568 case llvm::Triple::x86:
3569 // this->MCountName = ".mcount";
3570 break;
3571 case llvm::Triple::mips:
3572 case llvm::Triple::mipsel:
3573 case llvm::Triple::ppc:
3574 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003575 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003576 // this->MCountName = "_mcount";
3577 break;
3578 case llvm::Triple::arm:
3579 // this->MCountName = "__mcount";
3580 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003581 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003582 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003583};
3584
Douglas Gregor9fabd852011-07-01 22:41:14 +00003585// x86-32 RTEMS target
3586class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3587public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003588 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003589 SizeType = UnsignedLong;
3590 IntPtrType = SignedLong;
3591 PtrDiffType = SignedLong;
3592 this->UserLabelPrefix = "";
3593 }
Craig Topper3164f332014-03-11 03:39:26 +00003594 void getTargetDefines(const LangOptions &Opts,
3595 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003596 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3597 Builder.defineMacro("__INTEL__");
3598 Builder.defineMacro("__rtems__");
3599 }
3600};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003601
Eli Friedman3fd920a2008-08-20 02:34:37 +00003602// x86-64 generic target
3603class X86_64TargetInfo : public X86TargetInfo {
3604public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003605 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003606 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003607 bool IsWinCOFF =
3608 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003609 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003610 LongDoubleWidth = 128;
3611 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003612 LargeArrayMinWidth = 128;
3613 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003614 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003615 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3616 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3617 IntPtrType = IsX32 ? SignedInt : SignedLong;
3618 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003619 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003620 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003621
Eric Christopher917e9522014-11-18 22:36:15 +00003622 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003623 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3624 : IsWinCOFF
3625 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3626 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003627
3628 // Use fpret only for long double.
3629 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003630
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003631 // Use fp2ret for _Complex long double.
3632 ComplexLongDoubleUsesFP2Ret = true;
3633
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003634 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003635 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003636 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003637 }
Craig Topper3164f332014-03-11 03:39:26 +00003638 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003639 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003640 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003641
Craig Topper3164f332014-03-11 03:39:26 +00003642 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003643 if (RegNo == 0) return 0;
3644 if (RegNo == 1) return 1;
3645 return -1;
3646 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003647
Craig Topper3164f332014-03-11 03:39:26 +00003648 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003649 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003650 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003651 CC == CC_IntelOclBicc ||
3652 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003653 }
3654
Craig Topper3164f332014-03-11 03:39:26 +00003655 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003656 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003657 }
3658
Pavel Chupinfd223e12014-08-04 12:39:43 +00003659 // for x32 we need it here explicitly
3660 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003661};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003662
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003663// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003664class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003665public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003666 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3667 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003668 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003669 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003670 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003671 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003672 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003673 SizeType = UnsignedLongLong;
3674 PtrDiffType = SignedLongLong;
3675 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003676 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003677 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003678
Craig Topper3164f332014-03-11 03:39:26 +00003679 void getTargetDefines(const LangOptions &Opts,
3680 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003681 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003682 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003683 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003684
Craig Topper3164f332014-03-11 03:39:26 +00003685 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003686 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003687 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003688
Craig Topper3164f332014-03-11 03:39:26 +00003689 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003690 switch (CC) {
3691 case CC_X86StdCall:
3692 case CC_X86ThisCall:
3693 case CC_X86FastCall:
3694 return CCCR_Ignore;
3695 case CC_C:
3696 case CC_X86VectorCall:
3697 case CC_IntelOclBicc:
3698 case CC_X86_64SysV:
3699 return CCCR_OK;
3700 default:
3701 return CCCR_Warning;
3702 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003703 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003704};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003705
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003706// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003707class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003708public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003709 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003710 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003711 LongDoubleWidth = LongDoubleAlign = 64;
3712 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003713 }
Craig Topper3164f332014-03-11 03:39:26 +00003714 void getTargetDefines(const LangOptions &Opts,
3715 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003716 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3717 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003718 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003719 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003720 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003721};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003722
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003723// x86-64 MinGW target
3724class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3725public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003726 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3727 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003728 void getTargetDefines(const LangOptions &Opts,
3729 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003730 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003731 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003732 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003733 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003734
3735 // GCC defines this macro when it is using __gxx_personality_seh0.
3736 if (!Opts.SjLjExceptions)
3737 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003738 }
3739};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003740
Eli Friedman2857ccb2009-07-01 03:36:11 +00003741class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3742public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003743 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3744 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003745 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003746 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003747 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3748 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003749 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003750 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003751 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003752 }
3753};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003754
Eli Friedman245f2292009-07-05 22:31:18 +00003755class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3756public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003757 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3758 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003759 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003760 Int64Type = SignedLongLong;
3761 }
3762};
Eli Friedman245f2292009-07-05 22:31:18 +00003763
Eli Friedman9fa28852012-08-08 23:57:20 +00003764class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3765public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003766 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3767 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3768 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003769 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003770 }
3771};
Tim Northover9bb857a2013-01-31 12:13:10 +00003772
Eli Friedmanf05b7722008-08-20 07:44:10 +00003773class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003774 // Possible FPU choices.
3775 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003776 VFP2FPU = (1 << 0),
3777 VFP3FPU = (1 << 1),
3778 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003779 NeonFPU = (1 << 3),
3780 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003781 };
3782
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003783 // Possible HWDiv features.
3784 enum HWDivMode {
3785 HWDivThumb = (1 << 0),
3786 HWDivARM = (1 << 1)
3787 };
3788
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003789 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003790 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003791 }
3792
3793 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3794 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003795
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003796 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003797
Rafael Espindolaeb265472013-08-21 21:59:03 +00003798 enum {
3799 FP_Default,
3800 FP_VFP,
3801 FP_Neon
3802 } FPMath;
3803
Bernard Ogdenda13af32013-10-24 18:32:51 +00003804 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003805
Logan Chien57086ce2012-10-10 06:56:20 +00003806 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003807 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003808 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003809
3810 // Initialized via features.
3811 unsigned SoftFloat : 1;
3812 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003813
Bernard Ogden18b57012013-10-29 09:47:51 +00003814 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003815 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003816
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003817 // ACLE 6.5.1 Hardware floating point
3818 enum {
3819 HW_FP_HP = (1 << 1), /// half (16-bit)
3820 HW_FP_SP = (1 << 2), /// single (32-bit)
3821 HW_FP_DP = (1 << 3), /// double (64-bit)
3822 };
3823 uint32_t HW_FP;
3824
Chris Lattner5cc15e02010-03-03 19:03:45 +00003825 static const Builtin::Info BuiltinInfo[];
3826
Rafael Espindola101d5b92013-05-13 20:09:47 +00003827 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003828 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003829 if (T.getArch() == llvm::Triple::arm ||
3830 T.getArch() == llvm::Triple::armeb) {
3831 StringRef VersionStr;
3832 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003833 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003834 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003835 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003836 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003837 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003838 unsigned Version;
3839 if (VersionStr.getAsInteger(10, Version))
3840 return false;
3841 return Version >= 6;
3842 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003843 assert(T.getArch() == llvm::Triple::thumb ||
3844 T.getArch() == llvm::Triple::thumbeb);
3845 StringRef VersionStr;
3846 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003847 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003848 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003849 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003850 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003851 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003852 unsigned Version;
3853 if (VersionStr.getAsInteger(10, Version))
3854 return false;
3855 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003856 }
3857
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003858 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003859 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003860
3861 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003862 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003863
Renato Golin9ba39232015-02-27 16:35:48 +00003864 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3865 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3866 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003867 SizeType = UnsignedLong;
3868 else
3869 SizeType = UnsignedInt;
3870
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003871 switch (T.getOS()) {
3872 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003873 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003874 break;
3875 case llvm::Triple::Win32:
3876 WCharType = UnsignedShort;
3877 break;
3878 case llvm::Triple::Linux:
3879 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003880 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3881 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003882 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003883 }
3884
3885 UseBitFieldTypeAlignment = true;
3886
3887 ZeroLengthBitfieldBoundary = 0;
3888
Tim Northover147cd2f2014-10-14 22:12:21 +00003889 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3890 // so set preferred for small types to 32.
3891 if (T.isOSBinFormatMachO()) {
3892 DescriptionString =
3893 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3894 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3895 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00003896 assert(!BigEndian && "Windows on ARM does not support big endian");
3897 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00003898 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00003899 "-p:32:32"
3900 "-i64:64"
3901 "-v128:64:128"
3902 "-a:0:32"
3903 "-n32"
3904 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003905 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003906 DescriptionString =
3907 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3908 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003909 }
3910
3911 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003912 }
3913
3914 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003915 const llvm::Triple &T = getTriple();
3916
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003917 IsAAPCS = false;
3918
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003919 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003920
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003921 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003922 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003923 SizeType = UnsignedInt;
3924 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003925 SizeType = UnsignedLong;
3926
3927 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3928 WCharType = SignedInt;
3929
3930 // Do not respect the alignment of bit-field types when laying out
3931 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3932 UseBitFieldTypeAlignment = false;
3933
3934 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3935 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3936 /// gcc.
3937 ZeroLengthBitfieldBoundary = 32;
3938
Tim Northover147cd2f2014-10-14 22:12:21 +00003939 if (T.isOSBinFormatMachO())
3940 DescriptionString =
3941 BigEndian
3942 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3943 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3944 else
3945 DescriptionString =
3946 BigEndian
3947 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3948 : "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 +00003949
3950 // FIXME: Override "preferred align" for double and long long.
3951 }
3952
Chris Lattner17df24e2008-04-21 18:56:49 +00003953public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003954 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003955 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003956 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003957 BigEndian = IsBigEndian;
3958
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003959 switch (getTriple().getOS()) {
3960 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003961 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003962 break;
3963 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003964 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003965 break;
3966 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003967
Chris Lattner1a8f3942010-04-23 16:29:58 +00003968 // {} in inline assembly are neon specifiers, not assembly variant
3969 // specifiers.
3970 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003971
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003972 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003973 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003974
Eric Christopher0e261882014-12-05 01:06:59 +00003975 // FIXME: This duplicates code from the driver that sets the -target-abi
3976 // option - this code is used if -target-abi isn't passed and should
3977 // be unified in some way.
3978 if (Triple.isOSBinFormatMachO()) {
3979 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3980 // the frontend matches that.
3981 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3982 Triple.getOS() == llvm::Triple::UnknownOS ||
3983 StringRef(CPU).startswith("cortex-m")) {
3984 setABI("aapcs");
3985 } else {
3986 setABI("apcs-gnu");
3987 }
3988 } else if (Triple.isOSWindows()) {
3989 // FIXME: this is invalid for WindowsCE
3990 setABI("aapcs");
3991 } else {
3992 // Select the default based on the platform.
3993 switch (Triple.getEnvironment()) {
3994 case llvm::Triple::Android:
3995 case llvm::Triple::GNUEABI:
3996 case llvm::Triple::GNUEABIHF:
3997 setABI("aapcs-linux");
3998 break;
3999 case llvm::Triple::EABIHF:
4000 case llvm::Triple::EABI:
4001 setABI("aapcs");
4002 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004003 case llvm::Triple::GNU:
4004 setABI("apcs-gnu");
4005 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004006 default:
4007 if (Triple.getOS() == llvm::Triple::NetBSD)
4008 setABI("apcs-gnu");
4009 else
4010 setABI("aapcs");
4011 break;
4012 }
4013 }
John McCall86353412010-08-21 22:46:04 +00004014
4015 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004016 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004017
4018 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004019 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004020 if (shouldUseInlineAtomic(getTriple()))
4021 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004022
4023 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004024 // the alignment of the zero-length bitfield is greater than the member
4025 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004026 // zero length bitfield.
4027 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004028 }
Alp Toker4925ba72014-06-07 23:30:42 +00004029 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004030 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004031 ABI = Name;
4032
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004033 // The defaults (above) are for AAPCS, check if we need to change them.
4034 //
4035 // FIXME: We need support for -meabi... we could just mangle it into the
4036 // name.
4037 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004038 setABIAPCS();
4039 return true;
4040 }
4041 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4042 setABIAAPCS();
4043 return true;
4044 }
4045 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004046 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004047
Craig Topper3164f332014-03-11 03:39:26 +00004048 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004049 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004050 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4051 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004052 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004053 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004054 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004055 }
4056 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004057 Features["vfp4"] = true;
4058 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004059 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4060 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004061 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004062 Features["vfp4"] = true;
4063 Features["neon"] = true;
4064 Features["hwdiv"] = true;
4065 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004066 } else if (CPU == "cyclone") {
4067 Features["v8fp"] = true;
4068 Features["neon"] = true;
4069 Features["hwdiv"] = true;
4070 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004071 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004072 Features["fp-armv8"] = true;
4073 Features["neon"] = true;
4074 Features["hwdiv"] = true;
4075 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004076 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004077 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004078 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004079 // Enable the hwdiv extension for all v8a AArch32 cores by
4080 // default.
4081 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004082 ArchName == "armebv8a" || ArchName == "armebv8" ||
4083 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4084 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004085 Features["hwdiv"] = true;
4086 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004087 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
4088 CPU == "sc300") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004089 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004090 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004091 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004092
Craig Topper3164f332014-03-11 03:39:26 +00004093 bool handleTargetFeatures(std::vector<std::string> &Features,
4094 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004095 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004096 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004097 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004098 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004099 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004100
4101 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004102 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004103 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004104 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004105 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004106 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004107 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004108 HW_FP = HW_FP_SP | HW_FP_DP;
4109 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004110 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004111 HW_FP = HW_FP_SP | HW_FP_DP;
4112 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004113 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004114 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4115 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004116 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004117 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4118 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004119 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004120 HW_FP = HW_FP_SP | HW_FP_DP;
4121 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004122 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004123 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004124 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004125 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004126 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004127 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004128 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004129 } else if (Feature == "+fp-only-sp") {
4130 HW_FP &= ~HW_FP_DP;
4131 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004132 }
4133
Rafael Espindolaeb265472013-08-21 21:59:03 +00004134 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4135 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4136 return false;
4137 }
4138
4139 if (FPMath == FP_Neon)
4140 Features.push_back("+neonfp");
4141 else if (FPMath == FP_VFP)
4142 Features.push_back("-neonfp");
4143
Daniel Dunbar893d4752009-12-19 04:15:38 +00004144 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004145 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4146 for (const auto &FEFeature : FrontEndFeatures) {
4147 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4148 if (Feature != Features.end())
4149 Features.erase(Feature);
4150 }
4151
Rafael Espindolaeb265472013-08-21 21:59:03 +00004152 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004153 }
4154
Craig Topper3164f332014-03-11 03:39:26 +00004155 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004156 return llvm::StringSwitch<bool>(Feature)
4157 .Case("arm", true)
4158 .Case("softfloat", SoftFloat)
4159 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004160 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004161 .Case("hwdiv", HWDiv & HWDivThumb)
4162 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004163 .Default(false);
4164 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004165 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004166 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004167 return llvm::StringSwitch<const char *>(Name)
4168 .Cases("arm8", "arm810", "4")
4169 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4170 "4")
4171 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4172 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4173 .Case("ep9312", "4T")
4174 .Cases("arm10tdmi", "arm1020t", "5T")
4175 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4176 .Case("arm926ej-s", "5TEJ")
4177 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4178 .Cases("xscale", "iwmmxt", "5TE")
4179 .Case("arm1136j-s", "6J")
Renato Goline11531f2015-03-17 11:55:43 +00004180 .Case("arm1136jf-s", "6")
4181 .Cases("mpcorenovfp", "mpcore", "6K")
4182 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Eric Christopher917e9522014-11-18 22:36:15 +00004183 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4184 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4185 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4186 "7A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004187 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004188 .Case("swift", "7S")
4189 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004190 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004191 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004192 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004193 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004194 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004195 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004196 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004197 return llvm::StringSwitch<const char *>(Name)
4198 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4199 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4200 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004201 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004202 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4203 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
4204 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004205 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004206 }
Craig Topper3164f332014-03-11 03:39:26 +00004207 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004208 if (!getCPUDefineSuffix(Name))
4209 return false;
4210
Tim Northovere8c37212014-07-09 09:24:43 +00004211 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4212 StringRef Profile = getCPUProfile(Name);
4213 if (Profile == "M" && MaxAtomicInlineWidth) {
4214 MaxAtomicPromoteWidth = 32;
4215 MaxAtomicInlineWidth = 32;
4216 }
4217
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004218 CPU = Name;
4219 return true;
4220 }
Craig Topper3164f332014-03-11 03:39:26 +00004221 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004222 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4223 unsigned CPUArchVer) const {
4224 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4225 (CPUArch.find('M') != StringRef::npos);
4226 }
4227 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4228 unsigned CPUArchVer) const {
4229 // We check both CPUArchVer and ArchName because when only triple is
4230 // specified, the default CPU is arm1136j-s.
4231 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4232 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4233 }
Craig Topper3164f332014-03-11 03:39:26 +00004234 void getTargetDefines(const LangOptions &Opts,
4235 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004236 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004237 Builder.defineMacro("__arm");
4238 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004239
Chris Lattnerecd49032009-03-02 22:27:17 +00004240 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004241 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004242
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004243 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004244 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004245 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004246 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004247 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004248
4249 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004250 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004251 StringRef ArchName = getTriple().getArchName();
4252
4253 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4254 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004255 if (CPUArch[0] >= '8') {
4256 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4257 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004258 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004259
4260 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4261 // is not defined for the M-profile.
4262 // NOTE that the deffault profile is assumed to be 'A'
4263 if (CPUProfile.empty() || CPUProfile != "M")
4264 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4265
4266 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4267 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4268 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4269 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4270 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4271 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4272 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4273
4274 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4275 // instruction set such as ARM or Thumb.
4276 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4277
4278 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4279
4280 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004281 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004282 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004283
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004284 // ACLE 6.5.1 Hardware Floating Point
4285 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004286 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004287
Yi Konga44c4d72014-06-27 21:25:42 +00004288 // ACLE predefines.
4289 Builder.defineMacro("__ARM_ACLE", "200");
4290
Mike Stump9d54bd72009-04-08 02:07:04 +00004291 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004292
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004293 // FIXME: It's more complicated than this and we don't really support
4294 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004295 // Windows on ARM does not "support" interworking
4296 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004297 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004298
David Tweed8f676532012-10-25 13:33:01 +00004299 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004300 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004301 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4302 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004303 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004304 Builder.defineMacro("__ARM_PCS", "1");
4305
David Tweed8f676532012-10-25 13:33:01 +00004306 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004307 Builder.defineMacro("__ARM_PCS_VFP", "1");
4308 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004309
Daniel Dunbar893d4752009-12-19 04:15:38 +00004310 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004311 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004312
4313 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004314 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004315
4316 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004317 Builder.defineMacro("__THUMBEL__");
4318 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004319 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004320 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004321 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004322 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4323 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004324
4325 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004326 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004327
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004328 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004329 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004330 if (FPU & VFP2FPU)
4331 Builder.defineMacro("__ARM_VFPV2__");
4332 if (FPU & VFP3FPU)
4333 Builder.defineMacro("__ARM_VFPV3__");
4334 if (FPU & VFP4FPU)
4335 Builder.defineMacro("__ARM_VFPV4__");
4336 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004337
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004338 // This only gets set when Neon instructions are actually available, unlike
4339 // the VFP define, hence the soft float and arch check. This is subtly
4340 // different from gcc, we follow the intent which was that it should be set
4341 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004342 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4343 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004344 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004345 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004346
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004347 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4348 Opts.ShortWChar ? "2" : "4");
4349
4350 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4351 Opts.ShortEnums ? "1" : "4");
4352
Bernard Ogden18b57012013-10-29 09:47:51 +00004353 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004354 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004355
Tim Northover02e38602014-02-03 17:28:04 +00004356 if (Crypto)
4357 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4358
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004359 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004360 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4362 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4363 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4364 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004365
4366 bool is5EOrAbove = (CPUArchVer >= 6 ||
4367 (CPUArchVer == 5 &&
4368 CPUArch.find('E') != StringRef::npos));
4369 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4370 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4371 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004372 }
Craig Topper3164f332014-03-11 03:39:26 +00004373 void getTargetBuiltins(const Builtin::Info *&Records,
4374 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004375 Records = BuiltinInfo;
4376 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004377 }
Craig Topper3164f332014-03-11 03:39:26 +00004378 bool isCLZForZeroUndef() const override { return false; }
4379 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004380 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004381 }
Craig Topper3164f332014-03-11 03:39:26 +00004382 void getGCCRegNames(const char * const *&Names,
4383 unsigned &NumNames) const override;
4384 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4385 unsigned &NumAliases) const override;
4386 bool validateAsmConstraint(const char *&Name,
4387 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004388 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004389 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004390 case 'l': // r0-r7
4391 case 'h': // r8-r15
4392 case 'w': // VFP Floating point register single precision
4393 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004394 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004395 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004396 case 'I':
4397 case 'J':
4398 case 'K':
4399 case 'L':
4400 case 'M':
4401 // FIXME
4402 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004403 case 'Q': // A memory address that is a single base register.
4404 Info.setAllowsMemory();
4405 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004406 case 'U': // a memory reference...
4407 switch (Name[1]) {
4408 case 'q': // ...ARMV4 ldrsb
4409 case 'v': // ...VFP load/store (reg+constant offset)
4410 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004411 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004412 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004413 case 'n': // valid address for Neon doubleword vector load/store
4414 case 'm': // valid address for Neon element and structure load/store
4415 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004416 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004417 Info.setAllowsMemory();
4418 Name++;
4419 return true;
4420 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004421 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004422 return false;
4423 }
Craig Topper3164f332014-03-11 03:39:26 +00004424 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004425 std::string R;
4426 switch (*Constraint) {
4427 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004428 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004429 Constraint++;
4430 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004431 case 'p': // 'p' should be translated to 'r' by default.
4432 R = std::string("r");
4433 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004434 default:
4435 return std::string(1, *Constraint);
4436 }
4437 return R;
4438 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004439 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004440 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004441 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004442 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004443 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004444
Bill Wendling9d1ee112012-10-25 23:28:48 +00004445 // Strip off constraint modifiers.
4446 while (Constraint[0] == '=' ||
4447 Constraint[0] == '+' ||
4448 Constraint[0] == '&')
4449 Constraint = Constraint.substr(1);
4450
4451 switch (Constraint[0]) {
4452 default: break;
4453 case 'r': {
4454 switch (Modifier) {
4455 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004456 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004457 case 'q':
4458 // A register of size 32 cannot fit a vector type.
4459 return false;
4460 }
4461 }
4462 }
4463
4464 return true;
4465 }
Craig Topper3164f332014-03-11 03:39:26 +00004466 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004467 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004468 return "";
4469 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004470
Craig Topper3164f332014-03-11 03:39:26 +00004471 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004472 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4473 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004474
Craig Topper3164f332014-03-11 03:39:26 +00004475 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004476 if (RegNo == 0) return 0;
4477 if (RegNo == 1) return 1;
4478 return -1;
4479 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004480};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004481
Rafael Espindolaeb265472013-08-21 21:59:03 +00004482bool ARMTargetInfo::setFPMath(StringRef Name) {
4483 if (Name == "neon") {
4484 FPMath = FP_Neon;
4485 return true;
4486 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4487 Name == "vfp4") {
4488 FPMath = FP_VFP;
4489 return true;
4490 }
4491 return false;
4492}
4493
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004494const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004495 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004496 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004497 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4498
4499 // Float registers
4500 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4501 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4502 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004503 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004504
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004505 // Double registers
4506 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4507 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004508 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4509 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004510
4511 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004512 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4513 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004514};
4515
4516void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004517 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004518 Names = GCCRegNames;
4519 NumNames = llvm::array_lengthof(GCCRegNames);
4520}
4521
4522const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004523 { { "a1" }, "r0" },
4524 { { "a2" }, "r1" },
4525 { { "a3" }, "r2" },
4526 { { "a4" }, "r3" },
4527 { { "v1" }, "r4" },
4528 { { "v2" }, "r5" },
4529 { { "v3" }, "r6" },
4530 { { "v4" }, "r7" },
4531 { { "v5" }, "r8" },
4532 { { "v6", "rfp" }, "r9" },
4533 { { "sl" }, "r10" },
4534 { { "fp" }, "r11" },
4535 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004536 { { "r13" }, "sp" },
4537 { { "r14" }, "lr" },
4538 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004539 // The S, D and Q registers overlap, but aren't really aliases; we
4540 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004541};
4542
4543void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4544 unsigned &NumAliases) const {
4545 Aliases = GCCRegAliases;
4546 NumAliases = llvm::array_lengthof(GCCRegAliases);
4547}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004548
4549const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004550#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004551#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004552 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004553#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004554
4555#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004556#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004557#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4558 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004559#include "clang/Basic/BuiltinsARM.def"
4560};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004561
4562class ARMleTargetInfo : public ARMTargetInfo {
4563public:
4564 ARMleTargetInfo(const llvm::Triple &Triple)
4565 : ARMTargetInfo(Triple, false) { }
4566 virtual void getTargetDefines(const LangOptions &Opts,
4567 MacroBuilder &Builder) const {
4568 Builder.defineMacro("__ARMEL__");
4569 ARMTargetInfo::getTargetDefines(Opts, Builder);
4570 }
4571};
4572
4573class ARMbeTargetInfo : public ARMTargetInfo {
4574public:
4575 ARMbeTargetInfo(const llvm::Triple &Triple)
4576 : ARMTargetInfo(Triple, true) { }
4577 virtual void getTargetDefines(const LangOptions &Opts,
4578 MacroBuilder &Builder) const {
4579 Builder.defineMacro("__ARMEB__");
4580 Builder.defineMacro("__ARM_BIG_ENDIAN");
4581 ARMTargetInfo::getTargetDefines(Opts, Builder);
4582 }
4583};
Chris Lattner17df24e2008-04-21 18:56:49 +00004584
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004585class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4586 const llvm::Triple Triple;
4587public:
4588 WindowsARMTargetInfo(const llvm::Triple &Triple)
4589 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4590 TLSSupported = false;
4591 WCharType = UnsignedShort;
4592 SizeType = UnsignedInt;
4593 UserLabelPrefix = "";
4594 }
4595 void getVisualStudioDefines(const LangOptions &Opts,
4596 MacroBuilder &Builder) const {
4597 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4598
4599 // FIXME: this is invalid for WindowsCE
4600 Builder.defineMacro("_M_ARM_NT", "1");
4601 Builder.defineMacro("_M_ARMT", "_M_ARM");
4602 Builder.defineMacro("_M_THUMB", "_M_ARM");
4603
4604 assert((Triple.getArch() == llvm::Triple::arm ||
4605 Triple.getArch() == llvm::Triple::thumb) &&
4606 "invalid architecture for Windows ARM target info");
4607 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4608 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4609
4610 // TODO map the complete set of values
4611 // 31: VFPv3 40: VFPv4
4612 Builder.defineMacro("_M_ARM_FP", "31");
4613 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004614 BuiltinVaListKind getBuiltinVaListKind() const override {
4615 return TargetInfo::CharPtrBuiltinVaList;
4616 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004617};
4618
4619// Windows ARM + Itanium C++ ABI Target
4620class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4621public:
4622 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4623 : WindowsARMTargetInfo(Triple) {
4624 TheCXXABI.set(TargetCXXABI::GenericARM);
4625 }
4626
4627 void getTargetDefines(const LangOptions &Opts,
4628 MacroBuilder &Builder) const override {
4629 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4630
4631 if (Opts.MSVCCompat)
4632 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4633 }
4634};
4635
4636// Windows ARM, MS (C++) ABI
4637class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4638public:
4639 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4640 : WindowsARMTargetInfo(Triple) {
4641 TheCXXABI.set(TargetCXXABI::Microsoft);
4642 }
4643
4644 void getTargetDefines(const LangOptions &Opts,
4645 MacroBuilder &Builder) const override {
4646 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4647 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4648 }
4649};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004650
Mike Stump11289f42009-09-09 15:08:12 +00004651class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004652 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004653protected:
Craig Topper3164f332014-03-11 03:39:26 +00004654 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4655 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004656 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004657 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004658
Torok Edwinb2b37c62009-06-30 17:10:35 +00004659public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004660 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004661 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004662 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004663 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004664 // FIXME: This should be based off of the target features in
4665 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004666 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004667
4668 // Darwin on iOS uses a variant of the ARM C++ ABI.
4669 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004670 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004671};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004672
Tim Northover573cbee2014-05-24 12:52:07 +00004673class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004674 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004675 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4676 static const char *const GCCRegNames[];
4677
James Molloy75f5f9e2014-04-16 15:33:48 +00004678 enum FPUModeEnum {
4679 FPUMode,
4680 NeonMode
4681 };
4682
4683 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004684 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004685 unsigned Crypto;
4686
Tim Northovera2ee4332014-03-29 15:09:45 +00004687 static const Builtin::Info BuiltinInfo[];
4688
4689 std::string ABI;
4690
4691public:
Tim Northover573cbee2014-05-24 12:52:07 +00004692 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004693 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004694
4695 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4696 WCharType = SignedInt;
4697
4698 // NetBSD apparently prefers consistency across ARM targets to consistency
4699 // across 64-bit targets.
4700 Int64Type = SignedLongLong;
4701 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004702 } else {
4703 WCharType = UnsignedInt;
4704 Int64Type = SignedLong;
4705 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004706 }
4707
Tim Northovera2ee4332014-03-29 15:09:45 +00004708 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004709 MaxVectorAlign = 128;
4710 RegParmMax = 8;
4711 MaxAtomicInlineWidth = 128;
4712 MaxAtomicPromoteWidth = 128;
4713
Tim Northovera6a19f12015-02-06 01:25:07 +00004714 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004715 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4716
Tim Northovera2ee4332014-03-29 15:09:45 +00004717 // {} in inline assembly are neon specifiers, not assembly variant
4718 // specifiers.
4719 NoAsmVariants = true;
4720
Tim Northover7ad87af2015-01-16 18:44:04 +00004721 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4722 // contributes to the alignment of the containing aggregate in the same way
4723 // a plain (non bit-field) member of that type would, without exception for
4724 // zero-sized or anonymous bit-fields."
4725 UseBitFieldTypeAlignment = true;
4726 UseZeroLengthBitfieldAlignment = true;
4727
Tim Northover573cbee2014-05-24 12:52:07 +00004728 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004729 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4730 }
4731
Alp Toker4925ba72014-06-07 23:30:42 +00004732 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004733 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004734 if (Name != "aapcs" && Name != "darwinpcs")
4735 return false;
4736
4737 ABI = Name;
4738 return true;
4739 }
4740
David Blaikie1cbb9712014-11-14 19:09:44 +00004741 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004742 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004743 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004744 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004745 .Case("cyclone", true)
4746 .Default(false);
4747 return CPUKnown;
4748 }
4749
4750 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004751 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004752 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004753 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004754
4755 // Target properties.
4756 Builder.defineMacro("_LP64");
4757 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004758
4759 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4760 Builder.defineMacro("__ARM_ACLE", "200");
4761 Builder.defineMacro("__ARM_ARCH", "8");
4762 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4763
4764 Builder.defineMacro("__ARM_64BIT_STATE");
4765 Builder.defineMacro("__ARM_PCS_AAPCS64");
4766 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4767
4768 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4769 Builder.defineMacro("__ARM_FEATURE_CLZ");
4770 Builder.defineMacro("__ARM_FEATURE_FMA");
4771 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004772 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4773 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4774 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4775 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004776
4777 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4778
4779 // 0xe implies support for half, single and double precision operations.
4780 Builder.defineMacro("__ARM_FP", "0xe");
4781
4782 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4783 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4784 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4785
4786 if (Opts.FastMath || Opts.FiniteMathOnly)
4787 Builder.defineMacro("__ARM_FP_FAST");
4788
Richard Smithab506ad2014-10-20 23:26:58 +00004789 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004790 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4791
4792 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4793
4794 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4795 Opts.ShortEnums ? "1" : "4");
4796
James Molloy75f5f9e2014-04-16 15:33:48 +00004797 if (FPU == NeonMode) {
4798 Builder.defineMacro("__ARM_NEON");
4799 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004800 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004801 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004802
Bradley Smith418c5932014-05-02 15:17:51 +00004803 if (CRC)
4804 Builder.defineMacro("__ARM_FEATURE_CRC32");
4805
James Molloy75f5f9e2014-04-16 15:33:48 +00004806 if (Crypto)
4807 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004808 }
4809
4810 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004811 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004812 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004813 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004814 }
4815
David Blaikie1cbb9712014-11-14 19:09:44 +00004816 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004817 return Feature == "aarch64" ||
4818 Feature == "arm64" ||
4819 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004820 }
4821
James Molloy5e73df52014-04-16 15:06:20 +00004822 bool handleTargetFeatures(std::vector<std::string> &Features,
4823 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004824 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004825 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004826 Crypto = 0;
4827 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4828 if (Features[i] == "+neon")
4829 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004830 if (Features[i] == "+crc")
4831 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004832 if (Features[i] == "+crypto")
4833 Crypto = 1;
4834 }
4835
James Molloy5e73df52014-04-16 15:06:20 +00004836 setDescriptionString();
4837
4838 return true;
4839 }
4840
David Blaikie1cbb9712014-11-14 19:09:44 +00004841 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004842
David Blaikie1cbb9712014-11-14 19:09:44 +00004843 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004844 return TargetInfo::AArch64ABIBuiltinVaList;
4845 }
4846
4847 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004848 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004849 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004850 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004851
Eric Christopher917e9522014-11-18 22:36:15 +00004852 virtual bool
4853 validateAsmConstraint(const char *&Name,
4854 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004855 switch (*Name) {
4856 default:
4857 return false;
4858 case 'w': // Floating point and SIMD registers (V0-V31)
4859 Info.setAllowsRegister();
4860 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004861 case 'I': // Constant that can be used with an ADD instruction
4862 case 'J': // Constant that can be used with a SUB instruction
4863 case 'K': // Constant that can be used with a 32-bit logical instruction
4864 case 'L': // Constant that can be used with a 64-bit logical instruction
4865 case 'M': // Constant that can be used as a 32-bit MOV immediate
4866 case 'N': // Constant that can be used as a 64-bit MOV immediate
4867 case 'Y': // Floating point constant zero
4868 case 'Z': // Integer constant zero
4869 return true;
4870 case 'Q': // A memory reference with base register and no offset
4871 Info.setAllowsMemory();
4872 return true;
4873 case 'S': // A symbolic address
4874 Info.setAllowsRegister();
4875 return true;
4876 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004877 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4878 // Utf: A memory address suitable for ldp/stp in TF mode.
4879 // Usa: An absolute symbolic address.
4880 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4881 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004882 case 'z': // Zero register, wzr or xzr
4883 Info.setAllowsRegister();
4884 return true;
4885 case 'x': // Floating point and SIMD registers (V0-V15)
4886 Info.setAllowsRegister();
4887 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004888 }
4889 return false;
4890 }
4891
Akira Hatanaka987f1862014-08-22 06:05:21 +00004892 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004893 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004894 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004895 // Strip off constraint modifiers.
4896 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4897 Constraint = Constraint.substr(1);
4898
4899 switch (Constraint[0]) {
4900 default:
4901 return true;
4902 case 'z':
4903 case 'r': {
4904 switch (Modifier) {
4905 case 'x':
4906 case 'w':
4907 // For now assume that the person knows what they're
4908 // doing with the modifier.
4909 return true;
4910 default:
4911 // By default an 'r' constraint will be in the 'x'
4912 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004913 if (Size == 64)
4914 return true;
4915
4916 SuggestedModifier = "w";
4917 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004918 }
4919 }
4920 }
4921 }
4922
David Blaikie1cbb9712014-11-14 19:09:44 +00004923 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004924
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004925 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004926 if (RegNo == 0)
4927 return 0;
4928 if (RegNo == 1)
4929 return 1;
4930 return -1;
4931 }
4932};
4933
Tim Northover573cbee2014-05-24 12:52:07 +00004934const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004935 // 32-bit Integer registers
4936 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4937 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4938 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4939
4940 // 64-bit Integer registers
4941 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4942 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4943 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4944
4945 // 32-bit floating point regsisters
4946 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4947 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4948 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4949
4950 // 64-bit floating point regsisters
4951 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4952 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4953 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4954
4955 // Vector registers
4956 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4957 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4958 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4959};
4960
Tim Northover573cbee2014-05-24 12:52:07 +00004961void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004962 unsigned &NumNames) const {
4963 Names = GCCRegNames;
4964 NumNames = llvm::array_lengthof(GCCRegNames);
4965}
4966
Tim Northover573cbee2014-05-24 12:52:07 +00004967const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004968 { { "w31" }, "wsp" },
4969 { { "x29" }, "fp" },
4970 { { "x30" }, "lr" },
4971 { { "x31" }, "sp" },
4972 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4973 // don't want to substitute one of these for a different-sized one.
4974};
4975
Tim Northover573cbee2014-05-24 12:52:07 +00004976void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004977 unsigned &NumAliases) const {
4978 Aliases = GCCRegAliases;
4979 NumAliases = llvm::array_lengthof(GCCRegAliases);
4980}
4981
Tim Northover573cbee2014-05-24 12:52:07 +00004982const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004983#define BUILTIN(ID, TYPE, ATTRS) \
4984 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4985#include "clang/Basic/BuiltinsNEON.def"
4986
4987#define BUILTIN(ID, TYPE, ATTRS) \
4988 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004989#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004990};
James Molloy5e73df52014-04-16 15:06:20 +00004991
Tim Northover573cbee2014-05-24 12:52:07 +00004992class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004993 void setDescriptionString() override {
4994 if (getTriple().isOSBinFormatMachO())
4995 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4996 else
4997 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4998 }
4999
5000public:
Tim Northover573cbee2014-05-24 12:52:07 +00005001 AArch64leTargetInfo(const llvm::Triple &Triple)
5002 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005003 BigEndian = false;
5004 }
5005 void getTargetDefines(const LangOptions &Opts,
5006 MacroBuilder &Builder) const override {
5007 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005008 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005009 }
5010};
5011
Tim Northover573cbee2014-05-24 12:52:07 +00005012class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005013 void setDescriptionString() override {
5014 assert(!getTriple().isOSBinFormatMachO());
5015 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5016 }
5017
5018public:
Tim Northover573cbee2014-05-24 12:52:07 +00005019 AArch64beTargetInfo(const llvm::Triple &Triple)
5020 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005021 void getTargetDefines(const LangOptions &Opts,
5022 MacroBuilder &Builder) const override {
5023 Builder.defineMacro("__AARCH64EB__");
5024 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5025 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005026 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005027 }
5028};
Tim Northovera2ee4332014-03-29 15:09:45 +00005029
Tim Northover573cbee2014-05-24 12:52:07 +00005030class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005031protected:
5032 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5033 MacroBuilder &Builder) const override {
5034 Builder.defineMacro("__AARCH64_SIMD__");
5035 Builder.defineMacro("__ARM64_ARCH_8__");
5036 Builder.defineMacro("__ARM_NEON__");
5037 Builder.defineMacro("__LITTLE_ENDIAN__");
5038 Builder.defineMacro("__REGISTER_PREFIX__", "");
5039 Builder.defineMacro("__arm64", "1");
5040 Builder.defineMacro("__arm64__", "1");
5041
5042 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5043 }
5044
Tim Northovera2ee4332014-03-29 15:09:45 +00005045public:
Tim Northover573cbee2014-05-24 12:52:07 +00005046 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5047 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005048 Int64Type = SignedLongLong;
5049 WCharType = SignedInt;
5050 UseSignedCharForObjCBool = false;
5051
Tim Northovera6a19f12015-02-06 01:25:07 +00005052 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005053 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5054
5055 TheCXXABI.set(TargetCXXABI::iOS64);
5056 }
5057
David Blaikie1cbb9712014-11-14 19:09:44 +00005058 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005059 return TargetInfo::CharPtrBuiltinVaList;
5060 }
5061};
Tim Northovera2ee4332014-03-29 15:09:45 +00005062
Tony Linthicum76329bf2011-12-12 21:14:55 +00005063// Hexagon abstract base class
5064class HexagonTargetInfo : public TargetInfo {
5065 static const Builtin::Info BuiltinInfo[];
5066 static const char * const GCCRegNames[];
5067 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5068 std::string CPU;
5069public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005070 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005071 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005072 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005073
5074 // {} in inline assembly are packet specifiers, not assembly variant
5075 // specifiers.
5076 NoAsmVariants = true;
5077 }
5078
Craig Topper3164f332014-03-11 03:39:26 +00005079 void getTargetBuiltins(const Builtin::Info *&Records,
5080 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005081 Records = BuiltinInfo;
5082 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5083 }
5084
Craig Topper3164f332014-03-11 03:39:26 +00005085 bool validateAsmConstraint(const char *&Name,
5086 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005087 return true;
5088 }
5089
Craig Topper3164f332014-03-11 03:39:26 +00005090 void getTargetDefines(const LangOptions &Opts,
5091 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005092
Craig Topper3164f332014-03-11 03:39:26 +00005093 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005094 return Feature == "hexagon";
5095 }
Craig Topper3164f332014-03-11 03:39:26 +00005096
5097 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005098 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005099 }
Craig Topper3164f332014-03-11 03:39:26 +00005100 void getGCCRegNames(const char * const *&Names,
5101 unsigned &NumNames) const override;
5102 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5103 unsigned &NumAliases) const override;
5104 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005105 return "";
5106 }
Sebastian Pop86500282012-01-13 20:37:10 +00005107
5108 static const char *getHexagonCPUSuffix(StringRef Name) {
5109 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005110 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005111 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005112 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005113 }
5114
Craig Topper3164f332014-03-11 03:39:26 +00005115 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005116 if (!getHexagonCPUSuffix(Name))
5117 return false;
5118
Tony Linthicum76329bf2011-12-12 21:14:55 +00005119 CPU = Name;
5120 return true;
5121 }
5122};
5123
5124void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5125 MacroBuilder &Builder) const {
5126 Builder.defineMacro("qdsp6");
5127 Builder.defineMacro("__qdsp6", "1");
5128 Builder.defineMacro("__qdsp6__", "1");
5129
5130 Builder.defineMacro("hexagon");
5131 Builder.defineMacro("__hexagon", "1");
5132 Builder.defineMacro("__hexagon__", "1");
5133
5134 if(CPU == "hexagonv1") {
5135 Builder.defineMacro("__HEXAGON_V1__");
5136 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5137 if(Opts.HexagonQdsp6Compat) {
5138 Builder.defineMacro("__QDSP6_V1__");
5139 Builder.defineMacro("__QDSP6_ARCH__", "1");
5140 }
5141 }
5142 else if(CPU == "hexagonv2") {
5143 Builder.defineMacro("__HEXAGON_V2__");
5144 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5145 if(Opts.HexagonQdsp6Compat) {
5146 Builder.defineMacro("__QDSP6_V2__");
5147 Builder.defineMacro("__QDSP6_ARCH__", "2");
5148 }
5149 }
5150 else if(CPU == "hexagonv3") {
5151 Builder.defineMacro("__HEXAGON_V3__");
5152 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5153 if(Opts.HexagonQdsp6Compat) {
5154 Builder.defineMacro("__QDSP6_V3__");
5155 Builder.defineMacro("__QDSP6_ARCH__", "3");
5156 }
5157 }
5158 else if(CPU == "hexagonv4") {
5159 Builder.defineMacro("__HEXAGON_V4__");
5160 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5161 if(Opts.HexagonQdsp6Compat) {
5162 Builder.defineMacro("__QDSP6_V4__");
5163 Builder.defineMacro("__QDSP6_ARCH__", "4");
5164 }
5165 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005166 else if(CPU == "hexagonv5") {
5167 Builder.defineMacro("__HEXAGON_V5__");
5168 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5169 if(Opts.HexagonQdsp6Compat) {
5170 Builder.defineMacro("__QDSP6_V5__");
5171 Builder.defineMacro("__QDSP6_ARCH__", "5");
5172 }
5173 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005174}
5175
5176const char * const HexagonTargetInfo::GCCRegNames[] = {
5177 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5178 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5179 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5180 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5181 "p0", "p1", "p2", "p3",
5182 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5183};
5184
5185void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5186 unsigned &NumNames) const {
5187 Names = GCCRegNames;
5188 NumNames = llvm::array_lengthof(GCCRegNames);
5189}
5190
5191
5192const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5193 { { "sp" }, "r29" },
5194 { { "fp" }, "r30" },
5195 { { "lr" }, "r31" },
5196 };
5197
5198void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5199 unsigned &NumAliases) const {
5200 Aliases = GCCRegAliases;
5201 NumAliases = llvm::array_lengthof(GCCRegAliases);
5202}
5203
5204
5205const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5206#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5207#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5208 ALL_LANGUAGES },
5209#include "clang/Basic/BuiltinsHexagon.def"
5210};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005211
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005212// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5213class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005214 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5215 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005216 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005217public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005218 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005219
Craig Topper3164f332014-03-11 03:39:26 +00005220 bool handleTargetFeatures(std::vector<std::string> &Features,
5221 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005222 SoftFloat = false;
5223 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5224 if (Features[i] == "+soft-float")
5225 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005226 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005227 }
Craig Topper3164f332014-03-11 03:39:26 +00005228 void getTargetDefines(const LangOptions &Opts,
5229 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005230 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005231 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005232
5233 if (SoftFloat)
5234 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005235 }
Craig Topper3164f332014-03-11 03:39:26 +00005236
5237 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005238 return llvm::StringSwitch<bool>(Feature)
5239 .Case("softfloat", SoftFloat)
5240 .Case("sparc", true)
5241 .Default(false);
5242 }
Craig Topper3164f332014-03-11 03:39:26 +00005243
5244 void getTargetBuiltins(const Builtin::Info *&Records,
5245 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005246 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005247 }
Craig Topper3164f332014-03-11 03:39:26 +00005248 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005249 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005250 }
Craig Topper3164f332014-03-11 03:39:26 +00005251 void getGCCRegNames(const char * const *&Names,
5252 unsigned &NumNames) const override;
5253 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5254 unsigned &NumAliases) const override;
5255 bool validateAsmConstraint(const char *&Name,
5256 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005257 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005258 switch (*Name) {
5259 case 'I': // Signed 13-bit constant
5260 case 'J': // Zero
5261 case 'K': // 32-bit constant with the low 12 bits clear
5262 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5263 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5264 case 'N': // Same as 'K' but zext (required for SIMode)
5265 case 'O': // The constant 4096
5266 return true;
5267 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005268 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005269 }
Craig Topper3164f332014-03-11 03:39:26 +00005270 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005271 // FIXME: Implement!
5272 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005273 }
5274};
5275
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005276const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005277 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5278 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5279 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5280 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5281};
5282
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005283void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5284 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005285 Names = GCCRegNames;
5286 NumNames = llvm::array_lengthof(GCCRegNames);
5287}
5288
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005289const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005290 { { "g0" }, "r0" },
5291 { { "g1" }, "r1" },
5292 { { "g2" }, "r2" },
5293 { { "g3" }, "r3" },
5294 { { "g4" }, "r4" },
5295 { { "g5" }, "r5" },
5296 { { "g6" }, "r6" },
5297 { { "g7" }, "r7" },
5298 { { "o0" }, "r8" },
5299 { { "o1" }, "r9" },
5300 { { "o2" }, "r10" },
5301 { { "o3" }, "r11" },
5302 { { "o4" }, "r12" },
5303 { { "o5" }, "r13" },
5304 { { "o6", "sp" }, "r14" },
5305 { { "o7" }, "r15" },
5306 { { "l0" }, "r16" },
5307 { { "l1" }, "r17" },
5308 { { "l2" }, "r18" },
5309 { { "l3" }, "r19" },
5310 { { "l4" }, "r20" },
5311 { { "l5" }, "r21" },
5312 { { "l6" }, "r22" },
5313 { { "l7" }, "r23" },
5314 { { "i0" }, "r24" },
5315 { { "i1" }, "r25" },
5316 { { "i2" }, "r26" },
5317 { { "i3" }, "r27" },
5318 { { "i4" }, "r28" },
5319 { { "i5" }, "r29" },
5320 { { "i6", "fp" }, "r30" },
5321 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005322};
5323
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005324void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5325 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005326 Aliases = GCCRegAliases;
5327 NumAliases = llvm::array_lengthof(GCCRegAliases);
5328}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005329
5330// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5331class SparcV8TargetInfo : public SparcTargetInfo {
5332public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005333 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005334 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005335 }
5336
Craig Topper3164f332014-03-11 03:39:26 +00005337 void getTargetDefines(const LangOptions &Opts,
5338 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005339 SparcTargetInfo::getTargetDefines(Opts, Builder);
5340 Builder.defineMacro("__sparcv8");
5341 }
5342};
5343
5344// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5345class SparcV9TargetInfo : public SparcTargetInfo {
5346public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005347 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005348 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005349 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005350 // This is an LP64 platform.
5351 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005352
5353 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005354 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005355 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005356 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005357 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005358 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005359
5360 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5361 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5362 LongDoubleWidth = 128;
5363 LongDoubleAlign = 128;
5364 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005365 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005366 }
5367
Craig Topper3164f332014-03-11 03:39:26 +00005368 void getTargetDefines(const LangOptions &Opts,
5369 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005370 SparcTargetInfo::getTargetDefines(Opts, Builder);
5371 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005372 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005373 // Solaris doesn't need these variants, but the BSDs do.
5374 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005375 Builder.defineMacro("__sparc64__");
5376 Builder.defineMacro("__sparc_v9__");
5377 Builder.defineMacro("__sparcv9__");
5378 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005379 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005380
Craig Topper3164f332014-03-11 03:39:26 +00005381 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005382 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5383 .Case("v9", true)
5384 .Case("ultrasparc", true)
5385 .Case("ultrasparc3", true)
5386 .Case("niagara", true)
5387 .Case("niagara2", true)
5388 .Case("niagara3", true)
5389 .Case("niagara4", true)
5390 .Default(false);
5391
5392 // No need to store the CPU yet. There aren't any CPU-specific
5393 // macros to define.
5394 return CPUKnown;
5395 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005396};
5397
Torok Edwinb2b37c62009-06-30 17:10:35 +00005398class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005399public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005400 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5401 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005402 SizeType = UnsignedInt;
5403 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005404 }
5405};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005406
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005407class SystemZTargetInfo : public TargetInfo {
5408 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005409
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005410public:
5411 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5412 TLSSupported = true;
5413 IntWidth = IntAlign = 32;
5414 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5415 PointerWidth = PointerAlign = 64;
5416 LongDoubleWidth = 128;
5417 LongDoubleAlign = 64;
5418 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5419 MinGlobalAlign = 16;
5420 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5421 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5422 }
5423 void getTargetDefines(const LangOptions &Opts,
5424 MacroBuilder &Builder) const override {
5425 Builder.defineMacro("__s390__");
5426 Builder.defineMacro("__s390x__");
5427 Builder.defineMacro("__zarch__");
5428 Builder.defineMacro("__LONG_DOUBLE_128__");
5429 }
5430 void getTargetBuiltins(const Builtin::Info *&Records,
5431 unsigned &NumRecords) const override {
5432 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005433 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005434 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005435 }
5436
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005437 void getGCCRegNames(const char *const *&Names,
5438 unsigned &NumNames) const override;
5439 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5440 unsigned &NumAliases) const override {
5441 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005442 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005443 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005444 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005445 bool validateAsmConstraint(const char *&Name,
5446 TargetInfo::ConstraintInfo &info) const override;
5447 const char *getClobbers() const override {
5448 // FIXME: Is this really right?
5449 return "";
5450 }
5451 BuiltinVaListKind getBuiltinVaListKind() const override {
5452 return TargetInfo::SystemZBuiltinVaList;
5453 }
5454 bool setCPU(const std::string &Name) override {
5455 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5456 .Case("z10", true)
5457 .Case("z196", true)
5458 .Case("zEC12", true)
5459 .Default(false);
5460
5461 // No need to store the CPU yet. There aren't any CPU-specific
5462 // macros to define.
5463 return CPUKnown;
5464 }
5465};
5466
5467const char *const SystemZTargetInfo::GCCRegNames[] = {
5468 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5469 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5470 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5471 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5472};
5473
5474void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5475 unsigned &NumNames) const {
5476 Names = GCCRegNames;
5477 NumNames = llvm::array_lengthof(GCCRegNames);
5478}
5479
5480bool SystemZTargetInfo::
5481validateAsmConstraint(const char *&Name,
5482 TargetInfo::ConstraintInfo &Info) const {
5483 switch (*Name) {
5484 default:
5485 return false;
5486
5487 case 'a': // Address register
5488 case 'd': // Data register (equivalent to 'r')
5489 case 'f': // Floating-point register
5490 Info.setAllowsRegister();
5491 return true;
5492
5493 case 'I': // Unsigned 8-bit constant
5494 case 'J': // Unsigned 12-bit constant
5495 case 'K': // Signed 16-bit constant
5496 case 'L': // Signed 20-bit displacement (on all targets we support)
5497 case 'M': // 0x7fffffff
5498 return true;
5499
5500 case 'Q': // Memory with base and unsigned 12-bit displacement
5501 case 'R': // Likewise, plus an index
5502 case 'S': // Memory with base and signed 20-bit displacement
5503 case 'T': // Likewise, plus an index
5504 Info.setAllowsMemory();
5505 return true;
5506 }
5507}
Ulrich Weigand47445072013-05-06 16:26:41 +00005508
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005509 class MSP430TargetInfo : public TargetInfo {
5510 static const char * const GCCRegNames[];
5511 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005512 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005513 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005514 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005515 IntWidth = 16; IntAlign = 16;
5516 LongWidth = 32; LongLongWidth = 64;
5517 LongAlign = LongLongAlign = 16;
5518 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005519 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005520 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005521 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005522 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005523 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005524 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005525 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005526 }
5527 void getTargetDefines(const LangOptions &Opts,
5528 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005529 Builder.defineMacro("MSP430");
5530 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005531 // FIXME: defines for different 'flavours' of MCU
5532 }
Craig Topper3164f332014-03-11 03:39:26 +00005533 void getTargetBuiltins(const Builtin::Info *&Records,
5534 unsigned &NumRecords) const override {
5535 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005536 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005537 NumRecords = 0;
5538 }
Craig Topper3164f332014-03-11 03:39:26 +00005539 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005540 return Feature == "msp430";
5541 }
Craig Topper3164f332014-03-11 03:39:26 +00005542 void getGCCRegNames(const char * const *&Names,
5543 unsigned &NumNames) const override;
5544 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5545 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005546 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005547 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005548 NumAliases = 0;
5549 }
Eric Christopher917e9522014-11-18 22:36:15 +00005550 bool
5551 validateAsmConstraint(const char *&Name,
5552 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005553 // FIXME: implement
5554 switch (*Name) {
5555 case 'K': // the constant 1
5556 case 'L': // constant -1^20 .. 1^19
5557 case 'M': // constant 1-4:
5558 return true;
5559 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005560 // No target constraints for now.
5561 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005562 }
Craig Topper3164f332014-03-11 03:39:26 +00005563 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005564 // FIXME: Is this really right?
5565 return "";
5566 }
Craig Topper3164f332014-03-11 03:39:26 +00005567 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005568 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005569 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005570 }
5571 };
5572
5573 const char * const MSP430TargetInfo::GCCRegNames[] = {
5574 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5575 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5576 };
5577
5578 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5579 unsigned &NumNames) const {
5580 Names = GCCRegNames;
5581 NumNames = llvm::array_lengthof(GCCRegNames);
5582 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005583
Mike Stump11289f42009-09-09 15:08:12 +00005584 // LLVM and Clang cannot be used directly to output native binaries for
5585 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005586 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005587 //
5588 // TCE uses the llvm bitcode as input and uses it for generating customized
5589 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005590 // publicly available in http://tce.cs.tut.fi
5591
Eli Friedman1f191002011-10-07 19:51:42 +00005592 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5593 3, // opencl_global
5594 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005595 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005596 // FIXME: generic has to be added to the target
5597 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005598 0, // cuda_device
5599 0, // cuda_constant
5600 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005601 };
5602
Eli Friedmana9c3d712009-08-19 20:47:07 +00005603 class TCETargetInfo : public TargetInfo{
5604 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005605 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005606 TLSSupported = false;
5607 IntWidth = 32;
5608 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005609 PointerWidth = 32;
5610 IntAlign = 32;
5611 LongAlign = LongLongAlign = 32;
5612 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005613 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005614 SizeType = UnsignedInt;
5615 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005616 IntPtrType = SignedInt;
5617 PtrDiffType = SignedInt;
5618 FloatWidth = 32;
5619 FloatAlign = 32;
5620 DoubleWidth = 32;
5621 DoubleAlign = 32;
5622 LongDoubleWidth = 32;
5623 LongDoubleAlign = 32;
5624 FloatFormat = &llvm::APFloat::IEEEsingle;
5625 DoubleFormat = &llvm::APFloat::IEEEsingle;
5626 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005627 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5628 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005629 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005630 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005631 }
5632
Craig Topper3164f332014-03-11 03:39:26 +00005633 void getTargetDefines(const LangOptions &Opts,
5634 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005635 DefineStd(Builder, "tce", Opts);
5636 Builder.defineMacro("__TCE__");
5637 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005638 }
Craig Topper3164f332014-03-11 03:39:26 +00005639 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005640 return Feature == "tce";
5641 }
Craig Topper3164f332014-03-11 03:39:26 +00005642
5643 void getTargetBuiltins(const Builtin::Info *&Records,
5644 unsigned &NumRecords) const override {}
5645 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005646 return "";
5647 }
Craig Topper3164f332014-03-11 03:39:26 +00005648 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005649 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005650 }
Craig Topper3164f332014-03-11 03:39:26 +00005651 void getGCCRegNames(const char * const *&Names,
5652 unsigned &NumNames) const override {}
5653 bool validateAsmConstraint(const char *&Name,
5654 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005655 return true;
5656 }
Craig Topper3164f332014-03-11 03:39:26 +00005657 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5658 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005659 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005660
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005661class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005662 virtual void setDescriptionString() = 0;
5663
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005664 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005665 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005666 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005667 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005668 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005669 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005670 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005671 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005672 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005673 enum DspRevEnum {
5674 NoDSP, DSP1, DSP2
5675 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005676 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005677
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005678protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005679 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005680 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005681
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005682public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005683 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5684 const std::string &CPUStr)
5685 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005686 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005687 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5688 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5689 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005690
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005691 bool isNaN2008Default() const {
5692 return CPU == "mips32r6" || CPU == "mips64r6";
5693 }
5694
5695 bool isFP64Default() const {
5696 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5697 }
5698
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005699 bool isNan2008() const override {
5700 return IsNan2008;
5701 }
5702
Alp Toker4925ba72014-06-07 23:30:42 +00005703 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005704 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005705 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5706 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005707 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005708 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005709 .Case("mips1", IsMips32)
5710 .Case("mips2", IsMips32)
5711 .Case("mips3", true)
5712 .Case("mips4", true)
5713 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005714 .Case("mips32", IsMips32)
5715 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005716 .Case("mips32r3", IsMips32)
5717 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005718 .Case("mips32r6", IsMips32)
5719 .Case("mips64", true)
5720 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005721 .Case("mips64r3", true)
5722 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005723 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005724 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005725 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005726 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005727 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005728 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005729 if (CPU == "octeon")
5730 Features["mips64r2"] = Features["cnmips"] = true;
5731 else
5732 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005733 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005734
Craig Topper3164f332014-03-11 03:39:26 +00005735 void getTargetDefines(const LangOptions &Opts,
5736 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005737 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005738 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005739 if (Opts.GNUMode)
5740 Builder.defineMacro("mips");
5741
Simon Atanasyan683535b2012-08-29 19:14:58 +00005742 Builder.defineMacro("__REGISTER_PREFIX__", "");
5743
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005744 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005745 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005746 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005747 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005748 case SoftFloat:
5749 Builder.defineMacro("__mips_soft_float", Twine(1));
5750 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005751 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005752
Simon Atanasyan16071912013-04-14 14:07:30 +00005753 if (IsSingleFloat)
5754 Builder.defineMacro("__mips_single_float", Twine(1));
5755
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005756 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5757 Builder.defineMacro("_MIPS_FPSET",
5758 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5759
Simon Atanasyan72244b62012-07-05 16:06:06 +00005760 if (IsMips16)
5761 Builder.defineMacro("__mips16", Twine(1));
5762
Simon Atanasyan60777612013-04-14 14:07:51 +00005763 if (IsMicromips)
5764 Builder.defineMacro("__mips_micromips", Twine(1));
5765
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005766 if (IsNan2008)
5767 Builder.defineMacro("__mips_nan2008", Twine(1));
5768
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005769 switch (DspRev) {
5770 default:
5771 break;
5772 case DSP1:
5773 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5774 Builder.defineMacro("__mips_dsp", Twine(1));
5775 break;
5776 case DSP2:
5777 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5778 Builder.defineMacro("__mips_dspr2", Twine(1));
5779 Builder.defineMacro("__mips_dsp", Twine(1));
5780 break;
5781 }
5782
Jack Carter44ff1e52013-08-12 17:20:29 +00005783 if (HasMSA)
5784 Builder.defineMacro("__mips_msa", Twine(1));
5785
Simon Atanasyan26f19672012-04-05 19:28:31 +00005786 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5787 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5788 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005789
5790 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5791 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005792 }
5793
Craig Topper3164f332014-03-11 03:39:26 +00005794 void getTargetBuiltins(const Builtin::Info *&Records,
5795 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005796 Records = BuiltinInfo;
5797 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005798 }
Craig Topper3164f332014-03-11 03:39:26 +00005799 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005800 return llvm::StringSwitch<bool>(Feature)
5801 .Case("mips", true)
5802 .Case("fp64", HasFP64)
5803 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005804 }
Craig Topper3164f332014-03-11 03:39:26 +00005805 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005806 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005807 }
Craig Topper3164f332014-03-11 03:39:26 +00005808 void getGCCRegNames(const char * const *&Names,
5809 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005810 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005811 // CPU register names
5812 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005813 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5814 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5815 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005816 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5817 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005818 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5819 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5820 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5821 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005822 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005823 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005824 "$fcc5","$fcc6","$fcc7",
5825 // MSA register names
5826 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5827 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5828 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5829 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5830 // MSA control register names
5831 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5832 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005833 };
5834 Names = GCCRegNames;
5835 NumNames = llvm::array_lengthof(GCCRegNames);
5836 }
Craig Topper3164f332014-03-11 03:39:26 +00005837 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5838 unsigned &NumAliases) const override = 0;
5839 bool validateAsmConstraint(const char *&Name,
5840 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005841 switch (*Name) {
5842 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005843 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005844 case 'r': // CPU registers.
5845 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005846 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005847 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005848 case 'c': // $25 for indirect jumps
5849 case 'l': // lo register
5850 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005851 Info.setAllowsRegister();
5852 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005853 case 'I': // Signed 16-bit constant
5854 case 'J': // Integer 0
5855 case 'K': // Unsigned 16-bit constant
5856 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5857 case 'M': // Constants not loadable via lui, addiu, or ori
5858 case 'N': // Constant -1 to -65535
5859 case 'O': // A signed 15-bit constant
5860 case 'P': // A constant between 1 go 65535
5861 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005862 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005863 Info.setAllowsMemory();
5864 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005865 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005866 }
5867
Craig Topper3164f332014-03-11 03:39:26 +00005868 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005869 // In GCC, $1 is not widely used in generated code (it's used only in a few
5870 // specific situations), so there is no real need for users to add it to
5871 // the clobbers list if they want to use it in their inline assembly code.
5872 //
5873 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5874 // code generation, so using it in inline assembly without adding it to the
5875 // clobbers list can cause conflicts between the inline assembly code and
5876 // the surrounding generated code.
5877 //
5878 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5879 // operands, which will conflict with the ".set at" assembler option (which
5880 // we use only for inline assembly, in order to maintain compatibility with
5881 // GCC) and will also conflict with the user's usage of $1.
5882 //
5883 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5884 // register for generated code is to automatically clobber $1 for all inline
5885 // assembly code.
5886 //
5887 // FIXME: We should automatically clobber $1 only for inline assembly code
5888 // which actually uses it. This would allow LLVM to use $1 for inline
5889 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005890 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005891 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005892
Craig Topper3164f332014-03-11 03:39:26 +00005893 bool handleTargetFeatures(std::vector<std::string> &Features,
5894 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005895 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005896 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005897 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005898 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005899 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005900 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005901 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005902
5903 for (std::vector<std::string>::iterator it = Features.begin(),
5904 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005905 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005906 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005907 else if (*it == "+soft-float")
5908 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005909 else if (*it == "+mips16")
5910 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005911 else if (*it == "+micromips")
5912 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005913 else if (*it == "+dsp")
5914 DspRev = std::max(DspRev, DSP1);
5915 else if (*it == "+dspr2")
5916 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005917 else if (*it == "+msa")
5918 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005919 else if (*it == "+fp64")
5920 HasFP64 = true;
5921 else if (*it == "-fp64")
5922 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005923 else if (*it == "+nan2008")
5924 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005925 else if (*it == "-nan2008")
5926 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005927 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005928
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005929 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005930 std::vector<std::string>::iterator it =
5931 std::find(Features.begin(), Features.end(), "+soft-float");
5932 if (it != Features.end())
5933 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005934
Akira Hatanaka9064e362013-10-29 18:30:33 +00005935 setDescriptionString();
5936
Rafael Espindolaeb265472013-08-21 21:59:03 +00005937 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005938 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005939
Craig Topper3164f332014-03-11 03:39:26 +00005940 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005941 if (RegNo == 0) return 4;
5942 if (RegNo == 1) return 5;
5943 return -1;
5944 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005945
5946 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005947};
5948
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005949const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5950#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5951#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5952 ALL_LANGUAGES },
5953#include "clang/Basic/BuiltinsMips.def"
5954};
5955
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005956class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005957public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005958 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005959 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005960 SizeType = UnsignedInt;
5961 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00005962 Int64Type = SignedLongLong;
5963 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005964 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005965 }
Craig Topper3164f332014-03-11 03:39:26 +00005966 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005967 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005968 ABI = Name;
5969 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005970 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005971 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005972 }
Craig Topper3164f332014-03-11 03:39:26 +00005973 void getTargetDefines(const LangOptions &Opts,
5974 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005975 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005976
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005977 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005978 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5979
5980 const std::string& CPUStr = getCPU();
5981 if (CPUStr == "mips32")
5982 Builder.defineMacro("__mips_isa_rev", "1");
5983 else if (CPUStr == "mips32r2")
5984 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00005985 else if (CPUStr == "mips32r3")
5986 Builder.defineMacro("__mips_isa_rev", "3");
5987 else if (CPUStr == "mips32r5")
5988 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00005989 else if (CPUStr == "mips32r6")
5990 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005991
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005992 if (ABI == "o32") {
5993 Builder.defineMacro("__mips_o32");
5994 Builder.defineMacro("_ABIO32", "1");
5995 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5996 }
5997 else if (ABI == "eabi")
5998 Builder.defineMacro("__mips_eabi");
5999 else
David Blaikie83d382b2011-09-23 05:06:16 +00006000 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006001 }
Craig Topper3164f332014-03-11 03:39:26 +00006002 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6003 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006004 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6005 { { "at" }, "$1" },
6006 { { "v0" }, "$2" },
6007 { { "v1" }, "$3" },
6008 { { "a0" }, "$4" },
6009 { { "a1" }, "$5" },
6010 { { "a2" }, "$6" },
6011 { { "a3" }, "$7" },
6012 { { "t0" }, "$8" },
6013 { { "t1" }, "$9" },
6014 { { "t2" }, "$10" },
6015 { { "t3" }, "$11" },
6016 { { "t4" }, "$12" },
6017 { { "t5" }, "$13" },
6018 { { "t6" }, "$14" },
6019 { { "t7" }, "$15" },
6020 { { "s0" }, "$16" },
6021 { { "s1" }, "$17" },
6022 { { "s2" }, "$18" },
6023 { { "s3" }, "$19" },
6024 { { "s4" }, "$20" },
6025 { { "s5" }, "$21" },
6026 { { "s6" }, "$22" },
6027 { { "s7" }, "$23" },
6028 { { "t8" }, "$24" },
6029 { { "t9" }, "$25" },
6030 { { "k0" }, "$26" },
6031 { { "k1" }, "$27" },
6032 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006033 { { "sp","$sp" }, "$29" },
6034 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006035 { { "ra" }, "$31" }
6036 };
6037 Aliases = GCCRegAliases;
6038 NumAliases = llvm::array_lengthof(GCCRegAliases);
6039 }
6040};
6041
6042class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006043 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006044 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006045 }
6046
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006047public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006048 Mips32EBTargetInfo(const llvm::Triple &Triple)
6049 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006050 }
Craig Topper3164f332014-03-11 03:39:26 +00006051 void getTargetDefines(const LangOptions &Opts,
6052 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006053 DefineStd(Builder, "MIPSEB", Opts);
6054 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006055 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006056 }
6057};
6058
6059class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006060 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006061 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006062 }
6063
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006064public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006065 Mips32ELTargetInfo(const llvm::Triple &Triple)
6066 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006067 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +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, "MIPSEL", Opts);
6072 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006073 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006074 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006075};
Akira Hatanakabef17452011-09-20 19:21:49 +00006076
6077class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006078public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006079 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006080 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006081 LongDoubleWidth = LongDoubleAlign = 128;
6082 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006083 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6084 LongDoubleWidth = LongDoubleAlign = 64;
6085 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6086 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006087 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006088 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006089 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006090 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006091
6092 void setN64ABITypes() {
6093 LongWidth = LongAlign = 64;
6094 PointerWidth = PointerAlign = 64;
6095 SizeType = UnsignedLong;
6096 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006097 Int64Type = SignedLong;
6098 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006099 }
6100
6101 void setN32ABITypes() {
6102 LongWidth = LongAlign = 32;
6103 PointerWidth = PointerAlign = 32;
6104 SizeType = UnsignedInt;
6105 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006106 Int64Type = SignedLongLong;
6107 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006108 }
6109
Craig Topper3164f332014-03-11 03:39:26 +00006110 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006111 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006112 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006113 ABI = Name;
6114 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006115 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006116 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006117 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006118 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006119 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006120 }
6121 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006122 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006123
Craig Topper3164f332014-03-11 03:39:26 +00006124 void getTargetDefines(const LangOptions &Opts,
6125 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006126 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006127
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006128 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006129 Builder.defineMacro("__mips64");
6130 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006131 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6132
6133 const std::string& CPUStr = getCPU();
6134 if (CPUStr == "mips64")
6135 Builder.defineMacro("__mips_isa_rev", "1");
6136 else if (CPUStr == "mips64r2")
6137 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006138 else if (CPUStr == "mips64r3")
6139 Builder.defineMacro("__mips_isa_rev", "3");
6140 else if (CPUStr == "mips64r5")
6141 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006142 else if (CPUStr == "mips64r6")
6143 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006144
Akira Hatanakabef17452011-09-20 19:21:49 +00006145 if (ABI == "n32") {
6146 Builder.defineMacro("__mips_n32");
6147 Builder.defineMacro("_ABIN32", "2");
6148 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6149 }
6150 else if (ABI == "n64") {
6151 Builder.defineMacro("__mips_n64");
6152 Builder.defineMacro("_ABI64", "3");
6153 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6154 }
6155 else
David Blaikie83d382b2011-09-23 05:06:16 +00006156 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006157 }
Craig Topper3164f332014-03-11 03:39:26 +00006158 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6159 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006160 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6161 { { "at" }, "$1" },
6162 { { "v0" }, "$2" },
6163 { { "v1" }, "$3" },
6164 { { "a0" }, "$4" },
6165 { { "a1" }, "$5" },
6166 { { "a2" }, "$6" },
6167 { { "a3" }, "$7" },
6168 { { "a4" }, "$8" },
6169 { { "a5" }, "$9" },
6170 { { "a6" }, "$10" },
6171 { { "a7" }, "$11" },
6172 { { "t0" }, "$12" },
6173 { { "t1" }, "$13" },
6174 { { "t2" }, "$14" },
6175 { { "t3" }, "$15" },
6176 { { "s0" }, "$16" },
6177 { { "s1" }, "$17" },
6178 { { "s2" }, "$18" },
6179 { { "s3" }, "$19" },
6180 { { "s4" }, "$20" },
6181 { { "s5" }, "$21" },
6182 { { "s6" }, "$22" },
6183 { { "s7" }, "$23" },
6184 { { "t8" }, "$24" },
6185 { { "t9" }, "$25" },
6186 { { "k0" }, "$26" },
6187 { { "k1" }, "$27" },
6188 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006189 { { "sp","$sp" }, "$29" },
6190 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006191 { { "ra" }, "$31" }
6192 };
6193 Aliases = GCCRegAliases;
6194 NumAliases = llvm::array_lengthof(GCCRegAliases);
6195 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006196
6197 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006198};
6199
6200class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006201 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006202 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006203 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 +00006204 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006205 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006206
Akira Hatanakabef17452011-09-20 19:21:49 +00006207 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006208
Akira Hatanakabef17452011-09-20 19:21:49 +00006209public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006210 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006211 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006212 void getTargetDefines(const LangOptions &Opts,
6213 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006214 DefineStd(Builder, "MIPSEB", Opts);
6215 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006216 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006217 }
6218};
6219
6220class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006221 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006222 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006223 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 +00006224 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006225 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006226 }
6227public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006228 Mips64ELTargetInfo(const llvm::Triple &Triple)
6229 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006230 // Default ABI is n64.
6231 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006232 }
Craig Topper3164f332014-03-11 03:39:26 +00006233 void getTargetDefines(const LangOptions &Opts,
6234 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006235 DefineStd(Builder, "MIPSEL", Opts);
6236 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006237 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006238 }
6239};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006240
Ivan Krasindd7403e2011-08-24 20:22:22 +00006241class PNaClTargetInfo : public TargetInfo {
6242public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006243 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006244 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006245 this->UserLabelPrefix = "";
6246 this->LongAlign = 32;
6247 this->LongWidth = 32;
6248 this->PointerAlign = 32;
6249 this->PointerWidth = 32;
6250 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006251 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006252 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006253 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006254 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006255 this->SizeType = TargetInfo::UnsignedInt;
6256 this->PtrDiffType = TargetInfo::SignedInt;
6257 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006258 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006259 }
6260
Craig Topper3164f332014-03-11 03:39:26 +00006261 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006262 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006263 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006264 Builder.defineMacro("__le32__");
6265 Builder.defineMacro("__pnacl__");
6266 }
Craig Topper3164f332014-03-11 03:39:26 +00006267 void getTargetDefines(const LangOptions &Opts,
6268 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006269 getArchDefines(Opts, Builder);
6270 }
Craig Topper3164f332014-03-11 03:39:26 +00006271 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006272 return Feature == "pnacl";
6273 }
Craig Topper3164f332014-03-11 03:39:26 +00006274 void getTargetBuiltins(const Builtin::Info *&Records,
6275 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006276 }
Craig Topper3164f332014-03-11 03:39:26 +00006277 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006278 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006279 }
Craig Topper3164f332014-03-11 03:39:26 +00006280 void getGCCRegNames(const char * const *&Names,
6281 unsigned &NumNames) const override;
6282 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6283 unsigned &NumAliases) const override;
6284 bool validateAsmConstraint(const char *&Name,
6285 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006286 return false;
6287 }
6288
Craig Topper3164f332014-03-11 03:39:26 +00006289 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006290 return "";
6291 }
6292};
6293
6294void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6295 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006296 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006297 NumNames = 0;
6298}
6299
6300void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6301 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006302 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006303 NumAliases = 0;
6304}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006305
JF Bastien643817d2014-09-12 17:52:47 +00006306class Le64TargetInfo : public TargetInfo {
6307 static const Builtin::Info BuiltinInfo[];
6308
6309public:
6310 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6311 BigEndian = false;
6312 NoAsmVariants = true;
6313 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6314 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6315 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006316 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006317 }
6318
6319 void getTargetDefines(const LangOptions &Opts,
6320 MacroBuilder &Builder) const override {
6321 DefineStd(Builder, "unix", Opts);
6322 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6323 Builder.defineMacro("__ELF__");
6324 }
6325 void getTargetBuiltins(const Builtin::Info *&Records,
6326 unsigned &NumRecords) const override {
6327 Records = BuiltinInfo;
6328 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6329 }
6330 BuiltinVaListKind getBuiltinVaListKind() const override {
6331 return TargetInfo::PNaClABIBuiltinVaList;
6332 }
6333 const char *getClobbers() const override { return ""; }
6334 void getGCCRegNames(const char *const *&Names,
6335 unsigned &NumNames) const override {
6336 Names = nullptr;
6337 NumNames = 0;
6338 }
6339 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6340 unsigned &NumAliases) const override {
6341 Aliases = nullptr;
6342 NumAliases = 0;
6343 }
6344 bool validateAsmConstraint(const char *&Name,
6345 TargetInfo::ConstraintInfo &Info) const override {
6346 return false;
6347 }
6348
6349 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006350};
6351} // end anonymous namespace.
6352
6353const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6354#define BUILTIN(ID, TYPE, ATTRS) \
6355 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6356#include "clang/Basic/BuiltinsLe64.def"
6357};
6358
6359namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006360 static const unsigned SPIRAddrSpaceMap[] = {
6361 1, // opencl_global
6362 3, // opencl_local
6363 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006364 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006365 0, // cuda_device
6366 0, // cuda_constant
6367 0 // cuda_shared
6368 };
6369 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006370 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006371 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006372 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6373 "SPIR target must use unknown OS");
6374 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6375 "SPIR target must use unknown environment type");
6376 BigEndian = false;
6377 TLSSupported = false;
6378 LongWidth = LongAlign = 64;
6379 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006380 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006381 // Define available target features
6382 // These must be defined in sorted order!
6383 NoAsmVariants = true;
6384 }
Craig Topper3164f332014-03-11 03:39:26 +00006385 void getTargetDefines(const LangOptions &Opts,
6386 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006387 DefineStd(Builder, "SPIR", Opts);
6388 }
Craig Topper3164f332014-03-11 03:39:26 +00006389 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006390 return Feature == "spir";
6391 }
Craig Topper3164f332014-03-11 03:39:26 +00006392
6393 void getTargetBuiltins(const Builtin::Info *&Records,
6394 unsigned &NumRecords) const override {}
6395 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006396 return "";
6397 }
Craig Topper3164f332014-03-11 03:39:26 +00006398 void getGCCRegNames(const char * const *&Names,
6399 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006400 bool
6401 validateAsmConstraint(const char *&Name,
6402 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006403 return true;
6404 }
Craig Topper3164f332014-03-11 03:39:26 +00006405 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6406 unsigned &NumAliases) const override {}
6407 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006408 return TargetInfo::VoidPtrBuiltinVaList;
6409 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006410
6411 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6412 return (CC == CC_SpirFunction ||
6413 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6414 }
6415
6416 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6417 return CC_SpirFunction;
6418 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006419 };
6420
6421
6422 class SPIR32TargetInfo : public SPIRTargetInfo {
6423 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006424 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006425 PointerWidth = PointerAlign = 32;
6426 SizeType = TargetInfo::UnsignedInt;
6427 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6428 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006429 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6430 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006431 }
Craig Topper3164f332014-03-11 03:39:26 +00006432 void getTargetDefines(const LangOptions &Opts,
6433 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006434 DefineStd(Builder, "SPIR32", Opts);
6435 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006436 };
6437
6438 class SPIR64TargetInfo : public SPIRTargetInfo {
6439 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006440 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006441 PointerWidth = PointerAlign = 64;
6442 SizeType = TargetInfo::UnsignedLong;
6443 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006444 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6445 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006446 }
Craig Topper3164f332014-03-11 03:39:26 +00006447 void getTargetDefines(const LangOptions &Opts,
6448 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006449 DefineStd(Builder, "SPIR64", Opts);
6450 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006451 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006452
Robert Lytton0e076492013-08-13 09:43:10 +00006453class XCoreTargetInfo : public TargetInfo {
6454 static const Builtin::Info BuiltinInfo[];
6455public:
6456 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6457 BigEndian = false;
6458 NoAsmVariants = true;
6459 LongLongAlign = 32;
6460 SuitableAlign = 32;
6461 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006462 SizeType = UnsignedInt;
6463 PtrDiffType = SignedInt;
6464 IntPtrType = SignedInt;
6465 WCharType = UnsignedChar;
6466 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006467 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006468 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 +00006469 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006470 }
Craig Topper3164f332014-03-11 03:39:26 +00006471 void getTargetDefines(const LangOptions &Opts,
6472 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006473 Builder.defineMacro("__XS1B__");
6474 }
Craig Topper3164f332014-03-11 03:39:26 +00006475 void getTargetBuiltins(const Builtin::Info *&Records,
6476 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006477 Records = BuiltinInfo;
6478 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6479 }
Craig Topper3164f332014-03-11 03:39:26 +00006480 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006481 return TargetInfo::VoidPtrBuiltinVaList;
6482 }
Craig Topper3164f332014-03-11 03:39:26 +00006483 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006484 return "";
6485 }
Craig Topper3164f332014-03-11 03:39:26 +00006486 void getGCCRegNames(const char * const *&Names,
6487 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006488 static const char * const GCCRegNames[] = {
6489 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6490 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6491 };
6492 Names = GCCRegNames;
6493 NumNames = llvm::array_lengthof(GCCRegNames);
6494 }
Craig Topper3164f332014-03-11 03:39:26 +00006495 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6496 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006497 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006498 NumAliases = 0;
6499 }
Craig Topper3164f332014-03-11 03:39:26 +00006500 bool validateAsmConstraint(const char *&Name,
6501 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006502 return false;
6503 }
Craig Topper3164f332014-03-11 03:39:26 +00006504 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006505 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6506 return (RegNo < 2)? RegNo : -1;
6507 }
Robert Lytton0e076492013-08-13 09:43:10 +00006508};
6509
6510const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6511#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6512#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6513 ALL_LANGUAGES },
6514#include "clang/Basic/BuiltinsXCore.def"
6515};
6516} // end anonymous namespace.
6517
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006518namespace {
6519// x86_32 Android target
6520class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6521public:
6522 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6523 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6524 SuitableAlign = 32;
6525 LongDoubleWidth = 64;
6526 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6527 }
6528};
6529} // end anonymous namespace
6530
6531namespace {
6532// x86_64 Android target
6533class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6534public:
6535 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6536 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6537 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6538 }
6539};
6540} // end anonymous namespace
6541
Ivan Krasindd7403e2011-08-24 20:22:22 +00006542
Chris Lattner5ba61f02006-10-14 07:39:34 +00006543//===----------------------------------------------------------------------===//
6544// Driver code
6545//===----------------------------------------------------------------------===//
6546
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006547static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006548 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006549
Daniel Dunbar52322032009-08-18 05:47:58 +00006550 switch (Triple.getArch()) {
6551 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006552 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006553
Tim Northover2a0783d2014-05-30 14:14:07 +00006554 case llvm::Triple::xcore:
6555 return new XCoreTargetInfo(Triple);
6556
6557 case llvm::Triple::hexagon:
6558 return new HexagonTargetInfo(Triple);
6559
6560 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006561 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006562 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006563
6564 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006565 case llvm::Triple::FreeBSD:
6566 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006567 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006568 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006569 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006570 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006571 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006572 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006573 }
6574
Christian Pirker9b019ae2014-02-25 13:51:00 +00006575 case llvm::Triple::aarch64_be:
6576 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006577 case llvm::Triple::FreeBSD:
6578 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006579 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006580 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006581 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006582 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006583 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006584 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006585 }
6586
Daniel Dunbar52322032009-08-18 05:47:58 +00006587 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006588 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006589 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006590 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006591
Daniel Dunbar52322032009-08-18 05:47:58 +00006592 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006593 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006594 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006595 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006596 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006597 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006598 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006599 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006600 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006601 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006602 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006603 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006604 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006605 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006606 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006607 case llvm::Triple::Win32:
6608 switch (Triple.getEnvironment()) {
6609 default:
6610 return new ARMleTargetInfo(Triple);
6611 case llvm::Triple::Itanium:
6612 return new ItaniumWindowsARMleTargetInfo(Triple);
6613 case llvm::Triple::MSVC:
6614 return new MicrosoftARMleTargetInfo(Triple);
6615 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006616 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006617 return new ARMleTargetInfo(Triple);
6618 }
6619
6620 case llvm::Triple::armeb:
6621 case llvm::Triple::thumbeb:
6622 if (Triple.isOSDarwin())
6623 return new DarwinARMTargetInfo(Triple);
6624
6625 switch (os) {
6626 case llvm::Triple::Linux:
6627 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6628 case llvm::Triple::FreeBSD:
6629 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6630 case llvm::Triple::NetBSD:
6631 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6632 case llvm::Triple::OpenBSD:
6633 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6634 case llvm::Triple::Bitrig:
6635 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6636 case llvm::Triple::RTEMS:
6637 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6638 case llvm::Triple::NaCl:
6639 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6640 default:
6641 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006642 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006643
Daniel Dunbar52322032009-08-18 05:47:58 +00006644 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006645 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006646
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006647 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006648 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006649 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006650 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006651 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006652 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006653 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006654 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006655 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006656 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006657 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006658 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006659 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006660
6661 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006662 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006663 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006664 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006665 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006666 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006667 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006668 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006669 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006670 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006671 case llvm::Triple::NaCl:
6672 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006673 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006674 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006675 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006676
Akira Hatanakabef17452011-09-20 19:21:49 +00006677 case llvm::Triple::mips64:
6678 switch (os) {
6679 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006680 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006681 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006682 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006683 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006684 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006685 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006686 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006687 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006688 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006689 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006690 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006691 }
6692
6693 case llvm::Triple::mips64el:
6694 switch (os) {
6695 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006696 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006697 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006698 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006699 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006700 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006701 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006702 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006703 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006704 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006705 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006706 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006707 }
6708
Ivan Krasindd7403e2011-08-24 20:22:22 +00006709 case llvm::Triple::le32:
6710 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006711 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006712 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006713 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006714 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006715 }
6716
JF Bastien643817d2014-09-12 17:52:47 +00006717 case llvm::Triple::le64:
6718 return new Le64TargetInfo(Triple);
6719
Daniel Dunbar52322032009-08-18 05:47:58 +00006720 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006721 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006722 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006723 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006724 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006725 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006726 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006727 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006728 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006729 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006730 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006731 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006732 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006733 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006734 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006735 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006736 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006737
6738 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006739 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006740 return new DarwinPPC64TargetInfo(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<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006744 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006745 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006746 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006747 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006748 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006749 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006750 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006751 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006752 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006753
Bill Schmidt778d3872013-07-26 01:36:11 +00006754 case llvm::Triple::ppc64le:
6755 switch (os) {
6756 case llvm::Triple::Linux:
6757 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6758 default:
6759 return new PPC64TargetInfo(Triple);
6760 }
6761
Peter Collingbournec947aae2012-05-20 23:28:41 +00006762 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006763 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006764 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006765 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006766
Tom Stellardd8e38a32015-01-06 20:34:47 +00006767 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006768 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006769 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006770
Daniel Dunbar52322032009-08-18 05:47:58 +00006771 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006772 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006773 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006774 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006775 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006776 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006777 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006778 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006779 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006780 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006781 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006782 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006783 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006784 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006785 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006786
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006787 case llvm::Triple::sparcv9:
6788 switch (os) {
6789 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006790 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006791 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006792 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006793 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006794 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006795 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006796 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006797 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006798 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006799 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006800 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006801 }
6802
Ulrich Weigand47445072013-05-06 16:26:41 +00006803 case llvm::Triple::systemz:
6804 switch (os) {
6805 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006806 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006807 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006808 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006809 }
6810
Eli Friedmana9c3d712009-08-19 20:47:07 +00006811 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006812 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006813
Daniel Dunbar52322032009-08-18 05:47:58 +00006814 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006815 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006816 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006817
Daniel Dunbar52322032009-08-18 05:47:58 +00006818 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006819 case llvm::Triple::Linux: {
6820 switch (Triple.getEnvironment()) {
6821 default:
6822 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6823 case llvm::Triple::Android:
6824 return new AndroidX86_32TargetInfo(Triple);
6825 }
6826 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006827 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006828 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006829 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006830 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006831 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006832 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006833 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006834 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006835 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006836 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006837 case llvm::Triple::KFreeBSD:
6838 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006839 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006840 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006841 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006842 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006843 case llvm::Triple::Win32: {
6844 switch (Triple.getEnvironment()) {
6845 default:
6846 return new X86_32TargetInfo(Triple);
6847 case llvm::Triple::Cygnus:
6848 return new CygwinX86_32TargetInfo(Triple);
6849 case llvm::Triple::GNU:
6850 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006851 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006852 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006853 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006854 }
6855 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006856 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006857 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006858 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006859 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006860 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006861 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006862 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006863 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006864 }
6865
6866 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006867 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006868 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006869
Daniel Dunbar52322032009-08-18 05:47:58 +00006870 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00006871 case llvm::Triple::CloudABI:
6872 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006873 case llvm::Triple::Linux: {
6874 switch (Triple.getEnvironment()) {
6875 default:
6876 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
6877 case llvm::Triple::Android:
6878 return new AndroidX86_64TargetInfo(Triple);
6879 }
6880 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00006881 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006882 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006883 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006884 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006885 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006886 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006887 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006888 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006889 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006890 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006891 case llvm::Triple::KFreeBSD:
6892 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006893 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006894 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006895 case llvm::Triple::Win32: {
6896 switch (Triple.getEnvironment()) {
6897 default:
6898 return new X86_64TargetInfo(Triple);
6899 case llvm::Triple::GNU:
6900 return new MinGWX86_64TargetInfo(Triple);
6901 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006902 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006903 }
6904 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006905 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006906 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006907 case llvm::Triple::PS4:
6908 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006909 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006910 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006911 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006912
6913 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006914 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006915 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006916 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006917 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006918 }
6919 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006920 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006921 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006922 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006923 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006924 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006925 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006926}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006927
6928/// CreateTargetInfo - Return the target info object for the specified target
6929/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006930TargetInfo *
6931TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6932 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006933 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006934
6935 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006936 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006937 if (!Target) {
6938 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006939 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006940 }
Alp Toker80758082014-07-06 05:26:44 +00006941 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006942
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006943 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006944 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6945 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006946 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006947 }
6948
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006949 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006950 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6951 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006952 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006953 }
6954
Rafael Espindolaeb265472013-08-21 21:59:03 +00006955 // Set the fp math unit.
6956 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6957 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006958 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006959 }
6960
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006961 // Compute the default target features, we need the target to handle this
6962 // because features may have dependencies on one another.
6963 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006964 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006965
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006966 // Apply the user specified deltas.
6967 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6968 I < N; ++I) {
6969 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006970 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006971 bool Enabled = Name[0] == '+';
6972 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006973 }
6974
6975 // Add the features to the compile options.
6976 //
6977 // FIXME: If we are completely confident that we have the right set, we only
6978 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006979 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006980 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6981 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006982 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006983 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006984 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006985
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006986 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006987}