blob: 9c8c351e9d7ce9716c6d8dfcc8378e6af8b501c6 [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) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000716 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000717 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000718 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000720 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000721 } else if (Triple.getArch() == llvm::Triple::mipsel) {
722 // Handled on mips' setDescriptionString.
723 } else {
724 assert(Triple.getArch() == llvm::Triple::le32);
725 this->DescriptionString = "e-p:32:32-i64:64";
726 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000727 }
728};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000729
Chris Lattner09d98f52008-10-05 21:50:58 +0000730//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000731// Specific target implementations.
732//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000733
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000734// PPC abstract base class
735class PPCTargetInfo : public TargetInfo {
736 static const Builtin::Info BuiltinInfo[];
737 static const char * const GCCRegNames[];
738 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000739 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000740
741 // Target cpu features.
742 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000743 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000744 bool HasP8Crypto;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000745 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000746 bool HasHTM;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000747
Ulrich Weigand8afad612014-07-28 13:17:52 +0000748protected:
749 std::string ABI;
750
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000751public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000752 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000753 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Kit Barton8246f282015-03-25 19:41:41 +0000754 HasP8Crypto(false), HasQPX(false), HasHTM(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000755 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000756 LongDoubleWidth = LongDoubleAlign = 128;
757 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
758 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000759
Hal Finkel6b984f02012-07-03 16:51:04 +0000760 /// \brief Flags for architecture specific defines.
761 typedef enum {
762 ArchDefineNone = 0,
763 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
764 ArchDefinePpcgr = 1 << 1,
765 ArchDefinePpcsq = 1 << 2,
766 ArchDefine440 = 1 << 3,
767 ArchDefine603 = 1 << 4,
768 ArchDefine604 = 1 << 5,
769 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000770 ArchDefinePwr5 = 1 << 7,
771 ArchDefinePwr5x = 1 << 8,
772 ArchDefinePwr6 = 1 << 9,
773 ArchDefinePwr6x = 1 << 10,
774 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000775 ArchDefinePwr8 = 1 << 12,
776 ArchDefineA2 = 1 << 13,
777 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000778 } ArchDefineTypes;
779
Bill Schmidt38378a02013-02-01 20:23:10 +0000780 // Note: GCC recognizes the following additional cpus:
781 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
782 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
783 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000784 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000785 bool CPUKnown = llvm::StringSwitch<bool>(Name)
786 .Case("generic", true)
787 .Case("440", true)
788 .Case("450", true)
789 .Case("601", true)
790 .Case("602", true)
791 .Case("603", true)
792 .Case("603e", true)
793 .Case("603ev", true)
794 .Case("604", true)
795 .Case("604e", true)
796 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000797 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000798 .Case("g3", true)
799 .Case("7400", true)
800 .Case("g4", true)
801 .Case("7450", true)
802 .Case("g4+", true)
803 .Case("750", true)
804 .Case("970", true)
805 .Case("g5", true)
806 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000807 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000808 .Case("e500mc", true)
809 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000810 .Case("power3", true)
811 .Case("pwr3", true)
812 .Case("power4", true)
813 .Case("pwr4", true)
814 .Case("power5", true)
815 .Case("pwr5", true)
816 .Case("power5x", true)
817 .Case("pwr5x", true)
818 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000819 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000820 .Case("power6x", true)
821 .Case("pwr6x", true)
822 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000823 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000824 .Case("power8", true)
825 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000826 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000827 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000828 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000829 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000830 .Case("powerpc64le", true)
831 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000832 .Default(false);
833
834 if (CPUKnown)
835 CPU = Name;
836
837 return CPUKnown;
838 }
839
Ulrich Weigand8afad612014-07-28 13:17:52 +0000840
841 StringRef getABI() const override { return ABI; }
842
Craig Topper3164f332014-03-11 03:39:26 +0000843 void getTargetBuiltins(const Builtin::Info *&Records,
844 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000845 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000846 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000847 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000848
Craig Topper3164f332014-03-11 03:39:26 +0000849 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000850
Craig Topper3164f332014-03-11 03:39:26 +0000851 void getTargetDefines(const LangOptions &Opts,
852 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000853
Craig Topper3164f332014-03-11 03:39:26 +0000854 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000855
Craig Topper3164f332014-03-11 03:39:26 +0000856 bool handleTargetFeatures(std::vector<std::string> &Features,
857 DiagnosticsEngine &Diags) override;
858 bool hasFeature(StringRef Feature) const override;
859
860 void getGCCRegNames(const char * const *&Names,
861 unsigned &NumNames) const override;
862 void getGCCRegAliases(const GCCRegAlias *&Aliases,
863 unsigned &NumAliases) const override;
864 bool validateAsmConstraint(const char *&Name,
865 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000866 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000867 default: return false;
868 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000869 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000870 case 'b': // Base register
871 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000872 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000873 break;
874 // FIXME: The following are added to allow parsing.
875 // I just took a guess at what the actions should be.
876 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000877 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000878 case 'v': // Altivec vector register
879 Info.setAllowsRegister();
880 break;
881 case 'w':
882 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000883 case 'd':// VSX vector register to hold vector double data
884 case 'f':// VSX vector register to hold vector float data
885 case 's':// VSX vector register to hold scalar float data
886 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000887 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000888 break;
889 default:
890 return false;
891 }
892 Info.setAllowsRegister();
893 Name++; // Skip over 'w'.
894 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000895 case 'h': // `MQ', `CTR', or `LINK' register
896 case 'q': // `MQ' register
897 case 'c': // `CTR' register
898 case 'l': // `LINK' register
899 case 'x': // `CR' register (condition register) number 0
900 case 'y': // `CR' register (condition register)
901 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000902 Info.setAllowsRegister();
903 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000904 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000905 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000906 // (use `L' instead for SImode constants)
907 case 'K': // Unsigned 16-bit constant
908 case 'L': // Signed 16-bit constant shifted left 16 bits
909 case 'M': // Constant larger than 31
910 case 'N': // Exact power of 2
911 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000912 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000913 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000914 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000915 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000916 break;
917 case 'm': // Memory operand. Note that on PowerPC targets, m can
918 // include addresses that update the base register. It
919 // is therefore only safe to use `m' in an asm statement
920 // if that asm statement accesses the operand exactly once.
921 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000922 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000923 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000924 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000925 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000926 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
927 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000928 // register to be updated.
929 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000930 if (Name[1] != 's')
931 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000932 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000933 // include any automodification of the base register. Unlike
934 // `m', this constraint can be used in asm statements that
935 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000936 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000937 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000938 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000939 break;
940 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000941 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000942 case 'Z': // Memory operand that is an indexed or indirect from a
943 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000944 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000945 Info.setAllowsMemory();
946 Info.setAllowsRegister();
947 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000948 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000949 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 // register (`p' is preferable for asm statements)
951 case 'S': // Constant suitable as a 64-bit mask operand
952 case 'T': // Constant suitable as a 32-bit mask operand
953 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000954 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000955 // instructions
956 case 'W': // Vector constant that does not require memory
957 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000958 break;
959 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000960 }
John Thompson07a61a42010-06-24 22:44:13 +0000961 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000962 }
Craig Topper3164f332014-03-11 03:39:26 +0000963 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000964 std::string R;
965 switch (*Constraint) {
966 case 'e':
967 case 'w':
968 // Two-character constraint; add "^" hint for later parsing.
969 R = std::string("^") + std::string(Constraint, 2);
970 Constraint++;
971 break;
972 default:
973 return TargetInfo::convertConstraint(Constraint);
974 }
975 return R;
976 }
Craig Topper3164f332014-03-11 03:39:26 +0000977 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000978 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000979 }
Craig Topper3164f332014-03-11 03:39:26 +0000980 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000981 if (RegNo == 0) return 3;
982 if (RegNo == 1) return 4;
983 return -1;
984 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +0000985
986 bool hasSjLjLowering() const override {
987 return true;
988 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000989};
Anders Carlssonf511f642007-11-27 04:11:28 +0000990
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000991const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000992#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000993#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000994 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000995#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000996};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000997
Eric Christopher917e9522014-11-18 22:36:15 +0000998/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000999/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001000bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001001 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001002 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1003 // Ignore disabled features.
1004 if (Features[i][0] == '-')
1005 continue;
1006
1007 StringRef Feature = StringRef(Features[i]).substr(1);
1008
1009 if (Feature == "vsx") {
1010 HasVSX = true;
1011 continue;
1012 }
1013
Bill Schmidt59eb7672014-10-10 15:09:43 +00001014 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001015 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001016 continue;
1017 }
1018
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001019 if (Feature == "crypto") {
1020 HasP8Crypto = true;
1021 continue;
1022 }
1023
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001024 if (Feature == "qpx") {
1025 HasQPX = true;
1026 continue;
1027 }
1028
Kit Barton8246f282015-03-25 19:41:41 +00001029 if (Feature == "htm") {
1030 HasHTM = true;
1031 continue;
1032 }
1033
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001034 // TODO: Finish this list and add an assert that we've handled them
1035 // all.
1036 }
1037
1038 return true;
1039}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001040
Chris Lattnerecd49032009-03-02 22:27:17 +00001041/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1042/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001043void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001044 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001045 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001046 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001047 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001048 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001049 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001050 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001051 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001052 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001053 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001054 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001055 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001056 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001057
Chris Lattnerecd49032009-03-02 22:27:17 +00001058 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001059 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1060 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001061 } else {
1062 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1063 getTriple().getOS() != llvm::Triple::OpenBSD)
1064 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001065 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001066
Ulrich Weigand8afad612014-07-28 13:17:52 +00001067 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001068 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001069 Builder.defineMacro("_CALL_ELF", "1");
1070 if (ABI == "elfv2")
1071 Builder.defineMacro("_CALL_ELF", "2");
1072
Chris Lattnerecd49032009-03-02 22:27:17 +00001073 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001074 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1075 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001076
Chris Lattnerecd49032009-03-02 22:27:17 +00001077 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001078 if (LongDoubleWidth == 128)
1079 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080
John Thompsone467e192009-11-19 17:18:50 +00001081 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001082 Builder.defineMacro("__VEC__", "10206");
1083 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001084 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001085
1086 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001087 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1088 .Case("440", ArchDefineName)
1089 .Case("450", ArchDefineName | ArchDefine440)
1090 .Case("601", ArchDefineName)
1091 .Case("602", ArchDefineName | ArchDefinePpcgr)
1092 .Case("603", ArchDefineName | ArchDefinePpcgr)
1093 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1094 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1095 .Case("604", ArchDefineName | ArchDefinePpcgr)
1096 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1097 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001098 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001099 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1100 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1101 .Case("750", ArchDefineName | ArchDefinePpcgr)
1102 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1103 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001104 .Case("a2", ArchDefineA2)
1105 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001106 .Case("pwr3", ArchDefinePpcgr)
1107 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1108 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1109 | ArchDefinePpcsq)
1110 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1111 | ArchDefinePpcgr | ArchDefinePpcsq)
1112 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1113 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1114 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1115 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1116 | ArchDefinePpcsq)
1117 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1118 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001119 | ArchDefinePpcgr | ArchDefinePpcsq)
1120 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1121 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1122 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001123 .Case("power3", ArchDefinePpcgr)
1124 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1125 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1126 | ArchDefinePpcsq)
1127 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1128 | ArchDefinePpcgr | ArchDefinePpcsq)
1129 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1130 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1131 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1132 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1133 | ArchDefinePpcsq)
1134 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1135 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001136 | ArchDefinePpcgr | ArchDefinePpcsq)
1137 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1138 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1139 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001140 .Default(ArchDefineNone);
1141
1142 if (defs & ArchDefineName)
1143 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1144 if (defs & ArchDefinePpcgr)
1145 Builder.defineMacro("_ARCH_PPCGR");
1146 if (defs & ArchDefinePpcsq)
1147 Builder.defineMacro("_ARCH_PPCSQ");
1148 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001149 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001150 if (defs & ArchDefine603)
1151 Builder.defineMacro("_ARCH_603");
1152 if (defs & ArchDefine604)
1153 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001154 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001155 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001156 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001157 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001158 if (defs & ArchDefinePwr5x)
1159 Builder.defineMacro("_ARCH_PWR5X");
1160 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001161 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001162 if (defs & ArchDefinePwr6x)
1163 Builder.defineMacro("_ARCH_PWR6X");
1164 if (defs & ArchDefinePwr7)
1165 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001166 if (defs & ArchDefinePwr8)
1167 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001168 if (defs & ArchDefineA2)
1169 Builder.defineMacro("_ARCH_A2");
1170 if (defs & ArchDefineA2q) {
1171 Builder.defineMacro("_ARCH_A2Q");
1172 Builder.defineMacro("_ARCH_QP");
1173 }
1174
1175 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1176 Builder.defineMacro("__bg__");
1177 Builder.defineMacro("__THW_BLUEGENE__");
1178 Builder.defineMacro("__bgq__");
1179 Builder.defineMacro("__TOS_BGQ__");
1180 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001181
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001182 if (HasVSX)
1183 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001184 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001185 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001186 if (HasP8Crypto)
1187 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001188 if (HasHTM)
1189 Builder.defineMacro("__HTM__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001190
Bill Schmidt38378a02013-02-01 20:23:10 +00001191 // FIXME: The following are not yet generated here by Clang, but are
1192 // generated by GCC:
1193 //
1194 // _SOFT_FLOAT_
1195 // __RECIP_PRECISION__
1196 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001197 // __RECIP__
1198 // __RECIPF__
1199 // __RSQRTE__
1200 // __RSQRTEF__
1201 // _SOFT_DOUBLE_
1202 // __NO_LWSYNC__
1203 // __HAVE_BSWAP__
1204 // __LONGDOUBLE128
1205 // __CMODEL_MEDIUM__
1206 // __CMODEL_LARGE__
1207 // _CALL_SYSV
1208 // _CALL_DARWIN
1209 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001210}
1211
1212void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1213 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1214 .Case("7400", true)
1215 .Case("g4", true)
1216 .Case("7450", true)
1217 .Case("g4+", true)
1218 .Case("970", true)
1219 .Case("g5", true)
1220 .Case("pwr6", true)
1221 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001222 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001223 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001224 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001225 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001226
1227 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001228 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1229 .Case("ppc64le", true)
1230 .Case("pwr8", true)
1231 .Default(false);
1232 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1233 .Case("ppc64le", true)
1234 .Case("pwr8", true)
1235 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001236}
1237
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001238bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001239 return llvm::StringSwitch<bool>(Feature)
1240 .Case("powerpc", true)
1241 .Case("vsx", HasVSX)
1242 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001243 .Case("crypto", HasP8Crypto)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001244 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001245 .Case("htm", HasHTM)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001246 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001247}
Chris Lattner17df24e2008-04-21 18:56:49 +00001248
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001249const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001250 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1251 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1252 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1253 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1254 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1255 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1256 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1257 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001258 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001259 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001260 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001261 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1262 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1263 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1264 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001265 "vrsave", "vscr",
1266 "spe_acc", "spefscr",
1267 "sfp"
1268};
Chris Lattner10a5b382007-01-29 05:24:35 +00001269
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001270void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001271 unsigned &NumNames) const {
1272 Names = GCCRegNames;
1273 NumNames = llvm::array_lengthof(GCCRegNames);
1274}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001275
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001276const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1277 // While some of these aliases do map to different registers
1278 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001279 { { "0" }, "r0" },
1280 { { "1"}, "r1" },
1281 { { "2" }, "r2" },
1282 { { "3" }, "r3" },
1283 { { "4" }, "r4" },
1284 { { "5" }, "r5" },
1285 { { "6" }, "r6" },
1286 { { "7" }, "r7" },
1287 { { "8" }, "r8" },
1288 { { "9" }, "r9" },
1289 { { "10" }, "r10" },
1290 { { "11" }, "r11" },
1291 { { "12" }, "r12" },
1292 { { "13" }, "r13" },
1293 { { "14" }, "r14" },
1294 { { "15" }, "r15" },
1295 { { "16" }, "r16" },
1296 { { "17" }, "r17" },
1297 { { "18" }, "r18" },
1298 { { "19" }, "r19" },
1299 { { "20" }, "r20" },
1300 { { "21" }, "r21" },
1301 { { "22" }, "r22" },
1302 { { "23" }, "r23" },
1303 { { "24" }, "r24" },
1304 { { "25" }, "r25" },
1305 { { "26" }, "r26" },
1306 { { "27" }, "r27" },
1307 { { "28" }, "r28" },
1308 { { "29" }, "r29" },
1309 { { "30" }, "r30" },
1310 { { "31" }, "r31" },
1311 { { "fr0" }, "f0" },
1312 { { "fr1" }, "f1" },
1313 { { "fr2" }, "f2" },
1314 { { "fr3" }, "f3" },
1315 { { "fr4" }, "f4" },
1316 { { "fr5" }, "f5" },
1317 { { "fr6" }, "f6" },
1318 { { "fr7" }, "f7" },
1319 { { "fr8" }, "f8" },
1320 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001321 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001322 { { "fr11" }, "f11" },
1323 { { "fr12" }, "f12" },
1324 { { "fr13" }, "f13" },
1325 { { "fr14" }, "f14" },
1326 { { "fr15" }, "f15" },
1327 { { "fr16" }, "f16" },
1328 { { "fr17" }, "f17" },
1329 { { "fr18" }, "f18" },
1330 { { "fr19" }, "f19" },
1331 { { "fr20" }, "f20" },
1332 { { "fr21" }, "f21" },
1333 { { "fr22" }, "f22" },
1334 { { "fr23" }, "f23" },
1335 { { "fr24" }, "f24" },
1336 { { "fr25" }, "f25" },
1337 { { "fr26" }, "f26" },
1338 { { "fr27" }, "f27" },
1339 { { "fr28" }, "f28" },
1340 { { "fr29" }, "f29" },
1341 { { "fr30" }, "f30" },
1342 { { "fr31" }, "f31" },
1343 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001344};
1345
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001346void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001347 unsigned &NumAliases) const {
1348 Aliases = GCCRegAliases;
1349 NumAliases = llvm::array_lengthof(GCCRegAliases);
1350}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001351
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001352class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001353public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001354 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001355 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001356
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001357 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001358 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001359 case llvm::Triple::FreeBSD:
1360 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001361 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001362 PtrDiffType = SignedInt;
1363 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001364 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001365 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001366 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001367 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001368
Roman Divacky3ffe7462012-03-13 19:20:17 +00001369 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1370 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001371 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001372 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001373
1374 // PPC32 supports atomics up to 4 bytes.
1375 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001376 }
1377
Craig Topper3164f332014-03-11 03:39:26 +00001378 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001379 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001380 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001381 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001382};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001383
Bill Schmidt778d3872013-07-26 01:36:11 +00001384// Note: ABI differences may eventually require us to have a separate
1385// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001386class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001387public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001388 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001389 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001390 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001391 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001392
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001393 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1394 DescriptionString = "e-m:e-i64:64-n32:64";
1395 ABI = "elfv2";
1396 } else {
1397 DescriptionString = "E-m:e-i64:64-n32:64";
1398 ABI = "elfv1";
1399 }
1400
1401 switch (getTriple().getOS()) {
1402 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001403 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001404 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001405 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001406 case llvm::Triple::NetBSD:
1407 IntMaxType = SignedLongLong;
1408 Int64Type = SignedLongLong;
1409 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001410 default:
1411 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001412 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001413
1414 // PPC64 supports atomics up to 8 bytes.
1415 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001416 }
Craig Topper3164f332014-03-11 03:39:26 +00001417 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001418 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001419 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001420 // PPC64 Linux-specifc ABI options.
1421 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001422 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001423 ABI = Name;
1424 return true;
1425 }
1426 return false;
1427 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001428};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001429
Roman Divacky965b0b72011-01-06 08:27:10 +00001430class DarwinPPC32TargetInfo :
1431 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001432public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001433 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1434 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001435 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001436 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001437 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001438 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001439 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001440 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001441 }
Craig Topper3164f332014-03-11 03:39:26 +00001442 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001443 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001444 }
1445};
1446
1447class DarwinPPC64TargetInfo :
1448 public DarwinTargetInfo<PPC64TargetInfo> {
1449public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001450 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1451 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001452 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001453 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001454 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001455 }
1456};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001457
Peter Collingbournec947aae2012-05-20 23:28:41 +00001458 static const unsigned NVPTXAddrSpaceMap[] = {
1459 1, // opencl_global
1460 3, // opencl_local
1461 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001462 // FIXME: generic has to be added to the target
1463 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001464 1, // cuda_device
1465 4, // cuda_constant
1466 3, // cuda_shared
1467 };
1468 class NVPTXTargetInfo : public TargetInfo {
1469 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001470 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001471
1472 // The GPU profiles supported by the NVPTX backend
1473 enum GPUKind {
1474 GK_NONE,
1475 GK_SM20,
1476 GK_SM21,
1477 GK_SM30,
1478 GK_SM35,
1479 } GPU;
1480
Peter Collingbournec947aae2012-05-20 23:28:41 +00001481 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001482 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001483 BigEndian = false;
1484 TLSSupported = false;
1485 LongWidth = LongAlign = 64;
1486 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001487 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001488 // Define available target features
1489 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001490 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001491 // Set the default GPU to sm20
1492 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001493 }
Craig Topper3164f332014-03-11 03:39:26 +00001494 void getTargetDefines(const LangOptions &Opts,
1495 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001496 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001497 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001498 if (Opts.CUDAIsDevice) {
1499 // Set __CUDA_ARCH__ for the GPU specified.
1500 std::string CUDAArchCode;
1501 switch (GPU) {
1502 case GK_SM20:
1503 CUDAArchCode = "200";
1504 break;
1505 case GK_SM21:
1506 CUDAArchCode = "210";
1507 break;
1508 case GK_SM30:
1509 CUDAArchCode = "300";
1510 break;
1511 case GK_SM35:
1512 CUDAArchCode = "350";
1513 break;
1514 default:
1515 llvm_unreachable("Unhandled target CPU");
1516 }
1517 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1518 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001519 }
Craig Topper3164f332014-03-11 03:39:26 +00001520 void getTargetBuiltins(const Builtin::Info *&Records,
1521 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001522 Records = BuiltinInfo;
1523 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001524 }
Craig Topper3164f332014-03-11 03:39:26 +00001525 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001526 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001527 }
Craig Topper3164f332014-03-11 03:39:26 +00001528
1529 void getGCCRegNames(const char * const *&Names,
1530 unsigned &NumNames) const override;
1531 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1532 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001533 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001534 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001535 NumAliases = 0;
1536 }
Eric Christopher917e9522014-11-18 22:36:15 +00001537 bool
1538 validateAsmConstraint(const char *&Name,
1539 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001540 switch (*Name) {
1541 default: return false;
1542 case 'c':
1543 case 'h':
1544 case 'r':
1545 case 'l':
1546 case 'f':
1547 case 'd':
1548 Info.setAllowsRegister();
1549 return true;
1550 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001551 }
Craig Topper3164f332014-03-11 03:39:26 +00001552 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001553 // FIXME: Is this really right?
1554 return "";
1555 }
Craig Topper3164f332014-03-11 03:39:26 +00001556 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001557 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001558 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001559 }
Craig Topper3164f332014-03-11 03:39:26 +00001560 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001561 GPU = llvm::StringSwitch<GPUKind>(Name)
1562 .Case("sm_20", GK_SM20)
1563 .Case("sm_21", GK_SM21)
1564 .Case("sm_30", GK_SM30)
1565 .Case("sm_35", GK_SM35)
1566 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001567
Reid Klecknerbbc01782014-12-03 21:53:36 +00001568 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001569 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001570 };
1571
1572 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1573#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1574#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1575 ALL_LANGUAGES },
1576#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001577 };
1578
1579 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1580 "r0"
1581 };
1582
1583 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1584 unsigned &NumNames) const {
1585 Names = GCCRegNames;
1586 NumNames = llvm::array_lengthof(GCCRegNames);
1587 }
1588
1589 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1590 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001591 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001592 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001593 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1594 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001595 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001596 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001597 };
1598
1599 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1600 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001601 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001602 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001603 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1604 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001605 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001606 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001607 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001608
1609static const unsigned R600AddrSpaceMap[] = {
1610 1, // opencl_global
1611 3, // opencl_local
1612 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001613 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001614 1, // cuda_device
1615 2, // cuda_constant
1616 3 // cuda_shared
1617};
1618
Tom Stellarda96344b2014-08-21 13:58:40 +00001619// If you edit the description strings, make sure you update
1620// getPointerWidthV().
1621
Tom Stellardc74b1e02013-03-04 17:40:53 +00001622static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001623 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1624 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001625
1626static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001627 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1628 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001629
1630static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001631 "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 +00001632 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1633 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001634
Eli Friedmand13b41e2012-10-12 23:32:00 +00001635class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001636 static const Builtin::Info BuiltinInfo[];
1637
Tom Stellardc74b1e02013-03-04 17:40:53 +00001638 /// \brief The GPU profiles supported by the R600 target.
1639 enum GPUKind {
1640 GK_NONE,
1641 GK_R600,
1642 GK_R600_DOUBLE_OPS,
1643 GK_R700,
1644 GK_R700_DOUBLE_OPS,
1645 GK_EVERGREEN,
1646 GK_EVERGREEN_DOUBLE_OPS,
1647 GK_NORTHERN_ISLANDS,
1648 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001649 GK_SOUTHERN_ISLANDS,
1650 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001651 } GPU;
1652
Eli Friedmand13b41e2012-10-12 23:32:00 +00001653public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001654 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001655 : TargetInfo(Triple) {
1656
1657 if (Triple.getArch() == llvm::Triple::amdgcn) {
1658 DescriptionString = DescriptionStringSI;
1659 GPU = GK_SOUTHERN_ISLANDS;
1660 } else {
1661 DescriptionString = DescriptionStringR600;
1662 GPU = GK_R600;
1663 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001664 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001665 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001666 }
1667
Tom Stellarda96344b2014-08-21 13:58:40 +00001668 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1669 if (GPU <= GK_CAYMAN)
1670 return 32;
1671
1672 switch(AddrSpace) {
1673 default:
1674 return 64;
1675 case 0:
1676 case 3:
1677 case 5:
1678 return 32;
1679 }
1680 }
1681
Craig Topper3164f332014-03-11 03:39:26 +00001682 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001683 return "";
1684 }
1685
Craig Topper3164f332014-03-11 03:39:26 +00001686 void getGCCRegNames(const char * const *&Names,
1687 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001688 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001689 numNames = 0;
1690 }
1691
Craig Topper3164f332014-03-11 03:39:26 +00001692 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1693 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001694 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001695 NumAliases = 0;
1696 }
1697
Craig Topper3164f332014-03-11 03:39:26 +00001698 bool validateAsmConstraint(const char *&Name,
1699 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001700 return true;
1701 }
1702
Craig Topper3164f332014-03-11 03:39:26 +00001703 void getTargetBuiltins(const Builtin::Info *&Records,
1704 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001705 Records = BuiltinInfo;
1706 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001707 }
1708
Craig Topper3164f332014-03-11 03:39:26 +00001709 void getTargetDefines(const LangOptions &Opts,
1710 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001711 Builder.defineMacro("__R600__");
Tom Stellardfded50f2015-02-27 15:10:19 +00001712 if (GPU >= GK_SOUTHERN_ISLANDS && Opts.OpenCL)
1713 Builder.defineMacro("cl_khr_fp64");
Eli Friedmand13b41e2012-10-12 23:32:00 +00001714 }
1715
Craig Topper3164f332014-03-11 03:39:26 +00001716 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001717 return TargetInfo::CharPtrBuiltinVaList;
1718 }
1719
Craig Topper3164f332014-03-11 03:39:26 +00001720 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001721 GPU = llvm::StringSwitch<GPUKind>(Name)
1722 .Case("r600" , GK_R600)
1723 .Case("rv610", GK_R600)
1724 .Case("rv620", GK_R600)
1725 .Case("rv630", GK_R600)
1726 .Case("rv635", GK_R600)
1727 .Case("rs780", GK_R600)
1728 .Case("rs880", GK_R600)
1729 .Case("rv670", GK_R600_DOUBLE_OPS)
1730 .Case("rv710", GK_R700)
1731 .Case("rv730", GK_R700)
1732 .Case("rv740", GK_R700_DOUBLE_OPS)
1733 .Case("rv770", GK_R700_DOUBLE_OPS)
1734 .Case("palm", GK_EVERGREEN)
1735 .Case("cedar", GK_EVERGREEN)
1736 .Case("sumo", GK_EVERGREEN)
1737 .Case("sumo2", GK_EVERGREEN)
1738 .Case("redwood", GK_EVERGREEN)
1739 .Case("juniper", GK_EVERGREEN)
1740 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1741 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1742 .Case("barts", GK_NORTHERN_ISLANDS)
1743 .Case("turks", GK_NORTHERN_ISLANDS)
1744 .Case("caicos", GK_NORTHERN_ISLANDS)
1745 .Case("cayman", GK_CAYMAN)
1746 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001747 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001748 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1749 .Case("verde", GK_SOUTHERN_ISLANDS)
1750 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001751 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001752 .Case("bonaire", GK_SEA_ISLANDS)
1753 .Case("kabini", GK_SEA_ISLANDS)
1754 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001755 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001756 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001757 .Default(GK_NONE);
1758
1759 if (GPU == GK_NONE) {
1760 return false;
1761 }
1762
1763 // Set the correct data layout
1764 switch (GPU) {
1765 case GK_NONE:
1766 case GK_R600:
1767 case GK_R700:
1768 case GK_EVERGREEN:
1769 case GK_NORTHERN_ISLANDS:
1770 DescriptionString = DescriptionStringR600;
1771 break;
1772 case GK_R600_DOUBLE_OPS:
1773 case GK_R700_DOUBLE_OPS:
1774 case GK_EVERGREEN_DOUBLE_OPS:
1775 case GK_CAYMAN:
1776 DescriptionString = DescriptionStringR600DoubleOps;
1777 break;
1778 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001779 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001780 DescriptionString = DescriptionStringSI;
1781 break;
1782 }
1783
1784 return true;
1785 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001786};
1787
Matt Arsenault56f008d2014-06-24 20:45:01 +00001788const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1789#define BUILTIN(ID, TYPE, ATTRS) \
1790 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1791#include "clang/Basic/BuiltinsR600.def"
1792};
1793
Eli Friedman3fd920a2008-08-20 02:34:37 +00001794// Namespace for x86 abstract base class
1795const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001796#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001797#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001798 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001799#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001800};
Eli Friedmanb5366062008-05-20 14:21:01 +00001801
Nuno Lopescfca1f02009-12-23 17:49:57 +00001802static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001803 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1804 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001805 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001806 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1807 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1808 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001809 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001810 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1811 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001812};
1813
Eric Christophercdd36352011-06-21 00:05:20 +00001814const TargetInfo::AddlRegName AddlRegNames[] = {
1815 { { "al", "ah", "eax", "rax" }, 0 },
1816 { { "bl", "bh", "ebx", "rbx" }, 3 },
1817 { { "cl", "ch", "ecx", "rcx" }, 2 },
1818 { { "dl", "dh", "edx", "rdx" }, 1 },
1819 { { "esi", "rsi" }, 4 },
1820 { { "edi", "rdi" }, 5 },
1821 { { "esp", "rsp" }, 7 },
1822 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001823};
1824
1825// X86 target abstract base class; x86-32 and x86-64 are very close, so
1826// most of the implementation can be shared.
1827class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001828 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001829 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001830 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001831 enum MMX3DNowEnum {
1832 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1833 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001834 enum XOPEnum {
1835 NoXOP,
1836 SSE4A,
1837 FMA4,
1838 XOP
1839 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001840
Eric Christophere1ddaf92010-04-02 23:50:19 +00001841 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001842 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001843 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001844 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001845 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001846 bool HasBMI;
1847 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001848 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001849 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001850 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001851 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001852 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001853 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001854 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001855 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001856 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1857 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001858 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001859 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001860
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001861 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1862 ///
1863 /// Each enumeration represents a particular CPU supported by Clang. These
1864 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1865 enum CPUKind {
1866 CK_Generic,
1867
1868 /// \name i386
1869 /// i386-generation processors.
1870 //@{
1871 CK_i386,
1872 //@}
1873
1874 /// \name i486
1875 /// i486-generation processors.
1876 //@{
1877 CK_i486,
1878 CK_WinChipC6,
1879 CK_WinChip2,
1880 CK_C3,
1881 //@}
1882
1883 /// \name i586
1884 /// i586-generation processors, P5 microarchitecture based.
1885 //@{
1886 CK_i586,
1887 CK_Pentium,
1888 CK_PentiumMMX,
1889 //@}
1890
1891 /// \name i686
1892 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1893 //@{
1894 CK_i686,
1895 CK_PentiumPro,
1896 CK_Pentium2,
1897 CK_Pentium3,
1898 CK_Pentium3M,
1899 CK_PentiumM,
1900 CK_C3_2,
1901
1902 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1903 /// Clang however has some logic to suport this.
1904 // FIXME: Warn, deprecate, and potentially remove this.
1905 CK_Yonah,
1906 //@}
1907
1908 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001909 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001910 //@{
1911 CK_Pentium4,
1912 CK_Pentium4M,
1913 CK_Prescott,
1914 CK_Nocona,
1915 //@}
1916
1917 /// \name Core
1918 /// Core microarchitecture based processors.
1919 //@{
1920 CK_Core2,
1921
1922 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1923 /// codename which GCC no longer accepts as an option to -march, but Clang
1924 /// has some logic for recognizing it.
1925 // FIXME: Warn, deprecate, and potentially remove this.
1926 CK_Penryn,
1927 //@}
1928
1929 /// \name Atom
1930 /// Atom processors
1931 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001932 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001933 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001934 //@}
1935
1936 /// \name Nehalem
1937 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001938 CK_Nehalem,
1939
1940 /// \name Westmere
1941 /// Westmere microarchitecture based processors.
1942 CK_Westmere,
1943
1944 /// \name Sandy Bridge
1945 /// Sandy Bridge microarchitecture based processors.
1946 CK_SandyBridge,
1947
1948 /// \name Ivy Bridge
1949 /// Ivy Bridge microarchitecture based processors.
1950 CK_IvyBridge,
1951
1952 /// \name Haswell
1953 /// Haswell microarchitecture based processors.
1954 CK_Haswell,
1955
1956 /// \name Broadwell
1957 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001958 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001959
1960 /// \name Skylake
1961 /// Skylake microarchitecture based processors.
1962 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001963
Craig Topper449314e2013-08-20 07:09:39 +00001964 /// \name Knights Landing
1965 /// Knights Landing processor.
1966 CK_KNL,
1967
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001968 /// \name K6
1969 /// K6 architecture processors.
1970 //@{
1971 CK_K6,
1972 CK_K6_2,
1973 CK_K6_3,
1974 //@}
1975
1976 /// \name K7
1977 /// K7 architecture processors.
1978 //@{
1979 CK_Athlon,
1980 CK_AthlonThunderbird,
1981 CK_Athlon4,
1982 CK_AthlonXP,
1983 CK_AthlonMP,
1984 //@}
1985
1986 /// \name K8
1987 /// K8 architecture processors.
1988 //@{
1989 CK_Athlon64,
1990 CK_Athlon64SSE3,
1991 CK_AthlonFX,
1992 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001993 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001994 CK_Opteron,
1995 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001996 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001997 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001998
Benjamin Kramer569f2152012-01-10 11:50:18 +00001999 /// \name Bobcat
2000 /// Bobcat architecture processors.
2001 //@{
2002 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002003 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002004 //@}
2005
2006 /// \name Bulldozer
2007 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002008 //@{
2009 CK_BDVER1,
2010 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002011 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002012 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002013 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002014
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002015 /// This specification is deprecated and will be removed in the future.
2016 /// Users should prefer \see CK_K8.
2017 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002018 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002019 CK_x86_64,
2020 //@}
2021
2022 /// \name Geode
2023 /// Geode processors.
2024 //@{
2025 CK_Geode
2026 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002027 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002028
Rafael Espindolaeb265472013-08-21 21:59:03 +00002029 enum FPMathKind {
2030 FP_Default,
2031 FP_SSE,
2032 FP_387
2033 } FPMath;
2034
Eli Friedman3fd920a2008-08-20 02:34:37 +00002035public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002036 X86TargetInfo(const llvm::Triple &Triple)
2037 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002038 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002039 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2040 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2041 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2042 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2043 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2044 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002045 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002046 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002047 }
Craig Topper3164f332014-03-11 03:39:26 +00002048 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002049 // X87 evaluates with 80 bits "long double" precision.
2050 return SSELevel == NoSSE ? 2 : 0;
2051 }
Craig Topper3164f332014-03-11 03:39:26 +00002052 void getTargetBuiltins(const Builtin::Info *&Records,
2053 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002054 Records = BuiltinInfo;
2055 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002056 }
Craig Topper3164f332014-03-11 03:39:26 +00002057 void getGCCRegNames(const char * const *&Names,
2058 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002059 Names = GCCRegNames;
2060 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002061 }
Craig Topper3164f332014-03-11 03:39:26 +00002062 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2063 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002064 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002065 NumAliases = 0;
2066 }
Craig Topper3164f332014-03-11 03:39:26 +00002067 void getGCCAddlRegNames(const AddlRegName *&Names,
2068 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002069 Names = AddlRegNames;
2070 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002071 }
Craig Topper3164f332014-03-11 03:39:26 +00002072 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002073 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002074
Akira Hatanaka974131e2014-09-18 18:17:18 +00002075 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2076
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002077 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2078
Akira Hatanaka974131e2014-09-18 18:17:18 +00002079 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2080
Craig Topper3164f332014-03-11 03:39:26 +00002081 std::string convertConstraint(const char *&Constraint) const override;
2082 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002083 return "~{dirflag},~{fpsr},~{flags}";
2084 }
Craig Topper3164f332014-03-11 03:39:26 +00002085 void getTargetDefines(const LangOptions &Opts,
2086 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002087 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2088 bool Enabled);
2089 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2090 bool Enabled);
2091 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2092 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002093 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2094 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002095 setFeatureEnabledImpl(Features, Name, Enabled);
2096 }
2097 // This exists purely to cut down on the number of virtual calls in
2098 // getDefaultFeatures which calls this repeatedly.
2099 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2100 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002101 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2102 bool hasFeature(StringRef Feature) const override;
2103 bool handleTargetFeatures(std::vector<std::string> &Features,
2104 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002105 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002106 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002107 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002108 else if (getTriple().getArch() == llvm::Triple::x86 &&
2109 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002110 return "no-mmx";
2111 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002112 }
Craig Topper3164f332014-03-11 03:39:26 +00002113 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002114 CPU = llvm::StringSwitch<CPUKind>(Name)
2115 .Case("i386", CK_i386)
2116 .Case("i486", CK_i486)
2117 .Case("winchip-c6", CK_WinChipC6)
2118 .Case("winchip2", CK_WinChip2)
2119 .Case("c3", CK_C3)
2120 .Case("i586", CK_i586)
2121 .Case("pentium", CK_Pentium)
2122 .Case("pentium-mmx", CK_PentiumMMX)
2123 .Case("i686", CK_i686)
2124 .Case("pentiumpro", CK_PentiumPro)
2125 .Case("pentium2", CK_Pentium2)
2126 .Case("pentium3", CK_Pentium3)
2127 .Case("pentium3m", CK_Pentium3M)
2128 .Case("pentium-m", CK_PentiumM)
2129 .Case("c3-2", CK_C3_2)
2130 .Case("yonah", CK_Yonah)
2131 .Case("pentium4", CK_Pentium4)
2132 .Case("pentium4m", CK_Pentium4M)
2133 .Case("prescott", CK_Prescott)
2134 .Case("nocona", CK_Nocona)
2135 .Case("core2", CK_Core2)
2136 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002137 .Case("bonnell", CK_Bonnell)
2138 .Case("atom", CK_Bonnell) // Legacy name.
2139 .Case("silvermont", CK_Silvermont)
2140 .Case("slm", CK_Silvermont) // Legacy name.
2141 .Case("nehalem", CK_Nehalem)
2142 .Case("corei7", CK_Nehalem) // Legacy name.
2143 .Case("westmere", CK_Westmere)
2144 .Case("sandybridge", CK_SandyBridge)
2145 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2146 .Case("ivybridge", CK_IvyBridge)
2147 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2148 .Case("haswell", CK_Haswell)
2149 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002150 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002151 .Case("skylake", CK_Skylake)
2152 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002153 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002154 .Case("k6", CK_K6)
2155 .Case("k6-2", CK_K6_2)
2156 .Case("k6-3", CK_K6_3)
2157 .Case("athlon", CK_Athlon)
2158 .Case("athlon-tbird", CK_AthlonThunderbird)
2159 .Case("athlon-4", CK_Athlon4)
2160 .Case("athlon-xp", CK_AthlonXP)
2161 .Case("athlon-mp", CK_AthlonMP)
2162 .Case("athlon64", CK_Athlon64)
2163 .Case("athlon64-sse3", CK_Athlon64SSE3)
2164 .Case("athlon-fx", CK_AthlonFX)
2165 .Case("k8", CK_K8)
2166 .Case("k8-sse3", CK_K8SSE3)
2167 .Case("opteron", CK_Opteron)
2168 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002169 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002170 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002171 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002172 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002173 .Case("bdver1", CK_BDVER1)
2174 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002175 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002176 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002177 .Case("x86-64", CK_x86_64)
2178 .Case("geode", CK_Geode)
2179 .Default(CK_Generic);
2180
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002181 // Perform any per-CPU checks necessary to determine if this CPU is
2182 // acceptable.
2183 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2184 // invalid without explaining *why*.
2185 switch (CPU) {
2186 case CK_Generic:
2187 // No processor selected!
2188 return false;
2189
2190 case CK_i386:
2191 case CK_i486:
2192 case CK_WinChipC6:
2193 case CK_WinChip2:
2194 case CK_C3:
2195 case CK_i586:
2196 case CK_Pentium:
2197 case CK_PentiumMMX:
2198 case CK_i686:
2199 case CK_PentiumPro:
2200 case CK_Pentium2:
2201 case CK_Pentium3:
2202 case CK_Pentium3M:
2203 case CK_PentiumM:
2204 case CK_Yonah:
2205 case CK_C3_2:
2206 case CK_Pentium4:
2207 case CK_Pentium4M:
2208 case CK_Prescott:
2209 case CK_K6:
2210 case CK_K6_2:
2211 case CK_K6_3:
2212 case CK_Athlon:
2213 case CK_AthlonThunderbird:
2214 case CK_Athlon4:
2215 case CK_AthlonXP:
2216 case CK_AthlonMP:
2217 case CK_Geode:
2218 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002219 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002220 return false;
2221
2222 // Fallthrough
2223 case CK_Nocona:
2224 case CK_Core2:
2225 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002226 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002227 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002228 case CK_Nehalem:
2229 case CK_Westmere:
2230 case CK_SandyBridge:
2231 case CK_IvyBridge:
2232 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002233 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002234 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002235 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002236 case CK_Athlon64:
2237 case CK_Athlon64SSE3:
2238 case CK_AthlonFX:
2239 case CK_K8:
2240 case CK_K8SSE3:
2241 case CK_Opteron:
2242 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002243 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002244 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002245 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002246 case CK_BDVER1:
2247 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002248 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002249 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002250 case CK_x86_64:
2251 return true;
2252 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002253 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002254 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002255
Craig Topper3164f332014-03-11 03:39:26 +00002256 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002257
Craig Topper3164f332014-03-11 03:39:26 +00002258 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002259 // We accept all non-ARM calling conventions
2260 return (CC == CC_X86ThisCall ||
2261 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002262 CC == CC_X86StdCall ||
2263 CC == CC_X86VectorCall ||
2264 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002265 CC == CC_X86Pascal ||
2266 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002267 }
2268
Craig Topper3164f332014-03-11 03:39:26 +00002269 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002270 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002271 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002272
2273 bool hasSjLjLowering() const override {
2274 return true;
2275 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002276};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002277
Rafael Espindolaeb265472013-08-21 21:59:03 +00002278bool X86TargetInfo::setFPMath(StringRef Name) {
2279 if (Name == "387") {
2280 FPMath = FP_387;
2281 return true;
2282 }
2283 if (Name == "sse") {
2284 FPMath = FP_SSE;
2285 return true;
2286 }
2287 return false;
2288}
2289
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002290void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002291 // FIXME: This *really* should not be here.
2292
2293 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002294 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002295 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002296
Chandler Carruth212334f2011-09-28 08:55:37 +00002297 switch (CPU) {
2298 case CK_Generic:
2299 case CK_i386:
2300 case CK_i486:
2301 case CK_i586:
2302 case CK_Pentium:
2303 case CK_i686:
2304 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002305 break;
2306 case CK_PentiumMMX:
2307 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002308 case CK_K6:
2309 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002310 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002311 break;
2312 case CK_Pentium3:
2313 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002314 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002315 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002316 break;
2317 case CK_PentiumM:
2318 case CK_Pentium4:
2319 case CK_Pentium4M:
2320 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002321 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002322 break;
2323 case CK_Yonah:
2324 case CK_Prescott:
2325 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002326 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002327 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002328 break;
2329 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002330 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002331 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002332 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002333 break;
2334 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002335 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002336 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002337 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002338 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002339 setFeatureEnabledImpl(Features, "avx512f", true);
2340 setFeatureEnabledImpl(Features, "avx512cd", true);
2341 setFeatureEnabledImpl(Features, "avx512dq", true);
2342 setFeatureEnabledImpl(Features, "avx512bw", true);
2343 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002344 // FALLTHROUGH
2345 case CK_Broadwell:
2346 setFeatureEnabledImpl(Features, "rdseed", true);
2347 setFeatureEnabledImpl(Features, "adx", true);
2348 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002349 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002350 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002351 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002352 setFeatureEnabledImpl(Features, "bmi", true);
2353 setFeatureEnabledImpl(Features, "bmi2", true);
2354 setFeatureEnabledImpl(Features, "rtm", true);
2355 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002356 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002357 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002358 setFeatureEnabledImpl(Features, "rdrnd", true);
2359 setFeatureEnabledImpl(Features, "f16c", true);
2360 setFeatureEnabledImpl(Features, "fsgsbase", true);
2361 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002362 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002363 setFeatureEnabledImpl(Features, "avx", true);
2364 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002365 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002366 case CK_Silvermont:
2367 setFeatureEnabledImpl(Features, "aes", true);
2368 setFeatureEnabledImpl(Features, "pclmul", true);
2369 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002370 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002371 setFeatureEnabledImpl(Features, "sse4.2", true);
2372 setFeatureEnabledImpl(Features, "cx16", true);
2373 break;
2374 case CK_KNL:
2375 setFeatureEnabledImpl(Features, "avx512f", true);
2376 setFeatureEnabledImpl(Features, "avx512cd", true);
2377 setFeatureEnabledImpl(Features, "avx512er", true);
2378 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002379 setFeatureEnabledImpl(Features, "rdseed", true);
2380 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002381 setFeatureEnabledImpl(Features, "lzcnt", true);
2382 setFeatureEnabledImpl(Features, "bmi", true);
2383 setFeatureEnabledImpl(Features, "bmi2", true);
2384 setFeatureEnabledImpl(Features, "rtm", true);
2385 setFeatureEnabledImpl(Features, "fma", true);
2386 setFeatureEnabledImpl(Features, "rdrnd", true);
2387 setFeatureEnabledImpl(Features, "f16c", true);
2388 setFeatureEnabledImpl(Features, "fsgsbase", true);
2389 setFeatureEnabledImpl(Features, "aes", true);
2390 setFeatureEnabledImpl(Features, "pclmul", true);
2391 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002392 break;
2393 case CK_K6_2:
2394 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002395 case CK_WinChip2:
2396 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002397 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002398 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002399 case CK_Athlon:
2400 case CK_AthlonThunderbird:
2401 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002402 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002403 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002404 case CK_Athlon4:
2405 case CK_AthlonXP:
2406 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002407 setFeatureEnabledImpl(Features, "sse", true);
2408 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002409 break;
2410 case CK_K8:
2411 case CK_Opteron:
2412 case CK_Athlon64:
2413 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002414 setFeatureEnabledImpl(Features, "sse2", true);
2415 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002416 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002417 case CK_AMDFAM10:
2418 setFeatureEnabledImpl(Features, "sse4a", true);
2419 setFeatureEnabledImpl(Features, "lzcnt", true);
2420 setFeatureEnabledImpl(Features, "popcnt", true);
2421 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002422 case CK_K8SSE3:
2423 case CK_OpteronSSE3:
2424 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002425 setFeatureEnabledImpl(Features, "sse3", true);
2426 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002427 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002428 case CK_BTVER2:
2429 setFeatureEnabledImpl(Features, "avx", true);
2430 setFeatureEnabledImpl(Features, "aes", true);
2431 setFeatureEnabledImpl(Features, "pclmul", true);
2432 setFeatureEnabledImpl(Features, "bmi", true);
2433 setFeatureEnabledImpl(Features, "f16c", true);
2434 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002435 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002436 setFeatureEnabledImpl(Features, "ssse3", true);
2437 setFeatureEnabledImpl(Features, "sse4a", true);
2438 setFeatureEnabledImpl(Features, "lzcnt", true);
2439 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002440 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002441 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002442 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002443 case CK_BDVER4:
2444 setFeatureEnabledImpl(Features, "avx2", true);
2445 setFeatureEnabledImpl(Features, "bmi2", true);
2446 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002447 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002448 setFeatureEnabledImpl(Features, "fsgsbase", true);
2449 // FALLTHROUGH
2450 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002451 setFeatureEnabledImpl(Features, "bmi", true);
2452 setFeatureEnabledImpl(Features, "fma", true);
2453 setFeatureEnabledImpl(Features, "f16c", true);
2454 setFeatureEnabledImpl(Features, "tbm", true);
2455 // FALLTHROUGH
2456 case CK_BDVER1:
2457 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002458 setFeatureEnabledImpl(Features, "xop", true);
2459 setFeatureEnabledImpl(Features, "lzcnt", true);
2460 setFeatureEnabledImpl(Features, "aes", true);
2461 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002462 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002463 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002464 break;
Eli Friedman33465822011-07-08 23:31:17 +00002465 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002466}
2467
Rafael Espindolae62e2792013-08-20 13:44:29 +00002468void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002469 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002470 if (Enabled) {
2471 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002472 case AVX512F:
2473 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002474 case AVX2:
2475 Features["avx2"] = true;
2476 case AVX:
2477 Features["avx"] = true;
2478 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002479 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002480 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002481 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002482 case SSSE3:
2483 Features["ssse3"] = true;
2484 case SSE3:
2485 Features["sse3"] = true;
2486 case SSE2:
2487 Features["sse2"] = true;
2488 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002489 Features["sse"] = true;
2490 case NoSSE:
2491 break;
2492 }
2493 return;
2494 }
2495
2496 switch (Level) {
2497 case NoSSE:
2498 case SSE1:
2499 Features["sse"] = false;
2500 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002501 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2502 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002503 case SSE3:
2504 Features["sse3"] = false;
2505 setXOPLevel(Features, NoXOP, false);
2506 case SSSE3:
2507 Features["ssse3"] = false;
2508 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002509 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002510 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002511 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002512 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002513 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002514 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002515 case AVX2:
2516 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002517 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002518 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002519 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2520 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002521 }
2522}
2523
2524void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002525 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002526 if (Enabled) {
2527 switch (Level) {
2528 case AMD3DNowAthlon:
2529 Features["3dnowa"] = true;
2530 case AMD3DNow:
2531 Features["3dnow"] = true;
2532 case MMX:
2533 Features["mmx"] = true;
2534 case NoMMX3DNow:
2535 break;
2536 }
2537 return;
2538 }
2539
2540 switch (Level) {
2541 case NoMMX3DNow:
2542 case MMX:
2543 Features["mmx"] = false;
2544 case AMD3DNow:
2545 Features["3dnow"] = false;
2546 case AMD3DNowAthlon:
2547 Features["3dnowa"] = false;
2548 }
2549}
2550
2551void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002552 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002553 if (Enabled) {
2554 switch (Level) {
2555 case XOP:
2556 Features["xop"] = true;
2557 case FMA4:
2558 Features["fma4"] = true;
2559 setSSELevel(Features, AVX, true);
2560 case SSE4A:
2561 Features["sse4a"] = true;
2562 setSSELevel(Features, SSE3, true);
2563 case NoXOP:
2564 break;
2565 }
2566 return;
2567 }
2568
2569 switch (Level) {
2570 case NoXOP:
2571 case SSE4A:
2572 Features["sse4a"] = false;
2573 case FMA4:
2574 Features["fma4"] = false;
2575 case XOP:
2576 Features["xop"] = false;
2577 }
2578}
2579
Craig Topper86d79ef2013-09-17 04:51:29 +00002580void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2581 StringRef Name, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002582 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002583
Craig Topper29561122013-09-19 01:13:07 +00002584 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002585 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002586 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002587 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002588 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002589 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002590 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002591 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002592 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002593 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002594 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002595 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002596 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002597 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002598 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002599 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002600 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002601 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002602 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002603 if (Enabled)
2604 setSSELevel(Features, SSE2, Enabled);
2605 } else if (Name == "pclmul") {
2606 if (Enabled)
2607 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002608 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002609 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002610 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002611 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002612 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002613 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002614 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2615 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002616 if (Enabled)
2617 setSSELevel(Features, AVX512F, Enabled);
2618 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002619 if (Enabled)
2620 setSSELevel(Features, AVX, Enabled);
2621 } else if (Name == "fma4") {
2622 setXOPLevel(Features, FMA4, Enabled);
2623 } else if (Name == "xop") {
2624 setXOPLevel(Features, XOP, Enabled);
2625 } else if (Name == "sse4a") {
2626 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002627 } else if (Name == "f16c") {
2628 if (Enabled)
2629 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002630 } else if (Name == "sha") {
2631 if (Enabled)
2632 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002633 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002634}
2635
Eric Christopher3ff21b32013-10-16 21:26:26 +00002636/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002637/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002638bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002639 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002640 // Remember the maximum enabled sselevel.
2641 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2642 // Ignore disabled features.
2643 if (Features[i][0] == '-')
2644 continue;
2645
Benjamin Kramer27402c62012-03-05 15:10:44 +00002646 StringRef Feature = StringRef(Features[i]).substr(1);
2647
2648 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002649 HasAES = true;
2650 continue;
2651 }
2652
Craig Topper3f122a72012-05-31 05:18:48 +00002653 if (Feature == "pclmul") {
2654 HasPCLMUL = true;
2655 continue;
2656 }
2657
Benjamin Kramer27402c62012-03-05 15:10:44 +00002658 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002659 HasLZCNT = true;
2660 continue;
2661 }
2662
Rafael Espindola89049822013-08-23 20:21:37 +00002663 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002664 HasRDRND = true;
2665 continue;
2666 }
2667
Craig Topper8c7f2512014-11-03 06:51:41 +00002668 if (Feature == "fsgsbase") {
2669 HasFSGSBASE = true;
2670 continue;
2671 }
2672
Benjamin Kramer27402c62012-03-05 15:10:44 +00002673 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002674 HasBMI = true;
2675 continue;
2676 }
2677
Benjamin Kramer27402c62012-03-05 15:10:44 +00002678 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002679 HasBMI2 = true;
2680 continue;
2681 }
2682
Benjamin Kramer27402c62012-03-05 15:10:44 +00002683 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002684 HasPOPCNT = true;
2685 continue;
2686 }
2687
Michael Liao625a8752012-11-10 05:17:46 +00002688 if (Feature == "rtm") {
2689 HasRTM = true;
2690 continue;
2691 }
2692
Michael Liao74f4eaf2013-03-26 17:52:08 +00002693 if (Feature == "prfchw") {
2694 HasPRFCHW = true;
2695 continue;
2696 }
2697
Michael Liaoffaae352013-03-29 05:17:55 +00002698 if (Feature == "rdseed") {
2699 HasRDSEED = true;
2700 continue;
2701 }
2702
Robert Khasanov50e6f582014-09-19 09:53:48 +00002703 if (Feature == "adx") {
2704 HasADX = true;
2705 continue;
2706 }
2707
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002708 if (Feature == "tbm") {
2709 HasTBM = true;
2710 continue;
2711 }
2712
Craig Topperbba778b2012-06-03 21:46:30 +00002713 if (Feature == "fma") {
2714 HasFMA = true;
2715 continue;
2716 }
2717
Manman Rena45358c2012-10-11 00:59:55 +00002718 if (Feature == "f16c") {
2719 HasF16C = true;
2720 continue;
2721 }
2722
Craig Topper679b53a2013-08-21 05:29:10 +00002723 if (Feature == "avx512cd") {
2724 HasAVX512CD = true;
2725 continue;
2726 }
2727
2728 if (Feature == "avx512er") {
2729 HasAVX512ER = true;
2730 continue;
2731 }
2732
2733 if (Feature == "avx512pf") {
2734 HasAVX512PF = true;
2735 continue;
2736 }
2737
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002738 if (Feature == "avx512dq") {
2739 HasAVX512DQ = true;
2740 continue;
2741 }
2742
2743 if (Feature == "avx512bw") {
2744 HasAVX512BW = true;
2745 continue;
2746 }
2747
2748 if (Feature == "avx512vl") {
2749 HasAVX512VL = true;
2750 continue;
2751 }
2752
Ben Langmuir58078d02013-09-19 13:22:04 +00002753 if (Feature == "sha") {
2754 HasSHA = true;
2755 continue;
2756 }
2757
Nick Lewycky50e8f482013-10-05 20:14:27 +00002758 if (Feature == "cx16") {
2759 HasCX16 = true;
2760 continue;
2761 }
2762
Daniel Dunbar979586e2009-11-11 09:38:56 +00002763 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002764 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002765 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002766 .Case("avx2", AVX2)
2767 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002768 .Case("sse4.2", SSE42)
2769 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002770 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002771 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002772 .Case("sse2", SSE2)
2773 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002774 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002775 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002776
Eli Friedman33465822011-07-08 23:31:17 +00002777 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002778 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002779 .Case("3dnowa", AMD3DNowAthlon)
2780 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002781 .Case("mmx", MMX)
2782 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002783 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002784
2785 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2786 .Case("xop", XOP)
2787 .Case("fma4", FMA4)
2788 .Case("sse4a", SSE4A)
2789 .Default(NoXOP);
2790 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002791 }
Eli Friedman33465822011-07-08 23:31:17 +00002792
Craig Topper7481d8a2013-09-10 06:55:47 +00002793 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2794 // Can't do this earlier because we need to be able to explicitly enable
2795 // popcnt and still disable sse4.2.
2796 if (!HasPOPCNT && SSELevel >= SSE42 &&
2797 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2798 HasPOPCNT = true;
2799 Features.push_back("+popcnt");
2800 }
2801
Yunzhong Gao61089362013-10-16 19:07:02 +00002802 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2803 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2804 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2805 HasPRFCHW = true;
2806 Features.push_back("+prfchw");
2807 }
2808
Rafael Espindolaeb265472013-08-21 21:59:03 +00002809 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2810 // matches the selected sse level.
2811 if (FPMath == FP_SSE && SSELevel < SSE1) {
2812 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2813 return false;
2814 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2815 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2816 return false;
2817 }
2818
Eli Friedman33465822011-07-08 23:31:17 +00002819 // Don't tell the backend if we're turning off mmx; it will end up disabling
2820 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002821 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2822 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002823 std::vector<std::string>::iterator it;
2824 it = std::find(Features.begin(), Features.end(), "-mmx");
2825 if (it != Features.end())
2826 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002827 else if (SSELevel > NoSSE)
2828 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002829 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002830}
Chris Lattnerecd49032009-03-02 22:27:17 +00002831
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002832/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2833/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002834void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002835 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002836 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002837 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002838 Builder.defineMacro("__amd64__");
2839 Builder.defineMacro("__amd64");
2840 Builder.defineMacro("__x86_64");
2841 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002842 if (getTriple().getArchName() == "x86_64h") {
2843 Builder.defineMacro("__x86_64h");
2844 Builder.defineMacro("__x86_64h__");
2845 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002846 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002847 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002848 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002849
Chris Lattnerecd49032009-03-02 22:27:17 +00002850 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002851 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2852 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002853 switch (CPU) {
2854 case CK_Generic:
2855 break;
2856 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002857 // The rest are coming from the i386 define above.
2858 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002859 break;
2860 case CK_i486:
2861 case CK_WinChipC6:
2862 case CK_WinChip2:
2863 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002864 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002865 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002866 case CK_PentiumMMX:
2867 Builder.defineMacro("__pentium_mmx__");
2868 Builder.defineMacro("__tune_pentium_mmx__");
2869 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002870 case CK_i586:
2871 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002872 defineCPUMacros(Builder, "i586");
2873 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002874 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002875 case CK_Pentium3:
2876 case CK_Pentium3M:
2877 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002878 Builder.defineMacro("__tune_pentium3__");
2879 // Fallthrough
2880 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002881 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002882 Builder.defineMacro("__tune_pentium2__");
2883 // Fallthrough
2884 case CK_PentiumPro:
2885 Builder.defineMacro("__tune_i686__");
2886 Builder.defineMacro("__tune_pentiumpro__");
2887 // Fallthrough
2888 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002889 Builder.defineMacro("__i686");
2890 Builder.defineMacro("__i686__");
2891 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2892 Builder.defineMacro("__pentiumpro");
2893 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002894 break;
2895 case CK_Pentium4:
2896 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002897 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002898 break;
2899 case CK_Yonah:
2900 case CK_Prescott:
2901 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002902 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002903 break;
2904 case CK_Core2:
2905 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002906 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002907 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002908 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002909 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002910 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002911 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002912 defineCPUMacros(Builder, "slm");
2913 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002914 case CK_Nehalem:
2915 case CK_Westmere:
2916 case CK_SandyBridge:
2917 case CK_IvyBridge:
2918 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002919 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002920 // FIXME: Historically, we defined this legacy name, it would be nice to
2921 // remove it at some point. We've never exposed fine-grained names for
2922 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002923 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002924 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002925 case CK_Skylake:
2926 // FIXME: Historically, we defined this legacy name, it would be nice to
2927 // remove it at some point. This is the only fine-grained CPU macro in the
2928 // main intel CPU line, and it would be better to not have these and force
2929 // people to use ISA macros.
2930 defineCPUMacros(Builder, "skx");
2931 break;
Craig Topper449314e2013-08-20 07:09:39 +00002932 case CK_KNL:
2933 defineCPUMacros(Builder, "knl");
2934 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002935 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002936 Builder.defineMacro("__k6_2__");
2937 Builder.defineMacro("__tune_k6_2__");
2938 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002939 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002940 if (CPU != CK_K6_2) { // In case of fallthrough
2941 // FIXME: GCC may be enabling these in cases where some other k6
2942 // architecture is specified but -m3dnow is explicitly provided. The
2943 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002944 Builder.defineMacro("__k6_3__");
2945 Builder.defineMacro("__tune_k6_3__");
2946 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002947 // Fallthrough
2948 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002949 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002950 break;
2951 case CK_Athlon:
2952 case CK_AthlonThunderbird:
2953 case CK_Athlon4:
2954 case CK_AthlonXP:
2955 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002956 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002957 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002958 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002959 Builder.defineMacro("__tune_athlon_sse__");
2960 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002961 break;
2962 case CK_K8:
2963 case CK_K8SSE3:
2964 case CK_x86_64:
2965 case CK_Opteron:
2966 case CK_OpteronSSE3:
2967 case CK_Athlon64:
2968 case CK_Athlon64SSE3:
2969 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002970 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002971 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002972 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002973 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002974 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002975 case CK_BTVER1:
2976 defineCPUMacros(Builder, "btver1");
2977 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002978 case CK_BTVER2:
2979 defineCPUMacros(Builder, "btver2");
2980 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002981 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002982 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002983 break;
2984 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002985 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002986 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002987 case CK_BDVER3:
2988 defineCPUMacros(Builder, "bdver3");
2989 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002990 case CK_BDVER4:
2991 defineCPUMacros(Builder, "bdver4");
2992 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002993 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002994 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002995 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002996 }
Chris Lattner96e43572009-03-02 22:40:39 +00002997
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002998 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002999 Builder.defineMacro("__REGISTER_PREFIX__", "");
3000
Chris Lattner6df41af2009-04-19 17:32:33 +00003001 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3002 // functions in glibc header files that use FP Stack inline asm which the
3003 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003004 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003005
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003006 if (HasAES)
3007 Builder.defineMacro("__AES__");
3008
Craig Topper3f122a72012-05-31 05:18:48 +00003009 if (HasPCLMUL)
3010 Builder.defineMacro("__PCLMUL__");
3011
Craig Topper22967d42011-12-25 05:06:45 +00003012 if (HasLZCNT)
3013 Builder.defineMacro("__LZCNT__");
3014
Benjamin Kramer1e250392012-07-07 09:39:18 +00003015 if (HasRDRND)
3016 Builder.defineMacro("__RDRND__");
3017
Craig Topper8c7f2512014-11-03 06:51:41 +00003018 if (HasFSGSBASE)
3019 Builder.defineMacro("__FSGSBASE__");
3020
Craig Topper22967d42011-12-25 05:06:45 +00003021 if (HasBMI)
3022 Builder.defineMacro("__BMI__");
3023
3024 if (HasBMI2)
3025 Builder.defineMacro("__BMI2__");
3026
Craig Topper1de83482011-12-29 16:10:46 +00003027 if (HasPOPCNT)
3028 Builder.defineMacro("__POPCNT__");
3029
Michael Liao625a8752012-11-10 05:17:46 +00003030 if (HasRTM)
3031 Builder.defineMacro("__RTM__");
3032
Michael Liao74f4eaf2013-03-26 17:52:08 +00003033 if (HasPRFCHW)
3034 Builder.defineMacro("__PRFCHW__");
3035
Michael Liaoffaae352013-03-29 05:17:55 +00003036 if (HasRDSEED)
3037 Builder.defineMacro("__RDSEED__");
3038
Robert Khasanov50e6f582014-09-19 09:53:48 +00003039 if (HasADX)
3040 Builder.defineMacro("__ADX__");
3041
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003042 if (HasTBM)
3043 Builder.defineMacro("__TBM__");
3044
Rafael Espindolae62e2792013-08-20 13:44:29 +00003045 switch (XOPLevel) {
3046 case XOP:
3047 Builder.defineMacro("__XOP__");
3048 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003049 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003050 case SSE4A:
3051 Builder.defineMacro("__SSE4A__");
3052 case NoXOP:
3053 break;
3054 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003055
Craig Topperbba778b2012-06-03 21:46:30 +00003056 if (HasFMA)
3057 Builder.defineMacro("__FMA__");
3058
Manman Rena45358c2012-10-11 00:59:55 +00003059 if (HasF16C)
3060 Builder.defineMacro("__F16C__");
3061
Craig Topper679b53a2013-08-21 05:29:10 +00003062 if (HasAVX512CD)
3063 Builder.defineMacro("__AVX512CD__");
3064 if (HasAVX512ER)
3065 Builder.defineMacro("__AVX512ER__");
3066 if (HasAVX512PF)
3067 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003068 if (HasAVX512DQ)
3069 Builder.defineMacro("__AVX512DQ__");
3070 if (HasAVX512BW)
3071 Builder.defineMacro("__AVX512BW__");
3072 if (HasAVX512VL)
3073 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003074
Ben Langmuir58078d02013-09-19 13:22:04 +00003075 if (HasSHA)
3076 Builder.defineMacro("__SHA__");
3077
Nick Lewycky50e8f482013-10-05 20:14:27 +00003078 if (HasCX16)
3079 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3080
Chris Lattner96e43572009-03-02 22:40:39 +00003081 // Each case falls through to the previous one here.
3082 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003083 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003084 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003085 case AVX2:
3086 Builder.defineMacro("__AVX2__");
3087 case AVX:
3088 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003089 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003090 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003091 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003092 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003093 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003094 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003095 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003096 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003097 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003098 Builder.defineMacro("__SSE2__");
3099 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003100 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003101 Builder.defineMacro("__SSE__");
3102 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003103 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003104 break;
3105 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003106
Derek Schuffc7dd7222012-10-11 15:52:22 +00003107 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003108 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003109 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003110 case AVX2:
3111 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003112 case SSE42:
3113 case SSE41:
3114 case SSSE3:
3115 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003116 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003117 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003118 break;
3119 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003120 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003121 break;
3122 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003123 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003124 }
3125 }
3126
Anders Carlssone437c682010-01-27 03:47:49 +00003127 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003128 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003129 case AMD3DNowAthlon:
3130 Builder.defineMacro("__3dNOW_A__");
3131 case AMD3DNow:
3132 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003133 case MMX:
3134 Builder.defineMacro("__MMX__");
3135 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003136 break;
3137 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003138
3139 if (CPU >= CK_i486) {
3140 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3141 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3142 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3143 }
3144 if (CPU >= CK_i586)
3145 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003146}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003147
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003148bool X86TargetInfo::hasFeature(StringRef Feature) const {
3149 return llvm::StringSwitch<bool>(Feature)
3150 .Case("aes", HasAES)
3151 .Case("avx", SSELevel >= AVX)
3152 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003153 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003154 .Case("avx512cd", HasAVX512CD)
3155 .Case("avx512er", HasAVX512ER)
3156 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003157 .Case("avx512dq", HasAVX512DQ)
3158 .Case("avx512bw", HasAVX512BW)
3159 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003160 .Case("bmi", HasBMI)
3161 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003162 .Case("cx16", HasCX16)
3163 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003164 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003165 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003166 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003167 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003168 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3169 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3170 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003171 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003172 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003173 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003174 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003175 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003176 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003177 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003178 .Case("sse", SSELevel >= SSE1)
3179 .Case("sse2", SSELevel >= SSE2)
3180 .Case("sse3", SSELevel >= SSE3)
3181 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003182 .Case("sse4.1", SSELevel >= SSE41)
3183 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003184 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003185 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003186 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003187 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3188 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003189 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003190 .Default(false);
3191}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003192
Eli Friedman3fd920a2008-08-20 02:34:37 +00003193bool
Anders Carlsson58436352009-02-28 17:11:49 +00003194X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003195 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003196 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003197 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003198 case 'I':
3199 Info.setRequiresImmediate(0, 31);
3200 return true;
3201 case 'J':
3202 Info.setRequiresImmediate(0, 63);
3203 return true;
3204 case 'K':
3205 Info.setRequiresImmediate(-128, 127);
3206 return true;
3207 case 'L':
3208 // FIXME: properly analyze this constraint:
3209 // must be one of 0xff, 0xffff, or 0xffffffff
3210 return true;
3211 case 'M':
3212 Info.setRequiresImmediate(0, 3);
3213 return true;
3214 case 'N':
3215 Info.setRequiresImmediate(0, 255);
3216 return true;
3217 case 'O':
3218 Info.setRequiresImmediate(0, 127);
3219 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003220 case 'Y': // first letter of a pair:
3221 switch (*(Name+1)) {
3222 default: return false;
3223 case '0': // First SSE register.
3224 case 't': // Any SSE register, when SSE2 is enabled.
3225 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3226 case 'm': // any MMX register, when inter-unit moves enabled.
3227 break; // falls through to setAllowsRegister.
3228 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003229 case 'f': // any x87 floating point stack register.
3230 // Constraint 'f' cannot be used for output operands.
3231 if (Info.ConstraintStr[0] == '=')
3232 return false;
3233
3234 Info.setAllowsRegister();
3235 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003236 case 'a': // eax.
3237 case 'b': // ebx.
3238 case 'c': // ecx.
3239 case 'd': // edx.
3240 case 'S': // esi.
3241 case 'D': // edi.
3242 case 'A': // edx:eax.
3243 case 't': // top of floating point stack.
3244 case 'u': // second from top of floating point stack.
3245 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003246 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003247 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003248 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003249 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3250 case 'l': // "Index" registers: any general register that can be used as an
3251 // index in a base+index memory access.
3252 Info.setAllowsRegister();
3253 return true;
3254 case 'C': // SSE floating point constant.
3255 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003256 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003257 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003258 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003259 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003260 return true;
3261 }
3262}
3263
Akira Hatanaka974131e2014-09-18 18:17:18 +00003264bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3265 unsigned Size) const {
3266 // Strip off constraint modifiers.
3267 while (Constraint[0] == '=' ||
3268 Constraint[0] == '+' ||
3269 Constraint[0] == '&')
3270 Constraint = Constraint.substr(1);
3271
3272 return validateOperandSize(Constraint, Size);
3273}
3274
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003275bool X86TargetInfo::validateInputSize(StringRef Constraint,
3276 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003277 return validateOperandSize(Constraint, Size);
3278}
3279
3280bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3281 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003282 switch (Constraint[0]) {
3283 default: break;
3284 case 'y':
3285 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003286 case 'f':
3287 case 't':
3288 case 'u':
3289 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003290 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003291 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003292 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003293 }
3294
3295 return true;
3296}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003297
Eli Friedman3fd920a2008-08-20 02:34:37 +00003298std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003299X86TargetInfo::convertConstraint(const char *&Constraint) const {
3300 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003301 case 'a': return std::string("{ax}");
3302 case 'b': return std::string("{bx}");
3303 case 'c': return std::string("{cx}");
3304 case 'd': return std::string("{dx}");
3305 case 'S': return std::string("{si}");
3306 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003307 case 'p': // address
3308 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003309 case 't': // top of floating point stack.
3310 return std::string("{st}");
3311 case 'u': // second from top of floating point stack.
3312 return std::string("{st(1)}"); // second from top of floating point stack.
3313 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003314 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003315 }
3316}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003317
Eli Friedman3fd920a2008-08-20 02:34:37 +00003318// X86-32 generic target
3319class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003320public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003321 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003322 DoubleAlign = LongLongAlign = 32;
3323 LongDoubleWidth = 96;
3324 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003325 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003326 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003327 SizeType = UnsignedInt;
3328 PtrDiffType = SignedInt;
3329 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003330 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003331
3332 // Use fpret for all types.
3333 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3334 (1 << TargetInfo::Double) |
3335 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003336
3337 // x86-32 has atomics up to 8 bytes
3338 // FIXME: Check that we actually have cmpxchg8b before setting
3339 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3340 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003341 }
Craig Topper3164f332014-03-11 03:39:26 +00003342 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003343 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003344 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003345
Craig Topper3164f332014-03-11 03:39:26 +00003346 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003347 if (RegNo == 0) return 0;
3348 if (RegNo == 1) return 2;
3349 return -1;
3350 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003351 bool validateOperandSize(StringRef Constraint,
3352 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003353 switch (Constraint[0]) {
3354 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003355 case 'R':
3356 case 'q':
3357 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003358 case 'a':
3359 case 'b':
3360 case 'c':
3361 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003362 case 'S':
3363 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003364 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003365 case 'A':
3366 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003367 }
3368
Akira Hatanaka974131e2014-09-18 18:17:18 +00003369 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003370 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003371};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003372
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003373class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003375 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3376 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003377
Craig Topper3164f332014-03-11 03:39:26 +00003378 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003379 unsigned Major, Minor, Micro;
3380 getTriple().getOSVersion(Major, Minor, Micro);
3381 // New NetBSD uses the default rounding mode.
3382 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3383 return X86_32TargetInfo::getFloatEvalMethod();
3384 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003385 return 1;
3386 }
3387};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003388
Eli Friedmane3aa4542009-07-05 18:47:56 +00003389class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3390public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003391 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3392 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003393 SizeType = UnsignedLong;
3394 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003395 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003396 }
3397};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003398
Eli Friedman9fa28852012-08-08 23:57:20 +00003399class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3400public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003401 BitrigI386TargetInfo(const llvm::Triple &Triple)
3402 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003403 SizeType = UnsignedLong;
3404 IntPtrType = SignedLong;
3405 PtrDiffType = SignedLong;
3406 }
3407};
Eli Friedman9fa28852012-08-08 23:57:20 +00003408
Torok Edwinb2b37c62009-06-30 17:10:35 +00003409class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003410public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003411 DarwinI386TargetInfo(const llvm::Triple &Triple)
3412 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003413 LongDoubleWidth = 128;
3414 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003415 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003416 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003417 SizeType = UnsignedLong;
3418 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003419 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003420 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003421 }
3422
Eli Friedman3fd920a2008-08-20 02:34:37 +00003423};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003424
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003425// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003426class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003427public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003428 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3429 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003430 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003431 DoubleAlign = LongLongAlign = 64;
David Majnemer8fa8c382015-03-17 23:55:00 +00003432 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003433 }
Craig Topper3164f332014-03-11 03:39:26 +00003434 void getTargetDefines(const LangOptions &Opts,
3435 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003436 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3437 }
3438};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003439
3440// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003441class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003442public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003443 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003444 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003445 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003446 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3447 }
Craig Topper3164f332014-03-11 03:39:26 +00003448 void getTargetDefines(const LangOptions &Opts,
3449 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003450 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3451 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3452 // The value of the following reflects processor type.
3453 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3454 // We lost the original triple, so we use the default.
3455 Builder.defineMacro("_M_IX86", "600");
3456 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003457};
3458} // end anonymous namespace
3459
Reid Kleckner47606832014-04-21 20:58:00 +00003460static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3461 Builder.defineMacro("__MSVCRT__");
3462 Builder.defineMacro("__MINGW32__");
3463
3464 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3465 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3466 // macro anyway for pre-processor compatibility.
3467 if (Opts.MicrosoftExt)
3468 Builder.defineMacro("__declspec", "__declspec");
3469 else
3470 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3471
3472 if (!Opts.MicrosoftExt) {
3473 // Provide macros for all the calling convention keywords. Provide both
3474 // single and double underscore prefixed variants. These are available on
3475 // x64 as well as x86, even though they have no effect.
3476 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3477 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003478 std::string GCCSpelling = "__attribute__((__";
3479 GCCSpelling += CC;
3480 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003481 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3482 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3483 }
3484 }
3485}
3486
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003487namespace {
3488// x86-32 MinGW target
3489class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3490public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003491 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3492 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003493 void getTargetDefines(const LangOptions &Opts,
3494 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003495 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003496 DefineStd(Builder, "WIN32", Opts);
3497 DefineStd(Builder, "WINNT", Opts);
3498 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003499 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003500 }
3501};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003502
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003503// x86-32 Cygwin target
3504class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3505public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003506 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3507 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003508 TLSSupported = false;
3509 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003510 DoubleAlign = LongLongAlign = 64;
David Majnemer8fa8c382015-03-17 23:55:00 +00003511 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003512 }
Craig Topper3164f332014-03-11 03:39:26 +00003513 void getTargetDefines(const LangOptions &Opts,
3514 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003515 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003516 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003517 Builder.defineMacro("__CYGWIN__");
3518 Builder.defineMacro("__CYGWIN32__");
3519 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003520 if (Opts.CPlusPlus)
3521 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003522 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003523};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003524
Chris Lattnerb986aba2010-04-11 19:29:39 +00003525// x86-32 Haiku target
3526class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3527public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003528 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003529 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003530 IntPtrType = SignedLong;
3531 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003532 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003533 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003534 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003535 }
Craig Topper3164f332014-03-11 03:39:26 +00003536 void getTargetDefines(const LangOptions &Opts,
3537 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003538 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3539 Builder.defineMacro("__INTEL__");
3540 Builder.defineMacro("__HAIKU__");
3541 }
3542};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003543
Douglas Gregor9fabd852011-07-01 22:41:14 +00003544// RTEMS Target
3545template<typename Target>
3546class RTEMSTargetInfo : public OSTargetInfo<Target> {
3547protected:
Craig Topper3164f332014-03-11 03:39:26 +00003548 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3549 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003550 // RTEMS defines; list based off of gcc output
3551
Douglas Gregor9fabd852011-07-01 22:41:14 +00003552 Builder.defineMacro("__rtems__");
3553 Builder.defineMacro("__ELF__");
3554 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003555
Douglas Gregor9fabd852011-07-01 22:41:14 +00003556public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003557 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3558 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003559
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003560 switch (Triple.getArch()) {
3561 default:
3562 case llvm::Triple::x86:
3563 // this->MCountName = ".mcount";
3564 break;
3565 case llvm::Triple::mips:
3566 case llvm::Triple::mipsel:
3567 case llvm::Triple::ppc:
3568 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003569 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003570 // this->MCountName = "_mcount";
3571 break;
3572 case llvm::Triple::arm:
3573 // this->MCountName = "__mcount";
3574 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003575 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003576 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003577};
3578
Douglas Gregor9fabd852011-07-01 22:41:14 +00003579// x86-32 RTEMS target
3580class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3581public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003582 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003583 SizeType = UnsignedLong;
3584 IntPtrType = SignedLong;
3585 PtrDiffType = SignedLong;
3586 this->UserLabelPrefix = "";
3587 }
Craig Topper3164f332014-03-11 03:39:26 +00003588 void getTargetDefines(const LangOptions &Opts,
3589 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003590 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3591 Builder.defineMacro("__INTEL__");
3592 Builder.defineMacro("__rtems__");
3593 }
3594};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003595
Eli Friedman3fd920a2008-08-20 02:34:37 +00003596// x86-64 generic target
3597class X86_64TargetInfo : public X86TargetInfo {
3598public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003599 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003600 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003601 bool IsWinCOFF =
3602 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003603 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003604 LongDoubleWidth = 128;
3605 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003606 LargeArrayMinWidth = 128;
3607 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003608 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003609 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3610 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3611 IntPtrType = IsX32 ? SignedInt : SignedLong;
3612 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003613 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003614 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003615
Eric Christopher917e9522014-11-18 22:36:15 +00003616 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003617 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3618 : IsWinCOFF
3619 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3620 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003621
3622 // Use fpret only for long double.
3623 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003624
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003625 // Use fp2ret for _Complex long double.
3626 ComplexLongDoubleUsesFP2Ret = true;
3627
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003628 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003629 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003630 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003631 }
Craig Topper3164f332014-03-11 03:39:26 +00003632 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003633 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003634 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003635
Craig Topper3164f332014-03-11 03:39:26 +00003636 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003637 if (RegNo == 0) return 0;
3638 if (RegNo == 1) return 1;
3639 return -1;
3640 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003641
Craig Topper3164f332014-03-11 03:39:26 +00003642 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003643 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003644 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003645 CC == CC_IntelOclBicc ||
3646 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003647 }
3648
Craig Topper3164f332014-03-11 03:39:26 +00003649 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003650 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003651 }
3652
Pavel Chupinfd223e12014-08-04 12:39:43 +00003653 // for x32 we need it here explicitly
3654 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003655};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003656
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003657// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003658class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003659public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003660 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3661 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003662 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003663 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003664 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003665 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003666 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003667 SizeType = UnsignedLongLong;
3668 PtrDiffType = SignedLongLong;
3669 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003670 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003671 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003672
Craig Topper3164f332014-03-11 03:39:26 +00003673 void getTargetDefines(const LangOptions &Opts,
3674 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003675 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003676 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003677 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003678
Craig Topper3164f332014-03-11 03:39:26 +00003679 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003680 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003681 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003682
Craig Topper3164f332014-03-11 03:39:26 +00003683 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003684 switch (CC) {
3685 case CC_X86StdCall:
3686 case CC_X86ThisCall:
3687 case CC_X86FastCall:
3688 return CCCR_Ignore;
3689 case CC_C:
3690 case CC_X86VectorCall:
3691 case CC_IntelOclBicc:
3692 case CC_X86_64SysV:
3693 return CCCR_OK;
3694 default:
3695 return CCCR_Warning;
3696 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003697 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003698};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003699
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003700// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003701class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003702public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003703 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003704 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003705 LongDoubleWidth = LongDoubleAlign = 64;
3706 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003707 }
Craig Topper3164f332014-03-11 03:39:26 +00003708 void getTargetDefines(const LangOptions &Opts,
3709 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003710 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3711 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003712 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003713 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003714 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003715};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003716
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003717// x86-64 MinGW target
3718class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3719public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003720 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3721 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003722 void getTargetDefines(const LangOptions &Opts,
3723 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003724 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003725 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003726 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003727 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003728
3729 // GCC defines this macro when it is using __gxx_personality_seh0.
3730 if (!Opts.SjLjExceptions)
3731 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003732 }
3733};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003734
Eli Friedman2857ccb2009-07-01 03:36:11 +00003735class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3736public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003737 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3738 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003739 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003740 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003741 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3742 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003743 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003744 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003745 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003746 }
3747};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003748
Eli Friedman245f2292009-07-05 22:31:18 +00003749class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3750public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003751 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3752 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003753 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003754 Int64Type = SignedLongLong;
3755 }
3756};
Eli Friedman245f2292009-07-05 22:31:18 +00003757
Eli Friedman9fa28852012-08-08 23:57:20 +00003758class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3759public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003760 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3761 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3762 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003763 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003764 }
3765};
Tim Northover9bb857a2013-01-31 12:13:10 +00003766
Eli Friedmanf05b7722008-08-20 07:44:10 +00003767class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003768 // Possible FPU choices.
3769 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003770 VFP2FPU = (1 << 0),
3771 VFP3FPU = (1 << 1),
3772 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003773 NeonFPU = (1 << 3),
3774 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003775 };
3776
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003777 // Possible HWDiv features.
3778 enum HWDivMode {
3779 HWDivThumb = (1 << 0),
3780 HWDivARM = (1 << 1)
3781 };
3782
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003783 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003784 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003785 }
3786
3787 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3788 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003789
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003790 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003791
Rafael Espindolaeb265472013-08-21 21:59:03 +00003792 enum {
3793 FP_Default,
3794 FP_VFP,
3795 FP_Neon
3796 } FPMath;
3797
Bernard Ogdenda13af32013-10-24 18:32:51 +00003798 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003799
Logan Chien57086ce2012-10-10 06:56:20 +00003800 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003801 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003802 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003803
3804 // Initialized via features.
3805 unsigned SoftFloat : 1;
3806 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003807
Bernard Ogden18b57012013-10-29 09:47:51 +00003808 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003809 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003810
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003811 // ACLE 6.5.1 Hardware floating point
3812 enum {
3813 HW_FP_HP = (1 << 1), /// half (16-bit)
3814 HW_FP_SP = (1 << 2), /// single (32-bit)
3815 HW_FP_DP = (1 << 3), /// double (64-bit)
3816 };
3817 uint32_t HW_FP;
3818
Chris Lattner5cc15e02010-03-03 19:03:45 +00003819 static const Builtin::Info BuiltinInfo[];
3820
Rafael Espindola101d5b92013-05-13 20:09:47 +00003821 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003822 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003823 if (T.getArch() == llvm::Triple::arm ||
3824 T.getArch() == llvm::Triple::armeb) {
3825 StringRef VersionStr;
3826 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003827 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003828 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003829 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003830 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003831 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003832 unsigned Version;
3833 if (VersionStr.getAsInteger(10, Version))
3834 return false;
3835 return Version >= 6;
3836 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003837 assert(T.getArch() == llvm::Triple::thumb ||
3838 T.getArch() == llvm::Triple::thumbeb);
3839 StringRef VersionStr;
3840 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003841 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003842 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003843 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003844 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003845 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003846 unsigned Version;
3847 if (VersionStr.getAsInteger(10, Version))
3848 return false;
3849 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003850 }
3851
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003852 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003853 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003854
3855 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003856 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003857
Renato Golin9ba39232015-02-27 16:35:48 +00003858 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3859 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3860 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003861 SizeType = UnsignedLong;
3862 else
3863 SizeType = UnsignedInt;
3864
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003865 switch (T.getOS()) {
3866 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003867 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003868 break;
3869 case llvm::Triple::Win32:
3870 WCharType = UnsignedShort;
3871 break;
3872 case llvm::Triple::Linux:
3873 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003874 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3875 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003876 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003877 }
3878
3879 UseBitFieldTypeAlignment = true;
3880
3881 ZeroLengthBitfieldBoundary = 0;
3882
Tim Northover147cd2f2014-10-14 22:12:21 +00003883 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3884 // so set preferred for small types to 32.
3885 if (T.isOSBinFormatMachO()) {
3886 DescriptionString =
3887 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3888 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3889 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00003890 assert(!BigEndian && "Windows on ARM does not support big endian");
3891 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00003892 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00003893 "-p:32:32"
3894 "-i64:64"
3895 "-v128:64:128"
3896 "-a:0:32"
3897 "-n32"
3898 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003899 } else if (T.isOSNaCl()) {
3900 assert(!BigEndian && "NaCl on ARM does not support big endian");
3901 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003902 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003903 DescriptionString =
3904 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3905 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003906 }
3907
3908 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003909 }
3910
3911 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003912 const llvm::Triple &T = getTriple();
3913
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003914 IsAAPCS = false;
3915
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003916 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003917
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003918 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003919 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003920 SizeType = UnsignedInt;
3921 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003922 SizeType = UnsignedLong;
3923
3924 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3925 WCharType = SignedInt;
3926
3927 // Do not respect the alignment of bit-field types when laying out
3928 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3929 UseBitFieldTypeAlignment = false;
3930
3931 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3932 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3933 /// gcc.
3934 ZeroLengthBitfieldBoundary = 32;
3935
Tim Northover147cd2f2014-10-14 22:12:21 +00003936 if (T.isOSBinFormatMachO())
3937 DescriptionString =
3938 BigEndian
3939 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3940 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3941 else
3942 DescriptionString =
3943 BigEndian
3944 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3945 : "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 +00003946
3947 // FIXME: Override "preferred align" for double and long long.
3948 }
3949
Chris Lattner17df24e2008-04-21 18:56:49 +00003950public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003951 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003952 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003953 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003954 BigEndian = IsBigEndian;
3955
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003956 switch (getTriple().getOS()) {
3957 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003958 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003959 break;
3960 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003961 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003962 break;
3963 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003964
Chris Lattner1a8f3942010-04-23 16:29:58 +00003965 // {} in inline assembly are neon specifiers, not assembly variant
3966 // specifiers.
3967 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003968
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003969 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003970 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003971
Eric Christopher0e261882014-12-05 01:06:59 +00003972 // FIXME: This duplicates code from the driver that sets the -target-abi
3973 // option - this code is used if -target-abi isn't passed and should
3974 // be unified in some way.
3975 if (Triple.isOSBinFormatMachO()) {
3976 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3977 // the frontend matches that.
3978 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3979 Triple.getOS() == llvm::Triple::UnknownOS ||
3980 StringRef(CPU).startswith("cortex-m")) {
3981 setABI("aapcs");
3982 } else {
3983 setABI("apcs-gnu");
3984 }
3985 } else if (Triple.isOSWindows()) {
3986 // FIXME: this is invalid for WindowsCE
3987 setABI("aapcs");
3988 } else {
3989 // Select the default based on the platform.
3990 switch (Triple.getEnvironment()) {
3991 case llvm::Triple::Android:
3992 case llvm::Triple::GNUEABI:
3993 case llvm::Triple::GNUEABIHF:
3994 setABI("aapcs-linux");
3995 break;
3996 case llvm::Triple::EABIHF:
3997 case llvm::Triple::EABI:
3998 setABI("aapcs");
3999 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004000 case llvm::Triple::GNU:
4001 setABI("apcs-gnu");
4002 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004003 default:
4004 if (Triple.getOS() == llvm::Triple::NetBSD)
4005 setABI("apcs-gnu");
4006 else
4007 setABI("aapcs");
4008 break;
4009 }
4010 }
John McCall86353412010-08-21 22:46:04 +00004011
4012 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004013 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004014
4015 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004016 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004017 if (shouldUseInlineAtomic(getTriple()))
4018 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004019
4020 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004021 // the alignment of the zero-length bitfield is greater than the member
4022 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004023 // zero length bitfield.
4024 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004025 }
Alp Toker4925ba72014-06-07 23:30:42 +00004026 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004027 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004028 ABI = Name;
4029
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004030 // The defaults (above) are for AAPCS, check if we need to change them.
4031 //
4032 // FIXME: We need support for -meabi... we could just mangle it into the
4033 // name.
4034 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004035 setABIAPCS();
4036 return true;
4037 }
4038 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4039 setABIAAPCS();
4040 return true;
4041 }
4042 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004043 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004044
Craig Topper3164f332014-03-11 03:39:26 +00004045 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004046 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004047 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4048 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004049 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004050 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004051 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004052 }
4053 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004054 Features["vfp4"] = true;
4055 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004056 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4057 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004058 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004059 Features["vfp4"] = true;
4060 Features["neon"] = true;
4061 Features["hwdiv"] = true;
4062 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004063 } else if (CPU == "cyclone") {
4064 Features["v8fp"] = true;
4065 Features["neon"] = true;
4066 Features["hwdiv"] = true;
4067 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004068 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004069 Features["fp-armv8"] = true;
4070 Features["neon"] = true;
4071 Features["hwdiv"] = true;
4072 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004073 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004074 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004075 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004076 // Enable the hwdiv extension for all v8a AArch32 cores by
4077 // default.
4078 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004079 ArchName == "armebv8a" || ArchName == "armebv8" ||
4080 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4081 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004082 Features["hwdiv"] = true;
4083 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004084 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
4085 CPU == "sc300") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004086 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004087 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004088 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004089
Craig Topper3164f332014-03-11 03:39:26 +00004090 bool handleTargetFeatures(std::vector<std::string> &Features,
4091 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004092 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004093 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004094 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004095 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004096 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004097
4098 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004099 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004100 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004101 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004102 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004103 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004104 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004105 HW_FP = HW_FP_SP | HW_FP_DP;
4106 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004107 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004108 HW_FP = HW_FP_SP | HW_FP_DP;
4109 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004110 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004111 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4112 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004113 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004114 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4115 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004116 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004117 HW_FP = HW_FP_SP | HW_FP_DP;
4118 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004119 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004120 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004121 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004122 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004123 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004124 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004125 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004126 } else if (Feature == "+fp-only-sp") {
4127 HW_FP &= ~HW_FP_DP;
4128 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004129 }
4130
Rafael Espindolaeb265472013-08-21 21:59:03 +00004131 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4132 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4133 return false;
4134 }
4135
4136 if (FPMath == FP_Neon)
4137 Features.push_back("+neonfp");
4138 else if (FPMath == FP_VFP)
4139 Features.push_back("-neonfp");
4140
Daniel Dunbar893d4752009-12-19 04:15:38 +00004141 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004142 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4143 for (const auto &FEFeature : FrontEndFeatures) {
4144 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4145 if (Feature != Features.end())
4146 Features.erase(Feature);
4147 }
4148
Rafael Espindolaeb265472013-08-21 21:59:03 +00004149 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004150 }
4151
Craig Topper3164f332014-03-11 03:39:26 +00004152 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004153 return llvm::StringSwitch<bool>(Feature)
4154 .Case("arm", true)
4155 .Case("softfloat", SoftFloat)
4156 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004157 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004158 .Case("hwdiv", HWDiv & HWDivThumb)
4159 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004160 .Default(false);
4161 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004162 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004163 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004164 return llvm::StringSwitch<const char *>(Name)
4165 .Cases("arm8", "arm810", "4")
4166 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4167 "4")
4168 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4169 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4170 .Case("ep9312", "4T")
4171 .Cases("arm10tdmi", "arm1020t", "5T")
4172 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4173 .Case("arm926ej-s", "5TEJ")
4174 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4175 .Cases("xscale", "iwmmxt", "5TE")
4176 .Case("arm1136j-s", "6J")
Renato Goline11531f2015-03-17 11:55:43 +00004177 .Case("arm1136jf-s", "6")
4178 .Cases("mpcorenovfp", "mpcore", "6K")
4179 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Eric Christopher917e9522014-11-18 22:36:15 +00004180 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4181 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4182 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4183 "7A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004184 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004185 .Case("swift", "7S")
4186 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004187 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004188 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004189 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004190 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004191 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004192 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004193 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004194 return llvm::StringSwitch<const char *>(Name)
4195 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4196 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4197 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004198 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004199 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4200 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
4201 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004202 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004203 }
Craig Topper3164f332014-03-11 03:39:26 +00004204 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004205 if (!getCPUDefineSuffix(Name))
4206 return false;
4207
Tim Northovere8c37212014-07-09 09:24:43 +00004208 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4209 StringRef Profile = getCPUProfile(Name);
4210 if (Profile == "M" && MaxAtomicInlineWidth) {
4211 MaxAtomicPromoteWidth = 32;
4212 MaxAtomicInlineWidth = 32;
4213 }
4214
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004215 CPU = Name;
4216 return true;
4217 }
Craig Topper3164f332014-03-11 03:39:26 +00004218 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004219 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4220 unsigned CPUArchVer) const {
4221 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4222 (CPUArch.find('M') != StringRef::npos);
4223 }
4224 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4225 unsigned CPUArchVer) const {
4226 // We check both CPUArchVer and ArchName because when only triple is
4227 // specified, the default CPU is arm1136j-s.
4228 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4229 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4230 }
Craig Topper3164f332014-03-11 03:39:26 +00004231 void getTargetDefines(const LangOptions &Opts,
4232 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004233 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004234 Builder.defineMacro("__arm");
4235 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004236
Chris Lattnerecd49032009-03-02 22:27:17 +00004237 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004238 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004239
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004240 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004241 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004242 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004243 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004244 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004245
4246 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004247 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004248 StringRef ArchName = getTriple().getArchName();
4249
4250 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4251 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004252 if (CPUArch[0] >= '8') {
4253 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4254 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004255 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004256
4257 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4258 // is not defined for the M-profile.
4259 // NOTE that the deffault profile is assumed to be 'A'
4260 if (CPUProfile.empty() || CPUProfile != "M")
4261 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4262
4263 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4264 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4265 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4266 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4267 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4268 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4269 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4270
4271 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4272 // instruction set such as ARM or Thumb.
4273 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4274
4275 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4276
4277 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004278 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004279 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004280
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004281 // ACLE 6.5.1 Hardware Floating Point
4282 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004283 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004284
Yi Konga44c4d72014-06-27 21:25:42 +00004285 // ACLE predefines.
4286 Builder.defineMacro("__ARM_ACLE", "200");
4287
Mike Stump9d54bd72009-04-08 02:07:04 +00004288 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004289
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004290 // FIXME: It's more complicated than this and we don't really support
4291 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004292 // Windows on ARM does not "support" interworking
4293 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004294 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004295
David Tweed8f676532012-10-25 13:33:01 +00004296 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004297 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004298 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4299 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004300 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004301 Builder.defineMacro("__ARM_PCS", "1");
4302
David Tweed8f676532012-10-25 13:33:01 +00004303 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004304 Builder.defineMacro("__ARM_PCS_VFP", "1");
4305 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004306
Daniel Dunbar893d4752009-12-19 04:15:38 +00004307 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004308 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004309
4310 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004311 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004312
4313 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004314 Builder.defineMacro("__THUMBEL__");
4315 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004316 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004317 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004318 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004319 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4320 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004321
4322 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004323 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004324
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004325 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004326 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004327 if (FPU & VFP2FPU)
4328 Builder.defineMacro("__ARM_VFPV2__");
4329 if (FPU & VFP3FPU)
4330 Builder.defineMacro("__ARM_VFPV3__");
4331 if (FPU & VFP4FPU)
4332 Builder.defineMacro("__ARM_VFPV4__");
4333 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004334
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004335 // This only gets set when Neon instructions are actually available, unlike
4336 // the VFP define, hence the soft float and arch check. This is subtly
4337 // different from gcc, we follow the intent which was that it should be set
4338 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004339 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4340 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004341 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004342 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004343
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004344 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4345 Opts.ShortWChar ? "2" : "4");
4346
4347 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4348 Opts.ShortEnums ? "1" : "4");
4349
Bernard Ogden18b57012013-10-29 09:47:51 +00004350 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004351 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004352
Tim Northover02e38602014-02-03 17:28:04 +00004353 if (Crypto)
4354 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4355
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004356 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004357 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4358 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4360 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4361 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004362
4363 bool is5EOrAbove = (CPUArchVer >= 6 ||
4364 (CPUArchVer == 5 &&
4365 CPUArch.find('E') != StringRef::npos));
4366 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4367 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4368 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004369 }
Craig Topper3164f332014-03-11 03:39:26 +00004370 void getTargetBuiltins(const Builtin::Info *&Records,
4371 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004372 Records = BuiltinInfo;
4373 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004374 }
Craig Topper3164f332014-03-11 03:39:26 +00004375 bool isCLZForZeroUndef() const override { return false; }
4376 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004377 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004378 }
Craig Topper3164f332014-03-11 03:39:26 +00004379 void getGCCRegNames(const char * const *&Names,
4380 unsigned &NumNames) const override;
4381 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4382 unsigned &NumAliases) const override;
4383 bool validateAsmConstraint(const char *&Name,
4384 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004385 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004386 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004387 case 'l': // r0-r7
4388 case 'h': // r8-r15
4389 case 'w': // VFP Floating point register single precision
4390 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004391 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004392 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004393 case 'I':
4394 case 'J':
4395 case 'K':
4396 case 'L':
4397 case 'M':
4398 // FIXME
4399 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004400 case 'Q': // A memory address that is a single base register.
4401 Info.setAllowsMemory();
4402 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004403 case 'U': // a memory reference...
4404 switch (Name[1]) {
4405 case 'q': // ...ARMV4 ldrsb
4406 case 'v': // ...VFP load/store (reg+constant offset)
4407 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004408 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004409 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004410 case 'n': // valid address for Neon doubleword vector load/store
4411 case 'm': // valid address for Neon element and structure load/store
4412 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004413 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004414 Info.setAllowsMemory();
4415 Name++;
4416 return true;
4417 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004418 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004419 return false;
4420 }
Craig Topper3164f332014-03-11 03:39:26 +00004421 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004422 std::string R;
4423 switch (*Constraint) {
4424 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004425 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004426 Constraint++;
4427 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004428 case 'p': // 'p' should be translated to 'r' by default.
4429 R = std::string("r");
4430 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004431 default:
4432 return std::string(1, *Constraint);
4433 }
4434 return R;
4435 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004436 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004437 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004438 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004439 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004440 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004441
Bill Wendling9d1ee112012-10-25 23:28:48 +00004442 // Strip off constraint modifiers.
4443 while (Constraint[0] == '=' ||
4444 Constraint[0] == '+' ||
4445 Constraint[0] == '&')
4446 Constraint = Constraint.substr(1);
4447
4448 switch (Constraint[0]) {
4449 default: break;
4450 case 'r': {
4451 switch (Modifier) {
4452 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004453 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004454 case 'q':
4455 // A register of size 32 cannot fit a vector type.
4456 return false;
4457 }
4458 }
4459 }
4460
4461 return true;
4462 }
Craig Topper3164f332014-03-11 03:39:26 +00004463 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004464 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004465 return "";
4466 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004467
Craig Topper3164f332014-03-11 03:39:26 +00004468 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004469 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4470 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004471
Craig Topper3164f332014-03-11 03:39:26 +00004472 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004473 if (RegNo == 0) return 0;
4474 if (RegNo == 1) return 1;
4475 return -1;
4476 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004477};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004478
Rafael Espindolaeb265472013-08-21 21:59:03 +00004479bool ARMTargetInfo::setFPMath(StringRef Name) {
4480 if (Name == "neon") {
4481 FPMath = FP_Neon;
4482 return true;
4483 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4484 Name == "vfp4") {
4485 FPMath = FP_VFP;
4486 return true;
4487 }
4488 return false;
4489}
4490
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004491const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004492 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004493 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004494 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4495
4496 // Float registers
4497 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4498 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4499 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004500 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004501
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004502 // Double registers
4503 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4504 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004505 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4506 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004507
4508 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004509 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4510 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004511};
4512
4513void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004514 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004515 Names = GCCRegNames;
4516 NumNames = llvm::array_lengthof(GCCRegNames);
4517}
4518
4519const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004520 { { "a1" }, "r0" },
4521 { { "a2" }, "r1" },
4522 { { "a3" }, "r2" },
4523 { { "a4" }, "r3" },
4524 { { "v1" }, "r4" },
4525 { { "v2" }, "r5" },
4526 { { "v3" }, "r6" },
4527 { { "v4" }, "r7" },
4528 { { "v5" }, "r8" },
4529 { { "v6", "rfp" }, "r9" },
4530 { { "sl" }, "r10" },
4531 { { "fp" }, "r11" },
4532 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004533 { { "r13" }, "sp" },
4534 { { "r14" }, "lr" },
4535 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004536 // The S, D and Q registers overlap, but aren't really aliases; we
4537 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004538};
4539
4540void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4541 unsigned &NumAliases) const {
4542 Aliases = GCCRegAliases;
4543 NumAliases = llvm::array_lengthof(GCCRegAliases);
4544}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004545
4546const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004547#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004548#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004549 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004550#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004551
4552#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004553#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004554#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4555 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004556#include "clang/Basic/BuiltinsARM.def"
4557};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004558
4559class ARMleTargetInfo : public ARMTargetInfo {
4560public:
4561 ARMleTargetInfo(const llvm::Triple &Triple)
4562 : ARMTargetInfo(Triple, false) { }
4563 virtual void getTargetDefines(const LangOptions &Opts,
4564 MacroBuilder &Builder) const {
4565 Builder.defineMacro("__ARMEL__");
4566 ARMTargetInfo::getTargetDefines(Opts, Builder);
4567 }
4568};
4569
4570class ARMbeTargetInfo : public ARMTargetInfo {
4571public:
4572 ARMbeTargetInfo(const llvm::Triple &Triple)
4573 : ARMTargetInfo(Triple, true) { }
4574 virtual void getTargetDefines(const LangOptions &Opts,
4575 MacroBuilder &Builder) const {
4576 Builder.defineMacro("__ARMEB__");
4577 Builder.defineMacro("__ARM_BIG_ENDIAN");
4578 ARMTargetInfo::getTargetDefines(Opts, Builder);
4579 }
4580};
Chris Lattner17df24e2008-04-21 18:56:49 +00004581
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004582class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4583 const llvm::Triple Triple;
4584public:
4585 WindowsARMTargetInfo(const llvm::Triple &Triple)
4586 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4587 TLSSupported = false;
4588 WCharType = UnsignedShort;
4589 SizeType = UnsignedInt;
4590 UserLabelPrefix = "";
4591 }
4592 void getVisualStudioDefines(const LangOptions &Opts,
4593 MacroBuilder &Builder) const {
4594 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4595
4596 // FIXME: this is invalid for WindowsCE
4597 Builder.defineMacro("_M_ARM_NT", "1");
4598 Builder.defineMacro("_M_ARMT", "_M_ARM");
4599 Builder.defineMacro("_M_THUMB", "_M_ARM");
4600
4601 assert((Triple.getArch() == llvm::Triple::arm ||
4602 Triple.getArch() == llvm::Triple::thumb) &&
4603 "invalid architecture for Windows ARM target info");
4604 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4605 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4606
4607 // TODO map the complete set of values
4608 // 31: VFPv3 40: VFPv4
4609 Builder.defineMacro("_M_ARM_FP", "31");
4610 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004611 BuiltinVaListKind getBuiltinVaListKind() const override {
4612 return TargetInfo::CharPtrBuiltinVaList;
4613 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004614};
4615
4616// Windows ARM + Itanium C++ ABI Target
4617class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4618public:
4619 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4620 : WindowsARMTargetInfo(Triple) {
4621 TheCXXABI.set(TargetCXXABI::GenericARM);
4622 }
4623
4624 void getTargetDefines(const LangOptions &Opts,
4625 MacroBuilder &Builder) const override {
4626 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4627
4628 if (Opts.MSVCCompat)
4629 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4630 }
4631};
4632
4633// Windows ARM, MS (C++) ABI
4634class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4635public:
4636 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4637 : WindowsARMTargetInfo(Triple) {
4638 TheCXXABI.set(TargetCXXABI::Microsoft);
4639 }
4640
4641 void getTargetDefines(const LangOptions &Opts,
4642 MacroBuilder &Builder) const override {
4643 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4644 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4645 }
4646};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004647
Mike Stump11289f42009-09-09 15:08:12 +00004648class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004649 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004650protected:
Craig Topper3164f332014-03-11 03:39:26 +00004651 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4652 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004653 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004654 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004655
Torok Edwinb2b37c62009-06-30 17:10:35 +00004656public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004657 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004658 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004659 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004660 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004661 // FIXME: This should be based off of the target features in
4662 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004663 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004664
4665 // Darwin on iOS uses a variant of the ARM C++ ABI.
4666 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004667 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004668};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004669
Tim Northover573cbee2014-05-24 12:52:07 +00004670class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004671 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004672 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4673 static const char *const GCCRegNames[];
4674
James Molloy75f5f9e2014-04-16 15:33:48 +00004675 enum FPUModeEnum {
4676 FPUMode,
4677 NeonMode
4678 };
4679
4680 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004681 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004682 unsigned Crypto;
4683
Tim Northovera2ee4332014-03-29 15:09:45 +00004684 static const Builtin::Info BuiltinInfo[];
4685
4686 std::string ABI;
4687
4688public:
Tim Northover573cbee2014-05-24 12:52:07 +00004689 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004690 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004691
4692 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4693 WCharType = SignedInt;
4694
4695 // NetBSD apparently prefers consistency across ARM targets to consistency
4696 // across 64-bit targets.
4697 Int64Type = SignedLongLong;
4698 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004699 } else {
4700 WCharType = UnsignedInt;
4701 Int64Type = SignedLong;
4702 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004703 }
4704
Tim Northovera2ee4332014-03-29 15:09:45 +00004705 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004706 MaxVectorAlign = 128;
4707 RegParmMax = 8;
4708 MaxAtomicInlineWidth = 128;
4709 MaxAtomicPromoteWidth = 128;
4710
Tim Northovera6a19f12015-02-06 01:25:07 +00004711 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004712 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4713
Tim Northovera2ee4332014-03-29 15:09:45 +00004714 // {} in inline assembly are neon specifiers, not assembly variant
4715 // specifiers.
4716 NoAsmVariants = true;
4717
Tim Northover7ad87af2015-01-16 18:44:04 +00004718 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4719 // contributes to the alignment of the containing aggregate in the same way
4720 // a plain (non bit-field) member of that type would, without exception for
4721 // zero-sized or anonymous bit-fields."
4722 UseBitFieldTypeAlignment = true;
4723 UseZeroLengthBitfieldAlignment = true;
4724
Tim Northover573cbee2014-05-24 12:52:07 +00004725 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004726 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4727 }
4728
Alp Toker4925ba72014-06-07 23:30:42 +00004729 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004730 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004731 if (Name != "aapcs" && Name != "darwinpcs")
4732 return false;
4733
4734 ABI = Name;
4735 return true;
4736 }
4737
David Blaikie1cbb9712014-11-14 19:09:44 +00004738 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004739 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004740 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004741 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004742 .Case("cyclone", true)
4743 .Default(false);
4744 return CPUKnown;
4745 }
4746
4747 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004748 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004749 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004750 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004751
4752 // Target properties.
4753 Builder.defineMacro("_LP64");
4754 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004755
4756 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4757 Builder.defineMacro("__ARM_ACLE", "200");
4758 Builder.defineMacro("__ARM_ARCH", "8");
4759 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4760
4761 Builder.defineMacro("__ARM_64BIT_STATE");
4762 Builder.defineMacro("__ARM_PCS_AAPCS64");
4763 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4764
4765 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4766 Builder.defineMacro("__ARM_FEATURE_CLZ");
4767 Builder.defineMacro("__ARM_FEATURE_FMA");
4768 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004769 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4770 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4771 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4772 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004773
4774 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4775
4776 // 0xe implies support for half, single and double precision operations.
4777 Builder.defineMacro("__ARM_FP", "0xe");
4778
4779 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4780 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4781 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4782
4783 if (Opts.FastMath || Opts.FiniteMathOnly)
4784 Builder.defineMacro("__ARM_FP_FAST");
4785
Richard Smithab506ad2014-10-20 23:26:58 +00004786 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004787 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4788
4789 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4790
4791 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4792 Opts.ShortEnums ? "1" : "4");
4793
James Molloy75f5f9e2014-04-16 15:33:48 +00004794 if (FPU == NeonMode) {
4795 Builder.defineMacro("__ARM_NEON");
4796 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004797 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004798 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004799
Bradley Smith418c5932014-05-02 15:17:51 +00004800 if (CRC)
4801 Builder.defineMacro("__ARM_FEATURE_CRC32");
4802
James Molloy75f5f9e2014-04-16 15:33:48 +00004803 if (Crypto)
4804 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004805 }
4806
4807 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004808 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004809 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004810 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004811 }
4812
David Blaikie1cbb9712014-11-14 19:09:44 +00004813 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004814 return Feature == "aarch64" ||
4815 Feature == "arm64" ||
4816 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004817 }
4818
James Molloy5e73df52014-04-16 15:06:20 +00004819 bool handleTargetFeatures(std::vector<std::string> &Features,
4820 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004821 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004822 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004823 Crypto = 0;
4824 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4825 if (Features[i] == "+neon")
4826 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004827 if (Features[i] == "+crc")
4828 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004829 if (Features[i] == "+crypto")
4830 Crypto = 1;
4831 }
4832
James Molloy5e73df52014-04-16 15:06:20 +00004833 setDescriptionString();
4834
4835 return true;
4836 }
4837
David Blaikie1cbb9712014-11-14 19:09:44 +00004838 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004839
David Blaikie1cbb9712014-11-14 19:09:44 +00004840 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004841 return TargetInfo::AArch64ABIBuiltinVaList;
4842 }
4843
4844 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004845 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004846 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004847 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004848
Eric Christopher917e9522014-11-18 22:36:15 +00004849 virtual bool
4850 validateAsmConstraint(const char *&Name,
4851 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004852 switch (*Name) {
4853 default:
4854 return false;
4855 case 'w': // Floating point and SIMD registers (V0-V31)
4856 Info.setAllowsRegister();
4857 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004858 case 'I': // Constant that can be used with an ADD instruction
4859 case 'J': // Constant that can be used with a SUB instruction
4860 case 'K': // Constant that can be used with a 32-bit logical instruction
4861 case 'L': // Constant that can be used with a 64-bit logical instruction
4862 case 'M': // Constant that can be used as a 32-bit MOV immediate
4863 case 'N': // Constant that can be used as a 64-bit MOV immediate
4864 case 'Y': // Floating point constant zero
4865 case 'Z': // Integer constant zero
4866 return true;
4867 case 'Q': // A memory reference with base register and no offset
4868 Info.setAllowsMemory();
4869 return true;
4870 case 'S': // A symbolic address
4871 Info.setAllowsRegister();
4872 return true;
4873 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004874 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4875 // Utf: A memory address suitable for ldp/stp in TF mode.
4876 // Usa: An absolute symbolic address.
4877 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4878 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004879 case 'z': // Zero register, wzr or xzr
4880 Info.setAllowsRegister();
4881 return true;
4882 case 'x': // Floating point and SIMD registers (V0-V15)
4883 Info.setAllowsRegister();
4884 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004885 }
4886 return false;
4887 }
4888
Akira Hatanaka987f1862014-08-22 06:05:21 +00004889 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004890 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004891 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004892 // Strip off constraint modifiers.
4893 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4894 Constraint = Constraint.substr(1);
4895
4896 switch (Constraint[0]) {
4897 default:
4898 return true;
4899 case 'z':
4900 case 'r': {
4901 switch (Modifier) {
4902 case 'x':
4903 case 'w':
4904 // For now assume that the person knows what they're
4905 // doing with the modifier.
4906 return true;
4907 default:
4908 // By default an 'r' constraint will be in the 'x'
4909 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004910 if (Size == 64)
4911 return true;
4912
4913 SuggestedModifier = "w";
4914 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004915 }
4916 }
4917 }
4918 }
4919
David Blaikie1cbb9712014-11-14 19:09:44 +00004920 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004921
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004922 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004923 if (RegNo == 0)
4924 return 0;
4925 if (RegNo == 1)
4926 return 1;
4927 return -1;
4928 }
4929};
4930
Tim Northover573cbee2014-05-24 12:52:07 +00004931const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004932 // 32-bit Integer registers
4933 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4934 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4935 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4936
4937 // 64-bit Integer registers
4938 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4939 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4940 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4941
4942 // 32-bit floating point regsisters
4943 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4944 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4945 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4946
4947 // 64-bit floating point regsisters
4948 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4949 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4950 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4951
4952 // Vector registers
4953 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4954 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4955 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4956};
4957
Tim Northover573cbee2014-05-24 12:52:07 +00004958void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004959 unsigned &NumNames) const {
4960 Names = GCCRegNames;
4961 NumNames = llvm::array_lengthof(GCCRegNames);
4962}
4963
Tim Northover573cbee2014-05-24 12:52:07 +00004964const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004965 { { "w31" }, "wsp" },
4966 { { "x29" }, "fp" },
4967 { { "x30" }, "lr" },
4968 { { "x31" }, "sp" },
4969 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4970 // don't want to substitute one of these for a different-sized one.
4971};
4972
Tim Northover573cbee2014-05-24 12:52:07 +00004973void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004974 unsigned &NumAliases) const {
4975 Aliases = GCCRegAliases;
4976 NumAliases = llvm::array_lengthof(GCCRegAliases);
4977}
4978
Tim Northover573cbee2014-05-24 12:52:07 +00004979const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004980#define BUILTIN(ID, TYPE, ATTRS) \
4981 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4982#include "clang/Basic/BuiltinsNEON.def"
4983
4984#define BUILTIN(ID, TYPE, ATTRS) \
4985 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004986#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004987};
James Molloy5e73df52014-04-16 15:06:20 +00004988
Tim Northover573cbee2014-05-24 12:52:07 +00004989class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004990 void setDescriptionString() override {
4991 if (getTriple().isOSBinFormatMachO())
4992 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4993 else
4994 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4995 }
4996
4997public:
Tim Northover573cbee2014-05-24 12:52:07 +00004998 AArch64leTargetInfo(const llvm::Triple &Triple)
4999 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005000 BigEndian = false;
5001 }
5002 void getTargetDefines(const LangOptions &Opts,
5003 MacroBuilder &Builder) const override {
5004 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005005 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005006 }
5007};
5008
Tim Northover573cbee2014-05-24 12:52:07 +00005009class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005010 void setDescriptionString() override {
5011 assert(!getTriple().isOSBinFormatMachO());
5012 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5013 }
5014
5015public:
Tim Northover573cbee2014-05-24 12:52:07 +00005016 AArch64beTargetInfo(const llvm::Triple &Triple)
5017 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005018 void getTargetDefines(const LangOptions &Opts,
5019 MacroBuilder &Builder) const override {
5020 Builder.defineMacro("__AARCH64EB__");
5021 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5022 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005023 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005024 }
5025};
Tim Northovera2ee4332014-03-29 15:09:45 +00005026
Tim Northover573cbee2014-05-24 12:52:07 +00005027class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005028protected:
5029 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5030 MacroBuilder &Builder) const override {
5031 Builder.defineMacro("__AARCH64_SIMD__");
5032 Builder.defineMacro("__ARM64_ARCH_8__");
5033 Builder.defineMacro("__ARM_NEON__");
5034 Builder.defineMacro("__LITTLE_ENDIAN__");
5035 Builder.defineMacro("__REGISTER_PREFIX__", "");
5036 Builder.defineMacro("__arm64", "1");
5037 Builder.defineMacro("__arm64__", "1");
5038
5039 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5040 }
5041
Tim Northovera2ee4332014-03-29 15:09:45 +00005042public:
Tim Northover573cbee2014-05-24 12:52:07 +00005043 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5044 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005045 Int64Type = SignedLongLong;
5046 WCharType = SignedInt;
5047 UseSignedCharForObjCBool = false;
5048
Tim Northovera6a19f12015-02-06 01:25:07 +00005049 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005050 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5051
5052 TheCXXABI.set(TargetCXXABI::iOS64);
5053 }
5054
David Blaikie1cbb9712014-11-14 19:09:44 +00005055 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005056 return TargetInfo::CharPtrBuiltinVaList;
5057 }
5058};
Tim Northovera2ee4332014-03-29 15:09:45 +00005059
Tony Linthicum76329bf2011-12-12 21:14:55 +00005060// Hexagon abstract base class
5061class HexagonTargetInfo : public TargetInfo {
5062 static const Builtin::Info BuiltinInfo[];
5063 static const char * const GCCRegNames[];
5064 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5065 std::string CPU;
5066public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005067 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005068 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005069 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005070
5071 // {} in inline assembly are packet specifiers, not assembly variant
5072 // specifiers.
5073 NoAsmVariants = true;
5074 }
5075
Craig Topper3164f332014-03-11 03:39:26 +00005076 void getTargetBuiltins(const Builtin::Info *&Records,
5077 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005078 Records = BuiltinInfo;
5079 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5080 }
5081
Craig Topper3164f332014-03-11 03:39:26 +00005082 bool validateAsmConstraint(const char *&Name,
5083 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005084 return true;
5085 }
5086
Craig Topper3164f332014-03-11 03:39:26 +00005087 void getTargetDefines(const LangOptions &Opts,
5088 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005089
Craig Topper3164f332014-03-11 03:39:26 +00005090 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005091 return Feature == "hexagon";
5092 }
Craig Topper3164f332014-03-11 03:39:26 +00005093
5094 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005095 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005096 }
Craig Topper3164f332014-03-11 03:39:26 +00005097 void getGCCRegNames(const char * const *&Names,
5098 unsigned &NumNames) const override;
5099 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5100 unsigned &NumAliases) const override;
5101 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005102 return "";
5103 }
Sebastian Pop86500282012-01-13 20:37:10 +00005104
5105 static const char *getHexagonCPUSuffix(StringRef Name) {
5106 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005107 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005108 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005109 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005110 }
5111
Craig Topper3164f332014-03-11 03:39:26 +00005112 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005113 if (!getHexagonCPUSuffix(Name))
5114 return false;
5115
Tony Linthicum76329bf2011-12-12 21:14:55 +00005116 CPU = Name;
5117 return true;
5118 }
5119};
5120
5121void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5122 MacroBuilder &Builder) const {
5123 Builder.defineMacro("qdsp6");
5124 Builder.defineMacro("__qdsp6", "1");
5125 Builder.defineMacro("__qdsp6__", "1");
5126
5127 Builder.defineMacro("hexagon");
5128 Builder.defineMacro("__hexagon", "1");
5129 Builder.defineMacro("__hexagon__", "1");
5130
5131 if(CPU == "hexagonv1") {
5132 Builder.defineMacro("__HEXAGON_V1__");
5133 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5134 if(Opts.HexagonQdsp6Compat) {
5135 Builder.defineMacro("__QDSP6_V1__");
5136 Builder.defineMacro("__QDSP6_ARCH__", "1");
5137 }
5138 }
5139 else if(CPU == "hexagonv2") {
5140 Builder.defineMacro("__HEXAGON_V2__");
5141 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5142 if(Opts.HexagonQdsp6Compat) {
5143 Builder.defineMacro("__QDSP6_V2__");
5144 Builder.defineMacro("__QDSP6_ARCH__", "2");
5145 }
5146 }
5147 else if(CPU == "hexagonv3") {
5148 Builder.defineMacro("__HEXAGON_V3__");
5149 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5150 if(Opts.HexagonQdsp6Compat) {
5151 Builder.defineMacro("__QDSP6_V3__");
5152 Builder.defineMacro("__QDSP6_ARCH__", "3");
5153 }
5154 }
5155 else if(CPU == "hexagonv4") {
5156 Builder.defineMacro("__HEXAGON_V4__");
5157 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5158 if(Opts.HexagonQdsp6Compat) {
5159 Builder.defineMacro("__QDSP6_V4__");
5160 Builder.defineMacro("__QDSP6_ARCH__", "4");
5161 }
5162 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005163 else if(CPU == "hexagonv5") {
5164 Builder.defineMacro("__HEXAGON_V5__");
5165 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5166 if(Opts.HexagonQdsp6Compat) {
5167 Builder.defineMacro("__QDSP6_V5__");
5168 Builder.defineMacro("__QDSP6_ARCH__", "5");
5169 }
5170 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005171}
5172
5173const char * const HexagonTargetInfo::GCCRegNames[] = {
5174 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5175 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5176 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5177 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5178 "p0", "p1", "p2", "p3",
5179 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5180};
5181
5182void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5183 unsigned &NumNames) const {
5184 Names = GCCRegNames;
5185 NumNames = llvm::array_lengthof(GCCRegNames);
5186}
5187
5188
5189const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5190 { { "sp" }, "r29" },
5191 { { "fp" }, "r30" },
5192 { { "lr" }, "r31" },
5193 };
5194
5195void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5196 unsigned &NumAliases) const {
5197 Aliases = GCCRegAliases;
5198 NumAliases = llvm::array_lengthof(GCCRegAliases);
5199}
5200
5201
5202const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5203#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5204#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5205 ALL_LANGUAGES },
5206#include "clang/Basic/BuiltinsHexagon.def"
5207};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005208
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005209// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5210class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005211 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5212 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005213 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005214public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005215 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005216
Craig Topper3164f332014-03-11 03:39:26 +00005217 bool handleTargetFeatures(std::vector<std::string> &Features,
5218 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005219 SoftFloat = false;
5220 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5221 if (Features[i] == "+soft-float")
5222 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005223 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005224 }
Craig Topper3164f332014-03-11 03:39:26 +00005225 void getTargetDefines(const LangOptions &Opts,
5226 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005227 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005228 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005229
5230 if (SoftFloat)
5231 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005232 }
Craig Topper3164f332014-03-11 03:39:26 +00005233
5234 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005235 return llvm::StringSwitch<bool>(Feature)
5236 .Case("softfloat", SoftFloat)
5237 .Case("sparc", true)
5238 .Default(false);
5239 }
Craig Topper3164f332014-03-11 03:39:26 +00005240
5241 void getTargetBuiltins(const Builtin::Info *&Records,
5242 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005243 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005244 }
Craig Topper3164f332014-03-11 03:39:26 +00005245 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005246 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005247 }
Craig Topper3164f332014-03-11 03:39:26 +00005248 void getGCCRegNames(const char * const *&Names,
5249 unsigned &NumNames) const override;
5250 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5251 unsigned &NumAliases) const override;
5252 bool validateAsmConstraint(const char *&Name,
5253 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005254 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005255 switch (*Name) {
5256 case 'I': // Signed 13-bit constant
5257 case 'J': // Zero
5258 case 'K': // 32-bit constant with the low 12 bits clear
5259 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5260 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5261 case 'N': // Same as 'K' but zext (required for SIMode)
5262 case 'O': // The constant 4096
5263 return true;
5264 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005265 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005266 }
Craig Topper3164f332014-03-11 03:39:26 +00005267 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005268 // FIXME: Implement!
5269 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005270 }
5271};
5272
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005273const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005274 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5275 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5276 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5277 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5278};
5279
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005280void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5281 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005282 Names = GCCRegNames;
5283 NumNames = llvm::array_lengthof(GCCRegNames);
5284}
5285
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005286const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005287 { { "g0" }, "r0" },
5288 { { "g1" }, "r1" },
5289 { { "g2" }, "r2" },
5290 { { "g3" }, "r3" },
5291 { { "g4" }, "r4" },
5292 { { "g5" }, "r5" },
5293 { { "g6" }, "r6" },
5294 { { "g7" }, "r7" },
5295 { { "o0" }, "r8" },
5296 { { "o1" }, "r9" },
5297 { { "o2" }, "r10" },
5298 { { "o3" }, "r11" },
5299 { { "o4" }, "r12" },
5300 { { "o5" }, "r13" },
5301 { { "o6", "sp" }, "r14" },
5302 { { "o7" }, "r15" },
5303 { { "l0" }, "r16" },
5304 { { "l1" }, "r17" },
5305 { { "l2" }, "r18" },
5306 { { "l3" }, "r19" },
5307 { { "l4" }, "r20" },
5308 { { "l5" }, "r21" },
5309 { { "l6" }, "r22" },
5310 { { "l7" }, "r23" },
5311 { { "i0" }, "r24" },
5312 { { "i1" }, "r25" },
5313 { { "i2" }, "r26" },
5314 { { "i3" }, "r27" },
5315 { { "i4" }, "r28" },
5316 { { "i5" }, "r29" },
5317 { { "i6", "fp" }, "r30" },
5318 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005319};
5320
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005321void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5322 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005323 Aliases = GCCRegAliases;
5324 NumAliases = llvm::array_lengthof(GCCRegAliases);
5325}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005326
5327// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5328class SparcV8TargetInfo : public SparcTargetInfo {
5329public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005330 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005331 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005332 }
5333
Craig Topper3164f332014-03-11 03:39:26 +00005334 void getTargetDefines(const LangOptions &Opts,
5335 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005336 SparcTargetInfo::getTargetDefines(Opts, Builder);
5337 Builder.defineMacro("__sparcv8");
5338 }
5339};
5340
5341// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5342class SparcV9TargetInfo : public SparcTargetInfo {
5343public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005344 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005345 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005346 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005347 // This is an LP64 platform.
5348 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005349
5350 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005351 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005352 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005353 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005354 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005355 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005356
5357 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5358 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5359 LongDoubleWidth = 128;
5360 LongDoubleAlign = 128;
5361 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005362 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005363 }
5364
Craig Topper3164f332014-03-11 03:39:26 +00005365 void getTargetDefines(const LangOptions &Opts,
5366 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005367 SparcTargetInfo::getTargetDefines(Opts, Builder);
5368 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005369 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005370 // Solaris doesn't need these variants, but the BSDs do.
5371 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005372 Builder.defineMacro("__sparc64__");
5373 Builder.defineMacro("__sparc_v9__");
5374 Builder.defineMacro("__sparcv9__");
5375 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005376 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005377
Craig Topper3164f332014-03-11 03:39:26 +00005378 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005379 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5380 .Case("v9", true)
5381 .Case("ultrasparc", true)
5382 .Case("ultrasparc3", true)
5383 .Case("niagara", true)
5384 .Case("niagara2", true)
5385 .Case("niagara3", true)
5386 .Case("niagara4", true)
5387 .Default(false);
5388
5389 // No need to store the CPU yet. There aren't any CPU-specific
5390 // macros to define.
5391 return CPUKnown;
5392 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005393};
5394
Torok Edwinb2b37c62009-06-30 17:10:35 +00005395class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005396public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005397 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5398 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005399 SizeType = UnsignedInt;
5400 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005401 }
5402};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005403
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005404class SystemZTargetInfo : public TargetInfo {
5405 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005406
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005407public:
5408 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005409 IntMaxType = SignedLong;
5410 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005411 TLSSupported = true;
5412 IntWidth = IntAlign = 32;
5413 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5414 PointerWidth = PointerAlign = 64;
5415 LongDoubleWidth = 128;
5416 LongDoubleAlign = 64;
5417 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5418 MinGlobalAlign = 16;
5419 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5420 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5421 }
5422 void getTargetDefines(const LangOptions &Opts,
5423 MacroBuilder &Builder) const override {
5424 Builder.defineMacro("__s390__");
5425 Builder.defineMacro("__s390x__");
5426 Builder.defineMacro("__zarch__");
5427 Builder.defineMacro("__LONG_DOUBLE_128__");
5428 }
5429 void getTargetBuiltins(const Builtin::Info *&Records,
5430 unsigned &NumRecords) const override {
5431 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005432 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005433 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005434 }
5435
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005436 void getGCCRegNames(const char *const *&Names,
5437 unsigned &NumNames) const override;
5438 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5439 unsigned &NumAliases) const override {
5440 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005441 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005442 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005443 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005444 bool validateAsmConstraint(const char *&Name,
5445 TargetInfo::ConstraintInfo &info) const override;
5446 const char *getClobbers() const override {
5447 // FIXME: Is this really right?
5448 return "";
5449 }
5450 BuiltinVaListKind getBuiltinVaListKind() const override {
5451 return TargetInfo::SystemZBuiltinVaList;
5452 }
5453 bool setCPU(const std::string &Name) override {
5454 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5455 .Case("z10", true)
5456 .Case("z196", true)
5457 .Case("zEC12", true)
5458 .Default(false);
5459
5460 // No need to store the CPU yet. There aren't any CPU-specific
5461 // macros to define.
5462 return CPUKnown;
5463 }
5464};
5465
5466const char *const SystemZTargetInfo::GCCRegNames[] = {
5467 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5468 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5469 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5470 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5471};
5472
5473void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5474 unsigned &NumNames) const {
5475 Names = GCCRegNames;
5476 NumNames = llvm::array_lengthof(GCCRegNames);
5477}
5478
5479bool SystemZTargetInfo::
5480validateAsmConstraint(const char *&Name,
5481 TargetInfo::ConstraintInfo &Info) const {
5482 switch (*Name) {
5483 default:
5484 return false;
5485
5486 case 'a': // Address register
5487 case 'd': // Data register (equivalent to 'r')
5488 case 'f': // Floating-point register
5489 Info.setAllowsRegister();
5490 return true;
5491
5492 case 'I': // Unsigned 8-bit constant
5493 case 'J': // Unsigned 12-bit constant
5494 case 'K': // Signed 16-bit constant
5495 case 'L': // Signed 20-bit displacement (on all targets we support)
5496 case 'M': // 0x7fffffff
5497 return true;
5498
5499 case 'Q': // Memory with base and unsigned 12-bit displacement
5500 case 'R': // Likewise, plus an index
5501 case 'S': // Memory with base and signed 20-bit displacement
5502 case 'T': // Likewise, plus an index
5503 Info.setAllowsMemory();
5504 return true;
5505 }
5506}
Ulrich Weigand47445072013-05-06 16:26:41 +00005507
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005508 class MSP430TargetInfo : public TargetInfo {
5509 static const char * const GCCRegNames[];
5510 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005511 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005512 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005513 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005514 IntWidth = 16; IntAlign = 16;
5515 LongWidth = 32; LongLongWidth = 64;
5516 LongAlign = LongLongAlign = 16;
5517 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005518 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005519 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005520 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005521 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005522 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005523 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005524 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005525 }
5526 void getTargetDefines(const LangOptions &Opts,
5527 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005528 Builder.defineMacro("MSP430");
5529 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005530 // FIXME: defines for different 'flavours' of MCU
5531 }
Craig Topper3164f332014-03-11 03:39:26 +00005532 void getTargetBuiltins(const Builtin::Info *&Records,
5533 unsigned &NumRecords) const override {
5534 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005535 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005536 NumRecords = 0;
5537 }
Craig Topper3164f332014-03-11 03:39:26 +00005538 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005539 return Feature == "msp430";
5540 }
Craig Topper3164f332014-03-11 03:39:26 +00005541 void getGCCRegNames(const char * const *&Names,
5542 unsigned &NumNames) const override;
5543 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5544 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005545 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005546 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005547 NumAliases = 0;
5548 }
Eric Christopher917e9522014-11-18 22:36:15 +00005549 bool
5550 validateAsmConstraint(const char *&Name,
5551 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005552 // FIXME: implement
5553 switch (*Name) {
5554 case 'K': // the constant 1
5555 case 'L': // constant -1^20 .. 1^19
5556 case 'M': // constant 1-4:
5557 return true;
5558 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005559 // No target constraints for now.
5560 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005561 }
Craig Topper3164f332014-03-11 03:39:26 +00005562 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005563 // FIXME: Is this really right?
5564 return "";
5565 }
Craig Topper3164f332014-03-11 03:39:26 +00005566 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005567 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005568 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005569 }
5570 };
5571
5572 const char * const MSP430TargetInfo::GCCRegNames[] = {
5573 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5574 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5575 };
5576
5577 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5578 unsigned &NumNames) const {
5579 Names = GCCRegNames;
5580 NumNames = llvm::array_lengthof(GCCRegNames);
5581 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005582
Mike Stump11289f42009-09-09 15:08:12 +00005583 // LLVM and Clang cannot be used directly to output native binaries for
5584 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005585 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005586 //
5587 // TCE uses the llvm bitcode as input and uses it for generating customized
5588 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005589 // publicly available in http://tce.cs.tut.fi
5590
Eli Friedman1f191002011-10-07 19:51:42 +00005591 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5592 3, // opencl_global
5593 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005594 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005595 // FIXME: generic has to be added to the target
5596 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005597 0, // cuda_device
5598 0, // cuda_constant
5599 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005600 };
5601
Eli Friedmana9c3d712009-08-19 20:47:07 +00005602 class TCETargetInfo : public TargetInfo{
5603 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005604 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005605 TLSSupported = false;
5606 IntWidth = 32;
5607 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005608 PointerWidth = 32;
5609 IntAlign = 32;
5610 LongAlign = LongLongAlign = 32;
5611 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005612 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005613 SizeType = UnsignedInt;
5614 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005615 IntPtrType = SignedInt;
5616 PtrDiffType = SignedInt;
5617 FloatWidth = 32;
5618 FloatAlign = 32;
5619 DoubleWidth = 32;
5620 DoubleAlign = 32;
5621 LongDoubleWidth = 32;
5622 LongDoubleAlign = 32;
5623 FloatFormat = &llvm::APFloat::IEEEsingle;
5624 DoubleFormat = &llvm::APFloat::IEEEsingle;
5625 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005626 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5627 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005628 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005629 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005630 }
5631
Craig Topper3164f332014-03-11 03:39:26 +00005632 void getTargetDefines(const LangOptions &Opts,
5633 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005634 DefineStd(Builder, "tce", Opts);
5635 Builder.defineMacro("__TCE__");
5636 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005637 }
Craig Topper3164f332014-03-11 03:39:26 +00005638 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005639 return Feature == "tce";
5640 }
Craig Topper3164f332014-03-11 03:39:26 +00005641
5642 void getTargetBuiltins(const Builtin::Info *&Records,
5643 unsigned &NumRecords) const override {}
5644 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005645 return "";
5646 }
Craig Topper3164f332014-03-11 03:39:26 +00005647 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005648 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005649 }
Craig Topper3164f332014-03-11 03:39:26 +00005650 void getGCCRegNames(const char * const *&Names,
5651 unsigned &NumNames) const override {}
5652 bool validateAsmConstraint(const char *&Name,
5653 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005654 return true;
5655 }
Craig Topper3164f332014-03-11 03:39:26 +00005656 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5657 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005658 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005659
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005660class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005661 virtual void setDescriptionString() = 0;
5662
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005663 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005664 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005665 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005666 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005667 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005668 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005669 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005670 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005671 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005672 enum DspRevEnum {
5673 NoDSP, DSP1, DSP2
5674 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005675 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005676
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005677protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005678 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005679 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005680
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005681public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005682 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5683 const std::string &CPUStr)
5684 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005685 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005686 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5687 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5688 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005689
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005690 bool isNaN2008Default() const {
5691 return CPU == "mips32r6" || CPU == "mips64r6";
5692 }
5693
5694 bool isFP64Default() const {
5695 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5696 }
5697
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005698 bool isNan2008() const override {
5699 return IsNan2008;
5700 }
5701
Alp Toker4925ba72014-06-07 23:30:42 +00005702 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005703 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005704 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5705 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005706 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005707 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005708 .Case("mips1", IsMips32)
5709 .Case("mips2", IsMips32)
5710 .Case("mips3", true)
5711 .Case("mips4", true)
5712 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005713 .Case("mips32", IsMips32)
5714 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005715 .Case("mips32r3", IsMips32)
5716 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005717 .Case("mips32r6", IsMips32)
5718 .Case("mips64", true)
5719 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005720 .Case("mips64r3", true)
5721 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005722 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005723 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005724 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005725 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005726 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005727 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005728 if (CPU == "octeon")
5729 Features["mips64r2"] = Features["cnmips"] = true;
5730 else
5731 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005732 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005733
Craig Topper3164f332014-03-11 03:39:26 +00005734 void getTargetDefines(const LangOptions &Opts,
5735 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005736 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005737 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005738 if (Opts.GNUMode)
5739 Builder.defineMacro("mips");
5740
Simon Atanasyan683535b2012-08-29 19:14:58 +00005741 Builder.defineMacro("__REGISTER_PREFIX__", "");
5742
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005743 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005744 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005745 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005746 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005747 case SoftFloat:
5748 Builder.defineMacro("__mips_soft_float", Twine(1));
5749 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005750 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005751
Simon Atanasyan16071912013-04-14 14:07:30 +00005752 if (IsSingleFloat)
5753 Builder.defineMacro("__mips_single_float", Twine(1));
5754
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005755 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5756 Builder.defineMacro("_MIPS_FPSET",
5757 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5758
Simon Atanasyan72244b62012-07-05 16:06:06 +00005759 if (IsMips16)
5760 Builder.defineMacro("__mips16", Twine(1));
5761
Simon Atanasyan60777612013-04-14 14:07:51 +00005762 if (IsMicromips)
5763 Builder.defineMacro("__mips_micromips", Twine(1));
5764
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005765 if (IsNan2008)
5766 Builder.defineMacro("__mips_nan2008", Twine(1));
5767
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005768 switch (DspRev) {
5769 default:
5770 break;
5771 case DSP1:
5772 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5773 Builder.defineMacro("__mips_dsp", Twine(1));
5774 break;
5775 case DSP2:
5776 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5777 Builder.defineMacro("__mips_dspr2", Twine(1));
5778 Builder.defineMacro("__mips_dsp", Twine(1));
5779 break;
5780 }
5781
Jack Carter44ff1e52013-08-12 17:20:29 +00005782 if (HasMSA)
5783 Builder.defineMacro("__mips_msa", Twine(1));
5784
Simon Atanasyan26f19672012-04-05 19:28:31 +00005785 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5786 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5787 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005788
5789 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5790 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005791 }
5792
Craig Topper3164f332014-03-11 03:39:26 +00005793 void getTargetBuiltins(const Builtin::Info *&Records,
5794 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005795 Records = BuiltinInfo;
5796 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005797 }
Craig Topper3164f332014-03-11 03:39:26 +00005798 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005799 return llvm::StringSwitch<bool>(Feature)
5800 .Case("mips", true)
5801 .Case("fp64", HasFP64)
5802 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005803 }
Craig Topper3164f332014-03-11 03:39:26 +00005804 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005805 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005806 }
Craig Topper3164f332014-03-11 03:39:26 +00005807 void getGCCRegNames(const char * const *&Names,
5808 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005809 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005810 // CPU register names
5811 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005812 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5813 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5814 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005815 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5816 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005817 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5818 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5819 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5820 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005821 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005822 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005823 "$fcc5","$fcc6","$fcc7",
5824 // MSA register names
5825 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5826 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5827 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5828 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5829 // MSA control register names
5830 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5831 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005832 };
5833 Names = GCCRegNames;
5834 NumNames = llvm::array_lengthof(GCCRegNames);
5835 }
Craig Topper3164f332014-03-11 03:39:26 +00005836 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5837 unsigned &NumAliases) const override = 0;
5838 bool validateAsmConstraint(const char *&Name,
5839 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005840 switch (*Name) {
5841 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005842 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005843 case 'r': // CPU registers.
5844 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005845 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005846 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005847 case 'c': // $25 for indirect jumps
5848 case 'l': // lo register
5849 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005850 Info.setAllowsRegister();
5851 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005852 case 'I': // Signed 16-bit constant
5853 case 'J': // Integer 0
5854 case 'K': // Unsigned 16-bit constant
5855 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5856 case 'M': // Constants not loadable via lui, addiu, or ori
5857 case 'N': // Constant -1 to -65535
5858 case 'O': // A signed 15-bit constant
5859 case 'P': // A constant between 1 go 65535
5860 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005861 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005862 Info.setAllowsMemory();
5863 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00005864 case 'Z':
5865 if (Name[1] == 'C') { // An address usable by ll, and sc.
5866 Info.setAllowsMemory();
5867 Name++; // Skip over 'Z'.
5868 return true;
5869 }
5870 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005871 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005872 }
5873
Daniel Sanders48fa39e2015-03-30 13:47:23 +00005874 std::string convertConstraint(const char *&Constraint) const override {
5875 std::string R;
5876 switch (*Constraint) {
5877 case 'Z': // Two-character constraint; add "^" hint for later parsing.
5878 if (Constraint[1] == 'C') {
5879 R = std::string("^") + std::string(Constraint, 2);
5880 Constraint++;
5881 return R;
5882 }
5883 break;
5884 }
5885 return TargetInfo::convertConstraint(Constraint);
5886 }
5887
Craig Topper3164f332014-03-11 03:39:26 +00005888 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005889 // In GCC, $1 is not widely used in generated code (it's used only in a few
5890 // specific situations), so there is no real need for users to add it to
5891 // the clobbers list if they want to use it in their inline assembly code.
5892 //
5893 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5894 // code generation, so using it in inline assembly without adding it to the
5895 // clobbers list can cause conflicts between the inline assembly code and
5896 // the surrounding generated code.
5897 //
5898 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5899 // operands, which will conflict with the ".set at" assembler option (which
5900 // we use only for inline assembly, in order to maintain compatibility with
5901 // GCC) and will also conflict with the user's usage of $1.
5902 //
5903 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5904 // register for generated code is to automatically clobber $1 for all inline
5905 // assembly code.
5906 //
5907 // FIXME: We should automatically clobber $1 only for inline assembly code
5908 // which actually uses it. This would allow LLVM to use $1 for inline
5909 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005910 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005911 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005912
Craig Topper3164f332014-03-11 03:39:26 +00005913 bool handleTargetFeatures(std::vector<std::string> &Features,
5914 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005915 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005916 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005917 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005918 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005919 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005920 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005921 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005922
5923 for (std::vector<std::string>::iterator it = Features.begin(),
5924 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005925 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005926 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005927 else if (*it == "+soft-float")
5928 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005929 else if (*it == "+mips16")
5930 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005931 else if (*it == "+micromips")
5932 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005933 else if (*it == "+dsp")
5934 DspRev = std::max(DspRev, DSP1);
5935 else if (*it == "+dspr2")
5936 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005937 else if (*it == "+msa")
5938 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005939 else if (*it == "+fp64")
5940 HasFP64 = true;
5941 else if (*it == "-fp64")
5942 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005943 else if (*it == "+nan2008")
5944 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005945 else if (*it == "-nan2008")
5946 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005947 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005948
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005949 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005950 std::vector<std::string>::iterator it =
5951 std::find(Features.begin(), Features.end(), "+soft-float");
5952 if (it != Features.end())
5953 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005954
Akira Hatanaka9064e362013-10-29 18:30:33 +00005955 setDescriptionString();
5956
Rafael Espindolaeb265472013-08-21 21:59:03 +00005957 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005958 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005959
Craig Topper3164f332014-03-11 03:39:26 +00005960 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005961 if (RegNo == 0) return 4;
5962 if (RegNo == 1) return 5;
5963 return -1;
5964 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005965
5966 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005967};
5968
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005969const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5970#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5971#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5972 ALL_LANGUAGES },
5973#include "clang/Basic/BuiltinsMips.def"
5974};
5975
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005976class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005977public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005978 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005979 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005980 SizeType = UnsignedInt;
5981 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00005982 Int64Type = SignedLongLong;
5983 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005984 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005985 }
Craig Topper3164f332014-03-11 03:39:26 +00005986 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005987 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005988 ABI = Name;
5989 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005990 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005991 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005992 }
Craig Topper3164f332014-03-11 03:39:26 +00005993 void getTargetDefines(const LangOptions &Opts,
5994 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005995 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005996
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005997 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005998 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5999
6000 const std::string& CPUStr = getCPU();
6001 if (CPUStr == "mips32")
6002 Builder.defineMacro("__mips_isa_rev", "1");
6003 else if (CPUStr == "mips32r2")
6004 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006005 else if (CPUStr == "mips32r3")
6006 Builder.defineMacro("__mips_isa_rev", "3");
6007 else if (CPUStr == "mips32r5")
6008 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006009 else if (CPUStr == "mips32r6")
6010 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006011
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006012 if (ABI == "o32") {
6013 Builder.defineMacro("__mips_o32");
6014 Builder.defineMacro("_ABIO32", "1");
6015 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6016 }
6017 else if (ABI == "eabi")
6018 Builder.defineMacro("__mips_eabi");
6019 else
David Blaikie83d382b2011-09-23 05:06:16 +00006020 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006021 }
Craig Topper3164f332014-03-11 03:39:26 +00006022 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6023 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006024 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6025 { { "at" }, "$1" },
6026 { { "v0" }, "$2" },
6027 { { "v1" }, "$3" },
6028 { { "a0" }, "$4" },
6029 { { "a1" }, "$5" },
6030 { { "a2" }, "$6" },
6031 { { "a3" }, "$7" },
6032 { { "t0" }, "$8" },
6033 { { "t1" }, "$9" },
6034 { { "t2" }, "$10" },
6035 { { "t3" }, "$11" },
6036 { { "t4" }, "$12" },
6037 { { "t5" }, "$13" },
6038 { { "t6" }, "$14" },
6039 { { "t7" }, "$15" },
6040 { { "s0" }, "$16" },
6041 { { "s1" }, "$17" },
6042 { { "s2" }, "$18" },
6043 { { "s3" }, "$19" },
6044 { { "s4" }, "$20" },
6045 { { "s5" }, "$21" },
6046 { { "s6" }, "$22" },
6047 { { "s7" }, "$23" },
6048 { { "t8" }, "$24" },
6049 { { "t9" }, "$25" },
6050 { { "k0" }, "$26" },
6051 { { "k1" }, "$27" },
6052 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006053 { { "sp","$sp" }, "$29" },
6054 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006055 { { "ra" }, "$31" }
6056 };
6057 Aliases = GCCRegAliases;
6058 NumAliases = llvm::array_lengthof(GCCRegAliases);
6059 }
6060};
6061
6062class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006063 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006064 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006065 }
6066
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006067public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006068 Mips32EBTargetInfo(const llvm::Triple &Triple)
6069 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006070 }
Craig Topper3164f332014-03-11 03:39:26 +00006071 void getTargetDefines(const LangOptions &Opts,
6072 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006073 DefineStd(Builder, "MIPSEB", Opts);
6074 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006075 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006076 }
6077};
6078
6079class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006080 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006081 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006082 }
6083
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006084public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006085 Mips32ELTargetInfo(const llvm::Triple &Triple)
6086 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006087 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006088 }
Craig Topper3164f332014-03-11 03:39:26 +00006089 void getTargetDefines(const LangOptions &Opts,
6090 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006091 DefineStd(Builder, "MIPSEL", Opts);
6092 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006093 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006094 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006095};
Akira Hatanakabef17452011-09-20 19:21:49 +00006096
6097class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006098public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006099 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006100 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006101 LongDoubleWidth = LongDoubleAlign = 128;
6102 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006103 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6104 LongDoubleWidth = LongDoubleAlign = 64;
6105 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6106 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006107 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006108 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006109 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006110 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006111
6112 void setN64ABITypes() {
6113 LongWidth = LongAlign = 64;
6114 PointerWidth = PointerAlign = 64;
6115 SizeType = UnsignedLong;
6116 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006117 Int64Type = SignedLong;
6118 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006119 }
6120
6121 void setN32ABITypes() {
6122 LongWidth = LongAlign = 32;
6123 PointerWidth = PointerAlign = 32;
6124 SizeType = UnsignedInt;
6125 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006126 Int64Type = SignedLongLong;
6127 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006128 }
6129
Craig Topper3164f332014-03-11 03:39:26 +00006130 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006131 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006132 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006133 ABI = Name;
6134 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006135 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006136 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006137 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006138 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006139 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006140 }
6141 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006142 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006143
Craig Topper3164f332014-03-11 03:39:26 +00006144 void getTargetDefines(const LangOptions &Opts,
6145 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006146 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006147
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006148 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006149 Builder.defineMacro("__mips64");
6150 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006151 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6152
6153 const std::string& CPUStr = getCPU();
6154 if (CPUStr == "mips64")
6155 Builder.defineMacro("__mips_isa_rev", "1");
6156 else if (CPUStr == "mips64r2")
6157 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006158 else if (CPUStr == "mips64r3")
6159 Builder.defineMacro("__mips_isa_rev", "3");
6160 else if (CPUStr == "mips64r5")
6161 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006162 else if (CPUStr == "mips64r6")
6163 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006164
Akira Hatanakabef17452011-09-20 19:21:49 +00006165 if (ABI == "n32") {
6166 Builder.defineMacro("__mips_n32");
6167 Builder.defineMacro("_ABIN32", "2");
6168 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6169 }
6170 else if (ABI == "n64") {
6171 Builder.defineMacro("__mips_n64");
6172 Builder.defineMacro("_ABI64", "3");
6173 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6174 }
6175 else
David Blaikie83d382b2011-09-23 05:06:16 +00006176 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006177 }
Craig Topper3164f332014-03-11 03:39:26 +00006178 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6179 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006180 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6181 { { "at" }, "$1" },
6182 { { "v0" }, "$2" },
6183 { { "v1" }, "$3" },
6184 { { "a0" }, "$4" },
6185 { { "a1" }, "$5" },
6186 { { "a2" }, "$6" },
6187 { { "a3" }, "$7" },
6188 { { "a4" }, "$8" },
6189 { { "a5" }, "$9" },
6190 { { "a6" }, "$10" },
6191 { { "a7" }, "$11" },
6192 { { "t0" }, "$12" },
6193 { { "t1" }, "$13" },
6194 { { "t2" }, "$14" },
6195 { { "t3" }, "$15" },
6196 { { "s0" }, "$16" },
6197 { { "s1" }, "$17" },
6198 { { "s2" }, "$18" },
6199 { { "s3" }, "$19" },
6200 { { "s4" }, "$20" },
6201 { { "s5" }, "$21" },
6202 { { "s6" }, "$22" },
6203 { { "s7" }, "$23" },
6204 { { "t8" }, "$24" },
6205 { { "t9" }, "$25" },
6206 { { "k0" }, "$26" },
6207 { { "k1" }, "$27" },
6208 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006209 { { "sp","$sp" }, "$29" },
6210 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006211 { { "ra" }, "$31" }
6212 };
6213 Aliases = GCCRegAliases;
6214 NumAliases = llvm::array_lengthof(GCCRegAliases);
6215 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006216
6217 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006218};
6219
6220class Mips64EBTargetInfo : 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 Hatanaka9064e362013-10-29 18:30:33 +00006226
Akira Hatanakabef17452011-09-20 19:21:49 +00006227 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006228
Akira Hatanakabef17452011-09-20 19:21:49 +00006229public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006230 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006231 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006232 void getTargetDefines(const LangOptions &Opts,
6233 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006234 DefineStd(Builder, "MIPSEB", Opts);
6235 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006236 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006237 }
6238};
6239
6240class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006241 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006242 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006243 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 +00006244 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006245 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006246 }
6247public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006248 Mips64ELTargetInfo(const llvm::Triple &Triple)
6249 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006250 // Default ABI is n64.
6251 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006252 }
Craig Topper3164f332014-03-11 03:39:26 +00006253 void getTargetDefines(const LangOptions &Opts,
6254 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006255 DefineStd(Builder, "MIPSEL", Opts);
6256 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006257 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006258 }
6259};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006260
Ivan Krasindd7403e2011-08-24 20:22:22 +00006261class PNaClTargetInfo : public TargetInfo {
6262public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006263 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006264 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006265 this->UserLabelPrefix = "";
6266 this->LongAlign = 32;
6267 this->LongWidth = 32;
6268 this->PointerAlign = 32;
6269 this->PointerWidth = 32;
6270 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006271 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006272 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006273 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006274 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006275 this->SizeType = TargetInfo::UnsignedInt;
6276 this->PtrDiffType = TargetInfo::SignedInt;
6277 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006278 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006279 }
6280
Craig Topper3164f332014-03-11 03:39:26 +00006281 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006282 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006283 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006284 Builder.defineMacro("__le32__");
6285 Builder.defineMacro("__pnacl__");
6286 }
Craig Topper3164f332014-03-11 03:39:26 +00006287 void getTargetDefines(const LangOptions &Opts,
6288 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006289 getArchDefines(Opts, Builder);
6290 }
Craig Topper3164f332014-03-11 03:39:26 +00006291 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006292 return Feature == "pnacl";
6293 }
Craig Topper3164f332014-03-11 03:39:26 +00006294 void getTargetBuiltins(const Builtin::Info *&Records,
6295 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006296 }
Craig Topper3164f332014-03-11 03:39:26 +00006297 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006298 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006299 }
Craig Topper3164f332014-03-11 03:39:26 +00006300 void getGCCRegNames(const char * const *&Names,
6301 unsigned &NumNames) const override;
6302 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6303 unsigned &NumAliases) const override;
6304 bool validateAsmConstraint(const char *&Name,
6305 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006306 return false;
6307 }
6308
Craig Topper3164f332014-03-11 03:39:26 +00006309 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006310 return "";
6311 }
6312};
6313
6314void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6315 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006316 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006317 NumNames = 0;
6318}
6319
6320void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6321 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006322 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006323 NumAliases = 0;
6324}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006325
JF Bastien643817d2014-09-12 17:52:47 +00006326class Le64TargetInfo : public TargetInfo {
6327 static const Builtin::Info BuiltinInfo[];
6328
6329public:
6330 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6331 BigEndian = false;
6332 NoAsmVariants = true;
6333 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6334 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6335 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006336 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006337 }
6338
6339 void getTargetDefines(const LangOptions &Opts,
6340 MacroBuilder &Builder) const override {
6341 DefineStd(Builder, "unix", Opts);
6342 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6343 Builder.defineMacro("__ELF__");
6344 }
6345 void getTargetBuiltins(const Builtin::Info *&Records,
6346 unsigned &NumRecords) const override {
6347 Records = BuiltinInfo;
6348 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6349 }
6350 BuiltinVaListKind getBuiltinVaListKind() const override {
6351 return TargetInfo::PNaClABIBuiltinVaList;
6352 }
6353 const char *getClobbers() const override { return ""; }
6354 void getGCCRegNames(const char *const *&Names,
6355 unsigned &NumNames) const override {
6356 Names = nullptr;
6357 NumNames = 0;
6358 }
6359 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6360 unsigned &NumAliases) const override {
6361 Aliases = nullptr;
6362 NumAliases = 0;
6363 }
6364 bool validateAsmConstraint(const char *&Name,
6365 TargetInfo::ConstraintInfo &Info) const override {
6366 return false;
6367 }
6368
6369 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006370};
6371} // end anonymous namespace.
6372
6373const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6374#define BUILTIN(ID, TYPE, ATTRS) \
6375 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6376#include "clang/Basic/BuiltinsLe64.def"
6377};
6378
6379namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006380 static const unsigned SPIRAddrSpaceMap[] = {
6381 1, // opencl_global
6382 3, // opencl_local
6383 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006384 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006385 0, // cuda_device
6386 0, // cuda_constant
6387 0 // cuda_shared
6388 };
6389 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006390 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006391 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006392 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6393 "SPIR target must use unknown OS");
6394 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6395 "SPIR target must use unknown environment type");
6396 BigEndian = false;
6397 TLSSupported = false;
6398 LongWidth = LongAlign = 64;
6399 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006400 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006401 // Define available target features
6402 // These must be defined in sorted order!
6403 NoAsmVariants = true;
6404 }
Craig Topper3164f332014-03-11 03:39:26 +00006405 void getTargetDefines(const LangOptions &Opts,
6406 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006407 DefineStd(Builder, "SPIR", Opts);
6408 }
Craig Topper3164f332014-03-11 03:39:26 +00006409 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006410 return Feature == "spir";
6411 }
Craig Topper3164f332014-03-11 03:39:26 +00006412
6413 void getTargetBuiltins(const Builtin::Info *&Records,
6414 unsigned &NumRecords) const override {}
6415 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006416 return "";
6417 }
Craig Topper3164f332014-03-11 03:39:26 +00006418 void getGCCRegNames(const char * const *&Names,
6419 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006420 bool
6421 validateAsmConstraint(const char *&Name,
6422 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006423 return true;
6424 }
Craig Topper3164f332014-03-11 03:39:26 +00006425 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6426 unsigned &NumAliases) const override {}
6427 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006428 return TargetInfo::VoidPtrBuiltinVaList;
6429 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006430
6431 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6432 return (CC == CC_SpirFunction ||
6433 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6434 }
6435
6436 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6437 return CC_SpirFunction;
6438 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006439 };
6440
6441
6442 class SPIR32TargetInfo : public SPIRTargetInfo {
6443 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006444 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006445 PointerWidth = PointerAlign = 32;
6446 SizeType = TargetInfo::UnsignedInt;
6447 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6448 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006449 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6450 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006451 }
Craig Topper3164f332014-03-11 03:39:26 +00006452 void getTargetDefines(const LangOptions &Opts,
6453 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006454 DefineStd(Builder, "SPIR32", Opts);
6455 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006456 };
6457
6458 class SPIR64TargetInfo : public SPIRTargetInfo {
6459 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006460 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006461 PointerWidth = PointerAlign = 64;
6462 SizeType = TargetInfo::UnsignedLong;
6463 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006464 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6465 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006466 }
Craig Topper3164f332014-03-11 03:39:26 +00006467 void getTargetDefines(const LangOptions &Opts,
6468 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006469 DefineStd(Builder, "SPIR64", Opts);
6470 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006471 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006472
Robert Lytton0e076492013-08-13 09:43:10 +00006473class XCoreTargetInfo : public TargetInfo {
6474 static const Builtin::Info BuiltinInfo[];
6475public:
6476 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6477 BigEndian = false;
6478 NoAsmVariants = true;
6479 LongLongAlign = 32;
6480 SuitableAlign = 32;
6481 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006482 SizeType = UnsignedInt;
6483 PtrDiffType = SignedInt;
6484 IntPtrType = SignedInt;
6485 WCharType = UnsignedChar;
6486 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006487 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006488 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 +00006489 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006490 }
Craig Topper3164f332014-03-11 03:39:26 +00006491 void getTargetDefines(const LangOptions &Opts,
6492 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006493 Builder.defineMacro("__XS1B__");
6494 }
Craig Topper3164f332014-03-11 03:39:26 +00006495 void getTargetBuiltins(const Builtin::Info *&Records,
6496 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006497 Records = BuiltinInfo;
6498 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6499 }
Craig Topper3164f332014-03-11 03:39:26 +00006500 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006501 return TargetInfo::VoidPtrBuiltinVaList;
6502 }
Craig Topper3164f332014-03-11 03:39:26 +00006503 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006504 return "";
6505 }
Craig Topper3164f332014-03-11 03:39:26 +00006506 void getGCCRegNames(const char * const *&Names,
6507 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006508 static const char * const GCCRegNames[] = {
6509 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6510 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6511 };
6512 Names = GCCRegNames;
6513 NumNames = llvm::array_lengthof(GCCRegNames);
6514 }
Craig Topper3164f332014-03-11 03:39:26 +00006515 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6516 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006517 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006518 NumAliases = 0;
6519 }
Craig Topper3164f332014-03-11 03:39:26 +00006520 bool validateAsmConstraint(const char *&Name,
6521 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006522 return false;
6523 }
Craig Topper3164f332014-03-11 03:39:26 +00006524 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006525 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6526 return (RegNo < 2)? RegNo : -1;
6527 }
Robert Lytton0e076492013-08-13 09:43:10 +00006528};
6529
6530const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6531#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6532#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6533 ALL_LANGUAGES },
6534#include "clang/Basic/BuiltinsXCore.def"
6535};
6536} // end anonymous namespace.
6537
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006538namespace {
6539// x86_32 Android target
6540class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6541public:
6542 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6543 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6544 SuitableAlign = 32;
6545 LongDoubleWidth = 64;
6546 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6547 }
6548};
6549} // end anonymous namespace
6550
6551namespace {
6552// x86_64 Android target
6553class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6554public:
6555 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6556 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6557 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6558 }
6559};
6560} // end anonymous namespace
6561
Ivan Krasindd7403e2011-08-24 20:22:22 +00006562
Chris Lattner5ba61f02006-10-14 07:39:34 +00006563//===----------------------------------------------------------------------===//
6564// Driver code
6565//===----------------------------------------------------------------------===//
6566
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006567static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006568 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006569
Daniel Dunbar52322032009-08-18 05:47:58 +00006570 switch (Triple.getArch()) {
6571 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006572 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006573
Tim Northover2a0783d2014-05-30 14:14:07 +00006574 case llvm::Triple::xcore:
6575 return new XCoreTargetInfo(Triple);
6576
6577 case llvm::Triple::hexagon:
6578 return new HexagonTargetInfo(Triple);
6579
6580 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006581 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006582 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006583
6584 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006585 case llvm::Triple::FreeBSD:
6586 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006587 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006588 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006589 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006590 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006591 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006592 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006593 }
6594
Christian Pirker9b019ae2014-02-25 13:51:00 +00006595 case llvm::Triple::aarch64_be:
6596 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006597 case llvm::Triple::FreeBSD:
6598 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006599 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006600 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006601 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006602 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006603 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006604 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006605 }
6606
Daniel Dunbar52322032009-08-18 05:47:58 +00006607 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006608 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006609 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006610 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006611
Daniel Dunbar52322032009-08-18 05:47:58 +00006612 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006613 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006614 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006615 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006616 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006617 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006618 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006619 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006620 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006621 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006622 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006623 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006624 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006625 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006626 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006627 case llvm::Triple::Win32:
6628 switch (Triple.getEnvironment()) {
6629 default:
6630 return new ARMleTargetInfo(Triple);
6631 case llvm::Triple::Itanium:
6632 return new ItaniumWindowsARMleTargetInfo(Triple);
6633 case llvm::Triple::MSVC:
6634 return new MicrosoftARMleTargetInfo(Triple);
6635 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006636 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006637 return new ARMleTargetInfo(Triple);
6638 }
6639
6640 case llvm::Triple::armeb:
6641 case llvm::Triple::thumbeb:
6642 if (Triple.isOSDarwin())
6643 return new DarwinARMTargetInfo(Triple);
6644
6645 switch (os) {
6646 case llvm::Triple::Linux:
6647 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6648 case llvm::Triple::FreeBSD:
6649 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6650 case llvm::Triple::NetBSD:
6651 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6652 case llvm::Triple::OpenBSD:
6653 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6654 case llvm::Triple::Bitrig:
6655 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6656 case llvm::Triple::RTEMS:
6657 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6658 case llvm::Triple::NaCl:
6659 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6660 default:
6661 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006662 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006663
Daniel Dunbar52322032009-08-18 05:47:58 +00006664 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006665 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006666
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006667 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006668 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006669 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006670 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006671 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006672 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006673 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006674 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006675 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006676 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006677 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006678 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006679 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006680
6681 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006682 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006683 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006684 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006685 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006686 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006687 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006688 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006689 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006690 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006691 case llvm::Triple::NaCl:
6692 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006693 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006694 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006695 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006696
Akira Hatanakabef17452011-09-20 19:21:49 +00006697 case llvm::Triple::mips64:
6698 switch (os) {
6699 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006700 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006701 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006702 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006703 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006704 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006705 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006706 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006707 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006708 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006709 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006710 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006711 }
6712
6713 case llvm::Triple::mips64el:
6714 switch (os) {
6715 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006716 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006717 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006718 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006719 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006720 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006721 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006722 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006723 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006724 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006725 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006726 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006727 }
6728
Ivan Krasindd7403e2011-08-24 20:22:22 +00006729 case llvm::Triple::le32:
6730 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006731 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006732 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006733 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006734 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006735 }
6736
JF Bastien643817d2014-09-12 17:52:47 +00006737 case llvm::Triple::le64:
6738 return new Le64TargetInfo(Triple);
6739
Daniel Dunbar52322032009-08-18 05:47:58 +00006740 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006741 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006742 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006743 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006744 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006745 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006746 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006747 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006748 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006749 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006750 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006751 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006752 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006753 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006754 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006755 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006756 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006757
6758 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006759 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006760 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006761 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006762 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006763 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006764 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006765 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006766 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006767 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006768 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006769 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006770 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006771 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006772 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006773
Bill Schmidt778d3872013-07-26 01:36:11 +00006774 case llvm::Triple::ppc64le:
6775 switch (os) {
6776 case llvm::Triple::Linux:
6777 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6778 default:
6779 return new PPC64TargetInfo(Triple);
6780 }
6781
Peter Collingbournec947aae2012-05-20 23:28:41 +00006782 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006783 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006784 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006785 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006786
Tom Stellardd8e38a32015-01-06 20:34:47 +00006787 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006788 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006789 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006790
Daniel Dunbar52322032009-08-18 05:47:58 +00006791 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006792 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006793 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006794 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006795 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006796 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006797 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006798 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006799 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006800 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006801 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006802 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006803 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006804 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006805 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006806
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006807 case llvm::Triple::sparcv9:
6808 switch (os) {
6809 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006810 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006811 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006812 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006813 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006814 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006815 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006816 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006817 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006818 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006819 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006820 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006821 }
6822
Ulrich Weigand47445072013-05-06 16:26:41 +00006823 case llvm::Triple::systemz:
6824 switch (os) {
6825 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006826 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006827 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006828 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006829 }
6830
Eli Friedmana9c3d712009-08-19 20:47:07 +00006831 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006832 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006833
Daniel Dunbar52322032009-08-18 05:47:58 +00006834 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006835 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006836 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006837
Daniel Dunbar52322032009-08-18 05:47:58 +00006838 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006839 case llvm::Triple::Linux: {
6840 switch (Triple.getEnvironment()) {
6841 default:
6842 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6843 case llvm::Triple::Android:
6844 return new AndroidX86_32TargetInfo(Triple);
6845 }
6846 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006847 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006848 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006849 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006850 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006851 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006852 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006853 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006854 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006855 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006856 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006857 case llvm::Triple::KFreeBSD:
6858 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006859 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006860 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006861 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006862 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006863 case llvm::Triple::Win32: {
6864 switch (Triple.getEnvironment()) {
6865 default:
6866 return new X86_32TargetInfo(Triple);
6867 case llvm::Triple::Cygnus:
6868 return new CygwinX86_32TargetInfo(Triple);
6869 case llvm::Triple::GNU:
6870 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006871 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006872 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006873 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006874 }
6875 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006876 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006877 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006878 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006879 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006880 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006881 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006882 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006883 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006884 }
6885
6886 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006887 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006888 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006889
Daniel Dunbar52322032009-08-18 05:47:58 +00006890 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00006891 case llvm::Triple::CloudABI:
6892 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006893 case llvm::Triple::Linux: {
6894 switch (Triple.getEnvironment()) {
6895 default:
6896 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
6897 case llvm::Triple::Android:
6898 return new AndroidX86_64TargetInfo(Triple);
6899 }
6900 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00006901 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006902 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006903 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006904 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006905 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006906 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006907 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006908 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006909 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006910 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006911 case llvm::Triple::KFreeBSD:
6912 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006913 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006914 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006915 case llvm::Triple::Win32: {
6916 switch (Triple.getEnvironment()) {
6917 default:
6918 return new X86_64TargetInfo(Triple);
6919 case llvm::Triple::GNU:
6920 return new MinGWX86_64TargetInfo(Triple);
6921 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006922 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006923 }
6924 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006925 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006926 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006927 case llvm::Triple::PS4:
6928 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006929 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006930 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006931 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006932
6933 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006934 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006935 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006936 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006937 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006938 }
6939 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006940 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006941 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006942 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006943 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006944 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006945 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006946}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006947
6948/// CreateTargetInfo - Return the target info object for the specified target
6949/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006950TargetInfo *
6951TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6952 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006953 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006954
6955 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006956 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006957 if (!Target) {
6958 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006959 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006960 }
Alp Toker80758082014-07-06 05:26:44 +00006961 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006962
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006963 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006964 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6965 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006966 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006967 }
6968
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006969 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006970 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6971 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006972 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006973 }
6974
Rafael Espindolaeb265472013-08-21 21:59:03 +00006975 // Set the fp math unit.
6976 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6977 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006978 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006979 }
6980
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006981 // Compute the default target features, we need the target to handle this
6982 // because features may have dependencies on one another.
6983 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006984 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006985
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006986 // Apply the user specified deltas.
6987 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6988 I < N; ++I) {
6989 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006990 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006991 bool Enabled = Name[0] == '+';
6992 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006993 }
6994
6995 // Add the features to the compile options.
6996 //
6997 // FIXME: If we are completely confident that we have the right set, we only
6998 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006999 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007000 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7001 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007002 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007003 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007004 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007005
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007006 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007007}