blob: 25ce32e4664ebe1fa825cae27f394cfe0d470c99 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000031#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000032using namespace clang;
33
Chris Lattner5ba61f02006-10-14 07:39:34 +000034//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000035// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
37
Chris Lattner1e1c0b92009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000044
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055}
56
Benjamin Kramere3b442d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000096 if (Opts.Sanitize.has(SanitizerKind::Address))
97 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Evan Cheng31dd9a62014-01-26 23:12:43 +0000141 // Set the appropriate OS version define.
142 if (Triple.isiOS()) {
143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 Str);
153 } else if (Triple.isMacOSX()) {
154 // Note that the Driver allows versions which aren't representable in the
155 // define (because we only get a single digit for the minor and micro
156 // revision numbers). So, we limit them to the maximum representable
157 // version.
158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000159 char Str[7];
160 if (Maj < 10 || (Maj == 10 && Min < 10)) {
161 Str[0] = '0' + (Maj / 10);
162 Str[1] = '0' + (Maj % 10);
163 Str[2] = '0' + std::min(Min, 9U);
164 Str[3] = '0' + std::min(Rev, 9U);
165 Str[4] = '\0';
166 } else {
167 // Handle versions > 10.9.
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
170 Str[2] = '0' + (Min / 10);
171 Str[3] = '0' + (Min % 10);
172 Str[4] = '0' + (Rev / 10);
173 Str[5] = '0' + (Rev % 10);
174 Str[6] = '\0';
175 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000176 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000177 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 // Tell users about the kernel if there is one.
180 if (Triple.isOSDarwin())
181 Builder.defineMacro("__MACH__");
182
Daniel Dunbarecf13562011-04-19 21:40:34 +0000183 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000184}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000185
Benjamin Kramerd5748c72015-03-23 12:31:05 +0000186namespace {
Ed Schoutenf33c6072015-03-11 08:42:46 +0000187// CloudABI Target
188template <typename Target>
189class CloudABITargetInfo : public OSTargetInfo<Target> {
190protected:
191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
193 Builder.defineMacro("__CloudABI__");
194 Builder.defineMacro("__ELF__");
195
196 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
197 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
198 Builder.defineMacro("__STDC_UTF_16__");
199 Builder.defineMacro("__STDC_UTF_32__");
200 }
201
202public:
203 CloudABITargetInfo(const llvm::Triple &Triple)
204 : OSTargetInfo<Target>(Triple) {
205 this->UserLabelPrefix = "";
206 }
207};
208
Torok Edwinb2b37c62009-06-30 17:10:35 +0000209template<typename Target>
210class DarwinTargetInfo : public OSTargetInfo<Target> {
211protected:
Craig Topper3164f332014-03-11 03:39:26 +0000212 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
213 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000214 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000215 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216 }
Mike Stump11289f42009-09-09 15:08:12 +0000217
Torok Edwinb2b37c62009-06-30 17:10:35 +0000218public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000219 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
220 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
221 this->MCountName = "\01mcount";
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223
Craig Topper3164f332014-03-11 03:39:26 +0000224 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000225 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000226 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000228 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000230 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000231 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000232
Craig Topper3164f332014-03-11 03:39:26 +0000233 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000234 // FIXME: We should return 0 when building kexts.
235 return "__TEXT,__StaticInit,regular,pure_instructions";
236 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000237
John McCalleed64c72012-01-29 01:20:30 +0000238 /// Darwin does not support protected visibility. Darwin's "default"
239 /// is very similar to ELF's "protected"; Darwin requires a "weak"
240 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000241 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000242 return false;
243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244};
245
Chris Lattner30ba6742009-08-10 19:03:04 +0000246
Torok Edwinb2b37c62009-06-30 17:10:35 +0000247// DragonFlyBSD Target
248template<typename Target>
249class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
250protected:
Craig Topper3164f332014-03-11 03:39:26 +0000251 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
252 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000254 Builder.defineMacro("__DragonFly__");
255 Builder.defineMacro("__DragonFly_cc_version", "100001");
256 Builder.defineMacro("__ELF__");
257 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
258 Builder.defineMacro("__tune_i386__");
259 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260 }
261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000262 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
263 : OSTargetInfo<Target>(Triple) {
264 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000265
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000273 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274};
275
276// FreeBSD Target
277template<typename Target>
278class FreeBSDTargetInfo : public OSTargetInfo<Target> {
279protected:
Craig Topper3164f332014-03-11 03:39:26 +0000280 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
281 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282 // FreeBSD defines; list based off of gcc output
283
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000284 unsigned Release = Triple.getOSMajorVersion();
285 if (Release == 0U)
286 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000287
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000288 Builder.defineMacro("__FreeBSD__", Twine(Release));
289 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000290 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
291 DefineStd(Builder, "unix", Opts);
292 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000293
294 // On FreeBSD, wchar_t contains the number of the code point as
295 // used by the character set of the locale. These character sets are
296 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000297 //
298 // FIXME: This is wrong; the macro refers to the numerical values
299 // of wchar_t *literals*, which are not locale-dependent. However,
300 // FreeBSD systems apparently depend on us getting this wrong, and
301 // setting this to 1 is conforming even if all the basic source
302 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000303 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000304 }
305public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000306 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
307 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000308
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000309 switch (Triple.getArch()) {
310 default:
311 case llvm::Triple::x86:
312 case llvm::Triple::x86_64:
313 this->MCountName = ".mcount";
314 break;
315 case llvm::Triple::mips:
316 case llvm::Triple::mipsel:
317 case llvm::Triple::ppc:
318 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000319 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000320 this->MCountName = "_mcount";
321 break;
322 case llvm::Triple::arm:
323 this->MCountName = "__mcount";
324 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000325 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000326 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000327};
328
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000329// GNU/kFreeBSD Target
330template<typename Target>
331class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
332protected:
Craig Topper3164f332014-03-11 03:39:26 +0000333 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
334 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000335 // GNU/kFreeBSD defines; list based off of gcc output
336
337 DefineStd(Builder, "unix", Opts);
338 Builder.defineMacro("__FreeBSD_kernel__");
339 Builder.defineMacro("__GLIBC__");
340 Builder.defineMacro("__ELF__");
341 if (Opts.POSIXThreads)
342 Builder.defineMacro("_REENTRANT");
343 if (Opts.CPlusPlus)
344 Builder.defineMacro("_GNU_SOURCE");
345 }
346public:
Eric Christopher917e9522014-11-18 22:36:15 +0000347 KFreeBSDTargetInfo(const llvm::Triple &Triple)
348 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000349 this->UserLabelPrefix = "";
350 }
351};
352
Chris Lattner3e2ee142010-07-07 16:01:42 +0000353// Minix Target
354template<typename Target>
355class MinixTargetInfo : public OSTargetInfo<Target> {
356protected:
Craig Topper3164f332014-03-11 03:39:26 +0000357 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
358 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000359 // Minix defines
360
361 Builder.defineMacro("__minix", "3");
362 Builder.defineMacro("_EM_WSIZE", "4");
363 Builder.defineMacro("_EM_PSIZE", "4");
364 Builder.defineMacro("_EM_SSIZE", "2");
365 Builder.defineMacro("_EM_LSIZE", "4");
366 Builder.defineMacro("_EM_FSIZE", "4");
367 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000368 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000369 DefineStd(Builder, "unix", Opts);
370 }
371public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000372 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
373 this->UserLabelPrefix = "";
374 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000375};
376
Torok Edwinb2b37c62009-06-30 17:10:35 +0000377// Linux target
378template<typename Target>
379class LinuxTargetInfo : public OSTargetInfo<Target> {
380protected:
Craig Topper3164f332014-03-11 03:39:26 +0000381 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
382 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000383 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000384 DefineStd(Builder, "unix", Opts);
385 DefineStd(Builder, "linux", Opts);
386 Builder.defineMacro("__gnu_linux__");
387 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000388 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000389 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000390 unsigned Maj, Min, Rev;
391 Triple.getOSVersion(Maj, Min, Rev);
392 this->PlatformName = "android";
393 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
394 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000395 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000396 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000399 }
400public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000401 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000402 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000403 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000404
405 switch (Triple.getArch()) {
406 default:
407 break;
408 case llvm::Triple::ppc:
409 case llvm::Triple::ppc64:
410 case llvm::Triple::ppc64le:
411 this->MCountName = "_mcount";
412 break;
413 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000414 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000415
Craig Topper3164f332014-03-11 03:39:26 +0000416 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000417 return ".text.startup";
418 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419};
420
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000421// NetBSD Target
422template<typename Target>
423class NetBSDTargetInfo : public OSTargetInfo<Target> {
424protected:
Craig Topper3164f332014-03-11 03:39:26 +0000425 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
426 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000427 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000428 Builder.defineMacro("__NetBSD__");
429 Builder.defineMacro("__unix__");
430 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000431 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000432 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000433
434 switch (Triple.getArch()) {
435 default:
436 break;
437 case llvm::Triple::arm:
438 case llvm::Triple::armeb:
439 case llvm::Triple::thumb:
440 case llvm::Triple::thumbeb:
441 Builder.defineMacro("__ARM_DWARF_EH__");
442 break;
443 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000444 }
445public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000446 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
447 this->UserLabelPrefix = "";
448 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// OpenBSD Target
452template<typename Target>
453class OpenBSDTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // OpenBSD defines; list based off of gcc output
458
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 Builder.defineMacro("__OpenBSD__");
460 DefineStd(Builder, "unix", Opts);
461 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000462 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000463 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000464 }
465public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000466 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
467 this->UserLabelPrefix = "";
468 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000469
Eli Friedman3715d1f2011-12-15 02:15:56 +0000470 switch (Triple.getArch()) {
471 default:
472 case llvm::Triple::x86:
473 case llvm::Triple::x86_64:
474 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000475 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000476 this->MCountName = "__mcount";
477 break;
478 case llvm::Triple::mips64:
479 case llvm::Triple::mips64el:
480 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000481 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000482 this->MCountName = "_mcount";
483 break;
484 }
485 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000486};
487
Eli Friedman9fa28852012-08-08 23:57:20 +0000488// Bitrig Target
489template<typename Target>
490class BitrigTargetInfo : public OSTargetInfo<Target> {
491protected:
Craig Topper3164f332014-03-11 03:39:26 +0000492 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
493 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000494 // Bitrig defines; list based off of gcc output
495
496 Builder.defineMacro("__Bitrig__");
497 DefineStd(Builder, "unix", Opts);
498 Builder.defineMacro("__ELF__");
499 if (Opts.POSIXThreads)
500 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000501
502 switch (Triple.getArch()) {
503 default:
504 break;
505 case llvm::Triple::arm:
506 case llvm::Triple::armeb:
507 case llvm::Triple::thumb:
508 case llvm::Triple::thumbeb:
509 Builder.defineMacro("__ARM_DWARF_EH__");
510 break;
511 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000512 }
513public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000514 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
515 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000516 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000517 }
518};
519
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000520// PSP Target
521template<typename Target>
522class PSPTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000526 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000527 Builder.defineMacro("PSP");
528 Builder.defineMacro("_PSP");
529 Builder.defineMacro("__psp__");
530 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000531 }
532public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000533 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000534 this->UserLabelPrefix = "";
535 }
536};
537
John Thompsone467e192009-11-19 17:18:50 +0000538// PS3 PPU Target
539template<typename Target>
540class PS3PPUTargetInfo : public OSTargetInfo<Target> {
541protected:
Craig Topper3164f332014-03-11 03:39:26 +0000542 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
543 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000544 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000545 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000546 Builder.defineMacro("__PPU__");
547 Builder.defineMacro("__CELLOS_LV2__");
548 Builder.defineMacro("__ELF__");
549 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000550 Builder.defineMacro("_ARCH_PPC64");
551 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000552 }
553public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000554 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000555 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000556 this->LongWidth = this->LongAlign = 32;
557 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000558 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000559 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000560 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000561 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000562 }
563};
564
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000565template <typename Target>
566class PS4OSTargetInfo : public OSTargetInfo<Target> {
567protected:
568 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
569 MacroBuilder &Builder) const override {
570 Builder.defineMacro("__FreeBSD__", "9");
571 Builder.defineMacro("__FreeBSD_cc_version", "900001");
572 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
573 DefineStd(Builder, "unix", Opts);
574 Builder.defineMacro("__ELF__");
575 Builder.defineMacro("__PS4__");
576 }
577public:
578 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
579 this->WCharType = this->UnsignedShort;
580
581 this->UserLabelPrefix = "";
582
583 switch (Triple.getArch()) {
584 default:
585 case llvm::Triple::x86_64:
586 this->MCountName = ".mcount";
587 break;
588 }
589 }
590};
591
Torok Edwinb2b37c62009-06-30 17:10:35 +0000592// Solaris target
593template<typename Target>
594class SolarisTargetInfo : public OSTargetInfo<Target> {
595protected:
Craig Topper3164f332014-03-11 03:39:26 +0000596 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
597 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000598 DefineStd(Builder, "sun", Opts);
599 DefineStd(Builder, "unix", Opts);
600 Builder.defineMacro("__ELF__");
601 Builder.defineMacro("__svr4__");
602 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000603 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
604 // newer, but to 500 for everything else. feature_test.h has a check to
605 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000606 // with a new version.
607 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000608 Builder.defineMacro("_XOPEN_SOURCE", "600");
609 else
610 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000611 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000612 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000613 Builder.defineMacro("_LARGEFILE_SOURCE");
614 Builder.defineMacro("_LARGEFILE64_SOURCE");
615 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000616 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000617 }
618public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000619 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000620 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000621 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000622 // FIXME: WIntType should be SignedLong
623 }
624};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000625
626// Windows target
627template<typename Target>
628class WindowsTargetInfo : public OSTargetInfo<Target> {
629protected:
Craig Topper3164f332014-03-11 03:39:26 +0000630 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
631 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000632 Builder.defineMacro("_WIN32");
633 }
634 void getVisualStudioDefines(const LangOptions &Opts,
635 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000636 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000637 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000638 Builder.defineMacro("_CPPRTTI");
639
Reid Kleckner16514352015-01-30 21:42:55 +0000640 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000641 Builder.defineMacro("_CPPUNWIND");
642 }
643
644 if (!Opts.CharIsSigned)
645 Builder.defineMacro("_CHAR_UNSIGNED");
646
647 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
648 // but it works for now.
649 if (Opts.POSIXThreads)
650 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000651
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000652 if (Opts.MSCompatibilityVersion) {
653 Builder.defineMacro("_MSC_VER",
654 Twine(Opts.MSCompatibilityVersion / 100000));
655 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000656 // FIXME We cannot encode the revision information into 32-bits
657 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000658
659 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(19))
660 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000661 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000662
663 if (Opts.MicrosoftExt) {
664 Builder.defineMacro("_MSC_EXTENSIONS");
665
666 if (Opts.CPlusPlus11) {
667 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
668 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
669 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
670 }
671 }
672
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000673 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000674 }
675
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000676public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000677 WindowsTargetInfo(const llvm::Triple &Triple)
678 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000679};
680
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000681template <typename Target>
682class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000683protected:
Craig Topper3164f332014-03-11 03:39:26 +0000684 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
685 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000686 if (Opts.POSIXThreads)
687 Builder.defineMacro("_REENTRANT");
688 if (Opts.CPlusPlus)
689 Builder.defineMacro("_GNU_SOURCE");
690
691 DefineStd(Builder, "unix", Opts);
692 Builder.defineMacro("__ELF__");
693 Builder.defineMacro("__native_client__");
694 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000695
696public:
697 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000698 this->UserLabelPrefix = "";
699 this->LongAlign = 32;
700 this->LongWidth = 32;
701 this->PointerAlign = 32;
702 this->PointerWidth = 32;
703 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000704 this->Int64Type = TargetInfo::SignedLongLong;
705 this->DoubleAlign = 64;
706 this->LongDoubleWidth = 64;
707 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000708 this->LongLongWidth = 64;
709 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000710 this->SizeType = TargetInfo::UnsignedInt;
711 this->PtrDiffType = TargetInfo::SignedInt;
712 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000713 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000714 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000715 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000716 this->DescriptionString =
717 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000718 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000719 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000720 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000721 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000722 } else if (Triple.getArch() == llvm::Triple::mipsel) {
723 // Handled on mips' setDescriptionString.
724 } else {
725 assert(Triple.getArch() == llvm::Triple::le32);
726 this->DescriptionString = "e-p:32:32-i64:64";
727 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000728 }
729};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000730
Chris Lattner09d98f52008-10-05 21:50:58 +0000731//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000732// Specific target implementations.
733//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000734
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000735// PPC abstract base class
736class PPCTargetInfo : public TargetInfo {
737 static const Builtin::Info BuiltinInfo[];
738 static const char * const GCCRegNames[];
739 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000740 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000741
742 // Target cpu features.
743 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000744 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000745 bool HasP8Crypto;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000746 bool HasQPX;
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),
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000754 HasP8Crypto(false), HasQPX(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
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001029 // TODO: Finish this list and add an assert that we've handled them
1030 // all.
1031 }
1032
1033 return true;
1034}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001035
Chris Lattnerecd49032009-03-02 22:27:17 +00001036/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1037/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001038void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001039 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001040 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001041 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001042 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001043 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001044 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001045 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001046 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001047 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001048 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001049 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001050 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001051 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001052
Chris Lattnerecd49032009-03-02 22:27:17 +00001053 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001054 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1055 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001056 } else {
1057 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1058 getTriple().getOS() != llvm::Triple::OpenBSD)
1059 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001060 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001061
Ulrich Weigand8afad612014-07-28 13:17:52 +00001062 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001063 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001064 Builder.defineMacro("_CALL_ELF", "1");
1065 if (ABI == "elfv2")
1066 Builder.defineMacro("_CALL_ELF", "2");
1067
Chris Lattnerecd49032009-03-02 22:27:17 +00001068 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001069 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1070 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001071
Chris Lattnerecd49032009-03-02 22:27:17 +00001072 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001073 if (LongDoubleWidth == 128)
1074 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001075
John Thompsone467e192009-11-19 17:18:50 +00001076 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001077 Builder.defineMacro("__VEC__", "10206");
1078 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001079 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001080
1081 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001082 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1083 .Case("440", ArchDefineName)
1084 .Case("450", ArchDefineName | ArchDefine440)
1085 .Case("601", ArchDefineName)
1086 .Case("602", ArchDefineName | ArchDefinePpcgr)
1087 .Case("603", ArchDefineName | ArchDefinePpcgr)
1088 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1089 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1090 .Case("604", ArchDefineName | ArchDefinePpcgr)
1091 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1092 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001093 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001094 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1095 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1096 .Case("750", ArchDefineName | ArchDefinePpcgr)
1097 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1098 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001099 .Case("a2", ArchDefineA2)
1100 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001101 .Case("pwr3", ArchDefinePpcgr)
1102 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1103 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1104 | ArchDefinePpcsq)
1105 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1106 | ArchDefinePpcgr | ArchDefinePpcsq)
1107 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1108 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1109 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1110 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1111 | ArchDefinePpcsq)
1112 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1113 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001114 | ArchDefinePpcgr | ArchDefinePpcsq)
1115 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1116 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1117 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001118 .Case("power3", ArchDefinePpcgr)
1119 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1120 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1121 | ArchDefinePpcsq)
1122 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1123 | ArchDefinePpcgr | ArchDefinePpcsq)
1124 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1125 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1126 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1127 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1128 | ArchDefinePpcsq)
1129 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1130 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001131 | ArchDefinePpcgr | ArchDefinePpcsq)
1132 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1133 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1134 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001135 .Default(ArchDefineNone);
1136
1137 if (defs & ArchDefineName)
1138 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1139 if (defs & ArchDefinePpcgr)
1140 Builder.defineMacro("_ARCH_PPCGR");
1141 if (defs & ArchDefinePpcsq)
1142 Builder.defineMacro("_ARCH_PPCSQ");
1143 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001144 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001145 if (defs & ArchDefine603)
1146 Builder.defineMacro("_ARCH_603");
1147 if (defs & ArchDefine604)
1148 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001149 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001150 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001151 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001152 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001153 if (defs & ArchDefinePwr5x)
1154 Builder.defineMacro("_ARCH_PWR5X");
1155 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001156 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001157 if (defs & ArchDefinePwr6x)
1158 Builder.defineMacro("_ARCH_PWR6X");
1159 if (defs & ArchDefinePwr7)
1160 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001161 if (defs & ArchDefinePwr8)
1162 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001163 if (defs & ArchDefineA2)
1164 Builder.defineMacro("_ARCH_A2");
1165 if (defs & ArchDefineA2q) {
1166 Builder.defineMacro("_ARCH_A2Q");
1167 Builder.defineMacro("_ARCH_QP");
1168 }
1169
1170 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1171 Builder.defineMacro("__bg__");
1172 Builder.defineMacro("__THW_BLUEGENE__");
1173 Builder.defineMacro("__bgq__");
1174 Builder.defineMacro("__TOS_BGQ__");
1175 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001176
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001177 if (HasVSX)
1178 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001179 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001180 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001181 if (HasP8Crypto)
1182 Builder.defineMacro("__CRYPTO__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001183
Bill Schmidt38378a02013-02-01 20:23:10 +00001184 // FIXME: The following are not yet generated here by Clang, but are
1185 // generated by GCC:
1186 //
1187 // _SOFT_FLOAT_
1188 // __RECIP_PRECISION__
1189 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001190 // __RECIP__
1191 // __RECIPF__
1192 // __RSQRTE__
1193 // __RSQRTEF__
1194 // _SOFT_DOUBLE_
1195 // __NO_LWSYNC__
1196 // __HAVE_BSWAP__
1197 // __LONGDOUBLE128
1198 // __CMODEL_MEDIUM__
1199 // __CMODEL_LARGE__
1200 // _CALL_SYSV
1201 // _CALL_DARWIN
1202 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001203}
1204
1205void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1206 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1207 .Case("7400", true)
1208 .Case("g4", true)
1209 .Case("7450", true)
1210 .Case("g4+", true)
1211 .Case("970", true)
1212 .Case("g5", true)
1213 .Case("pwr6", true)
1214 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001215 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001216 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001217 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001218 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001219
1220 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001221 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1222 .Case("ppc64le", true)
1223 .Case("pwr8", true)
1224 .Default(false);
1225 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1226 .Case("ppc64le", true)
1227 .Case("pwr8", true)
1228 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001229}
1230
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001231bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001232 return llvm::StringSwitch<bool>(Feature)
1233 .Case("powerpc", true)
1234 .Case("vsx", HasVSX)
1235 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001236 .Case("crypto", HasP8Crypto)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001237 .Case("qpx", HasQPX)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001238 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001239}
Chris Lattner17df24e2008-04-21 18:56:49 +00001240
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001241const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001242 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1243 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1244 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1245 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1246 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1247 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1248 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1249 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001250 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001251 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001252 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001253 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1254 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1255 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1256 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001257 "vrsave", "vscr",
1258 "spe_acc", "spefscr",
1259 "sfp"
1260};
Chris Lattner10a5b382007-01-29 05:24:35 +00001261
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001262void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001263 unsigned &NumNames) const {
1264 Names = GCCRegNames;
1265 NumNames = llvm::array_lengthof(GCCRegNames);
1266}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001267
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001268const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1269 // While some of these aliases do map to different registers
1270 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001271 { { "0" }, "r0" },
1272 { { "1"}, "r1" },
1273 { { "2" }, "r2" },
1274 { { "3" }, "r3" },
1275 { { "4" }, "r4" },
1276 { { "5" }, "r5" },
1277 { { "6" }, "r6" },
1278 { { "7" }, "r7" },
1279 { { "8" }, "r8" },
1280 { { "9" }, "r9" },
1281 { { "10" }, "r10" },
1282 { { "11" }, "r11" },
1283 { { "12" }, "r12" },
1284 { { "13" }, "r13" },
1285 { { "14" }, "r14" },
1286 { { "15" }, "r15" },
1287 { { "16" }, "r16" },
1288 { { "17" }, "r17" },
1289 { { "18" }, "r18" },
1290 { { "19" }, "r19" },
1291 { { "20" }, "r20" },
1292 { { "21" }, "r21" },
1293 { { "22" }, "r22" },
1294 { { "23" }, "r23" },
1295 { { "24" }, "r24" },
1296 { { "25" }, "r25" },
1297 { { "26" }, "r26" },
1298 { { "27" }, "r27" },
1299 { { "28" }, "r28" },
1300 { { "29" }, "r29" },
1301 { { "30" }, "r30" },
1302 { { "31" }, "r31" },
1303 { { "fr0" }, "f0" },
1304 { { "fr1" }, "f1" },
1305 { { "fr2" }, "f2" },
1306 { { "fr3" }, "f3" },
1307 { { "fr4" }, "f4" },
1308 { { "fr5" }, "f5" },
1309 { { "fr6" }, "f6" },
1310 { { "fr7" }, "f7" },
1311 { { "fr8" }, "f8" },
1312 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001313 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001314 { { "fr11" }, "f11" },
1315 { { "fr12" }, "f12" },
1316 { { "fr13" }, "f13" },
1317 { { "fr14" }, "f14" },
1318 { { "fr15" }, "f15" },
1319 { { "fr16" }, "f16" },
1320 { { "fr17" }, "f17" },
1321 { { "fr18" }, "f18" },
1322 { { "fr19" }, "f19" },
1323 { { "fr20" }, "f20" },
1324 { { "fr21" }, "f21" },
1325 { { "fr22" }, "f22" },
1326 { { "fr23" }, "f23" },
1327 { { "fr24" }, "f24" },
1328 { { "fr25" }, "f25" },
1329 { { "fr26" }, "f26" },
1330 { { "fr27" }, "f27" },
1331 { { "fr28" }, "f28" },
1332 { { "fr29" }, "f29" },
1333 { { "fr30" }, "f30" },
1334 { { "fr31" }, "f31" },
1335 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001336};
1337
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001338void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001339 unsigned &NumAliases) const {
1340 Aliases = GCCRegAliases;
1341 NumAliases = llvm::array_lengthof(GCCRegAliases);
1342}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001343
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001344class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001345public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001346 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001347 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001348
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001349 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001350 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001351 case llvm::Triple::FreeBSD:
1352 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001353 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001354 PtrDiffType = SignedInt;
1355 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001356 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001357 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001358 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001359 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001360
Roman Divacky3ffe7462012-03-13 19:20:17 +00001361 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1362 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001363 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001364 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001365
1366 // PPC32 supports atomics up to 4 bytes.
1367 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001368 }
1369
Craig Topper3164f332014-03-11 03:39:26 +00001370 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001371 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001372 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001373 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001374};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001375
Bill Schmidt778d3872013-07-26 01:36:11 +00001376// Note: ABI differences may eventually require us to have a separate
1377// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001378class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001379public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001380 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001381 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001382 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001383 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001384
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001385 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1386 DescriptionString = "e-m:e-i64:64-n32:64";
1387 ABI = "elfv2";
1388 } else {
1389 DescriptionString = "E-m:e-i64:64-n32:64";
1390 ABI = "elfv1";
1391 }
1392
1393 switch (getTriple().getOS()) {
1394 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001395 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001396 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001397 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001398 case llvm::Triple::NetBSD:
1399 IntMaxType = SignedLongLong;
1400 Int64Type = SignedLongLong;
1401 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001402 default:
1403 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001404 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001405
1406 // PPC64 supports atomics up to 8 bytes.
1407 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001408 }
Craig Topper3164f332014-03-11 03:39:26 +00001409 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001410 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001411 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001412 // PPC64 Linux-specifc ABI options.
1413 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001414 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001415 ABI = Name;
1416 return true;
1417 }
1418 return false;
1419 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001420};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001421
Roman Divacky965b0b72011-01-06 08:27:10 +00001422class DarwinPPC32TargetInfo :
1423 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001424public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001425 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1426 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001427 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001428 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001429 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001430 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001431 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001432 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001433 }
Craig Topper3164f332014-03-11 03:39:26 +00001434 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001435 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001436 }
1437};
1438
1439class DarwinPPC64TargetInfo :
1440 public DarwinTargetInfo<PPC64TargetInfo> {
1441public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001442 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1443 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001444 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001445 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001446 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001447 }
1448};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001449
Peter Collingbournec947aae2012-05-20 23:28:41 +00001450 static const unsigned NVPTXAddrSpaceMap[] = {
1451 1, // opencl_global
1452 3, // opencl_local
1453 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001454 // FIXME: generic has to be added to the target
1455 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001456 1, // cuda_device
1457 4, // cuda_constant
1458 3, // cuda_shared
1459 };
1460 class NVPTXTargetInfo : public TargetInfo {
1461 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001462 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001463
1464 // The GPU profiles supported by the NVPTX backend
1465 enum GPUKind {
1466 GK_NONE,
1467 GK_SM20,
1468 GK_SM21,
1469 GK_SM30,
1470 GK_SM35,
1471 } GPU;
1472
Peter Collingbournec947aae2012-05-20 23:28:41 +00001473 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001474 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001475 BigEndian = false;
1476 TLSSupported = false;
1477 LongWidth = LongAlign = 64;
1478 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001479 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001480 // Define available target features
1481 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001482 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001483 // Set the default GPU to sm20
1484 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001485 }
Craig Topper3164f332014-03-11 03:39:26 +00001486 void getTargetDefines(const LangOptions &Opts,
1487 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001488 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001489 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001490 if (Opts.CUDAIsDevice) {
1491 // Set __CUDA_ARCH__ for the GPU specified.
1492 std::string CUDAArchCode;
1493 switch (GPU) {
1494 case GK_SM20:
1495 CUDAArchCode = "200";
1496 break;
1497 case GK_SM21:
1498 CUDAArchCode = "210";
1499 break;
1500 case GK_SM30:
1501 CUDAArchCode = "300";
1502 break;
1503 case GK_SM35:
1504 CUDAArchCode = "350";
1505 break;
1506 default:
1507 llvm_unreachable("Unhandled target CPU");
1508 }
1509 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1510 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001511 }
Craig Topper3164f332014-03-11 03:39:26 +00001512 void getTargetBuiltins(const Builtin::Info *&Records,
1513 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001514 Records = BuiltinInfo;
1515 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001516 }
Craig Topper3164f332014-03-11 03:39:26 +00001517 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001518 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001519 }
Craig Topper3164f332014-03-11 03:39:26 +00001520
1521 void getGCCRegNames(const char * const *&Names,
1522 unsigned &NumNames) const override;
1523 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1524 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001525 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001526 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001527 NumAliases = 0;
1528 }
Eric Christopher917e9522014-11-18 22:36:15 +00001529 bool
1530 validateAsmConstraint(const char *&Name,
1531 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001532 switch (*Name) {
1533 default: return false;
1534 case 'c':
1535 case 'h':
1536 case 'r':
1537 case 'l':
1538 case 'f':
1539 case 'd':
1540 Info.setAllowsRegister();
1541 return true;
1542 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001543 }
Craig Topper3164f332014-03-11 03:39:26 +00001544 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001545 // FIXME: Is this really right?
1546 return "";
1547 }
Craig Topper3164f332014-03-11 03:39:26 +00001548 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001549 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001550 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001551 }
Craig Topper3164f332014-03-11 03:39:26 +00001552 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001553 GPU = llvm::StringSwitch<GPUKind>(Name)
1554 .Case("sm_20", GK_SM20)
1555 .Case("sm_21", GK_SM21)
1556 .Case("sm_30", GK_SM30)
1557 .Case("sm_35", GK_SM35)
1558 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001559
Reid Klecknerbbc01782014-12-03 21:53:36 +00001560 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001561 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001562 };
1563
1564 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1565#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1566#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1567 ALL_LANGUAGES },
1568#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001569 };
1570
1571 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1572 "r0"
1573 };
1574
1575 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1576 unsigned &NumNames) const {
1577 Names = GCCRegNames;
1578 NumNames = llvm::array_lengthof(GCCRegNames);
1579 }
1580
1581 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1582 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001583 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001584 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001585 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1586 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001587 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001588 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001589 };
1590
1591 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1592 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001593 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001594 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001595 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1596 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001597 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001598 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001599 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001600
1601static const unsigned R600AddrSpaceMap[] = {
1602 1, // opencl_global
1603 3, // opencl_local
1604 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001605 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001606 1, // cuda_device
1607 2, // cuda_constant
1608 3 // cuda_shared
1609};
1610
Tom Stellarda96344b2014-08-21 13:58:40 +00001611// If you edit the description strings, make sure you update
1612// getPointerWidthV().
1613
Tom Stellardc74b1e02013-03-04 17:40:53 +00001614static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001615 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1616 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001617
1618static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001619 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1620 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001621
1622static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001623 "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 +00001624 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1625 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001626
Eli Friedmand13b41e2012-10-12 23:32:00 +00001627class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001628 static const Builtin::Info BuiltinInfo[];
1629
Tom Stellardc74b1e02013-03-04 17:40:53 +00001630 /// \brief The GPU profiles supported by the R600 target.
1631 enum GPUKind {
1632 GK_NONE,
1633 GK_R600,
1634 GK_R600_DOUBLE_OPS,
1635 GK_R700,
1636 GK_R700_DOUBLE_OPS,
1637 GK_EVERGREEN,
1638 GK_EVERGREEN_DOUBLE_OPS,
1639 GK_NORTHERN_ISLANDS,
1640 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001641 GK_SOUTHERN_ISLANDS,
1642 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001643 } GPU;
1644
Eli Friedmand13b41e2012-10-12 23:32:00 +00001645public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001646 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001647 : TargetInfo(Triple) {
1648
1649 if (Triple.getArch() == llvm::Triple::amdgcn) {
1650 DescriptionString = DescriptionStringSI;
1651 GPU = GK_SOUTHERN_ISLANDS;
1652 } else {
1653 DescriptionString = DescriptionStringR600;
1654 GPU = GK_R600;
1655 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001656 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001657 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001658 }
1659
Tom Stellarda96344b2014-08-21 13:58:40 +00001660 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1661 if (GPU <= GK_CAYMAN)
1662 return 32;
1663
1664 switch(AddrSpace) {
1665 default:
1666 return 64;
1667 case 0:
1668 case 3:
1669 case 5:
1670 return 32;
1671 }
1672 }
1673
Craig Topper3164f332014-03-11 03:39:26 +00001674 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001675 return "";
1676 }
1677
Craig Topper3164f332014-03-11 03:39:26 +00001678 void getGCCRegNames(const char * const *&Names,
1679 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001680 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001681 numNames = 0;
1682 }
1683
Craig Topper3164f332014-03-11 03:39:26 +00001684 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1685 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001686 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001687 NumAliases = 0;
1688 }
1689
Craig Topper3164f332014-03-11 03:39:26 +00001690 bool validateAsmConstraint(const char *&Name,
1691 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001692 return true;
1693 }
1694
Craig Topper3164f332014-03-11 03:39:26 +00001695 void getTargetBuiltins(const Builtin::Info *&Records,
1696 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001697 Records = BuiltinInfo;
1698 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001699 }
1700
Craig Topper3164f332014-03-11 03:39:26 +00001701 void getTargetDefines(const LangOptions &Opts,
1702 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001703 Builder.defineMacro("__R600__");
Tom Stellardfded50f2015-02-27 15:10:19 +00001704 if (GPU >= GK_SOUTHERN_ISLANDS && Opts.OpenCL)
1705 Builder.defineMacro("cl_khr_fp64");
Eli Friedmand13b41e2012-10-12 23:32:00 +00001706 }
1707
Craig Topper3164f332014-03-11 03:39:26 +00001708 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001709 return TargetInfo::CharPtrBuiltinVaList;
1710 }
1711
Craig Topper3164f332014-03-11 03:39:26 +00001712 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001713 GPU = llvm::StringSwitch<GPUKind>(Name)
1714 .Case("r600" , GK_R600)
1715 .Case("rv610", GK_R600)
1716 .Case("rv620", GK_R600)
1717 .Case("rv630", GK_R600)
1718 .Case("rv635", GK_R600)
1719 .Case("rs780", GK_R600)
1720 .Case("rs880", GK_R600)
1721 .Case("rv670", GK_R600_DOUBLE_OPS)
1722 .Case("rv710", GK_R700)
1723 .Case("rv730", GK_R700)
1724 .Case("rv740", GK_R700_DOUBLE_OPS)
1725 .Case("rv770", GK_R700_DOUBLE_OPS)
1726 .Case("palm", GK_EVERGREEN)
1727 .Case("cedar", GK_EVERGREEN)
1728 .Case("sumo", GK_EVERGREEN)
1729 .Case("sumo2", GK_EVERGREEN)
1730 .Case("redwood", GK_EVERGREEN)
1731 .Case("juniper", GK_EVERGREEN)
1732 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1733 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1734 .Case("barts", GK_NORTHERN_ISLANDS)
1735 .Case("turks", GK_NORTHERN_ISLANDS)
1736 .Case("caicos", GK_NORTHERN_ISLANDS)
1737 .Case("cayman", GK_CAYMAN)
1738 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001739 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001740 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1741 .Case("verde", GK_SOUTHERN_ISLANDS)
1742 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001743 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001744 .Case("bonaire", GK_SEA_ISLANDS)
1745 .Case("kabini", GK_SEA_ISLANDS)
1746 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001747 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001748 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001749 .Default(GK_NONE);
1750
1751 if (GPU == GK_NONE) {
1752 return false;
1753 }
1754
1755 // Set the correct data layout
1756 switch (GPU) {
1757 case GK_NONE:
1758 case GK_R600:
1759 case GK_R700:
1760 case GK_EVERGREEN:
1761 case GK_NORTHERN_ISLANDS:
1762 DescriptionString = DescriptionStringR600;
1763 break;
1764 case GK_R600_DOUBLE_OPS:
1765 case GK_R700_DOUBLE_OPS:
1766 case GK_EVERGREEN_DOUBLE_OPS:
1767 case GK_CAYMAN:
1768 DescriptionString = DescriptionStringR600DoubleOps;
1769 break;
1770 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001771 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001772 DescriptionString = DescriptionStringSI;
1773 break;
1774 }
1775
1776 return true;
1777 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001778};
1779
Matt Arsenault56f008d2014-06-24 20:45:01 +00001780const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1781#define BUILTIN(ID, TYPE, ATTRS) \
1782 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1783#include "clang/Basic/BuiltinsR600.def"
1784};
1785
Eli Friedman3fd920a2008-08-20 02:34:37 +00001786// Namespace for x86 abstract base class
1787const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001788#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001789#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001790 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001791#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001792};
Eli Friedmanb5366062008-05-20 14:21:01 +00001793
Nuno Lopescfca1f02009-12-23 17:49:57 +00001794static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001795 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1796 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001797 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001798 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1799 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1800 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001801 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001802 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1803 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001804};
1805
Eric Christophercdd36352011-06-21 00:05:20 +00001806const TargetInfo::AddlRegName AddlRegNames[] = {
1807 { { "al", "ah", "eax", "rax" }, 0 },
1808 { { "bl", "bh", "ebx", "rbx" }, 3 },
1809 { { "cl", "ch", "ecx", "rcx" }, 2 },
1810 { { "dl", "dh", "edx", "rdx" }, 1 },
1811 { { "esi", "rsi" }, 4 },
1812 { { "edi", "rdi" }, 5 },
1813 { { "esp", "rsp" }, 7 },
1814 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001815};
1816
1817// X86 target abstract base class; x86-32 and x86-64 are very close, so
1818// most of the implementation can be shared.
1819class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001820 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001821 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001822 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001823 enum MMX3DNowEnum {
1824 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1825 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001826 enum XOPEnum {
1827 NoXOP,
1828 SSE4A,
1829 FMA4,
1830 XOP
1831 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001832
Eric Christophere1ddaf92010-04-02 23:50:19 +00001833 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001834 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001835 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001836 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001837 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001838 bool HasBMI;
1839 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001840 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001841 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001842 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001843 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001844 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001845 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001846 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001847 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001848 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1849 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001850 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001851 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001852
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001853 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1854 ///
1855 /// Each enumeration represents a particular CPU supported by Clang. These
1856 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1857 enum CPUKind {
1858 CK_Generic,
1859
1860 /// \name i386
1861 /// i386-generation processors.
1862 //@{
1863 CK_i386,
1864 //@}
1865
1866 /// \name i486
1867 /// i486-generation processors.
1868 //@{
1869 CK_i486,
1870 CK_WinChipC6,
1871 CK_WinChip2,
1872 CK_C3,
1873 //@}
1874
1875 /// \name i586
1876 /// i586-generation processors, P5 microarchitecture based.
1877 //@{
1878 CK_i586,
1879 CK_Pentium,
1880 CK_PentiumMMX,
1881 //@}
1882
1883 /// \name i686
1884 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1885 //@{
1886 CK_i686,
1887 CK_PentiumPro,
1888 CK_Pentium2,
1889 CK_Pentium3,
1890 CK_Pentium3M,
1891 CK_PentiumM,
1892 CK_C3_2,
1893
1894 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1895 /// Clang however has some logic to suport this.
1896 // FIXME: Warn, deprecate, and potentially remove this.
1897 CK_Yonah,
1898 //@}
1899
1900 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001901 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001902 //@{
1903 CK_Pentium4,
1904 CK_Pentium4M,
1905 CK_Prescott,
1906 CK_Nocona,
1907 //@}
1908
1909 /// \name Core
1910 /// Core microarchitecture based processors.
1911 //@{
1912 CK_Core2,
1913
1914 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1915 /// codename which GCC no longer accepts as an option to -march, but Clang
1916 /// has some logic for recognizing it.
1917 // FIXME: Warn, deprecate, and potentially remove this.
1918 CK_Penryn,
1919 //@}
1920
1921 /// \name Atom
1922 /// Atom processors
1923 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001924 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001925 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001926 //@}
1927
1928 /// \name Nehalem
1929 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001930 CK_Nehalem,
1931
1932 /// \name Westmere
1933 /// Westmere microarchitecture based processors.
1934 CK_Westmere,
1935
1936 /// \name Sandy Bridge
1937 /// Sandy Bridge microarchitecture based processors.
1938 CK_SandyBridge,
1939
1940 /// \name Ivy Bridge
1941 /// Ivy Bridge microarchitecture based processors.
1942 CK_IvyBridge,
1943
1944 /// \name Haswell
1945 /// Haswell microarchitecture based processors.
1946 CK_Haswell,
1947
1948 /// \name Broadwell
1949 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001950 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001951
1952 /// \name Skylake
1953 /// Skylake microarchitecture based processors.
1954 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001955
Craig Topper449314e2013-08-20 07:09:39 +00001956 /// \name Knights Landing
1957 /// Knights Landing processor.
1958 CK_KNL,
1959
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001960 /// \name K6
1961 /// K6 architecture processors.
1962 //@{
1963 CK_K6,
1964 CK_K6_2,
1965 CK_K6_3,
1966 //@}
1967
1968 /// \name K7
1969 /// K7 architecture processors.
1970 //@{
1971 CK_Athlon,
1972 CK_AthlonThunderbird,
1973 CK_Athlon4,
1974 CK_AthlonXP,
1975 CK_AthlonMP,
1976 //@}
1977
1978 /// \name K8
1979 /// K8 architecture processors.
1980 //@{
1981 CK_Athlon64,
1982 CK_Athlon64SSE3,
1983 CK_AthlonFX,
1984 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001985 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001986 CK_Opteron,
1987 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001988 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001989 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001990
Benjamin Kramer569f2152012-01-10 11:50:18 +00001991 /// \name Bobcat
1992 /// Bobcat architecture processors.
1993 //@{
1994 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001995 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001996 //@}
1997
1998 /// \name Bulldozer
1999 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002000 //@{
2001 CK_BDVER1,
2002 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002003 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002004 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002005 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002006
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002007 /// This specification is deprecated and will be removed in the future.
2008 /// Users should prefer \see CK_K8.
2009 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002010 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002011 CK_x86_64,
2012 //@}
2013
2014 /// \name Geode
2015 /// Geode processors.
2016 //@{
2017 CK_Geode
2018 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002019 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002020
Rafael Espindolaeb265472013-08-21 21:59:03 +00002021 enum FPMathKind {
2022 FP_Default,
2023 FP_SSE,
2024 FP_387
2025 } FPMath;
2026
Eli Friedman3fd920a2008-08-20 02:34:37 +00002027public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002028 X86TargetInfo(const llvm::Triple &Triple)
2029 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002030 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002031 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2032 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2033 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2034 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2035 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2036 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002037 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002038 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002039 }
Craig Topper3164f332014-03-11 03:39:26 +00002040 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002041 // X87 evaluates with 80 bits "long double" precision.
2042 return SSELevel == NoSSE ? 2 : 0;
2043 }
Craig Topper3164f332014-03-11 03:39:26 +00002044 void getTargetBuiltins(const Builtin::Info *&Records,
2045 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002046 Records = BuiltinInfo;
2047 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002048 }
Craig Topper3164f332014-03-11 03:39:26 +00002049 void getGCCRegNames(const char * const *&Names,
2050 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002051 Names = GCCRegNames;
2052 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002053 }
Craig Topper3164f332014-03-11 03:39:26 +00002054 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2055 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002056 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002057 NumAliases = 0;
2058 }
Craig Topper3164f332014-03-11 03:39:26 +00002059 void getGCCAddlRegNames(const AddlRegName *&Names,
2060 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002061 Names = AddlRegNames;
2062 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002063 }
Craig Topper3164f332014-03-11 03:39:26 +00002064 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002065 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002066
Akira Hatanaka974131e2014-09-18 18:17:18 +00002067 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2068
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002069 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2070
Akira Hatanaka974131e2014-09-18 18:17:18 +00002071 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2072
Craig Topper3164f332014-03-11 03:39:26 +00002073 std::string convertConstraint(const char *&Constraint) const override;
2074 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002075 return "~{dirflag},~{fpsr},~{flags}";
2076 }
Craig Topper3164f332014-03-11 03:39:26 +00002077 void getTargetDefines(const LangOptions &Opts,
2078 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002079 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2080 bool Enabled);
2081 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2082 bool Enabled);
2083 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2084 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002085 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2086 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002087 setFeatureEnabledImpl(Features, Name, Enabled);
2088 }
2089 // This exists purely to cut down on the number of virtual calls in
2090 // getDefaultFeatures which calls this repeatedly.
2091 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2092 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002093 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2094 bool hasFeature(StringRef Feature) const override;
2095 bool handleTargetFeatures(std::vector<std::string> &Features,
2096 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002097 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002098 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002099 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002100 else if (getTriple().getArch() == llvm::Triple::x86 &&
2101 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002102 return "no-mmx";
2103 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002104 }
Craig Topper3164f332014-03-11 03:39:26 +00002105 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002106 CPU = llvm::StringSwitch<CPUKind>(Name)
2107 .Case("i386", CK_i386)
2108 .Case("i486", CK_i486)
2109 .Case("winchip-c6", CK_WinChipC6)
2110 .Case("winchip2", CK_WinChip2)
2111 .Case("c3", CK_C3)
2112 .Case("i586", CK_i586)
2113 .Case("pentium", CK_Pentium)
2114 .Case("pentium-mmx", CK_PentiumMMX)
2115 .Case("i686", CK_i686)
2116 .Case("pentiumpro", CK_PentiumPro)
2117 .Case("pentium2", CK_Pentium2)
2118 .Case("pentium3", CK_Pentium3)
2119 .Case("pentium3m", CK_Pentium3M)
2120 .Case("pentium-m", CK_PentiumM)
2121 .Case("c3-2", CK_C3_2)
2122 .Case("yonah", CK_Yonah)
2123 .Case("pentium4", CK_Pentium4)
2124 .Case("pentium4m", CK_Pentium4M)
2125 .Case("prescott", CK_Prescott)
2126 .Case("nocona", CK_Nocona)
2127 .Case("core2", CK_Core2)
2128 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002129 .Case("bonnell", CK_Bonnell)
2130 .Case("atom", CK_Bonnell) // Legacy name.
2131 .Case("silvermont", CK_Silvermont)
2132 .Case("slm", CK_Silvermont) // Legacy name.
2133 .Case("nehalem", CK_Nehalem)
2134 .Case("corei7", CK_Nehalem) // Legacy name.
2135 .Case("westmere", CK_Westmere)
2136 .Case("sandybridge", CK_SandyBridge)
2137 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2138 .Case("ivybridge", CK_IvyBridge)
2139 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2140 .Case("haswell", CK_Haswell)
2141 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002142 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002143 .Case("skylake", CK_Skylake)
2144 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002145 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002146 .Case("k6", CK_K6)
2147 .Case("k6-2", CK_K6_2)
2148 .Case("k6-3", CK_K6_3)
2149 .Case("athlon", CK_Athlon)
2150 .Case("athlon-tbird", CK_AthlonThunderbird)
2151 .Case("athlon-4", CK_Athlon4)
2152 .Case("athlon-xp", CK_AthlonXP)
2153 .Case("athlon-mp", CK_AthlonMP)
2154 .Case("athlon64", CK_Athlon64)
2155 .Case("athlon64-sse3", CK_Athlon64SSE3)
2156 .Case("athlon-fx", CK_AthlonFX)
2157 .Case("k8", CK_K8)
2158 .Case("k8-sse3", CK_K8SSE3)
2159 .Case("opteron", CK_Opteron)
2160 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002161 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002162 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002163 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002164 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002165 .Case("bdver1", CK_BDVER1)
2166 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002167 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002168 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002169 .Case("x86-64", CK_x86_64)
2170 .Case("geode", CK_Geode)
2171 .Default(CK_Generic);
2172
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002173 // Perform any per-CPU checks necessary to determine if this CPU is
2174 // acceptable.
2175 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2176 // invalid without explaining *why*.
2177 switch (CPU) {
2178 case CK_Generic:
2179 // No processor selected!
2180 return false;
2181
2182 case CK_i386:
2183 case CK_i486:
2184 case CK_WinChipC6:
2185 case CK_WinChip2:
2186 case CK_C3:
2187 case CK_i586:
2188 case CK_Pentium:
2189 case CK_PentiumMMX:
2190 case CK_i686:
2191 case CK_PentiumPro:
2192 case CK_Pentium2:
2193 case CK_Pentium3:
2194 case CK_Pentium3M:
2195 case CK_PentiumM:
2196 case CK_Yonah:
2197 case CK_C3_2:
2198 case CK_Pentium4:
2199 case CK_Pentium4M:
2200 case CK_Prescott:
2201 case CK_K6:
2202 case CK_K6_2:
2203 case CK_K6_3:
2204 case CK_Athlon:
2205 case CK_AthlonThunderbird:
2206 case CK_Athlon4:
2207 case CK_AthlonXP:
2208 case CK_AthlonMP:
2209 case CK_Geode:
2210 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002211 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002212 return false;
2213
2214 // Fallthrough
2215 case CK_Nocona:
2216 case CK_Core2:
2217 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002218 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002219 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002220 case CK_Nehalem:
2221 case CK_Westmere:
2222 case CK_SandyBridge:
2223 case CK_IvyBridge:
2224 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002225 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002226 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002227 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002228 case CK_Athlon64:
2229 case CK_Athlon64SSE3:
2230 case CK_AthlonFX:
2231 case CK_K8:
2232 case CK_K8SSE3:
2233 case CK_Opteron:
2234 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002235 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002236 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002237 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002238 case CK_BDVER1:
2239 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002240 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002241 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002242 case CK_x86_64:
2243 return true;
2244 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002245 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002246 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002247
Craig Topper3164f332014-03-11 03:39:26 +00002248 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002249
Craig Topper3164f332014-03-11 03:39:26 +00002250 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002251 // We accept all non-ARM calling conventions
2252 return (CC == CC_X86ThisCall ||
2253 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002254 CC == CC_X86StdCall ||
2255 CC == CC_X86VectorCall ||
2256 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002257 CC == CC_X86Pascal ||
2258 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002259 }
2260
Craig Topper3164f332014-03-11 03:39:26 +00002261 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002262 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002263 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002264
2265 bool hasSjLjLowering() const override {
2266 return true;
2267 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002268};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002269
Rafael Espindolaeb265472013-08-21 21:59:03 +00002270bool X86TargetInfo::setFPMath(StringRef Name) {
2271 if (Name == "387") {
2272 FPMath = FP_387;
2273 return true;
2274 }
2275 if (Name == "sse") {
2276 FPMath = FP_SSE;
2277 return true;
2278 }
2279 return false;
2280}
2281
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002282void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002283 // FIXME: This *really* should not be here.
2284
2285 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002286 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002287 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002288
Chandler Carruth212334f2011-09-28 08:55:37 +00002289 switch (CPU) {
2290 case CK_Generic:
2291 case CK_i386:
2292 case CK_i486:
2293 case CK_i586:
2294 case CK_Pentium:
2295 case CK_i686:
2296 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002297 break;
2298 case CK_PentiumMMX:
2299 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002300 case CK_K6:
2301 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002302 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002303 break;
2304 case CK_Pentium3:
2305 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002306 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002307 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002308 break;
2309 case CK_PentiumM:
2310 case CK_Pentium4:
2311 case CK_Pentium4M:
2312 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002313 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002314 break;
2315 case CK_Yonah:
2316 case CK_Prescott:
2317 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002318 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002319 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002320 break;
2321 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002322 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002323 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002324 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002325 break;
2326 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002327 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002328 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002329 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002330 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002331 setFeatureEnabledImpl(Features, "avx512f", true);
2332 setFeatureEnabledImpl(Features, "avx512cd", true);
2333 setFeatureEnabledImpl(Features, "avx512dq", true);
2334 setFeatureEnabledImpl(Features, "avx512bw", true);
2335 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002336 // FALLTHROUGH
2337 case CK_Broadwell:
2338 setFeatureEnabledImpl(Features, "rdseed", true);
2339 setFeatureEnabledImpl(Features, "adx", true);
2340 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002341 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002342 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002343 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002344 setFeatureEnabledImpl(Features, "bmi", true);
2345 setFeatureEnabledImpl(Features, "bmi2", true);
2346 setFeatureEnabledImpl(Features, "rtm", true);
2347 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002348 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002349 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002350 setFeatureEnabledImpl(Features, "rdrnd", true);
2351 setFeatureEnabledImpl(Features, "f16c", true);
2352 setFeatureEnabledImpl(Features, "fsgsbase", true);
2353 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002354 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002355 setFeatureEnabledImpl(Features, "avx", true);
2356 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002357 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002358 case CK_Silvermont:
2359 setFeatureEnabledImpl(Features, "aes", true);
2360 setFeatureEnabledImpl(Features, "pclmul", true);
2361 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002362 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002363 setFeatureEnabledImpl(Features, "sse4.2", true);
2364 setFeatureEnabledImpl(Features, "cx16", true);
2365 break;
2366 case CK_KNL:
2367 setFeatureEnabledImpl(Features, "avx512f", true);
2368 setFeatureEnabledImpl(Features, "avx512cd", true);
2369 setFeatureEnabledImpl(Features, "avx512er", true);
2370 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002371 setFeatureEnabledImpl(Features, "rdseed", true);
2372 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002373 setFeatureEnabledImpl(Features, "lzcnt", true);
2374 setFeatureEnabledImpl(Features, "bmi", true);
2375 setFeatureEnabledImpl(Features, "bmi2", true);
2376 setFeatureEnabledImpl(Features, "rtm", true);
2377 setFeatureEnabledImpl(Features, "fma", true);
2378 setFeatureEnabledImpl(Features, "rdrnd", true);
2379 setFeatureEnabledImpl(Features, "f16c", true);
2380 setFeatureEnabledImpl(Features, "fsgsbase", true);
2381 setFeatureEnabledImpl(Features, "aes", true);
2382 setFeatureEnabledImpl(Features, "pclmul", true);
2383 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002384 break;
2385 case CK_K6_2:
2386 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002387 case CK_WinChip2:
2388 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002389 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002390 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002391 case CK_Athlon:
2392 case CK_AthlonThunderbird:
2393 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002394 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002395 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002396 case CK_Athlon4:
2397 case CK_AthlonXP:
2398 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002399 setFeatureEnabledImpl(Features, "sse", true);
2400 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002401 break;
2402 case CK_K8:
2403 case CK_Opteron:
2404 case CK_Athlon64:
2405 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002406 setFeatureEnabledImpl(Features, "sse2", true);
2407 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002408 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002409 case CK_AMDFAM10:
2410 setFeatureEnabledImpl(Features, "sse4a", true);
2411 setFeatureEnabledImpl(Features, "lzcnt", true);
2412 setFeatureEnabledImpl(Features, "popcnt", true);
2413 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002414 case CK_K8SSE3:
2415 case CK_OpteronSSE3:
2416 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002417 setFeatureEnabledImpl(Features, "sse3", true);
2418 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002419 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002420 case CK_BTVER2:
2421 setFeatureEnabledImpl(Features, "avx", true);
2422 setFeatureEnabledImpl(Features, "aes", true);
2423 setFeatureEnabledImpl(Features, "pclmul", true);
2424 setFeatureEnabledImpl(Features, "bmi", true);
2425 setFeatureEnabledImpl(Features, "f16c", true);
2426 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002427 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002428 setFeatureEnabledImpl(Features, "ssse3", true);
2429 setFeatureEnabledImpl(Features, "sse4a", true);
2430 setFeatureEnabledImpl(Features, "lzcnt", true);
2431 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002432 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002433 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002434 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002435 case CK_BDVER4:
2436 setFeatureEnabledImpl(Features, "avx2", true);
2437 setFeatureEnabledImpl(Features, "bmi2", true);
2438 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002439 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002440 setFeatureEnabledImpl(Features, "fsgsbase", true);
2441 // FALLTHROUGH
2442 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002443 setFeatureEnabledImpl(Features, "bmi", true);
2444 setFeatureEnabledImpl(Features, "fma", true);
2445 setFeatureEnabledImpl(Features, "f16c", true);
2446 setFeatureEnabledImpl(Features, "tbm", true);
2447 // FALLTHROUGH
2448 case CK_BDVER1:
2449 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002450 setFeatureEnabledImpl(Features, "xop", true);
2451 setFeatureEnabledImpl(Features, "lzcnt", true);
2452 setFeatureEnabledImpl(Features, "aes", true);
2453 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002454 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002455 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002456 break;
Eli Friedman33465822011-07-08 23:31:17 +00002457 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002458}
2459
Rafael Espindolae62e2792013-08-20 13:44:29 +00002460void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002461 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002462 if (Enabled) {
2463 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002464 case AVX512F:
2465 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002466 case AVX2:
2467 Features["avx2"] = true;
2468 case AVX:
2469 Features["avx"] = true;
2470 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002471 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002472 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002473 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002474 case SSSE3:
2475 Features["ssse3"] = true;
2476 case SSE3:
2477 Features["sse3"] = true;
2478 case SSE2:
2479 Features["sse2"] = true;
2480 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002481 Features["sse"] = true;
2482 case NoSSE:
2483 break;
2484 }
2485 return;
2486 }
2487
2488 switch (Level) {
2489 case NoSSE:
2490 case SSE1:
2491 Features["sse"] = false;
2492 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002493 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2494 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002495 case SSE3:
2496 Features["sse3"] = false;
2497 setXOPLevel(Features, NoXOP, false);
2498 case SSSE3:
2499 Features["ssse3"] = false;
2500 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002501 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002502 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002503 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002504 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002505 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002506 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002507 case AVX2:
2508 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002509 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002510 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002511 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2512 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002513 }
2514}
2515
2516void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002517 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002518 if (Enabled) {
2519 switch (Level) {
2520 case AMD3DNowAthlon:
2521 Features["3dnowa"] = true;
2522 case AMD3DNow:
2523 Features["3dnow"] = true;
2524 case MMX:
2525 Features["mmx"] = true;
2526 case NoMMX3DNow:
2527 break;
2528 }
2529 return;
2530 }
2531
2532 switch (Level) {
2533 case NoMMX3DNow:
2534 case MMX:
2535 Features["mmx"] = false;
2536 case AMD3DNow:
2537 Features["3dnow"] = false;
2538 case AMD3DNowAthlon:
2539 Features["3dnowa"] = false;
2540 }
2541}
2542
2543void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002544 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002545 if (Enabled) {
2546 switch (Level) {
2547 case XOP:
2548 Features["xop"] = true;
2549 case FMA4:
2550 Features["fma4"] = true;
2551 setSSELevel(Features, AVX, true);
2552 case SSE4A:
2553 Features["sse4a"] = true;
2554 setSSELevel(Features, SSE3, true);
2555 case NoXOP:
2556 break;
2557 }
2558 return;
2559 }
2560
2561 switch (Level) {
2562 case NoXOP:
2563 case SSE4A:
2564 Features["sse4a"] = false;
2565 case FMA4:
2566 Features["fma4"] = false;
2567 case XOP:
2568 Features["xop"] = false;
2569 }
2570}
2571
Craig Topper86d79ef2013-09-17 04:51:29 +00002572void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2573 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002574 // FIXME: This *really* should not be here. We need some way of translating
2575 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002576 if (Name == "sse4")
2577 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002578
Rafael Espindolae62e2792013-08-20 13:44:29 +00002579 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002580
Craig Topper29561122013-09-19 01:13:07 +00002581 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002582 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002583 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002584 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002585 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002586 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002587 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002588 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002589 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002590 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002591 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002592 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002593 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002594 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002595 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002596 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002597 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002598 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002599 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002600 if (Enabled)
2601 setSSELevel(Features, SSE2, Enabled);
2602 } else if (Name == "pclmul") {
2603 if (Enabled)
2604 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002605 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002606 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002607 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002608 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002609 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002610 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002611 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2612 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002613 if (Enabled)
2614 setSSELevel(Features, AVX512F, Enabled);
2615 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002616 if (Enabled)
2617 setSSELevel(Features, AVX, Enabled);
2618 } else if (Name == "fma4") {
2619 setXOPLevel(Features, FMA4, Enabled);
2620 } else if (Name == "xop") {
2621 setXOPLevel(Features, XOP, Enabled);
2622 } else if (Name == "sse4a") {
2623 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002624 } else if (Name == "f16c") {
2625 if (Enabled)
2626 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002627 } else if (Name == "sha") {
2628 if (Enabled)
2629 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002630 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002631}
2632
Eric Christopher3ff21b32013-10-16 21:26:26 +00002633/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002634/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002635bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002636 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002637 // Remember the maximum enabled sselevel.
2638 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2639 // Ignore disabled features.
2640 if (Features[i][0] == '-')
2641 continue;
2642
Benjamin Kramer27402c62012-03-05 15:10:44 +00002643 StringRef Feature = StringRef(Features[i]).substr(1);
2644
2645 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002646 HasAES = true;
2647 continue;
2648 }
2649
Craig Topper3f122a72012-05-31 05:18:48 +00002650 if (Feature == "pclmul") {
2651 HasPCLMUL = true;
2652 continue;
2653 }
2654
Benjamin Kramer27402c62012-03-05 15:10:44 +00002655 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002656 HasLZCNT = true;
2657 continue;
2658 }
2659
Rafael Espindola89049822013-08-23 20:21:37 +00002660 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002661 HasRDRND = true;
2662 continue;
2663 }
2664
Craig Topper8c7f2512014-11-03 06:51:41 +00002665 if (Feature == "fsgsbase") {
2666 HasFSGSBASE = true;
2667 continue;
2668 }
2669
Benjamin Kramer27402c62012-03-05 15:10:44 +00002670 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002671 HasBMI = true;
2672 continue;
2673 }
2674
Benjamin Kramer27402c62012-03-05 15:10:44 +00002675 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002676 HasBMI2 = true;
2677 continue;
2678 }
2679
Benjamin Kramer27402c62012-03-05 15:10:44 +00002680 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002681 HasPOPCNT = true;
2682 continue;
2683 }
2684
Michael Liao625a8752012-11-10 05:17:46 +00002685 if (Feature == "rtm") {
2686 HasRTM = true;
2687 continue;
2688 }
2689
Michael Liao74f4eaf2013-03-26 17:52:08 +00002690 if (Feature == "prfchw") {
2691 HasPRFCHW = true;
2692 continue;
2693 }
2694
Michael Liaoffaae352013-03-29 05:17:55 +00002695 if (Feature == "rdseed") {
2696 HasRDSEED = true;
2697 continue;
2698 }
2699
Robert Khasanov50e6f582014-09-19 09:53:48 +00002700 if (Feature == "adx") {
2701 HasADX = true;
2702 continue;
2703 }
2704
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002705 if (Feature == "tbm") {
2706 HasTBM = true;
2707 continue;
2708 }
2709
Craig Topperbba778b2012-06-03 21:46:30 +00002710 if (Feature == "fma") {
2711 HasFMA = true;
2712 continue;
2713 }
2714
Manman Rena45358c2012-10-11 00:59:55 +00002715 if (Feature == "f16c") {
2716 HasF16C = true;
2717 continue;
2718 }
2719
Craig Topper679b53a2013-08-21 05:29:10 +00002720 if (Feature == "avx512cd") {
2721 HasAVX512CD = true;
2722 continue;
2723 }
2724
2725 if (Feature == "avx512er") {
2726 HasAVX512ER = true;
2727 continue;
2728 }
2729
2730 if (Feature == "avx512pf") {
2731 HasAVX512PF = true;
2732 continue;
2733 }
2734
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002735 if (Feature == "avx512dq") {
2736 HasAVX512DQ = true;
2737 continue;
2738 }
2739
2740 if (Feature == "avx512bw") {
2741 HasAVX512BW = true;
2742 continue;
2743 }
2744
2745 if (Feature == "avx512vl") {
2746 HasAVX512VL = true;
2747 continue;
2748 }
2749
Ben Langmuir58078d02013-09-19 13:22:04 +00002750 if (Feature == "sha") {
2751 HasSHA = true;
2752 continue;
2753 }
2754
Nick Lewycky50e8f482013-10-05 20:14:27 +00002755 if (Feature == "cx16") {
2756 HasCX16 = true;
2757 continue;
2758 }
2759
Daniel Dunbar979586e2009-11-11 09:38:56 +00002760 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002761 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002762 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002763 .Case("avx2", AVX2)
2764 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002765 .Case("sse4.2", SSE42)
2766 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002767 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002768 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002769 .Case("sse2", SSE2)
2770 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002771 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002772 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002773
Eli Friedman33465822011-07-08 23:31:17 +00002774 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002775 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002776 .Case("3dnowa", AMD3DNowAthlon)
2777 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002778 .Case("mmx", MMX)
2779 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002780 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002781
2782 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2783 .Case("xop", XOP)
2784 .Case("fma4", FMA4)
2785 .Case("sse4a", SSE4A)
2786 .Default(NoXOP);
2787 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002788 }
Eli Friedman33465822011-07-08 23:31:17 +00002789
Craig Topper7481d8a2013-09-10 06:55:47 +00002790 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2791 // Can't do this earlier because we need to be able to explicitly enable
2792 // popcnt and still disable sse4.2.
2793 if (!HasPOPCNT && SSELevel >= SSE42 &&
2794 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2795 HasPOPCNT = true;
2796 Features.push_back("+popcnt");
2797 }
2798
Yunzhong Gao61089362013-10-16 19:07:02 +00002799 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2800 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2801 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2802 HasPRFCHW = true;
2803 Features.push_back("+prfchw");
2804 }
2805
Rafael Espindolaeb265472013-08-21 21:59:03 +00002806 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2807 // matches the selected sse level.
2808 if (FPMath == FP_SSE && SSELevel < SSE1) {
2809 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2810 return false;
2811 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2812 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2813 return false;
2814 }
2815
Eli Friedman33465822011-07-08 23:31:17 +00002816 // Don't tell the backend if we're turning off mmx; it will end up disabling
2817 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002818 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2819 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002820 std::vector<std::string>::iterator it;
2821 it = std::find(Features.begin(), Features.end(), "-mmx");
2822 if (it != Features.end())
2823 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002824 else if (SSELevel > NoSSE)
2825 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002826 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002827}
Chris Lattnerecd49032009-03-02 22:27:17 +00002828
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002829/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2830/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002831void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002832 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002833 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002834 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002835 Builder.defineMacro("__amd64__");
2836 Builder.defineMacro("__amd64");
2837 Builder.defineMacro("__x86_64");
2838 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002839 if (getTriple().getArchName() == "x86_64h") {
2840 Builder.defineMacro("__x86_64h");
2841 Builder.defineMacro("__x86_64h__");
2842 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002843 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002844 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002845 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002846
Chris Lattnerecd49032009-03-02 22:27:17 +00002847 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002848 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2849 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002850 switch (CPU) {
2851 case CK_Generic:
2852 break;
2853 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002854 // The rest are coming from the i386 define above.
2855 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002856 break;
2857 case CK_i486:
2858 case CK_WinChipC6:
2859 case CK_WinChip2:
2860 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002861 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002862 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002863 case CK_PentiumMMX:
2864 Builder.defineMacro("__pentium_mmx__");
2865 Builder.defineMacro("__tune_pentium_mmx__");
2866 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002867 case CK_i586:
2868 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002869 defineCPUMacros(Builder, "i586");
2870 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002871 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002872 case CK_Pentium3:
2873 case CK_Pentium3M:
2874 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002875 Builder.defineMacro("__tune_pentium3__");
2876 // Fallthrough
2877 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002878 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002879 Builder.defineMacro("__tune_pentium2__");
2880 // Fallthrough
2881 case CK_PentiumPro:
2882 Builder.defineMacro("__tune_i686__");
2883 Builder.defineMacro("__tune_pentiumpro__");
2884 // Fallthrough
2885 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002886 Builder.defineMacro("__i686");
2887 Builder.defineMacro("__i686__");
2888 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2889 Builder.defineMacro("__pentiumpro");
2890 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002891 break;
2892 case CK_Pentium4:
2893 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002894 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002895 break;
2896 case CK_Yonah:
2897 case CK_Prescott:
2898 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002899 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002900 break;
2901 case CK_Core2:
2902 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002903 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002904 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002905 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002906 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002907 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002908 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002909 defineCPUMacros(Builder, "slm");
2910 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002911 case CK_Nehalem:
2912 case CK_Westmere:
2913 case CK_SandyBridge:
2914 case CK_IvyBridge:
2915 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002916 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002917 // FIXME: Historically, we defined this legacy name, it would be nice to
2918 // remove it at some point. We've never exposed fine-grained names for
2919 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002920 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002921 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002922 case CK_Skylake:
2923 // FIXME: Historically, we defined this legacy name, it would be nice to
2924 // remove it at some point. This is the only fine-grained CPU macro in the
2925 // main intel CPU line, and it would be better to not have these and force
2926 // people to use ISA macros.
2927 defineCPUMacros(Builder, "skx");
2928 break;
Craig Topper449314e2013-08-20 07:09:39 +00002929 case CK_KNL:
2930 defineCPUMacros(Builder, "knl");
2931 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002932 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002933 Builder.defineMacro("__k6_2__");
2934 Builder.defineMacro("__tune_k6_2__");
2935 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002936 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002937 if (CPU != CK_K6_2) { // In case of fallthrough
2938 // FIXME: GCC may be enabling these in cases where some other k6
2939 // architecture is specified but -m3dnow is explicitly provided. The
2940 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002941 Builder.defineMacro("__k6_3__");
2942 Builder.defineMacro("__tune_k6_3__");
2943 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002944 // Fallthrough
2945 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002946 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002947 break;
2948 case CK_Athlon:
2949 case CK_AthlonThunderbird:
2950 case CK_Athlon4:
2951 case CK_AthlonXP:
2952 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002953 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002954 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002955 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002956 Builder.defineMacro("__tune_athlon_sse__");
2957 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002958 break;
2959 case CK_K8:
2960 case CK_K8SSE3:
2961 case CK_x86_64:
2962 case CK_Opteron:
2963 case CK_OpteronSSE3:
2964 case CK_Athlon64:
2965 case CK_Athlon64SSE3:
2966 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002967 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002968 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002969 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002970 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002971 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002972 case CK_BTVER1:
2973 defineCPUMacros(Builder, "btver1");
2974 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002975 case CK_BTVER2:
2976 defineCPUMacros(Builder, "btver2");
2977 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002978 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002979 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002980 break;
2981 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002982 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002983 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002984 case CK_BDVER3:
2985 defineCPUMacros(Builder, "bdver3");
2986 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002987 case CK_BDVER4:
2988 defineCPUMacros(Builder, "bdver4");
2989 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002990 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002991 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002992 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002993 }
Chris Lattner96e43572009-03-02 22:40:39 +00002994
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002995 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002996 Builder.defineMacro("__REGISTER_PREFIX__", "");
2997
Chris Lattner6df41af2009-04-19 17:32:33 +00002998 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2999 // functions in glibc header files that use FP Stack inline asm which the
3000 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003001 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003002
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003003 if (HasAES)
3004 Builder.defineMacro("__AES__");
3005
Craig Topper3f122a72012-05-31 05:18:48 +00003006 if (HasPCLMUL)
3007 Builder.defineMacro("__PCLMUL__");
3008
Craig Topper22967d42011-12-25 05:06:45 +00003009 if (HasLZCNT)
3010 Builder.defineMacro("__LZCNT__");
3011
Benjamin Kramer1e250392012-07-07 09:39:18 +00003012 if (HasRDRND)
3013 Builder.defineMacro("__RDRND__");
3014
Craig Topper8c7f2512014-11-03 06:51:41 +00003015 if (HasFSGSBASE)
3016 Builder.defineMacro("__FSGSBASE__");
3017
Craig Topper22967d42011-12-25 05:06:45 +00003018 if (HasBMI)
3019 Builder.defineMacro("__BMI__");
3020
3021 if (HasBMI2)
3022 Builder.defineMacro("__BMI2__");
3023
Craig Topper1de83482011-12-29 16:10:46 +00003024 if (HasPOPCNT)
3025 Builder.defineMacro("__POPCNT__");
3026
Michael Liao625a8752012-11-10 05:17:46 +00003027 if (HasRTM)
3028 Builder.defineMacro("__RTM__");
3029
Michael Liao74f4eaf2013-03-26 17:52:08 +00003030 if (HasPRFCHW)
3031 Builder.defineMacro("__PRFCHW__");
3032
Michael Liaoffaae352013-03-29 05:17:55 +00003033 if (HasRDSEED)
3034 Builder.defineMacro("__RDSEED__");
3035
Robert Khasanov50e6f582014-09-19 09:53:48 +00003036 if (HasADX)
3037 Builder.defineMacro("__ADX__");
3038
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003039 if (HasTBM)
3040 Builder.defineMacro("__TBM__");
3041
Rafael Espindolae62e2792013-08-20 13:44:29 +00003042 switch (XOPLevel) {
3043 case XOP:
3044 Builder.defineMacro("__XOP__");
3045 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003046 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003047 case SSE4A:
3048 Builder.defineMacro("__SSE4A__");
3049 case NoXOP:
3050 break;
3051 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003052
Craig Topperbba778b2012-06-03 21:46:30 +00003053 if (HasFMA)
3054 Builder.defineMacro("__FMA__");
3055
Manman Rena45358c2012-10-11 00:59:55 +00003056 if (HasF16C)
3057 Builder.defineMacro("__F16C__");
3058
Craig Topper679b53a2013-08-21 05:29:10 +00003059 if (HasAVX512CD)
3060 Builder.defineMacro("__AVX512CD__");
3061 if (HasAVX512ER)
3062 Builder.defineMacro("__AVX512ER__");
3063 if (HasAVX512PF)
3064 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003065 if (HasAVX512DQ)
3066 Builder.defineMacro("__AVX512DQ__");
3067 if (HasAVX512BW)
3068 Builder.defineMacro("__AVX512BW__");
3069 if (HasAVX512VL)
3070 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003071
Ben Langmuir58078d02013-09-19 13:22:04 +00003072 if (HasSHA)
3073 Builder.defineMacro("__SHA__");
3074
Nick Lewycky50e8f482013-10-05 20:14:27 +00003075 if (HasCX16)
3076 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3077
Chris Lattner96e43572009-03-02 22:40:39 +00003078 // Each case falls through to the previous one here.
3079 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003080 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003081 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003082 case AVX2:
3083 Builder.defineMacro("__AVX2__");
3084 case AVX:
3085 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003086 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003087 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003088 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003089 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003090 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003091 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003092 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003093 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003094 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003095 Builder.defineMacro("__SSE2__");
3096 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003097 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003098 Builder.defineMacro("__SSE__");
3099 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003100 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003101 break;
3102 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003103
Derek Schuffc7dd7222012-10-11 15:52:22 +00003104 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003105 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003106 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003107 case AVX2:
3108 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003109 case SSE42:
3110 case SSE41:
3111 case SSSE3:
3112 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003113 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003114 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003115 break;
3116 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003117 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003118 break;
3119 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003120 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003121 }
3122 }
3123
Anders Carlssone437c682010-01-27 03:47:49 +00003124 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003125 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003126 case AMD3DNowAthlon:
3127 Builder.defineMacro("__3dNOW_A__");
3128 case AMD3DNow:
3129 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003130 case MMX:
3131 Builder.defineMacro("__MMX__");
3132 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003133 break;
3134 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003135
3136 if (CPU >= CK_i486) {
3137 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3138 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3139 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3140 }
3141 if (CPU >= CK_i586)
3142 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003143}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003144
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003145bool X86TargetInfo::hasFeature(StringRef Feature) const {
3146 return llvm::StringSwitch<bool>(Feature)
3147 .Case("aes", HasAES)
3148 .Case("avx", SSELevel >= AVX)
3149 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003150 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003151 .Case("avx512cd", HasAVX512CD)
3152 .Case("avx512er", HasAVX512ER)
3153 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003154 .Case("avx512dq", HasAVX512DQ)
3155 .Case("avx512bw", HasAVX512BW)
3156 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003157 .Case("bmi", HasBMI)
3158 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003159 .Case("cx16", HasCX16)
3160 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003161 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003162 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003163 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003164 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003165 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3166 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3167 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003168 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003169 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003170 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003171 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003172 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003173 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003174 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003175 .Case("sse", SSELevel >= SSE1)
3176 .Case("sse2", SSELevel >= SSE2)
3177 .Case("sse3", SSELevel >= SSE3)
3178 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003179 .Case("sse4.1", SSELevel >= SSE41)
3180 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003181 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003182 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003183 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003184 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3185 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003186 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003187 .Default(false);
3188}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003189
Eli Friedman3fd920a2008-08-20 02:34:37 +00003190bool
Anders Carlsson58436352009-02-28 17:11:49 +00003191X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003192 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003193 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003194 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003195 case 'I':
3196 Info.setRequiresImmediate(0, 31);
3197 return true;
3198 case 'J':
3199 Info.setRequiresImmediate(0, 63);
3200 return true;
3201 case 'K':
3202 Info.setRequiresImmediate(-128, 127);
3203 return true;
3204 case 'L':
3205 // FIXME: properly analyze this constraint:
3206 // must be one of 0xff, 0xffff, or 0xffffffff
3207 return true;
3208 case 'M':
3209 Info.setRequiresImmediate(0, 3);
3210 return true;
3211 case 'N':
3212 Info.setRequiresImmediate(0, 255);
3213 return true;
3214 case 'O':
3215 Info.setRequiresImmediate(0, 127);
3216 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003217 case 'Y': // first letter of a pair:
3218 switch (*(Name+1)) {
3219 default: return false;
3220 case '0': // First SSE register.
3221 case 't': // Any SSE register, when SSE2 is enabled.
3222 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3223 case 'm': // any MMX register, when inter-unit moves enabled.
3224 break; // falls through to setAllowsRegister.
3225 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003226 case 'f': // any x87 floating point stack register.
3227 // Constraint 'f' cannot be used for output operands.
3228 if (Info.ConstraintStr[0] == '=')
3229 return false;
3230
3231 Info.setAllowsRegister();
3232 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003233 case 'a': // eax.
3234 case 'b': // ebx.
3235 case 'c': // ecx.
3236 case 'd': // edx.
3237 case 'S': // esi.
3238 case 'D': // edi.
3239 case 'A': // edx:eax.
3240 case 't': // top of floating point stack.
3241 case 'u': // second from top of floating point stack.
3242 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003243 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003244 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003245 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003246 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3247 case 'l': // "Index" registers: any general register that can be used as an
3248 // index in a base+index memory access.
3249 Info.setAllowsRegister();
3250 return true;
3251 case 'C': // SSE floating point constant.
3252 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003253 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003254 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003255 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003256 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003257 return true;
3258 }
3259}
3260
Akira Hatanaka974131e2014-09-18 18:17:18 +00003261bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3262 unsigned Size) const {
3263 // Strip off constraint modifiers.
3264 while (Constraint[0] == '=' ||
3265 Constraint[0] == '+' ||
3266 Constraint[0] == '&')
3267 Constraint = Constraint.substr(1);
3268
3269 return validateOperandSize(Constraint, Size);
3270}
3271
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003272bool X86TargetInfo::validateInputSize(StringRef Constraint,
3273 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003274 return validateOperandSize(Constraint, Size);
3275}
3276
3277bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3278 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003279 switch (Constraint[0]) {
3280 default: break;
3281 case 'y':
3282 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003283 case 'f':
3284 case 't':
3285 case 'u':
3286 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003287 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003288 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003289 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003290 }
3291
3292 return true;
3293}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003294
Eli Friedman3fd920a2008-08-20 02:34:37 +00003295std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003296X86TargetInfo::convertConstraint(const char *&Constraint) const {
3297 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003298 case 'a': return std::string("{ax}");
3299 case 'b': return std::string("{bx}");
3300 case 'c': return std::string("{cx}");
3301 case 'd': return std::string("{dx}");
3302 case 'S': return std::string("{si}");
3303 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003304 case 'p': // address
3305 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003306 case 't': // top of floating point stack.
3307 return std::string("{st}");
3308 case 'u': // second from top of floating point stack.
3309 return std::string("{st(1)}"); // second from top of floating point stack.
3310 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003311 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003312 }
3313}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003314
Eli Friedman3fd920a2008-08-20 02:34:37 +00003315// X86-32 generic target
3316class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003317public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003318 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003319 DoubleAlign = LongLongAlign = 32;
3320 LongDoubleWidth = 96;
3321 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003322 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003323 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003324 SizeType = UnsignedInt;
3325 PtrDiffType = SignedInt;
3326 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003327 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003328
3329 // Use fpret for all types.
3330 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3331 (1 << TargetInfo::Double) |
3332 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003333
3334 // x86-32 has atomics up to 8 bytes
3335 // FIXME: Check that we actually have cmpxchg8b before setting
3336 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3337 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003338 }
Craig Topper3164f332014-03-11 03:39:26 +00003339 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003340 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003341 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003342
Craig Topper3164f332014-03-11 03:39:26 +00003343 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003344 if (RegNo == 0) return 0;
3345 if (RegNo == 1) return 2;
3346 return -1;
3347 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003348 bool validateOperandSize(StringRef Constraint,
3349 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003350 switch (Constraint[0]) {
3351 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003352 case 'R':
3353 case 'q':
3354 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003355 case 'a':
3356 case 'b':
3357 case 'c':
3358 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003359 case 'S':
3360 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003361 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003362 case 'A':
3363 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003364 }
3365
Akira Hatanaka974131e2014-09-18 18:17:18 +00003366 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003367 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003368};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003369
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003370class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3371public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003372 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3373 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003374
Craig Topper3164f332014-03-11 03:39:26 +00003375 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003376 unsigned Major, Minor, Micro;
3377 getTriple().getOSVersion(Major, Minor, Micro);
3378 // New NetBSD uses the default rounding mode.
3379 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3380 return X86_32TargetInfo::getFloatEvalMethod();
3381 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003382 return 1;
3383 }
3384};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003385
Eli Friedmane3aa4542009-07-05 18:47:56 +00003386class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3387public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003388 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3389 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003390 SizeType = UnsignedLong;
3391 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003392 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003393 }
3394};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003395
Eli Friedman9fa28852012-08-08 23:57:20 +00003396class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3397public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003398 BitrigI386TargetInfo(const llvm::Triple &Triple)
3399 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003400 SizeType = UnsignedLong;
3401 IntPtrType = SignedLong;
3402 PtrDiffType = SignedLong;
3403 }
3404};
Eli Friedman9fa28852012-08-08 23:57:20 +00003405
Torok Edwinb2b37c62009-06-30 17:10:35 +00003406class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003407public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003408 DarwinI386TargetInfo(const llvm::Triple &Triple)
3409 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003410 LongDoubleWidth = 128;
3411 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003412 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003413 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003414 SizeType = UnsignedLong;
3415 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003416 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003417 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003418 }
3419
Eli Friedman3fd920a2008-08-20 02:34:37 +00003420};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003421
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003422// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003423class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003424public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003425 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3426 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003427 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003428 DoubleAlign = LongLongAlign = 64;
David Majnemer8fa8c382015-03-17 23:55:00 +00003429 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003430 }
Craig Topper3164f332014-03-11 03:39:26 +00003431 void getTargetDefines(const LangOptions &Opts,
3432 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003433 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3434 }
3435};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003436
3437// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003438class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003439public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003440 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003441 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003442 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003443 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3444 }
Craig Topper3164f332014-03-11 03:39:26 +00003445 void getTargetDefines(const LangOptions &Opts,
3446 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003447 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3448 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3449 // The value of the following reflects processor type.
3450 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3451 // We lost the original triple, so we use the default.
3452 Builder.defineMacro("_M_IX86", "600");
3453 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003454};
3455} // end anonymous namespace
3456
Reid Kleckner47606832014-04-21 20:58:00 +00003457static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3458 Builder.defineMacro("__MSVCRT__");
3459 Builder.defineMacro("__MINGW32__");
3460
3461 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3462 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3463 // macro anyway for pre-processor compatibility.
3464 if (Opts.MicrosoftExt)
3465 Builder.defineMacro("__declspec", "__declspec");
3466 else
3467 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3468
3469 if (!Opts.MicrosoftExt) {
3470 // Provide macros for all the calling convention keywords. Provide both
3471 // single and double underscore prefixed variants. These are available on
3472 // x64 as well as x86, even though they have no effect.
3473 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3474 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003475 std::string GCCSpelling = "__attribute__((__";
3476 GCCSpelling += CC;
3477 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003478 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3479 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3480 }
3481 }
3482}
3483
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003484namespace {
3485// x86-32 MinGW target
3486class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3487public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003488 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3489 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003490 void getTargetDefines(const LangOptions &Opts,
3491 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003492 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003493 DefineStd(Builder, "WIN32", Opts);
3494 DefineStd(Builder, "WINNT", Opts);
3495 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003496 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003497 }
3498};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003499
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003500// x86-32 Cygwin target
3501class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3502public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003503 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3504 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003505 TLSSupported = false;
3506 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003507 DoubleAlign = LongLongAlign = 64;
David Majnemer8fa8c382015-03-17 23:55:00 +00003508 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003509 }
Craig Topper3164f332014-03-11 03:39:26 +00003510 void getTargetDefines(const LangOptions &Opts,
3511 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003512 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003513 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003514 Builder.defineMacro("__CYGWIN__");
3515 Builder.defineMacro("__CYGWIN32__");
3516 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003517 if (Opts.CPlusPlus)
3518 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003519 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003520};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003521
Chris Lattnerb986aba2010-04-11 19:29:39 +00003522// x86-32 Haiku target
3523class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3524public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003525 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003526 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003527 IntPtrType = SignedLong;
3528 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003529 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003530 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003531 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003532 }
Craig Topper3164f332014-03-11 03:39:26 +00003533 void getTargetDefines(const LangOptions &Opts,
3534 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003535 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3536 Builder.defineMacro("__INTEL__");
3537 Builder.defineMacro("__HAIKU__");
3538 }
3539};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003540
Douglas Gregor9fabd852011-07-01 22:41:14 +00003541// RTEMS Target
3542template<typename Target>
3543class RTEMSTargetInfo : public OSTargetInfo<Target> {
3544protected:
Craig Topper3164f332014-03-11 03:39:26 +00003545 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3546 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003547 // RTEMS defines; list based off of gcc output
3548
Douglas Gregor9fabd852011-07-01 22:41:14 +00003549 Builder.defineMacro("__rtems__");
3550 Builder.defineMacro("__ELF__");
3551 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003552
Douglas Gregor9fabd852011-07-01 22:41:14 +00003553public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003554 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3555 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003556
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003557 switch (Triple.getArch()) {
3558 default:
3559 case llvm::Triple::x86:
3560 // this->MCountName = ".mcount";
3561 break;
3562 case llvm::Triple::mips:
3563 case llvm::Triple::mipsel:
3564 case llvm::Triple::ppc:
3565 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003566 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003567 // this->MCountName = "_mcount";
3568 break;
3569 case llvm::Triple::arm:
3570 // this->MCountName = "__mcount";
3571 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003572 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003573 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003574};
3575
Douglas Gregor9fabd852011-07-01 22:41:14 +00003576// x86-32 RTEMS target
3577class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3578public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003579 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003580 SizeType = UnsignedLong;
3581 IntPtrType = SignedLong;
3582 PtrDiffType = SignedLong;
3583 this->UserLabelPrefix = "";
3584 }
Craig Topper3164f332014-03-11 03:39:26 +00003585 void getTargetDefines(const LangOptions &Opts,
3586 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003587 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3588 Builder.defineMacro("__INTEL__");
3589 Builder.defineMacro("__rtems__");
3590 }
3591};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003592
Eli Friedman3fd920a2008-08-20 02:34:37 +00003593// x86-64 generic target
3594class X86_64TargetInfo : public X86TargetInfo {
3595public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003596 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003597 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003598 bool IsWinCOFF =
3599 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003600 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003601 LongDoubleWidth = 128;
3602 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003603 LargeArrayMinWidth = 128;
3604 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003605 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003606 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3607 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3608 IntPtrType = IsX32 ? SignedInt : SignedLong;
3609 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003610 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003611 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003612
Eric Christopher917e9522014-11-18 22:36:15 +00003613 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003614 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3615 : IsWinCOFF
3616 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3617 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003618
3619 // Use fpret only for long double.
3620 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003621
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003622 // Use fp2ret for _Complex long double.
3623 ComplexLongDoubleUsesFP2Ret = true;
3624
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003625 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003626 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003627 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003628 }
Craig Topper3164f332014-03-11 03:39:26 +00003629 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003630 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003631 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003632
Craig Topper3164f332014-03-11 03:39:26 +00003633 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003634 if (RegNo == 0) return 0;
3635 if (RegNo == 1) return 1;
3636 return -1;
3637 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003638
Craig Topper3164f332014-03-11 03:39:26 +00003639 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003640 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003641 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003642 CC == CC_IntelOclBicc ||
3643 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003644 }
3645
Craig Topper3164f332014-03-11 03:39:26 +00003646 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003647 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003648 }
3649
Pavel Chupinfd223e12014-08-04 12:39:43 +00003650 // for x32 we need it here explicitly
3651 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003652};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003653
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003654// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003655class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003656public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003657 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3658 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003659 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003660 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003661 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003662 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003663 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003664 SizeType = UnsignedLongLong;
3665 PtrDiffType = SignedLongLong;
3666 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003667 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003668 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003669
Craig Topper3164f332014-03-11 03:39:26 +00003670 void getTargetDefines(const LangOptions &Opts,
3671 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003672 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003673 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003674 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003675
Craig Topper3164f332014-03-11 03:39:26 +00003676 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003677 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003678 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003679
Craig Topper3164f332014-03-11 03:39:26 +00003680 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003681 switch (CC) {
3682 case CC_X86StdCall:
3683 case CC_X86ThisCall:
3684 case CC_X86FastCall:
3685 return CCCR_Ignore;
3686 case CC_C:
3687 case CC_X86VectorCall:
3688 case CC_IntelOclBicc:
3689 case CC_X86_64SysV:
3690 return CCCR_OK;
3691 default:
3692 return CCCR_Warning;
3693 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003694 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003695};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003696
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003697// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003698class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003699public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003700 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003701 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003702 LongDoubleWidth = LongDoubleAlign = 64;
3703 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003704 }
Craig Topper3164f332014-03-11 03:39:26 +00003705 void getTargetDefines(const LangOptions &Opts,
3706 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003707 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3708 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003709 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003710 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003711 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003712};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003713
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003714// x86-64 MinGW target
3715class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3716public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003717 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3718 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003719 void getTargetDefines(const LangOptions &Opts,
3720 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003721 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003722 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003723 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003724 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003725
3726 // GCC defines this macro when it is using __gxx_personality_seh0.
3727 if (!Opts.SjLjExceptions)
3728 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003729 }
3730};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003731
Eli Friedman2857ccb2009-07-01 03:36:11 +00003732class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3733public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003734 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3735 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003736 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003737 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003738 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3739 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003740 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003741 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003742 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003743 }
3744};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003745
Eli Friedman245f2292009-07-05 22:31:18 +00003746class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3747public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003748 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3749 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003750 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003751 Int64Type = SignedLongLong;
3752 }
3753};
Eli Friedman245f2292009-07-05 22:31:18 +00003754
Eli Friedman9fa28852012-08-08 23:57:20 +00003755class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3756public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003757 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3758 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3759 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003760 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003761 }
3762};
Tim Northover9bb857a2013-01-31 12:13:10 +00003763
Eli Friedmanf05b7722008-08-20 07:44:10 +00003764class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003765 // Possible FPU choices.
3766 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003767 VFP2FPU = (1 << 0),
3768 VFP3FPU = (1 << 1),
3769 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003770 NeonFPU = (1 << 3),
3771 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003772 };
3773
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003774 // Possible HWDiv features.
3775 enum HWDivMode {
3776 HWDivThumb = (1 << 0),
3777 HWDivARM = (1 << 1)
3778 };
3779
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003780 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003781 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003782 }
3783
3784 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3785 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003786
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003787 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003788
Rafael Espindolaeb265472013-08-21 21:59:03 +00003789 enum {
3790 FP_Default,
3791 FP_VFP,
3792 FP_Neon
3793 } FPMath;
3794
Bernard Ogdenda13af32013-10-24 18:32:51 +00003795 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003796
Logan Chien57086ce2012-10-10 06:56:20 +00003797 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003798 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003799 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003800
3801 // Initialized via features.
3802 unsigned SoftFloat : 1;
3803 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003804
Bernard Ogden18b57012013-10-29 09:47:51 +00003805 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003806 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003807
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003808 // ACLE 6.5.1 Hardware floating point
3809 enum {
3810 HW_FP_HP = (1 << 1), /// half (16-bit)
3811 HW_FP_SP = (1 << 2), /// single (32-bit)
3812 HW_FP_DP = (1 << 3), /// double (64-bit)
3813 };
3814 uint32_t HW_FP;
3815
Chris Lattner5cc15e02010-03-03 19:03:45 +00003816 static const Builtin::Info BuiltinInfo[];
3817
Rafael Espindola101d5b92013-05-13 20:09:47 +00003818 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003819 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003820 if (T.getArch() == llvm::Triple::arm ||
3821 T.getArch() == llvm::Triple::armeb) {
3822 StringRef VersionStr;
3823 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003824 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003825 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003826 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003827 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003828 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003829 unsigned Version;
3830 if (VersionStr.getAsInteger(10, Version))
3831 return false;
3832 return Version >= 6;
3833 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003834 assert(T.getArch() == llvm::Triple::thumb ||
3835 T.getArch() == llvm::Triple::thumbeb);
3836 StringRef VersionStr;
3837 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003838 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003839 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003840 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003841 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003842 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003843 unsigned Version;
3844 if (VersionStr.getAsInteger(10, Version))
3845 return false;
3846 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003847 }
3848
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003849 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003850 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003851
3852 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003853 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003854
Renato Golin9ba39232015-02-27 16:35:48 +00003855 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3856 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3857 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003858 SizeType = UnsignedLong;
3859 else
3860 SizeType = UnsignedInt;
3861
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003862 switch (T.getOS()) {
3863 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003864 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003865 break;
3866 case llvm::Triple::Win32:
3867 WCharType = UnsignedShort;
3868 break;
3869 case llvm::Triple::Linux:
3870 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003871 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3872 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003873 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003874 }
3875
3876 UseBitFieldTypeAlignment = true;
3877
3878 ZeroLengthBitfieldBoundary = 0;
3879
Tim Northover147cd2f2014-10-14 22:12:21 +00003880 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3881 // so set preferred for small types to 32.
3882 if (T.isOSBinFormatMachO()) {
3883 DescriptionString =
3884 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3885 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3886 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00003887 assert(!BigEndian && "Windows on ARM does not support big endian");
3888 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00003889 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00003890 "-p:32:32"
3891 "-i64:64"
3892 "-v128:64:128"
3893 "-a:0:32"
3894 "-n32"
3895 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003896 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003897 DescriptionString =
3898 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3899 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003900 }
3901
3902 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003903 }
3904
3905 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003906 const llvm::Triple &T = getTriple();
3907
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003908 IsAAPCS = false;
3909
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003910 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003911
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003912 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003913 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003914 SizeType = UnsignedInt;
3915 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003916 SizeType = UnsignedLong;
3917
3918 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3919 WCharType = SignedInt;
3920
3921 // Do not respect the alignment of bit-field types when laying out
3922 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3923 UseBitFieldTypeAlignment = false;
3924
3925 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3926 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3927 /// gcc.
3928 ZeroLengthBitfieldBoundary = 32;
3929
Tim Northover147cd2f2014-10-14 22:12:21 +00003930 if (T.isOSBinFormatMachO())
3931 DescriptionString =
3932 BigEndian
3933 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3934 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3935 else
3936 DescriptionString =
3937 BigEndian
3938 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3939 : "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 +00003940
3941 // FIXME: Override "preferred align" for double and long long.
3942 }
3943
Chris Lattner17df24e2008-04-21 18:56:49 +00003944public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003945 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003946 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003947 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003948 BigEndian = IsBigEndian;
3949
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003950 switch (getTriple().getOS()) {
3951 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003952 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003953 break;
3954 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003955 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003956 break;
3957 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003958
Chris Lattner1a8f3942010-04-23 16:29:58 +00003959 // {} in inline assembly are neon specifiers, not assembly variant
3960 // specifiers.
3961 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003962
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003963 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003964 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003965
Eric Christopher0e261882014-12-05 01:06:59 +00003966 // FIXME: This duplicates code from the driver that sets the -target-abi
3967 // option - this code is used if -target-abi isn't passed and should
3968 // be unified in some way.
3969 if (Triple.isOSBinFormatMachO()) {
3970 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3971 // the frontend matches that.
3972 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3973 Triple.getOS() == llvm::Triple::UnknownOS ||
3974 StringRef(CPU).startswith("cortex-m")) {
3975 setABI("aapcs");
3976 } else {
3977 setABI("apcs-gnu");
3978 }
3979 } else if (Triple.isOSWindows()) {
3980 // FIXME: this is invalid for WindowsCE
3981 setABI("aapcs");
3982 } else {
3983 // Select the default based on the platform.
3984 switch (Triple.getEnvironment()) {
3985 case llvm::Triple::Android:
3986 case llvm::Triple::GNUEABI:
3987 case llvm::Triple::GNUEABIHF:
3988 setABI("aapcs-linux");
3989 break;
3990 case llvm::Triple::EABIHF:
3991 case llvm::Triple::EABI:
3992 setABI("aapcs");
3993 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00003994 case llvm::Triple::GNU:
3995 setABI("apcs-gnu");
3996 break;
Eric Christopher0e261882014-12-05 01:06:59 +00003997 default:
3998 if (Triple.getOS() == llvm::Triple::NetBSD)
3999 setABI("apcs-gnu");
4000 else
4001 setABI("aapcs");
4002 break;
4003 }
4004 }
John McCall86353412010-08-21 22:46:04 +00004005
4006 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004007 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004008
4009 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004010 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004011 if (shouldUseInlineAtomic(getTriple()))
4012 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004013
4014 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004015 // the alignment of the zero-length bitfield is greater than the member
4016 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004017 // zero length bitfield.
4018 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004019 }
Alp Toker4925ba72014-06-07 23:30:42 +00004020 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004021 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004022 ABI = Name;
4023
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004024 // The defaults (above) are for AAPCS, check if we need to change them.
4025 //
4026 // FIXME: We need support for -meabi... we could just mangle it into the
4027 // name.
4028 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004029 setABIAPCS();
4030 return true;
4031 }
4032 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4033 setABIAAPCS();
4034 return true;
4035 }
4036 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004037 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004038
Craig Topper3164f332014-03-11 03:39:26 +00004039 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004040 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004041 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4042 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004043 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004044 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004045 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004046 }
4047 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004048 Features["vfp4"] = true;
4049 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004050 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4051 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004052 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004053 Features["vfp4"] = true;
4054 Features["neon"] = true;
4055 Features["hwdiv"] = true;
4056 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004057 } else if (CPU == "cyclone") {
4058 Features["v8fp"] = true;
4059 Features["neon"] = true;
4060 Features["hwdiv"] = true;
4061 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004062 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004063 Features["fp-armv8"] = true;
4064 Features["neon"] = true;
4065 Features["hwdiv"] = true;
4066 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004067 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004068 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004069 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004070 // Enable the hwdiv extension for all v8a AArch32 cores by
4071 // default.
4072 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004073 ArchName == "armebv8a" || ArchName == "armebv8" ||
4074 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4075 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004076 Features["hwdiv"] = true;
4077 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004078 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
4079 CPU == "sc300") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004080 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004081 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004082 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004083
Craig Topper3164f332014-03-11 03:39:26 +00004084 bool handleTargetFeatures(std::vector<std::string> &Features,
4085 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004086 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004087 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004088 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004089 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004090 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004091
4092 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004093 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004094 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004095 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004096 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004097 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004098 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004099 HW_FP = HW_FP_SP | HW_FP_DP;
4100 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004101 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004102 HW_FP = HW_FP_SP | HW_FP_DP;
4103 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004104 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004105 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4106 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004107 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004108 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4109 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004110 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004111 HW_FP = HW_FP_SP | HW_FP_DP;
4112 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004113 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004114 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004115 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004116 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004117 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004118 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004119 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004120 } else if (Feature == "+fp-only-sp") {
4121 HW_FP &= ~HW_FP_DP;
4122 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004123 }
4124
Rafael Espindolaeb265472013-08-21 21:59:03 +00004125 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4126 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4127 return false;
4128 }
4129
4130 if (FPMath == FP_Neon)
4131 Features.push_back("+neonfp");
4132 else if (FPMath == FP_VFP)
4133 Features.push_back("-neonfp");
4134
Daniel Dunbar893d4752009-12-19 04:15:38 +00004135 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004136 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4137 for (const auto &FEFeature : FrontEndFeatures) {
4138 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4139 if (Feature != Features.end())
4140 Features.erase(Feature);
4141 }
4142
Rafael Espindolaeb265472013-08-21 21:59:03 +00004143 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004144 }
4145
Craig Topper3164f332014-03-11 03:39:26 +00004146 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004147 return llvm::StringSwitch<bool>(Feature)
4148 .Case("arm", true)
4149 .Case("softfloat", SoftFloat)
4150 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004151 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004152 .Case("hwdiv", HWDiv & HWDivThumb)
4153 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004154 .Default(false);
4155 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004156 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004157 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004158 return llvm::StringSwitch<const char *>(Name)
4159 .Cases("arm8", "arm810", "4")
4160 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4161 "4")
4162 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4163 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4164 .Case("ep9312", "4T")
4165 .Cases("arm10tdmi", "arm1020t", "5T")
4166 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4167 .Case("arm926ej-s", "5TEJ")
4168 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4169 .Cases("xscale", "iwmmxt", "5TE")
4170 .Case("arm1136j-s", "6J")
Renato Goline11531f2015-03-17 11:55:43 +00004171 .Case("arm1136jf-s", "6")
4172 .Cases("mpcorenovfp", "mpcore", "6K")
4173 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Eric Christopher917e9522014-11-18 22:36:15 +00004174 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4175 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4176 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4177 "7A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004178 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004179 .Case("swift", "7S")
4180 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004181 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004182 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004183 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004184 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004185 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004186 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004187 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004188 return llvm::StringSwitch<const char *>(Name)
4189 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4190 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4191 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004192 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004193 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4194 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
4195 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004196 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004197 }
Craig Topper3164f332014-03-11 03:39:26 +00004198 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004199 if (!getCPUDefineSuffix(Name))
4200 return false;
4201
Tim Northovere8c37212014-07-09 09:24:43 +00004202 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4203 StringRef Profile = getCPUProfile(Name);
4204 if (Profile == "M" && MaxAtomicInlineWidth) {
4205 MaxAtomicPromoteWidth = 32;
4206 MaxAtomicInlineWidth = 32;
4207 }
4208
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004209 CPU = Name;
4210 return true;
4211 }
Craig Topper3164f332014-03-11 03:39:26 +00004212 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004213 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4214 unsigned CPUArchVer) const {
4215 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4216 (CPUArch.find('M') != StringRef::npos);
4217 }
4218 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4219 unsigned CPUArchVer) const {
4220 // We check both CPUArchVer and ArchName because when only triple is
4221 // specified, the default CPU is arm1136j-s.
4222 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4223 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4224 }
Craig Topper3164f332014-03-11 03:39:26 +00004225 void getTargetDefines(const LangOptions &Opts,
4226 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004227 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004228 Builder.defineMacro("__arm");
4229 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004230
Chris Lattnerecd49032009-03-02 22:27:17 +00004231 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004232 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004233
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004234 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004235 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004236 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004237 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004238 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004239
4240 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004241 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004242 StringRef ArchName = getTriple().getArchName();
4243
4244 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4245 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004246 if (CPUArch[0] >= '8') {
4247 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4248 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004249 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004250
4251 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4252 // is not defined for the M-profile.
4253 // NOTE that the deffault profile is assumed to be 'A'
4254 if (CPUProfile.empty() || CPUProfile != "M")
4255 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4256
4257 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4258 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4259 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4260 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4261 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4262 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4263 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4264
4265 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4266 // instruction set such as ARM or Thumb.
4267 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4268
4269 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4270
4271 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004272 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004273 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004274
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004275 // ACLE 6.5.1 Hardware Floating Point
4276 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004277 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004278
Yi Konga44c4d72014-06-27 21:25:42 +00004279 // ACLE predefines.
4280 Builder.defineMacro("__ARM_ACLE", "200");
4281
Mike Stump9d54bd72009-04-08 02:07:04 +00004282 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004283
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004284 // FIXME: It's more complicated than this and we don't really support
4285 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004286 // Windows on ARM does not "support" interworking
4287 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004288 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004289
David Tweed8f676532012-10-25 13:33:01 +00004290 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004291 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004292 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4293 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004294 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004295 Builder.defineMacro("__ARM_PCS", "1");
4296
David Tweed8f676532012-10-25 13:33:01 +00004297 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004298 Builder.defineMacro("__ARM_PCS_VFP", "1");
4299 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004300
Daniel Dunbar893d4752009-12-19 04:15:38 +00004301 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004302 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004303
4304 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004305 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004306
4307 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004308 Builder.defineMacro("__THUMBEL__");
4309 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004310 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004311 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004312 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004313 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4314 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004315
4316 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004317 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004318
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004319 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004320 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004321 if (FPU & VFP2FPU)
4322 Builder.defineMacro("__ARM_VFPV2__");
4323 if (FPU & VFP3FPU)
4324 Builder.defineMacro("__ARM_VFPV3__");
4325 if (FPU & VFP4FPU)
4326 Builder.defineMacro("__ARM_VFPV4__");
4327 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004328
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004329 // This only gets set when Neon instructions are actually available, unlike
4330 // the VFP define, hence the soft float and arch check. This is subtly
4331 // different from gcc, we follow the intent which was that it should be set
4332 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004333 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4334 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004335 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004336 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004337
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004338 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4339 Opts.ShortWChar ? "2" : "4");
4340
4341 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4342 Opts.ShortEnums ? "1" : "4");
4343
Bernard Ogden18b57012013-10-29 09:47:51 +00004344 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004345 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004346
Tim Northover02e38602014-02-03 17:28:04 +00004347 if (Crypto)
4348 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4349
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004350 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004351 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4352 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4353 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4354 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4355 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004356
4357 bool is5EOrAbove = (CPUArchVer >= 6 ||
4358 (CPUArchVer == 5 &&
4359 CPUArch.find('E') != StringRef::npos));
4360 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4361 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4362 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004363 }
Craig Topper3164f332014-03-11 03:39:26 +00004364 void getTargetBuiltins(const Builtin::Info *&Records,
4365 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004366 Records = BuiltinInfo;
4367 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004368 }
Craig Topper3164f332014-03-11 03:39:26 +00004369 bool isCLZForZeroUndef() const override { return false; }
4370 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004371 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004372 }
Craig Topper3164f332014-03-11 03:39:26 +00004373 void getGCCRegNames(const char * const *&Names,
4374 unsigned &NumNames) const override;
4375 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4376 unsigned &NumAliases) const override;
4377 bool validateAsmConstraint(const char *&Name,
4378 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004379 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004380 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004381 case 'l': // r0-r7
4382 case 'h': // r8-r15
4383 case 'w': // VFP Floating point register single precision
4384 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004385 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004386 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004387 case 'I':
4388 case 'J':
4389 case 'K':
4390 case 'L':
4391 case 'M':
4392 // FIXME
4393 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004394 case 'Q': // A memory address that is a single base register.
4395 Info.setAllowsMemory();
4396 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004397 case 'U': // a memory reference...
4398 switch (Name[1]) {
4399 case 'q': // ...ARMV4 ldrsb
4400 case 'v': // ...VFP load/store (reg+constant offset)
4401 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004402 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004403 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004404 case 'n': // valid address for Neon doubleword vector load/store
4405 case 'm': // valid address for Neon element and structure load/store
4406 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004407 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004408 Info.setAllowsMemory();
4409 Name++;
4410 return true;
4411 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004412 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004413 return false;
4414 }
Craig Topper3164f332014-03-11 03:39:26 +00004415 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004416 std::string R;
4417 switch (*Constraint) {
4418 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004419 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004420 Constraint++;
4421 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004422 case 'p': // 'p' should be translated to 'r' by default.
4423 R = std::string("r");
4424 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004425 default:
4426 return std::string(1, *Constraint);
4427 }
4428 return R;
4429 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004430 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004431 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004432 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004433 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004434 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004435
Bill Wendling9d1ee112012-10-25 23:28:48 +00004436 // Strip off constraint modifiers.
4437 while (Constraint[0] == '=' ||
4438 Constraint[0] == '+' ||
4439 Constraint[0] == '&')
4440 Constraint = Constraint.substr(1);
4441
4442 switch (Constraint[0]) {
4443 default: break;
4444 case 'r': {
4445 switch (Modifier) {
4446 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004447 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004448 case 'q':
4449 // A register of size 32 cannot fit a vector type.
4450 return false;
4451 }
4452 }
4453 }
4454
4455 return true;
4456 }
Craig Topper3164f332014-03-11 03:39:26 +00004457 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004458 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004459 return "";
4460 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004461
Craig Topper3164f332014-03-11 03:39:26 +00004462 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004463 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4464 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004465
Craig Topper3164f332014-03-11 03:39:26 +00004466 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004467 if (RegNo == 0) return 0;
4468 if (RegNo == 1) return 1;
4469 return -1;
4470 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004471};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004472
Rafael Espindolaeb265472013-08-21 21:59:03 +00004473bool ARMTargetInfo::setFPMath(StringRef Name) {
4474 if (Name == "neon") {
4475 FPMath = FP_Neon;
4476 return true;
4477 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4478 Name == "vfp4") {
4479 FPMath = FP_VFP;
4480 return true;
4481 }
4482 return false;
4483}
4484
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004485const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004486 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004487 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004488 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4489
4490 // Float registers
4491 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4492 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4493 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004494 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004495
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004496 // Double registers
4497 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4498 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004499 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4500 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004501
4502 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004503 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4504 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004505};
4506
4507void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004508 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004509 Names = GCCRegNames;
4510 NumNames = llvm::array_lengthof(GCCRegNames);
4511}
4512
4513const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004514 { { "a1" }, "r0" },
4515 { { "a2" }, "r1" },
4516 { { "a3" }, "r2" },
4517 { { "a4" }, "r3" },
4518 { { "v1" }, "r4" },
4519 { { "v2" }, "r5" },
4520 { { "v3" }, "r6" },
4521 { { "v4" }, "r7" },
4522 { { "v5" }, "r8" },
4523 { { "v6", "rfp" }, "r9" },
4524 { { "sl" }, "r10" },
4525 { { "fp" }, "r11" },
4526 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004527 { { "r13" }, "sp" },
4528 { { "r14" }, "lr" },
4529 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004530 // The S, D and Q registers overlap, but aren't really aliases; we
4531 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004532};
4533
4534void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4535 unsigned &NumAliases) const {
4536 Aliases = GCCRegAliases;
4537 NumAliases = llvm::array_lengthof(GCCRegAliases);
4538}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004539
4540const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004541#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004542#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004543 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004544#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004545
4546#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004547#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004548#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4549 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004550#include "clang/Basic/BuiltinsARM.def"
4551};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004552
4553class ARMleTargetInfo : public ARMTargetInfo {
4554public:
4555 ARMleTargetInfo(const llvm::Triple &Triple)
4556 : ARMTargetInfo(Triple, false) { }
4557 virtual void getTargetDefines(const LangOptions &Opts,
4558 MacroBuilder &Builder) const {
4559 Builder.defineMacro("__ARMEL__");
4560 ARMTargetInfo::getTargetDefines(Opts, Builder);
4561 }
4562};
4563
4564class ARMbeTargetInfo : public ARMTargetInfo {
4565public:
4566 ARMbeTargetInfo(const llvm::Triple &Triple)
4567 : ARMTargetInfo(Triple, true) { }
4568 virtual void getTargetDefines(const LangOptions &Opts,
4569 MacroBuilder &Builder) const {
4570 Builder.defineMacro("__ARMEB__");
4571 Builder.defineMacro("__ARM_BIG_ENDIAN");
4572 ARMTargetInfo::getTargetDefines(Opts, Builder);
4573 }
4574};
Chris Lattner17df24e2008-04-21 18:56:49 +00004575
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004576class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4577 const llvm::Triple Triple;
4578public:
4579 WindowsARMTargetInfo(const llvm::Triple &Triple)
4580 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4581 TLSSupported = false;
4582 WCharType = UnsignedShort;
4583 SizeType = UnsignedInt;
4584 UserLabelPrefix = "";
4585 }
4586 void getVisualStudioDefines(const LangOptions &Opts,
4587 MacroBuilder &Builder) const {
4588 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4589
4590 // FIXME: this is invalid for WindowsCE
4591 Builder.defineMacro("_M_ARM_NT", "1");
4592 Builder.defineMacro("_M_ARMT", "_M_ARM");
4593 Builder.defineMacro("_M_THUMB", "_M_ARM");
4594
4595 assert((Triple.getArch() == llvm::Triple::arm ||
4596 Triple.getArch() == llvm::Triple::thumb) &&
4597 "invalid architecture for Windows ARM target info");
4598 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4599 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4600
4601 // TODO map the complete set of values
4602 // 31: VFPv3 40: VFPv4
4603 Builder.defineMacro("_M_ARM_FP", "31");
4604 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004605 BuiltinVaListKind getBuiltinVaListKind() const override {
4606 return TargetInfo::CharPtrBuiltinVaList;
4607 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004608};
4609
4610// Windows ARM + Itanium C++ ABI Target
4611class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4612public:
4613 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4614 : WindowsARMTargetInfo(Triple) {
4615 TheCXXABI.set(TargetCXXABI::GenericARM);
4616 }
4617
4618 void getTargetDefines(const LangOptions &Opts,
4619 MacroBuilder &Builder) const override {
4620 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4621
4622 if (Opts.MSVCCompat)
4623 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4624 }
4625};
4626
4627// Windows ARM, MS (C++) ABI
4628class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4629public:
4630 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4631 : WindowsARMTargetInfo(Triple) {
4632 TheCXXABI.set(TargetCXXABI::Microsoft);
4633 }
4634
4635 void getTargetDefines(const LangOptions &Opts,
4636 MacroBuilder &Builder) const override {
4637 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4638 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4639 }
4640};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004641
Mike Stump11289f42009-09-09 15:08:12 +00004642class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004643 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004644protected:
Craig Topper3164f332014-03-11 03:39:26 +00004645 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4646 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004647 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004648 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004649
Torok Edwinb2b37c62009-06-30 17:10:35 +00004650public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004651 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004652 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004653 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004654 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004655 // FIXME: This should be based off of the target features in
4656 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004657 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004658
4659 // Darwin on iOS uses a variant of the ARM C++ ABI.
4660 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004661 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004662};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004663
Tim Northover573cbee2014-05-24 12:52:07 +00004664class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004665 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004666 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4667 static const char *const GCCRegNames[];
4668
James Molloy75f5f9e2014-04-16 15:33:48 +00004669 enum FPUModeEnum {
4670 FPUMode,
4671 NeonMode
4672 };
4673
4674 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004675 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004676 unsigned Crypto;
4677
Tim Northovera2ee4332014-03-29 15:09:45 +00004678 static const Builtin::Info BuiltinInfo[];
4679
4680 std::string ABI;
4681
4682public:
Tim Northover573cbee2014-05-24 12:52:07 +00004683 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004684 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004685
4686 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4687 WCharType = SignedInt;
4688
4689 // NetBSD apparently prefers consistency across ARM targets to consistency
4690 // across 64-bit targets.
4691 Int64Type = SignedLongLong;
4692 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004693 } else {
4694 WCharType = UnsignedInt;
4695 Int64Type = SignedLong;
4696 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004697 }
4698
Tim Northovera2ee4332014-03-29 15:09:45 +00004699 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004700 MaxVectorAlign = 128;
4701 RegParmMax = 8;
4702 MaxAtomicInlineWidth = 128;
4703 MaxAtomicPromoteWidth = 128;
4704
Tim Northovera6a19f12015-02-06 01:25:07 +00004705 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004706 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4707
Tim Northovera2ee4332014-03-29 15:09:45 +00004708 // {} in inline assembly are neon specifiers, not assembly variant
4709 // specifiers.
4710 NoAsmVariants = true;
4711
Tim Northover7ad87af2015-01-16 18:44:04 +00004712 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4713 // contributes to the alignment of the containing aggregate in the same way
4714 // a plain (non bit-field) member of that type would, without exception for
4715 // zero-sized or anonymous bit-fields."
4716 UseBitFieldTypeAlignment = true;
4717 UseZeroLengthBitfieldAlignment = true;
4718
Tim Northover573cbee2014-05-24 12:52:07 +00004719 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004720 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4721 }
4722
Alp Toker4925ba72014-06-07 23:30:42 +00004723 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004724 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004725 if (Name != "aapcs" && Name != "darwinpcs")
4726 return false;
4727
4728 ABI = Name;
4729 return true;
4730 }
4731
David Blaikie1cbb9712014-11-14 19:09:44 +00004732 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004733 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004734 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004735 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004736 .Case("cyclone", true)
4737 .Default(false);
4738 return CPUKnown;
4739 }
4740
4741 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004742 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004743 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004744 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004745
4746 // Target properties.
4747 Builder.defineMacro("_LP64");
4748 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004749
4750 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4751 Builder.defineMacro("__ARM_ACLE", "200");
4752 Builder.defineMacro("__ARM_ARCH", "8");
4753 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4754
4755 Builder.defineMacro("__ARM_64BIT_STATE");
4756 Builder.defineMacro("__ARM_PCS_AAPCS64");
4757 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4758
4759 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4760 Builder.defineMacro("__ARM_FEATURE_CLZ");
4761 Builder.defineMacro("__ARM_FEATURE_FMA");
4762 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004763 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4764 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4765 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4766 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004767
4768 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4769
4770 // 0xe implies support for half, single and double precision operations.
4771 Builder.defineMacro("__ARM_FP", "0xe");
4772
4773 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4774 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4775 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4776
4777 if (Opts.FastMath || Opts.FiniteMathOnly)
4778 Builder.defineMacro("__ARM_FP_FAST");
4779
Richard Smithab506ad2014-10-20 23:26:58 +00004780 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004781 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4782
4783 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4784
4785 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4786 Opts.ShortEnums ? "1" : "4");
4787
James Molloy75f5f9e2014-04-16 15:33:48 +00004788 if (FPU == NeonMode) {
4789 Builder.defineMacro("__ARM_NEON");
4790 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004791 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004792 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004793
Bradley Smith418c5932014-05-02 15:17:51 +00004794 if (CRC)
4795 Builder.defineMacro("__ARM_FEATURE_CRC32");
4796
James Molloy75f5f9e2014-04-16 15:33:48 +00004797 if (Crypto)
4798 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004799 }
4800
4801 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004802 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004803 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004804 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004805 }
4806
David Blaikie1cbb9712014-11-14 19:09:44 +00004807 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004808 return Feature == "aarch64" ||
4809 Feature == "arm64" ||
4810 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004811 }
4812
James Molloy5e73df52014-04-16 15:06:20 +00004813 bool handleTargetFeatures(std::vector<std::string> &Features,
4814 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004815 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004816 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004817 Crypto = 0;
4818 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4819 if (Features[i] == "+neon")
4820 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004821 if (Features[i] == "+crc")
4822 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004823 if (Features[i] == "+crypto")
4824 Crypto = 1;
4825 }
4826
James Molloy5e73df52014-04-16 15:06:20 +00004827 setDescriptionString();
4828
4829 return true;
4830 }
4831
David Blaikie1cbb9712014-11-14 19:09:44 +00004832 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004833
David Blaikie1cbb9712014-11-14 19:09:44 +00004834 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004835 return TargetInfo::AArch64ABIBuiltinVaList;
4836 }
4837
4838 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004839 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004840 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004841 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004842
Eric Christopher917e9522014-11-18 22:36:15 +00004843 virtual bool
4844 validateAsmConstraint(const char *&Name,
4845 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004846 switch (*Name) {
4847 default:
4848 return false;
4849 case 'w': // Floating point and SIMD registers (V0-V31)
4850 Info.setAllowsRegister();
4851 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004852 case 'I': // Constant that can be used with an ADD instruction
4853 case 'J': // Constant that can be used with a SUB instruction
4854 case 'K': // Constant that can be used with a 32-bit logical instruction
4855 case 'L': // Constant that can be used with a 64-bit logical instruction
4856 case 'M': // Constant that can be used as a 32-bit MOV immediate
4857 case 'N': // Constant that can be used as a 64-bit MOV immediate
4858 case 'Y': // Floating point constant zero
4859 case 'Z': // Integer constant zero
4860 return true;
4861 case 'Q': // A memory reference with base register and no offset
4862 Info.setAllowsMemory();
4863 return true;
4864 case 'S': // A symbolic address
4865 Info.setAllowsRegister();
4866 return true;
4867 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004868 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4869 // Utf: A memory address suitable for ldp/stp in TF mode.
4870 // Usa: An absolute symbolic address.
4871 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4872 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004873 case 'z': // Zero register, wzr or xzr
4874 Info.setAllowsRegister();
4875 return true;
4876 case 'x': // Floating point and SIMD registers (V0-V15)
4877 Info.setAllowsRegister();
4878 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004879 }
4880 return false;
4881 }
4882
Akira Hatanaka987f1862014-08-22 06:05:21 +00004883 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004884 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004885 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004886 // Strip off constraint modifiers.
4887 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4888 Constraint = Constraint.substr(1);
4889
4890 switch (Constraint[0]) {
4891 default:
4892 return true;
4893 case 'z':
4894 case 'r': {
4895 switch (Modifier) {
4896 case 'x':
4897 case 'w':
4898 // For now assume that the person knows what they're
4899 // doing with the modifier.
4900 return true;
4901 default:
4902 // By default an 'r' constraint will be in the 'x'
4903 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004904 if (Size == 64)
4905 return true;
4906
4907 SuggestedModifier = "w";
4908 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004909 }
4910 }
4911 }
4912 }
4913
David Blaikie1cbb9712014-11-14 19:09:44 +00004914 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004915
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004916 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004917 if (RegNo == 0)
4918 return 0;
4919 if (RegNo == 1)
4920 return 1;
4921 return -1;
4922 }
4923};
4924
Tim Northover573cbee2014-05-24 12:52:07 +00004925const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004926 // 32-bit Integer registers
4927 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4928 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4929 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4930
4931 // 64-bit Integer registers
4932 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4933 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4934 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4935
4936 // 32-bit floating point regsisters
4937 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4938 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4939 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4940
4941 // 64-bit floating point regsisters
4942 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4943 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4944 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4945
4946 // Vector registers
4947 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4948 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4949 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4950};
4951
Tim Northover573cbee2014-05-24 12:52:07 +00004952void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004953 unsigned &NumNames) const {
4954 Names = GCCRegNames;
4955 NumNames = llvm::array_lengthof(GCCRegNames);
4956}
4957
Tim Northover573cbee2014-05-24 12:52:07 +00004958const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004959 { { "w31" }, "wsp" },
4960 { { "x29" }, "fp" },
4961 { { "x30" }, "lr" },
4962 { { "x31" }, "sp" },
4963 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4964 // don't want to substitute one of these for a different-sized one.
4965};
4966
Tim Northover573cbee2014-05-24 12:52:07 +00004967void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004968 unsigned &NumAliases) const {
4969 Aliases = GCCRegAliases;
4970 NumAliases = llvm::array_lengthof(GCCRegAliases);
4971}
4972
Tim Northover573cbee2014-05-24 12:52:07 +00004973const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004974#define BUILTIN(ID, TYPE, ATTRS) \
4975 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4976#include "clang/Basic/BuiltinsNEON.def"
4977
4978#define BUILTIN(ID, TYPE, ATTRS) \
4979 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004980#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004981};
James Molloy5e73df52014-04-16 15:06:20 +00004982
Tim Northover573cbee2014-05-24 12:52:07 +00004983class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004984 void setDescriptionString() override {
4985 if (getTriple().isOSBinFormatMachO())
4986 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4987 else
4988 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4989 }
4990
4991public:
Tim Northover573cbee2014-05-24 12:52:07 +00004992 AArch64leTargetInfo(const llvm::Triple &Triple)
4993 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004994 BigEndian = false;
4995 }
4996 void getTargetDefines(const LangOptions &Opts,
4997 MacroBuilder &Builder) const override {
4998 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004999 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005000 }
5001};
5002
Tim Northover573cbee2014-05-24 12:52:07 +00005003class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005004 void setDescriptionString() override {
5005 assert(!getTriple().isOSBinFormatMachO());
5006 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5007 }
5008
5009public:
Tim Northover573cbee2014-05-24 12:52:07 +00005010 AArch64beTargetInfo(const llvm::Triple &Triple)
5011 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005012 void getTargetDefines(const LangOptions &Opts,
5013 MacroBuilder &Builder) const override {
5014 Builder.defineMacro("__AARCH64EB__");
5015 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5016 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005017 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005018 }
5019};
Tim Northovera2ee4332014-03-29 15:09:45 +00005020
Tim Northover573cbee2014-05-24 12:52:07 +00005021class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005022protected:
5023 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5024 MacroBuilder &Builder) const override {
5025 Builder.defineMacro("__AARCH64_SIMD__");
5026 Builder.defineMacro("__ARM64_ARCH_8__");
5027 Builder.defineMacro("__ARM_NEON__");
5028 Builder.defineMacro("__LITTLE_ENDIAN__");
5029 Builder.defineMacro("__REGISTER_PREFIX__", "");
5030 Builder.defineMacro("__arm64", "1");
5031 Builder.defineMacro("__arm64__", "1");
5032
5033 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5034 }
5035
Tim Northovera2ee4332014-03-29 15:09:45 +00005036public:
Tim Northover573cbee2014-05-24 12:52:07 +00005037 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5038 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005039 Int64Type = SignedLongLong;
5040 WCharType = SignedInt;
5041 UseSignedCharForObjCBool = false;
5042
Tim Northovera6a19f12015-02-06 01:25:07 +00005043 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005044 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5045
5046 TheCXXABI.set(TargetCXXABI::iOS64);
5047 }
5048
David Blaikie1cbb9712014-11-14 19:09:44 +00005049 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005050 return TargetInfo::CharPtrBuiltinVaList;
5051 }
5052};
Tim Northovera2ee4332014-03-29 15:09:45 +00005053
Tony Linthicum76329bf2011-12-12 21:14:55 +00005054// Hexagon abstract base class
5055class HexagonTargetInfo : public TargetInfo {
5056 static const Builtin::Info BuiltinInfo[];
5057 static const char * const GCCRegNames[];
5058 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5059 std::string CPU;
5060public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005061 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005062 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005063 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005064
5065 // {} in inline assembly are packet specifiers, not assembly variant
5066 // specifiers.
5067 NoAsmVariants = true;
5068 }
5069
Craig Topper3164f332014-03-11 03:39:26 +00005070 void getTargetBuiltins(const Builtin::Info *&Records,
5071 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005072 Records = BuiltinInfo;
5073 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5074 }
5075
Craig Topper3164f332014-03-11 03:39:26 +00005076 bool validateAsmConstraint(const char *&Name,
5077 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005078 return true;
5079 }
5080
Craig Topper3164f332014-03-11 03:39:26 +00005081 void getTargetDefines(const LangOptions &Opts,
5082 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005083
Craig Topper3164f332014-03-11 03:39:26 +00005084 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005085 return Feature == "hexagon";
5086 }
Craig Topper3164f332014-03-11 03:39:26 +00005087
5088 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005089 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005090 }
Craig Topper3164f332014-03-11 03:39:26 +00005091 void getGCCRegNames(const char * const *&Names,
5092 unsigned &NumNames) const override;
5093 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5094 unsigned &NumAliases) const override;
5095 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005096 return "";
5097 }
Sebastian Pop86500282012-01-13 20:37:10 +00005098
5099 static const char *getHexagonCPUSuffix(StringRef Name) {
5100 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005101 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005102 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005103 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005104 }
5105
Craig Topper3164f332014-03-11 03:39:26 +00005106 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005107 if (!getHexagonCPUSuffix(Name))
5108 return false;
5109
Tony Linthicum76329bf2011-12-12 21:14:55 +00005110 CPU = Name;
5111 return true;
5112 }
5113};
5114
5115void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5116 MacroBuilder &Builder) const {
5117 Builder.defineMacro("qdsp6");
5118 Builder.defineMacro("__qdsp6", "1");
5119 Builder.defineMacro("__qdsp6__", "1");
5120
5121 Builder.defineMacro("hexagon");
5122 Builder.defineMacro("__hexagon", "1");
5123 Builder.defineMacro("__hexagon__", "1");
5124
5125 if(CPU == "hexagonv1") {
5126 Builder.defineMacro("__HEXAGON_V1__");
5127 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5128 if(Opts.HexagonQdsp6Compat) {
5129 Builder.defineMacro("__QDSP6_V1__");
5130 Builder.defineMacro("__QDSP6_ARCH__", "1");
5131 }
5132 }
5133 else if(CPU == "hexagonv2") {
5134 Builder.defineMacro("__HEXAGON_V2__");
5135 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5136 if(Opts.HexagonQdsp6Compat) {
5137 Builder.defineMacro("__QDSP6_V2__");
5138 Builder.defineMacro("__QDSP6_ARCH__", "2");
5139 }
5140 }
5141 else if(CPU == "hexagonv3") {
5142 Builder.defineMacro("__HEXAGON_V3__");
5143 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5144 if(Opts.HexagonQdsp6Compat) {
5145 Builder.defineMacro("__QDSP6_V3__");
5146 Builder.defineMacro("__QDSP6_ARCH__", "3");
5147 }
5148 }
5149 else if(CPU == "hexagonv4") {
5150 Builder.defineMacro("__HEXAGON_V4__");
5151 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5152 if(Opts.HexagonQdsp6Compat) {
5153 Builder.defineMacro("__QDSP6_V4__");
5154 Builder.defineMacro("__QDSP6_ARCH__", "4");
5155 }
5156 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005157 else if(CPU == "hexagonv5") {
5158 Builder.defineMacro("__HEXAGON_V5__");
5159 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5160 if(Opts.HexagonQdsp6Compat) {
5161 Builder.defineMacro("__QDSP6_V5__");
5162 Builder.defineMacro("__QDSP6_ARCH__", "5");
5163 }
5164 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005165}
5166
5167const char * const HexagonTargetInfo::GCCRegNames[] = {
5168 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5169 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5170 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5171 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5172 "p0", "p1", "p2", "p3",
5173 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5174};
5175
5176void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5177 unsigned &NumNames) const {
5178 Names = GCCRegNames;
5179 NumNames = llvm::array_lengthof(GCCRegNames);
5180}
5181
5182
5183const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5184 { { "sp" }, "r29" },
5185 { { "fp" }, "r30" },
5186 { { "lr" }, "r31" },
5187 };
5188
5189void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5190 unsigned &NumAliases) const {
5191 Aliases = GCCRegAliases;
5192 NumAliases = llvm::array_lengthof(GCCRegAliases);
5193}
5194
5195
5196const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5197#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5198#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5199 ALL_LANGUAGES },
5200#include "clang/Basic/BuiltinsHexagon.def"
5201};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005202
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005203// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5204class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005205 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5206 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005207 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005208public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005209 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005210
Craig Topper3164f332014-03-11 03:39:26 +00005211 bool handleTargetFeatures(std::vector<std::string> &Features,
5212 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005213 SoftFloat = false;
5214 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5215 if (Features[i] == "+soft-float")
5216 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005217 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005218 }
Craig Topper3164f332014-03-11 03:39:26 +00005219 void getTargetDefines(const LangOptions &Opts,
5220 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005221 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005222 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005223
5224 if (SoftFloat)
5225 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005226 }
Craig Topper3164f332014-03-11 03:39:26 +00005227
5228 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005229 return llvm::StringSwitch<bool>(Feature)
5230 .Case("softfloat", SoftFloat)
5231 .Case("sparc", true)
5232 .Default(false);
5233 }
Craig Topper3164f332014-03-11 03:39:26 +00005234
5235 void getTargetBuiltins(const Builtin::Info *&Records,
5236 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005237 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005238 }
Craig Topper3164f332014-03-11 03:39:26 +00005239 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005240 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005241 }
Craig Topper3164f332014-03-11 03:39:26 +00005242 void getGCCRegNames(const char * const *&Names,
5243 unsigned &NumNames) const override;
5244 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5245 unsigned &NumAliases) const override;
5246 bool validateAsmConstraint(const char *&Name,
5247 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005248 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005249 switch (*Name) {
5250 case 'I': // Signed 13-bit constant
5251 case 'J': // Zero
5252 case 'K': // 32-bit constant with the low 12 bits clear
5253 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5254 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5255 case 'N': // Same as 'K' but zext (required for SIMode)
5256 case 'O': // The constant 4096
5257 return true;
5258 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005259 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005260 }
Craig Topper3164f332014-03-11 03:39:26 +00005261 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005262 // FIXME: Implement!
5263 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005264 }
5265};
5266
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005267const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005268 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5269 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5270 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5271 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5272};
5273
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005274void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5275 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005276 Names = GCCRegNames;
5277 NumNames = llvm::array_lengthof(GCCRegNames);
5278}
5279
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005280const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005281 { { "g0" }, "r0" },
5282 { { "g1" }, "r1" },
5283 { { "g2" }, "r2" },
5284 { { "g3" }, "r3" },
5285 { { "g4" }, "r4" },
5286 { { "g5" }, "r5" },
5287 { { "g6" }, "r6" },
5288 { { "g7" }, "r7" },
5289 { { "o0" }, "r8" },
5290 { { "o1" }, "r9" },
5291 { { "o2" }, "r10" },
5292 { { "o3" }, "r11" },
5293 { { "o4" }, "r12" },
5294 { { "o5" }, "r13" },
5295 { { "o6", "sp" }, "r14" },
5296 { { "o7" }, "r15" },
5297 { { "l0" }, "r16" },
5298 { { "l1" }, "r17" },
5299 { { "l2" }, "r18" },
5300 { { "l3" }, "r19" },
5301 { { "l4" }, "r20" },
5302 { { "l5" }, "r21" },
5303 { { "l6" }, "r22" },
5304 { { "l7" }, "r23" },
5305 { { "i0" }, "r24" },
5306 { { "i1" }, "r25" },
5307 { { "i2" }, "r26" },
5308 { { "i3" }, "r27" },
5309 { { "i4" }, "r28" },
5310 { { "i5" }, "r29" },
5311 { { "i6", "fp" }, "r30" },
5312 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005313};
5314
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005315void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5316 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005317 Aliases = GCCRegAliases;
5318 NumAliases = llvm::array_lengthof(GCCRegAliases);
5319}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005320
5321// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5322class SparcV8TargetInfo : public SparcTargetInfo {
5323public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005324 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005325 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005326 }
5327
Craig Topper3164f332014-03-11 03:39:26 +00005328 void getTargetDefines(const LangOptions &Opts,
5329 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005330 SparcTargetInfo::getTargetDefines(Opts, Builder);
5331 Builder.defineMacro("__sparcv8");
5332 }
5333};
5334
5335// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5336class SparcV9TargetInfo : public SparcTargetInfo {
5337public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005338 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005339 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005340 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005341 // This is an LP64 platform.
5342 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005343
5344 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005345 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005346 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005347 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005348 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005349 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005350
5351 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5352 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5353 LongDoubleWidth = 128;
5354 LongDoubleAlign = 128;
5355 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005356 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005357 }
5358
Craig Topper3164f332014-03-11 03:39:26 +00005359 void getTargetDefines(const LangOptions &Opts,
5360 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005361 SparcTargetInfo::getTargetDefines(Opts, Builder);
5362 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005363 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005364 // Solaris doesn't need these variants, but the BSDs do.
5365 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005366 Builder.defineMacro("__sparc64__");
5367 Builder.defineMacro("__sparc_v9__");
5368 Builder.defineMacro("__sparcv9__");
5369 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005370 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005371
Craig Topper3164f332014-03-11 03:39:26 +00005372 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005373 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5374 .Case("v9", true)
5375 .Case("ultrasparc", true)
5376 .Case("ultrasparc3", true)
5377 .Case("niagara", true)
5378 .Case("niagara2", true)
5379 .Case("niagara3", true)
5380 .Case("niagara4", true)
5381 .Default(false);
5382
5383 // No need to store the CPU yet. There aren't any CPU-specific
5384 // macros to define.
5385 return CPUKnown;
5386 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005387};
5388
Torok Edwinb2b37c62009-06-30 17:10:35 +00005389class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005390public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005391 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5392 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005393 SizeType = UnsignedInt;
5394 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005395 }
5396};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005397
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005398class SystemZTargetInfo : public TargetInfo {
5399 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005400
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005401public:
5402 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5403 TLSSupported = true;
5404 IntWidth = IntAlign = 32;
5405 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5406 PointerWidth = PointerAlign = 64;
5407 LongDoubleWidth = 128;
5408 LongDoubleAlign = 64;
5409 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5410 MinGlobalAlign = 16;
5411 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5412 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5413 }
5414 void getTargetDefines(const LangOptions &Opts,
5415 MacroBuilder &Builder) const override {
5416 Builder.defineMacro("__s390__");
5417 Builder.defineMacro("__s390x__");
5418 Builder.defineMacro("__zarch__");
5419 Builder.defineMacro("__LONG_DOUBLE_128__");
5420 }
5421 void getTargetBuiltins(const Builtin::Info *&Records,
5422 unsigned &NumRecords) const override {
5423 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005424 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005425 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005426 }
5427
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005428 void getGCCRegNames(const char *const *&Names,
5429 unsigned &NumNames) const override;
5430 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5431 unsigned &NumAliases) const override {
5432 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005433 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005434 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005435 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005436 bool validateAsmConstraint(const char *&Name,
5437 TargetInfo::ConstraintInfo &info) const override;
5438 const char *getClobbers() const override {
5439 // FIXME: Is this really right?
5440 return "";
5441 }
5442 BuiltinVaListKind getBuiltinVaListKind() const override {
5443 return TargetInfo::SystemZBuiltinVaList;
5444 }
5445 bool setCPU(const std::string &Name) override {
5446 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5447 .Case("z10", true)
5448 .Case("z196", true)
5449 .Case("zEC12", true)
5450 .Default(false);
5451
5452 // No need to store the CPU yet. There aren't any CPU-specific
5453 // macros to define.
5454 return CPUKnown;
5455 }
5456};
5457
5458const char *const SystemZTargetInfo::GCCRegNames[] = {
5459 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5460 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5461 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5462 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5463};
5464
5465void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5466 unsigned &NumNames) const {
5467 Names = GCCRegNames;
5468 NumNames = llvm::array_lengthof(GCCRegNames);
5469}
5470
5471bool SystemZTargetInfo::
5472validateAsmConstraint(const char *&Name,
5473 TargetInfo::ConstraintInfo &Info) const {
5474 switch (*Name) {
5475 default:
5476 return false;
5477
5478 case 'a': // Address register
5479 case 'd': // Data register (equivalent to 'r')
5480 case 'f': // Floating-point register
5481 Info.setAllowsRegister();
5482 return true;
5483
5484 case 'I': // Unsigned 8-bit constant
5485 case 'J': // Unsigned 12-bit constant
5486 case 'K': // Signed 16-bit constant
5487 case 'L': // Signed 20-bit displacement (on all targets we support)
5488 case 'M': // 0x7fffffff
5489 return true;
5490
5491 case 'Q': // Memory with base and unsigned 12-bit displacement
5492 case 'R': // Likewise, plus an index
5493 case 'S': // Memory with base and signed 20-bit displacement
5494 case 'T': // Likewise, plus an index
5495 Info.setAllowsMemory();
5496 return true;
5497 }
5498}
Ulrich Weigand47445072013-05-06 16:26:41 +00005499
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005500 class MSP430TargetInfo : public TargetInfo {
5501 static const char * const GCCRegNames[];
5502 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005503 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005504 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005505 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005506 IntWidth = 16; IntAlign = 16;
5507 LongWidth = 32; LongLongWidth = 64;
5508 LongAlign = LongLongAlign = 16;
5509 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005510 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005511 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005512 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005513 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005514 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005515 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005516 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005517 }
5518 void getTargetDefines(const LangOptions &Opts,
5519 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005520 Builder.defineMacro("MSP430");
5521 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005522 // FIXME: defines for different 'flavours' of MCU
5523 }
Craig Topper3164f332014-03-11 03:39:26 +00005524 void getTargetBuiltins(const Builtin::Info *&Records,
5525 unsigned &NumRecords) const override {
5526 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005527 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005528 NumRecords = 0;
5529 }
Craig Topper3164f332014-03-11 03:39:26 +00005530 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005531 return Feature == "msp430";
5532 }
Craig Topper3164f332014-03-11 03:39:26 +00005533 void getGCCRegNames(const char * const *&Names,
5534 unsigned &NumNames) const override;
5535 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5536 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005537 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005538 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005539 NumAliases = 0;
5540 }
Eric Christopher917e9522014-11-18 22:36:15 +00005541 bool
5542 validateAsmConstraint(const char *&Name,
5543 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005544 // FIXME: implement
5545 switch (*Name) {
5546 case 'K': // the constant 1
5547 case 'L': // constant -1^20 .. 1^19
5548 case 'M': // constant 1-4:
5549 return true;
5550 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005551 // No target constraints for now.
5552 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005553 }
Craig Topper3164f332014-03-11 03:39:26 +00005554 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005555 // FIXME: Is this really right?
5556 return "";
5557 }
Craig Topper3164f332014-03-11 03:39:26 +00005558 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005559 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005560 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005561 }
5562 };
5563
5564 const char * const MSP430TargetInfo::GCCRegNames[] = {
5565 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5566 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5567 };
5568
5569 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5570 unsigned &NumNames) const {
5571 Names = GCCRegNames;
5572 NumNames = llvm::array_lengthof(GCCRegNames);
5573 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005574
Mike Stump11289f42009-09-09 15:08:12 +00005575 // LLVM and Clang cannot be used directly to output native binaries for
5576 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005577 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005578 //
5579 // TCE uses the llvm bitcode as input and uses it for generating customized
5580 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005581 // publicly available in http://tce.cs.tut.fi
5582
Eli Friedman1f191002011-10-07 19:51:42 +00005583 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5584 3, // opencl_global
5585 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005586 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005587 // FIXME: generic has to be added to the target
5588 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005589 0, // cuda_device
5590 0, // cuda_constant
5591 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005592 };
5593
Eli Friedmana9c3d712009-08-19 20:47:07 +00005594 class TCETargetInfo : public TargetInfo{
5595 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005596 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005597 TLSSupported = false;
5598 IntWidth = 32;
5599 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005600 PointerWidth = 32;
5601 IntAlign = 32;
5602 LongAlign = LongLongAlign = 32;
5603 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005604 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005605 SizeType = UnsignedInt;
5606 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005607 IntPtrType = SignedInt;
5608 PtrDiffType = SignedInt;
5609 FloatWidth = 32;
5610 FloatAlign = 32;
5611 DoubleWidth = 32;
5612 DoubleAlign = 32;
5613 LongDoubleWidth = 32;
5614 LongDoubleAlign = 32;
5615 FloatFormat = &llvm::APFloat::IEEEsingle;
5616 DoubleFormat = &llvm::APFloat::IEEEsingle;
5617 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005618 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5619 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005620 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005621 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005622 }
5623
Craig Topper3164f332014-03-11 03:39:26 +00005624 void getTargetDefines(const LangOptions &Opts,
5625 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005626 DefineStd(Builder, "tce", Opts);
5627 Builder.defineMacro("__TCE__");
5628 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005629 }
Craig Topper3164f332014-03-11 03:39:26 +00005630 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005631 return Feature == "tce";
5632 }
Craig Topper3164f332014-03-11 03:39:26 +00005633
5634 void getTargetBuiltins(const Builtin::Info *&Records,
5635 unsigned &NumRecords) const override {}
5636 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005637 return "";
5638 }
Craig Topper3164f332014-03-11 03:39:26 +00005639 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005640 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005641 }
Craig Topper3164f332014-03-11 03:39:26 +00005642 void getGCCRegNames(const char * const *&Names,
5643 unsigned &NumNames) const override {}
5644 bool validateAsmConstraint(const char *&Name,
5645 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005646 return true;
5647 }
Craig Topper3164f332014-03-11 03:39:26 +00005648 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5649 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005650 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005651
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005652class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005653 virtual void setDescriptionString() = 0;
5654
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005655 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005656 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005657 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005658 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005659 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005660 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005661 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005662 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005663 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005664 enum DspRevEnum {
5665 NoDSP, DSP1, DSP2
5666 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005667 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005668
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005669protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005670 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005671 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005672
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005673public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005674 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5675 const std::string &CPUStr)
5676 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005677 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005678 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5679 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5680 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005681
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005682 bool isNaN2008Default() const {
5683 return CPU == "mips32r6" || CPU == "mips64r6";
5684 }
5685
5686 bool isFP64Default() const {
5687 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5688 }
5689
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005690 bool isNan2008() const override {
5691 return IsNan2008;
5692 }
5693
Alp Toker4925ba72014-06-07 23:30:42 +00005694 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005695 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005696 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5697 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005698 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005699 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005700 .Case("mips1", IsMips32)
5701 .Case("mips2", IsMips32)
5702 .Case("mips3", true)
5703 .Case("mips4", true)
5704 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005705 .Case("mips32", IsMips32)
5706 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005707 .Case("mips32r3", IsMips32)
5708 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005709 .Case("mips32r6", IsMips32)
5710 .Case("mips64", true)
5711 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005712 .Case("mips64r3", true)
5713 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005714 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005715 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005716 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005717 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005718 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005719 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005720 if (CPU == "octeon")
5721 Features["mips64r2"] = Features["cnmips"] = true;
5722 else
5723 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005724 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005725
Craig Topper3164f332014-03-11 03:39:26 +00005726 void getTargetDefines(const LangOptions &Opts,
5727 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005728 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005729 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005730 if (Opts.GNUMode)
5731 Builder.defineMacro("mips");
5732
Simon Atanasyan683535b2012-08-29 19:14:58 +00005733 Builder.defineMacro("__REGISTER_PREFIX__", "");
5734
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005735 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005736 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005737 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005738 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005739 case SoftFloat:
5740 Builder.defineMacro("__mips_soft_float", Twine(1));
5741 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005742 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005743
Simon Atanasyan16071912013-04-14 14:07:30 +00005744 if (IsSingleFloat)
5745 Builder.defineMacro("__mips_single_float", Twine(1));
5746
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005747 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5748 Builder.defineMacro("_MIPS_FPSET",
5749 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5750
Simon Atanasyan72244b62012-07-05 16:06:06 +00005751 if (IsMips16)
5752 Builder.defineMacro("__mips16", Twine(1));
5753
Simon Atanasyan60777612013-04-14 14:07:51 +00005754 if (IsMicromips)
5755 Builder.defineMacro("__mips_micromips", Twine(1));
5756
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005757 if (IsNan2008)
5758 Builder.defineMacro("__mips_nan2008", Twine(1));
5759
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005760 switch (DspRev) {
5761 default:
5762 break;
5763 case DSP1:
5764 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5765 Builder.defineMacro("__mips_dsp", Twine(1));
5766 break;
5767 case DSP2:
5768 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5769 Builder.defineMacro("__mips_dspr2", Twine(1));
5770 Builder.defineMacro("__mips_dsp", Twine(1));
5771 break;
5772 }
5773
Jack Carter44ff1e52013-08-12 17:20:29 +00005774 if (HasMSA)
5775 Builder.defineMacro("__mips_msa", Twine(1));
5776
Simon Atanasyan26f19672012-04-05 19:28:31 +00005777 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5778 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5779 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005780
5781 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5782 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005783 }
5784
Craig Topper3164f332014-03-11 03:39:26 +00005785 void getTargetBuiltins(const Builtin::Info *&Records,
5786 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005787 Records = BuiltinInfo;
5788 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005789 }
Craig Topper3164f332014-03-11 03:39:26 +00005790 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005791 return llvm::StringSwitch<bool>(Feature)
5792 .Case("mips", true)
5793 .Case("fp64", HasFP64)
5794 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005795 }
Craig Topper3164f332014-03-11 03:39:26 +00005796 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005797 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005798 }
Craig Topper3164f332014-03-11 03:39:26 +00005799 void getGCCRegNames(const char * const *&Names,
5800 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005801 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005802 // CPU register names
5803 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005804 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5805 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5806 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005807 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5808 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005809 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5810 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5811 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5812 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005813 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005814 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005815 "$fcc5","$fcc6","$fcc7",
5816 // MSA register names
5817 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5818 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5819 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5820 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5821 // MSA control register names
5822 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5823 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005824 };
5825 Names = GCCRegNames;
5826 NumNames = llvm::array_lengthof(GCCRegNames);
5827 }
Craig Topper3164f332014-03-11 03:39:26 +00005828 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5829 unsigned &NumAliases) const override = 0;
5830 bool validateAsmConstraint(const char *&Name,
5831 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005832 switch (*Name) {
5833 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005834 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005835 case 'r': // CPU registers.
5836 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005837 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005838 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005839 case 'c': // $25 for indirect jumps
5840 case 'l': // lo register
5841 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005842 Info.setAllowsRegister();
5843 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005844 case 'I': // Signed 16-bit constant
5845 case 'J': // Integer 0
5846 case 'K': // Unsigned 16-bit constant
5847 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5848 case 'M': // Constants not loadable via lui, addiu, or ori
5849 case 'N': // Constant -1 to -65535
5850 case 'O': // A signed 15-bit constant
5851 case 'P': // A constant between 1 go 65535
5852 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005853 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005854 Info.setAllowsMemory();
5855 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005856 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005857 }
5858
Craig Topper3164f332014-03-11 03:39:26 +00005859 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005860 // In GCC, $1 is not widely used in generated code (it's used only in a few
5861 // specific situations), so there is no real need for users to add it to
5862 // the clobbers list if they want to use it in their inline assembly code.
5863 //
5864 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5865 // code generation, so using it in inline assembly without adding it to the
5866 // clobbers list can cause conflicts between the inline assembly code and
5867 // the surrounding generated code.
5868 //
5869 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5870 // operands, which will conflict with the ".set at" assembler option (which
5871 // we use only for inline assembly, in order to maintain compatibility with
5872 // GCC) and will also conflict with the user's usage of $1.
5873 //
5874 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5875 // register for generated code is to automatically clobber $1 for all inline
5876 // assembly code.
5877 //
5878 // FIXME: We should automatically clobber $1 only for inline assembly code
5879 // which actually uses it. This would allow LLVM to use $1 for inline
5880 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005881 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005882 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005883
Craig Topper3164f332014-03-11 03:39:26 +00005884 bool handleTargetFeatures(std::vector<std::string> &Features,
5885 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005886 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005887 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005888 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005889 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005890 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005891 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005892 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005893
5894 for (std::vector<std::string>::iterator it = Features.begin(),
5895 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005896 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005897 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005898 else if (*it == "+soft-float")
5899 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005900 else if (*it == "+mips16")
5901 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005902 else if (*it == "+micromips")
5903 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005904 else if (*it == "+dsp")
5905 DspRev = std::max(DspRev, DSP1);
5906 else if (*it == "+dspr2")
5907 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005908 else if (*it == "+msa")
5909 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005910 else if (*it == "+fp64")
5911 HasFP64 = true;
5912 else if (*it == "-fp64")
5913 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005914 else if (*it == "+nan2008")
5915 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005916 else if (*it == "-nan2008")
5917 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005918 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005919
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005920 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005921 std::vector<std::string>::iterator it =
5922 std::find(Features.begin(), Features.end(), "+soft-float");
5923 if (it != Features.end())
5924 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005925
Akira Hatanaka9064e362013-10-29 18:30:33 +00005926 setDescriptionString();
5927
Rafael Espindolaeb265472013-08-21 21:59:03 +00005928 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005929 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005930
Craig Topper3164f332014-03-11 03:39:26 +00005931 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005932 if (RegNo == 0) return 4;
5933 if (RegNo == 1) return 5;
5934 return -1;
5935 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005936
5937 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005938};
5939
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005940const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5941#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5942#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5943 ALL_LANGUAGES },
5944#include "clang/Basic/BuiltinsMips.def"
5945};
5946
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005947class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005948public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005949 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005950 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005951 SizeType = UnsignedInt;
5952 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00005953 Int64Type = SignedLongLong;
5954 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005955 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005956 }
Craig Topper3164f332014-03-11 03:39:26 +00005957 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005958 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005959 ABI = Name;
5960 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005961 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005962 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005963 }
Craig Topper3164f332014-03-11 03:39:26 +00005964 void getTargetDefines(const LangOptions &Opts,
5965 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005966 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005967
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005968 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005969 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5970
5971 const std::string& CPUStr = getCPU();
5972 if (CPUStr == "mips32")
5973 Builder.defineMacro("__mips_isa_rev", "1");
5974 else if (CPUStr == "mips32r2")
5975 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00005976 else if (CPUStr == "mips32r3")
5977 Builder.defineMacro("__mips_isa_rev", "3");
5978 else if (CPUStr == "mips32r5")
5979 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00005980 else if (CPUStr == "mips32r6")
5981 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005982
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005983 if (ABI == "o32") {
5984 Builder.defineMacro("__mips_o32");
5985 Builder.defineMacro("_ABIO32", "1");
5986 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5987 }
5988 else if (ABI == "eabi")
5989 Builder.defineMacro("__mips_eabi");
5990 else
David Blaikie83d382b2011-09-23 05:06:16 +00005991 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005992 }
Craig Topper3164f332014-03-11 03:39:26 +00005993 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5994 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005995 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5996 { { "at" }, "$1" },
5997 { { "v0" }, "$2" },
5998 { { "v1" }, "$3" },
5999 { { "a0" }, "$4" },
6000 { { "a1" }, "$5" },
6001 { { "a2" }, "$6" },
6002 { { "a3" }, "$7" },
6003 { { "t0" }, "$8" },
6004 { { "t1" }, "$9" },
6005 { { "t2" }, "$10" },
6006 { { "t3" }, "$11" },
6007 { { "t4" }, "$12" },
6008 { { "t5" }, "$13" },
6009 { { "t6" }, "$14" },
6010 { { "t7" }, "$15" },
6011 { { "s0" }, "$16" },
6012 { { "s1" }, "$17" },
6013 { { "s2" }, "$18" },
6014 { { "s3" }, "$19" },
6015 { { "s4" }, "$20" },
6016 { { "s5" }, "$21" },
6017 { { "s6" }, "$22" },
6018 { { "s7" }, "$23" },
6019 { { "t8" }, "$24" },
6020 { { "t9" }, "$25" },
6021 { { "k0" }, "$26" },
6022 { { "k1" }, "$27" },
6023 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006024 { { "sp","$sp" }, "$29" },
6025 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006026 { { "ra" }, "$31" }
6027 };
6028 Aliases = GCCRegAliases;
6029 NumAliases = llvm::array_lengthof(GCCRegAliases);
6030 }
6031};
6032
6033class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006034 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006035 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006036 }
6037
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006038public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006039 Mips32EBTargetInfo(const llvm::Triple &Triple)
6040 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006041 }
Craig Topper3164f332014-03-11 03:39:26 +00006042 void getTargetDefines(const LangOptions &Opts,
6043 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006044 DefineStd(Builder, "MIPSEB", Opts);
6045 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006046 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006047 }
6048};
6049
6050class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006051 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006052 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006053 }
6054
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006055public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006056 Mips32ELTargetInfo(const llvm::Triple &Triple)
6057 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006058 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006059 }
Craig Topper3164f332014-03-11 03:39:26 +00006060 void getTargetDefines(const LangOptions &Opts,
6061 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006062 DefineStd(Builder, "MIPSEL", Opts);
6063 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006064 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006065 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006066};
Akira Hatanakabef17452011-09-20 19:21:49 +00006067
6068class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006069public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006070 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006071 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006072 LongDoubleWidth = LongDoubleAlign = 128;
6073 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006074 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6075 LongDoubleWidth = LongDoubleAlign = 64;
6076 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6077 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006078 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006079 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006080 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006081 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006082
6083 void setN64ABITypes() {
6084 LongWidth = LongAlign = 64;
6085 PointerWidth = PointerAlign = 64;
6086 SizeType = UnsignedLong;
6087 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006088 Int64Type = SignedLong;
6089 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006090 }
6091
6092 void setN32ABITypes() {
6093 LongWidth = LongAlign = 32;
6094 PointerWidth = PointerAlign = 32;
6095 SizeType = UnsignedInt;
6096 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006097 Int64Type = SignedLongLong;
6098 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006099 }
6100
Craig Topper3164f332014-03-11 03:39:26 +00006101 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006102 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006103 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006104 ABI = Name;
6105 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006106 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006107 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006108 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006109 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006110 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006111 }
6112 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006113 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006114
Craig Topper3164f332014-03-11 03:39:26 +00006115 void getTargetDefines(const LangOptions &Opts,
6116 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006117 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006118
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006119 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006120 Builder.defineMacro("__mips64");
6121 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006122 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6123
6124 const std::string& CPUStr = getCPU();
6125 if (CPUStr == "mips64")
6126 Builder.defineMacro("__mips_isa_rev", "1");
6127 else if (CPUStr == "mips64r2")
6128 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006129 else if (CPUStr == "mips64r3")
6130 Builder.defineMacro("__mips_isa_rev", "3");
6131 else if (CPUStr == "mips64r5")
6132 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006133 else if (CPUStr == "mips64r6")
6134 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006135
Akira Hatanakabef17452011-09-20 19:21:49 +00006136 if (ABI == "n32") {
6137 Builder.defineMacro("__mips_n32");
6138 Builder.defineMacro("_ABIN32", "2");
6139 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6140 }
6141 else if (ABI == "n64") {
6142 Builder.defineMacro("__mips_n64");
6143 Builder.defineMacro("_ABI64", "3");
6144 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6145 }
6146 else
David Blaikie83d382b2011-09-23 05:06:16 +00006147 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006148 }
Craig Topper3164f332014-03-11 03:39:26 +00006149 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6150 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006151 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6152 { { "at" }, "$1" },
6153 { { "v0" }, "$2" },
6154 { { "v1" }, "$3" },
6155 { { "a0" }, "$4" },
6156 { { "a1" }, "$5" },
6157 { { "a2" }, "$6" },
6158 { { "a3" }, "$7" },
6159 { { "a4" }, "$8" },
6160 { { "a5" }, "$9" },
6161 { { "a6" }, "$10" },
6162 { { "a7" }, "$11" },
6163 { { "t0" }, "$12" },
6164 { { "t1" }, "$13" },
6165 { { "t2" }, "$14" },
6166 { { "t3" }, "$15" },
6167 { { "s0" }, "$16" },
6168 { { "s1" }, "$17" },
6169 { { "s2" }, "$18" },
6170 { { "s3" }, "$19" },
6171 { { "s4" }, "$20" },
6172 { { "s5" }, "$21" },
6173 { { "s6" }, "$22" },
6174 { { "s7" }, "$23" },
6175 { { "t8" }, "$24" },
6176 { { "t9" }, "$25" },
6177 { { "k0" }, "$26" },
6178 { { "k1" }, "$27" },
6179 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006180 { { "sp","$sp" }, "$29" },
6181 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006182 { { "ra" }, "$31" }
6183 };
6184 Aliases = GCCRegAliases;
6185 NumAliases = llvm::array_lengthof(GCCRegAliases);
6186 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006187
6188 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006189};
6190
6191class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006192 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006193 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006194 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 +00006195 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006196 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006197
Akira Hatanakabef17452011-09-20 19:21:49 +00006198 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006199
Akira Hatanakabef17452011-09-20 19:21:49 +00006200public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006201 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006202 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006203 void getTargetDefines(const LangOptions &Opts,
6204 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006205 DefineStd(Builder, "MIPSEB", Opts);
6206 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006207 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006208 }
6209};
6210
6211class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006212 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006213 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006214 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 +00006215 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006216 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006217 }
6218public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006219 Mips64ELTargetInfo(const llvm::Triple &Triple)
6220 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006221 // Default ABI is n64.
6222 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006223 }
Craig Topper3164f332014-03-11 03:39:26 +00006224 void getTargetDefines(const LangOptions &Opts,
6225 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006226 DefineStd(Builder, "MIPSEL", Opts);
6227 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006228 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006229 }
6230};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006231
Ivan Krasindd7403e2011-08-24 20:22:22 +00006232class PNaClTargetInfo : public TargetInfo {
6233public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006234 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006235 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006236 this->UserLabelPrefix = "";
6237 this->LongAlign = 32;
6238 this->LongWidth = 32;
6239 this->PointerAlign = 32;
6240 this->PointerWidth = 32;
6241 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006242 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006243 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006244 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006245 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006246 this->SizeType = TargetInfo::UnsignedInt;
6247 this->PtrDiffType = TargetInfo::SignedInt;
6248 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006249 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006250 }
6251
Craig Topper3164f332014-03-11 03:39:26 +00006252 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006253 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006254 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006255 Builder.defineMacro("__le32__");
6256 Builder.defineMacro("__pnacl__");
6257 }
Craig Topper3164f332014-03-11 03:39:26 +00006258 void getTargetDefines(const LangOptions &Opts,
6259 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006260 getArchDefines(Opts, Builder);
6261 }
Craig Topper3164f332014-03-11 03:39:26 +00006262 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006263 return Feature == "pnacl";
6264 }
Craig Topper3164f332014-03-11 03:39:26 +00006265 void getTargetBuiltins(const Builtin::Info *&Records,
6266 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006267 }
Craig Topper3164f332014-03-11 03:39:26 +00006268 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006269 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006270 }
Craig Topper3164f332014-03-11 03:39:26 +00006271 void getGCCRegNames(const char * const *&Names,
6272 unsigned &NumNames) const override;
6273 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6274 unsigned &NumAliases) const override;
6275 bool validateAsmConstraint(const char *&Name,
6276 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006277 return false;
6278 }
6279
Craig Topper3164f332014-03-11 03:39:26 +00006280 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006281 return "";
6282 }
6283};
6284
6285void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6286 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006287 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006288 NumNames = 0;
6289}
6290
6291void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6292 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006293 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006294 NumAliases = 0;
6295}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006296
JF Bastien643817d2014-09-12 17:52:47 +00006297class Le64TargetInfo : public TargetInfo {
6298 static const Builtin::Info BuiltinInfo[];
6299
6300public:
6301 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6302 BigEndian = false;
6303 NoAsmVariants = true;
6304 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6305 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6306 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006307 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006308 }
6309
6310 void getTargetDefines(const LangOptions &Opts,
6311 MacroBuilder &Builder) const override {
6312 DefineStd(Builder, "unix", Opts);
6313 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6314 Builder.defineMacro("__ELF__");
6315 }
6316 void getTargetBuiltins(const Builtin::Info *&Records,
6317 unsigned &NumRecords) const override {
6318 Records = BuiltinInfo;
6319 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6320 }
6321 BuiltinVaListKind getBuiltinVaListKind() const override {
6322 return TargetInfo::PNaClABIBuiltinVaList;
6323 }
6324 const char *getClobbers() const override { return ""; }
6325 void getGCCRegNames(const char *const *&Names,
6326 unsigned &NumNames) const override {
6327 Names = nullptr;
6328 NumNames = 0;
6329 }
6330 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6331 unsigned &NumAliases) const override {
6332 Aliases = nullptr;
6333 NumAliases = 0;
6334 }
6335 bool validateAsmConstraint(const char *&Name,
6336 TargetInfo::ConstraintInfo &Info) const override {
6337 return false;
6338 }
6339
6340 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006341};
6342} // end anonymous namespace.
6343
6344const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6345#define BUILTIN(ID, TYPE, ATTRS) \
6346 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6347#include "clang/Basic/BuiltinsLe64.def"
6348};
6349
6350namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006351 static const unsigned SPIRAddrSpaceMap[] = {
6352 1, // opencl_global
6353 3, // opencl_local
6354 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006355 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006356 0, // cuda_device
6357 0, // cuda_constant
6358 0 // cuda_shared
6359 };
6360 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006361 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006362 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006363 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6364 "SPIR target must use unknown OS");
6365 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6366 "SPIR target must use unknown environment type");
6367 BigEndian = false;
6368 TLSSupported = false;
6369 LongWidth = LongAlign = 64;
6370 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006371 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006372 // Define available target features
6373 // These must be defined in sorted order!
6374 NoAsmVariants = true;
6375 }
Craig Topper3164f332014-03-11 03:39:26 +00006376 void getTargetDefines(const LangOptions &Opts,
6377 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006378 DefineStd(Builder, "SPIR", Opts);
6379 }
Craig Topper3164f332014-03-11 03:39:26 +00006380 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006381 return Feature == "spir";
6382 }
Craig Topper3164f332014-03-11 03:39:26 +00006383
6384 void getTargetBuiltins(const Builtin::Info *&Records,
6385 unsigned &NumRecords) const override {}
6386 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006387 return "";
6388 }
Craig Topper3164f332014-03-11 03:39:26 +00006389 void getGCCRegNames(const char * const *&Names,
6390 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006391 bool
6392 validateAsmConstraint(const char *&Name,
6393 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006394 return true;
6395 }
Craig Topper3164f332014-03-11 03:39:26 +00006396 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6397 unsigned &NumAliases) const override {}
6398 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006399 return TargetInfo::VoidPtrBuiltinVaList;
6400 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006401
6402 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6403 return (CC == CC_SpirFunction ||
6404 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6405 }
6406
6407 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6408 return CC_SpirFunction;
6409 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006410 };
6411
6412
6413 class SPIR32TargetInfo : public SPIRTargetInfo {
6414 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006415 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006416 PointerWidth = PointerAlign = 32;
6417 SizeType = TargetInfo::UnsignedInt;
6418 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6419 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006420 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6421 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006422 }
Craig Topper3164f332014-03-11 03:39:26 +00006423 void getTargetDefines(const LangOptions &Opts,
6424 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006425 DefineStd(Builder, "SPIR32", Opts);
6426 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006427 };
6428
6429 class SPIR64TargetInfo : public SPIRTargetInfo {
6430 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006431 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006432 PointerWidth = PointerAlign = 64;
6433 SizeType = TargetInfo::UnsignedLong;
6434 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006435 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6436 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006437 }
Craig Topper3164f332014-03-11 03:39:26 +00006438 void getTargetDefines(const LangOptions &Opts,
6439 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006440 DefineStd(Builder, "SPIR64", Opts);
6441 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006442 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006443
Robert Lytton0e076492013-08-13 09:43:10 +00006444class XCoreTargetInfo : public TargetInfo {
6445 static const Builtin::Info BuiltinInfo[];
6446public:
6447 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6448 BigEndian = false;
6449 NoAsmVariants = true;
6450 LongLongAlign = 32;
6451 SuitableAlign = 32;
6452 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006453 SizeType = UnsignedInt;
6454 PtrDiffType = SignedInt;
6455 IntPtrType = SignedInt;
6456 WCharType = UnsignedChar;
6457 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006458 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006459 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 +00006460 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006461 }
Craig Topper3164f332014-03-11 03:39:26 +00006462 void getTargetDefines(const LangOptions &Opts,
6463 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006464 Builder.defineMacro("__XS1B__");
6465 }
Craig Topper3164f332014-03-11 03:39:26 +00006466 void getTargetBuiltins(const Builtin::Info *&Records,
6467 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006468 Records = BuiltinInfo;
6469 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6470 }
Craig Topper3164f332014-03-11 03:39:26 +00006471 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006472 return TargetInfo::VoidPtrBuiltinVaList;
6473 }
Craig Topper3164f332014-03-11 03:39:26 +00006474 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006475 return "";
6476 }
Craig Topper3164f332014-03-11 03:39:26 +00006477 void getGCCRegNames(const char * const *&Names,
6478 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006479 static const char * const GCCRegNames[] = {
6480 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6481 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6482 };
6483 Names = GCCRegNames;
6484 NumNames = llvm::array_lengthof(GCCRegNames);
6485 }
Craig Topper3164f332014-03-11 03:39:26 +00006486 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6487 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006488 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006489 NumAliases = 0;
6490 }
Craig Topper3164f332014-03-11 03:39:26 +00006491 bool validateAsmConstraint(const char *&Name,
6492 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006493 return false;
6494 }
Craig Topper3164f332014-03-11 03:39:26 +00006495 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006496 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6497 return (RegNo < 2)? RegNo : -1;
6498 }
Robert Lytton0e076492013-08-13 09:43:10 +00006499};
6500
6501const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6502#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6503#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6504 ALL_LANGUAGES },
6505#include "clang/Basic/BuiltinsXCore.def"
6506};
6507} // end anonymous namespace.
6508
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006509namespace {
6510// x86_32 Android target
6511class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6512public:
6513 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6514 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6515 SuitableAlign = 32;
6516 LongDoubleWidth = 64;
6517 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6518 }
6519};
6520} // end anonymous namespace
6521
6522namespace {
6523// x86_64 Android target
6524class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6525public:
6526 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6527 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6528 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6529 }
6530};
6531} // end anonymous namespace
6532
Ivan Krasindd7403e2011-08-24 20:22:22 +00006533
Chris Lattner5ba61f02006-10-14 07:39:34 +00006534//===----------------------------------------------------------------------===//
6535// Driver code
6536//===----------------------------------------------------------------------===//
6537
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006538static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006539 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006540
Daniel Dunbar52322032009-08-18 05:47:58 +00006541 switch (Triple.getArch()) {
6542 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006543 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006544
Tim Northover2a0783d2014-05-30 14:14:07 +00006545 case llvm::Triple::xcore:
6546 return new XCoreTargetInfo(Triple);
6547
6548 case llvm::Triple::hexagon:
6549 return new HexagonTargetInfo(Triple);
6550
6551 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006552 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006553 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006554
6555 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006556 case llvm::Triple::FreeBSD:
6557 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006558 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006559 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006560 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006561 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006562 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006563 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006564 }
6565
Christian Pirker9b019ae2014-02-25 13:51:00 +00006566 case llvm::Triple::aarch64_be:
6567 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006568 case llvm::Triple::FreeBSD:
6569 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006570 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006571 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006572 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006573 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006574 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006575 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006576 }
6577
Daniel Dunbar52322032009-08-18 05:47:58 +00006578 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006579 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006580 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006581 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006582
Daniel Dunbar52322032009-08-18 05:47:58 +00006583 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006584 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006585 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006586 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006587 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006588 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006589 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006590 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006591 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006592 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006593 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006594 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006595 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006596 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006597 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006598 case llvm::Triple::Win32:
6599 switch (Triple.getEnvironment()) {
6600 default:
6601 return new ARMleTargetInfo(Triple);
6602 case llvm::Triple::Itanium:
6603 return new ItaniumWindowsARMleTargetInfo(Triple);
6604 case llvm::Triple::MSVC:
6605 return new MicrosoftARMleTargetInfo(Triple);
6606 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006607 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006608 return new ARMleTargetInfo(Triple);
6609 }
6610
6611 case llvm::Triple::armeb:
6612 case llvm::Triple::thumbeb:
6613 if (Triple.isOSDarwin())
6614 return new DarwinARMTargetInfo(Triple);
6615
6616 switch (os) {
6617 case llvm::Triple::Linux:
6618 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6619 case llvm::Triple::FreeBSD:
6620 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6621 case llvm::Triple::NetBSD:
6622 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6623 case llvm::Triple::OpenBSD:
6624 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6625 case llvm::Triple::Bitrig:
6626 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6627 case llvm::Triple::RTEMS:
6628 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6629 case llvm::Triple::NaCl:
6630 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6631 default:
6632 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006633 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006634
Daniel Dunbar52322032009-08-18 05:47:58 +00006635 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006636 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006637
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006638 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006639 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006640 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006641 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006642 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006643 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006644 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006645 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006646 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006647 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006648 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006649 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006650 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006651
6652 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006653 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006654 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006655 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006656 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006657 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006658 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006659 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006660 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006661 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006662 case llvm::Triple::NaCl:
6663 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006664 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006665 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006666 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006667
Akira Hatanakabef17452011-09-20 19:21:49 +00006668 case llvm::Triple::mips64:
6669 switch (os) {
6670 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006671 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006672 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006673 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006674 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006675 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006676 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006677 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006678 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006679 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006680 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006681 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006682 }
6683
6684 case llvm::Triple::mips64el:
6685 switch (os) {
6686 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006687 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006688 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006689 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006690 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006691 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006692 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006693 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006694 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006695 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006696 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006697 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006698 }
6699
Ivan Krasindd7403e2011-08-24 20:22:22 +00006700 case llvm::Triple::le32:
6701 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006702 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006703 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006704 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006705 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006706 }
6707
JF Bastien643817d2014-09-12 17:52:47 +00006708 case llvm::Triple::le64:
6709 return new Le64TargetInfo(Triple);
6710
Daniel Dunbar52322032009-08-18 05:47:58 +00006711 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006712 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006713 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006714 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006715 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006716 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006717 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006718 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006719 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006720 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006721 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006722 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006723 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006724 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006725 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006726 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006727 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006728
6729 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006730 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006731 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006732 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006733 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006734 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006735 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006736 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006737 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006738 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006739 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006740 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006741 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006742 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006743 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006744
Bill Schmidt778d3872013-07-26 01:36:11 +00006745 case llvm::Triple::ppc64le:
6746 switch (os) {
6747 case llvm::Triple::Linux:
6748 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6749 default:
6750 return new PPC64TargetInfo(Triple);
6751 }
6752
Peter Collingbournec947aae2012-05-20 23:28:41 +00006753 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006754 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006755 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006756 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006757
Tom Stellardd8e38a32015-01-06 20:34:47 +00006758 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006759 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006760 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006761
Daniel Dunbar52322032009-08-18 05:47:58 +00006762 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006763 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006764 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006765 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006766 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006767 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006768 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006769 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006770 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006771 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006772 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006773 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006774 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006775 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006776 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006777
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006778 case llvm::Triple::sparcv9:
6779 switch (os) {
6780 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006781 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006782 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006783 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006784 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006785 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006786 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006787 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006788 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006789 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006790 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006791 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006792 }
6793
Ulrich Weigand47445072013-05-06 16:26:41 +00006794 case llvm::Triple::systemz:
6795 switch (os) {
6796 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006797 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006798 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006799 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006800 }
6801
Eli Friedmana9c3d712009-08-19 20:47:07 +00006802 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006803 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006804
Daniel Dunbar52322032009-08-18 05:47:58 +00006805 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006806 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006807 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006808
Daniel Dunbar52322032009-08-18 05:47:58 +00006809 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006810 case llvm::Triple::Linux: {
6811 switch (Triple.getEnvironment()) {
6812 default:
6813 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6814 case llvm::Triple::Android:
6815 return new AndroidX86_32TargetInfo(Triple);
6816 }
6817 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006818 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006819 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006820 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006821 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006822 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006823 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006824 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006825 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006826 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006827 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006828 case llvm::Triple::KFreeBSD:
6829 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006830 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006831 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006832 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006833 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006834 case llvm::Triple::Win32: {
6835 switch (Triple.getEnvironment()) {
6836 default:
6837 return new X86_32TargetInfo(Triple);
6838 case llvm::Triple::Cygnus:
6839 return new CygwinX86_32TargetInfo(Triple);
6840 case llvm::Triple::GNU:
6841 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006842 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006843 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006844 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006845 }
6846 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006847 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006848 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006849 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006850 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006851 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006852 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006853 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006854 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006855 }
6856
6857 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006858 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006859 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006860
Daniel Dunbar52322032009-08-18 05:47:58 +00006861 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00006862 case llvm::Triple::CloudABI:
6863 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006864 case llvm::Triple::Linux: {
6865 switch (Triple.getEnvironment()) {
6866 default:
6867 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
6868 case llvm::Triple::Android:
6869 return new AndroidX86_64TargetInfo(Triple);
6870 }
6871 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00006872 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006873 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006874 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006875 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006876 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006877 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006878 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006879 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006880 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006881 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006882 case llvm::Triple::KFreeBSD:
6883 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006884 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006885 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006886 case llvm::Triple::Win32: {
6887 switch (Triple.getEnvironment()) {
6888 default:
6889 return new X86_64TargetInfo(Triple);
6890 case llvm::Triple::GNU:
6891 return new MinGWX86_64TargetInfo(Triple);
6892 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006893 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006894 }
6895 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006896 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006897 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006898 case llvm::Triple::PS4:
6899 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006900 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006901 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006902 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006903
6904 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006905 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006906 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006907 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006908 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006909 }
6910 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006911 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006912 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006913 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006914 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006915 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006916 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006917}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006918
6919/// CreateTargetInfo - Return the target info object for the specified target
6920/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006921TargetInfo *
6922TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6923 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006924 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006925
6926 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006927 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006928 if (!Target) {
6929 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006930 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006931 }
Alp Toker80758082014-07-06 05:26:44 +00006932 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006933
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006934 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006935 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6936 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006937 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006938 }
6939
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006940 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006941 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6942 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006943 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006944 }
6945
Rafael Espindolaeb265472013-08-21 21:59:03 +00006946 // Set the fp math unit.
6947 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6948 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006949 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006950 }
6951
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006952 // Compute the default target features, we need the target to handle this
6953 // because features may have dependencies on one another.
6954 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006955 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006956
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006957 // Apply the user specified deltas.
6958 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6959 I < N; ++I) {
6960 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006961 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006962 bool Enabled = Name[0] == '+';
6963 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006964 }
6965
6966 // Add the features to the compile options.
6967 //
6968 // FIXME: If we are completely confident that we have the right set, we only
6969 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006970 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006971 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6972 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006973 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006974 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006975 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006976
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006977 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006978}