blob: 56b884d4ae66a71dc4cc2c67fa8f90d0ca7d1905 [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
Chris Lattner30ba6742009-08-10 19:03:04 +0000186namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000187template<typename Target>
188class DarwinTargetInfo : public OSTargetInfo<Target> {
189protected:
Craig Topper3164f332014-03-11 03:39:26 +0000190 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
191 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000192 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000193 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000194 }
Mike Stump11289f42009-09-09 15:08:12 +0000195
Torok Edwinb2b37c62009-06-30 17:10:35 +0000196public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000197 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
198 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
199 this->MCountName = "\01mcount";
200 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000201
Craig Topper3164f332014-03-11 03:39:26 +0000202 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000203 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000204 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000205 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000206 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000207 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000208 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000209 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000210
Craig Topper3164f332014-03-11 03:39:26 +0000211 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000212 // FIXME: We should return 0 when building kexts.
213 return "__TEXT,__StaticInit,regular,pure_instructions";
214 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000215
John McCalleed64c72012-01-29 01:20:30 +0000216 /// Darwin does not support protected visibility. Darwin's "default"
217 /// is very similar to ELF's "protected"; Darwin requires a "weak"
218 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000219 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000220 return false;
221 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222};
223
Chris Lattner30ba6742009-08-10 19:03:04 +0000224
Torok Edwinb2b37c62009-06-30 17:10:35 +0000225// DragonFlyBSD Target
226template<typename Target>
227class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
228protected:
Craig Topper3164f332014-03-11 03:39:26 +0000229 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
230 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000231 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000232 Builder.defineMacro("__DragonFly__");
233 Builder.defineMacro("__DragonFly_cc_version", "100001");
234 Builder.defineMacro("__ELF__");
235 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
236 Builder.defineMacro("__tune_i386__");
237 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000238 }
239public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000240 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
241 : OSTargetInfo<Target>(Triple) {
242 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000243
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000244 switch (Triple.getArch()) {
245 default:
246 case llvm::Triple::x86:
247 case llvm::Triple::x86_64:
248 this->MCountName = ".mcount";
249 break;
250 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000251 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000252};
253
254// FreeBSD Target
255template<typename Target>
256class FreeBSDTargetInfo : public OSTargetInfo<Target> {
257protected:
Craig Topper3164f332014-03-11 03:39:26 +0000258 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
259 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260 // FreeBSD defines; list based off of gcc output
261
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000262 unsigned Release = Triple.getOSMajorVersion();
263 if (Release == 0U)
264 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000265
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000266 Builder.defineMacro("__FreeBSD__", Twine(Release));
267 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000268 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
269 DefineStd(Builder, "unix", Opts);
270 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000271
272 // On FreeBSD, wchar_t contains the number of the code point as
273 // used by the character set of the locale. These character sets are
274 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000275 //
276 // FIXME: This is wrong; the macro refers to the numerical values
277 // of wchar_t *literals*, which are not locale-dependent. However,
278 // FreeBSD systems apparently depend on us getting this wrong, and
279 // setting this to 1 is conforming even if all the basic source
280 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000281 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282 }
283public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000284 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
285 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000286
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000287 switch (Triple.getArch()) {
288 default:
289 case llvm::Triple::x86:
290 case llvm::Triple::x86_64:
291 this->MCountName = ".mcount";
292 break;
293 case llvm::Triple::mips:
294 case llvm::Triple::mipsel:
295 case llvm::Triple::ppc:
296 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000297 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000298 this->MCountName = "_mcount";
299 break;
300 case llvm::Triple::arm:
301 this->MCountName = "__mcount";
302 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000303 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000304 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000305};
306
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000307// GNU/kFreeBSD Target
308template<typename Target>
309class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
310protected:
Craig Topper3164f332014-03-11 03:39:26 +0000311 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
312 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000313 // GNU/kFreeBSD defines; list based off of gcc output
314
315 DefineStd(Builder, "unix", Opts);
316 Builder.defineMacro("__FreeBSD_kernel__");
317 Builder.defineMacro("__GLIBC__");
318 Builder.defineMacro("__ELF__");
319 if (Opts.POSIXThreads)
320 Builder.defineMacro("_REENTRANT");
321 if (Opts.CPlusPlus)
322 Builder.defineMacro("_GNU_SOURCE");
323 }
324public:
Eric Christopher917e9522014-11-18 22:36:15 +0000325 KFreeBSDTargetInfo(const llvm::Triple &Triple)
326 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000327 this->UserLabelPrefix = "";
328 }
329};
330
Chris Lattner3e2ee142010-07-07 16:01:42 +0000331// Minix Target
332template<typename Target>
333class MinixTargetInfo : public OSTargetInfo<Target> {
334protected:
Craig Topper3164f332014-03-11 03:39:26 +0000335 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
336 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000337 // Minix defines
338
339 Builder.defineMacro("__minix", "3");
340 Builder.defineMacro("_EM_WSIZE", "4");
341 Builder.defineMacro("_EM_PSIZE", "4");
342 Builder.defineMacro("_EM_SSIZE", "2");
343 Builder.defineMacro("_EM_LSIZE", "4");
344 Builder.defineMacro("_EM_FSIZE", "4");
345 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000346 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000347 DefineStd(Builder, "unix", Opts);
348 }
349public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000350 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
351 this->UserLabelPrefix = "";
352 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000353};
354
Torok Edwinb2b37c62009-06-30 17:10:35 +0000355// Linux target
356template<typename Target>
357class LinuxTargetInfo : public OSTargetInfo<Target> {
358protected:
Craig Topper3164f332014-03-11 03:39:26 +0000359 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
360 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000361 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000362 DefineStd(Builder, "unix", Opts);
363 DefineStd(Builder, "linux", Opts);
364 Builder.defineMacro("__gnu_linux__");
365 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000366 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000367 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000368 unsigned Maj, Min, Rev;
369 Triple.getOSVersion(Maj, Min, Rev);
370 this->PlatformName = "android";
371 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
372 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000373 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000374 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000375 if (Opts.CPlusPlus)
376 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000377 }
378public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000379 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000380 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000381 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000382
383 switch (Triple.getArch()) {
384 default:
385 break;
386 case llvm::Triple::ppc:
387 case llvm::Triple::ppc64:
388 case llvm::Triple::ppc64le:
389 this->MCountName = "_mcount";
390 break;
391 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000392 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000393
Craig Topper3164f332014-03-11 03:39:26 +0000394 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000395 return ".text.startup";
396 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000397};
398
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000399// NetBSD Target
400template<typename Target>
401class NetBSDTargetInfo : public OSTargetInfo<Target> {
402protected:
Craig Topper3164f332014-03-11 03:39:26 +0000403 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
404 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000405 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000406 Builder.defineMacro("__NetBSD__");
407 Builder.defineMacro("__unix__");
408 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000409 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000410 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000411
412 switch (Triple.getArch()) {
413 default:
414 break;
415 case llvm::Triple::arm:
416 case llvm::Triple::armeb:
417 case llvm::Triple::thumb:
418 case llvm::Triple::thumbeb:
419 Builder.defineMacro("__ARM_DWARF_EH__");
420 break;
421 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000422 }
423public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000424 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
425 this->UserLabelPrefix = "";
426 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000427};
428
Torok Edwinb2b37c62009-06-30 17:10:35 +0000429// OpenBSD Target
430template<typename Target>
431class OpenBSDTargetInfo : public OSTargetInfo<Target> {
432protected:
Craig Topper3164f332014-03-11 03:39:26 +0000433 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
434 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000435 // OpenBSD defines; list based off of gcc output
436
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000437 Builder.defineMacro("__OpenBSD__");
438 DefineStd(Builder, "unix", Opts);
439 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000440 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000441 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000442 }
443public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000444 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
445 this->UserLabelPrefix = "";
446 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000447
Eli Friedman3715d1f2011-12-15 02:15:56 +0000448 switch (Triple.getArch()) {
449 default:
450 case llvm::Triple::x86:
451 case llvm::Triple::x86_64:
452 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000453 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000454 this->MCountName = "__mcount";
455 break;
456 case llvm::Triple::mips64:
457 case llvm::Triple::mips64el:
458 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000459 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000460 this->MCountName = "_mcount";
461 break;
462 }
463 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000464};
465
Eli Friedman9fa28852012-08-08 23:57:20 +0000466// Bitrig Target
467template<typename Target>
468class BitrigTargetInfo : public OSTargetInfo<Target> {
469protected:
Craig Topper3164f332014-03-11 03:39:26 +0000470 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
471 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000472 // Bitrig defines; list based off of gcc output
473
474 Builder.defineMacro("__Bitrig__");
475 DefineStd(Builder, "unix", Opts);
476 Builder.defineMacro("__ELF__");
477 if (Opts.POSIXThreads)
478 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000479
480 switch (Triple.getArch()) {
481 default:
482 break;
483 case llvm::Triple::arm:
484 case llvm::Triple::armeb:
485 case llvm::Triple::thumb:
486 case llvm::Triple::thumbeb:
487 Builder.defineMacro("__ARM_DWARF_EH__");
488 break;
489 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000490 }
491public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000492 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
493 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000494 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000495 }
496};
497
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000498// PSP Target
499template<typename Target>
500class PSPTargetInfo : public OSTargetInfo<Target> {
501protected:
Craig Topper3164f332014-03-11 03:39:26 +0000502 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
503 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000504 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000505 Builder.defineMacro("PSP");
506 Builder.defineMacro("_PSP");
507 Builder.defineMacro("__psp__");
508 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000509 }
510public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000511 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000512 this->UserLabelPrefix = "";
513 }
514};
515
John Thompsone467e192009-11-19 17:18:50 +0000516// PS3 PPU Target
517template<typename Target>
518class PS3PPUTargetInfo : public OSTargetInfo<Target> {
519protected:
Craig Topper3164f332014-03-11 03:39:26 +0000520 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
521 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000522 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000523 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000524 Builder.defineMacro("__PPU__");
525 Builder.defineMacro("__CELLOS_LV2__");
526 Builder.defineMacro("__ELF__");
527 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000528 Builder.defineMacro("_ARCH_PPC64");
529 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000530 }
531public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000533 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000534 this->LongWidth = this->LongAlign = 32;
535 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000536 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000537 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000538 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000539 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000540 }
541};
542
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000543template <typename Target>
544class PS4OSTargetInfo : public OSTargetInfo<Target> {
545protected:
546 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
547 MacroBuilder &Builder) const override {
548 Builder.defineMacro("__FreeBSD__", "9");
549 Builder.defineMacro("__FreeBSD_cc_version", "900001");
550 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
551 DefineStd(Builder, "unix", Opts);
552 Builder.defineMacro("__ELF__");
553 Builder.defineMacro("__PS4__");
554 }
555public:
556 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
557 this->WCharType = this->UnsignedShort;
558
559 this->UserLabelPrefix = "";
560
561 switch (Triple.getArch()) {
562 default:
563 case llvm::Triple::x86_64:
564 this->MCountName = ".mcount";
565 break;
566 }
567 }
568};
569
Torok Edwinb2b37c62009-06-30 17:10:35 +0000570// Solaris target
571template<typename Target>
572class SolarisTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000576 DefineStd(Builder, "sun", Opts);
577 DefineStd(Builder, "unix", Opts);
578 Builder.defineMacro("__ELF__");
579 Builder.defineMacro("__svr4__");
580 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000581 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
582 // newer, but to 500 for everything else. feature_test.h has a check to
583 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000584 // with a new version.
585 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000586 Builder.defineMacro("_XOPEN_SOURCE", "600");
587 else
588 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000589 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000590 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000591 Builder.defineMacro("_LARGEFILE_SOURCE");
592 Builder.defineMacro("_LARGEFILE64_SOURCE");
593 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000594 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000595 }
596public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000597 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000598 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000599 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000600 // FIXME: WIntType should be SignedLong
601 }
602};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000603
604// Windows target
605template<typename Target>
606class WindowsTargetInfo : public OSTargetInfo<Target> {
607protected:
Craig Topper3164f332014-03-11 03:39:26 +0000608 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
609 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000610 Builder.defineMacro("_WIN32");
611 }
612 void getVisualStudioDefines(const LangOptions &Opts,
613 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000614 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000615 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000616 Builder.defineMacro("_CPPRTTI");
617
Reid Kleckner16514352015-01-30 21:42:55 +0000618 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000619 Builder.defineMacro("_CPPUNWIND");
620 }
621
622 if (!Opts.CharIsSigned)
623 Builder.defineMacro("_CHAR_UNSIGNED");
624
625 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
626 // but it works for now.
627 if (Opts.POSIXThreads)
628 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000629
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000630 if (Opts.MSCompatibilityVersion) {
631 Builder.defineMacro("_MSC_VER",
632 Twine(Opts.MSCompatibilityVersion / 100000));
633 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000634 // FIXME We cannot encode the revision information into 32-bits
635 Builder.defineMacro("_MSC_BUILD", Twine(1));
636 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000637
638 if (Opts.MicrosoftExt) {
639 Builder.defineMacro("_MSC_EXTENSIONS");
640
641 if (Opts.CPlusPlus11) {
642 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
643 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
644 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
645 }
646 }
647
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000648 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000649 }
650
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000651public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000652 WindowsTargetInfo(const llvm::Triple &Triple)
653 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000654};
655
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000656template <typename Target>
657class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000658protected:
Craig Topper3164f332014-03-11 03:39:26 +0000659 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
660 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000661 if (Opts.POSIXThreads)
662 Builder.defineMacro("_REENTRANT");
663 if (Opts.CPlusPlus)
664 Builder.defineMacro("_GNU_SOURCE");
665
666 DefineStd(Builder, "unix", Opts);
667 Builder.defineMacro("__ELF__");
668 Builder.defineMacro("__native_client__");
669 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000670
671public:
672 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000673 this->UserLabelPrefix = "";
674 this->LongAlign = 32;
675 this->LongWidth = 32;
676 this->PointerAlign = 32;
677 this->PointerWidth = 32;
678 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000679 this->Int64Type = TargetInfo::SignedLongLong;
680 this->DoubleAlign = 64;
681 this->LongDoubleWidth = 64;
682 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000683 this->LongLongWidth = 64;
684 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000685 this->SizeType = TargetInfo::UnsignedInt;
686 this->PtrDiffType = TargetInfo::SignedInt;
687 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000688 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000689 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000690 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000691 this->DescriptionString =
692 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000693 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000694 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000695 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000696 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000697 } else if (Triple.getArch() == llvm::Triple::mipsel) {
698 // Handled on mips' setDescriptionString.
699 } else {
700 assert(Triple.getArch() == llvm::Triple::le32);
701 this->DescriptionString = "e-p:32:32-i64:64";
702 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000703 }
704};
Mike Stump11289f42009-09-09 15:08:12 +0000705} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000706
Chris Lattner09d98f52008-10-05 21:50:58 +0000707//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000708// Specific target implementations.
709//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000710
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000711namespace {
712// PPC abstract base class
713class PPCTargetInfo : public TargetInfo {
714 static const Builtin::Info BuiltinInfo[];
715 static const char * const GCCRegNames[];
716 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000717 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000718
719 // Target cpu features.
720 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000721 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000722 bool HasP8Crypto;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000723
Ulrich Weigand8afad612014-07-28 13:17:52 +0000724protected:
725 std::string ABI;
726
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000727public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000728 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000729 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
730 HasP8Crypto(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000731 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000732 LongDoubleWidth = LongDoubleAlign = 128;
733 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
734 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000735
Hal Finkel6b984f02012-07-03 16:51:04 +0000736 /// \brief Flags for architecture specific defines.
737 typedef enum {
738 ArchDefineNone = 0,
739 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
740 ArchDefinePpcgr = 1 << 1,
741 ArchDefinePpcsq = 1 << 2,
742 ArchDefine440 = 1 << 3,
743 ArchDefine603 = 1 << 4,
744 ArchDefine604 = 1 << 5,
745 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000746 ArchDefinePwr5 = 1 << 7,
747 ArchDefinePwr5x = 1 << 8,
748 ArchDefinePwr6 = 1 << 9,
749 ArchDefinePwr6x = 1 << 10,
750 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000751 ArchDefinePwr8 = 1 << 12,
752 ArchDefineA2 = 1 << 13,
753 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000754 } ArchDefineTypes;
755
Bill Schmidt38378a02013-02-01 20:23:10 +0000756 // Note: GCC recognizes the following additional cpus:
757 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
758 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
759 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000760 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000761 bool CPUKnown = llvm::StringSwitch<bool>(Name)
762 .Case("generic", true)
763 .Case("440", true)
764 .Case("450", true)
765 .Case("601", true)
766 .Case("602", true)
767 .Case("603", true)
768 .Case("603e", true)
769 .Case("603ev", true)
770 .Case("604", true)
771 .Case("604e", true)
772 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000773 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000774 .Case("g3", true)
775 .Case("7400", true)
776 .Case("g4", true)
777 .Case("7450", true)
778 .Case("g4+", true)
779 .Case("750", true)
780 .Case("970", true)
781 .Case("g5", true)
782 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000783 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000784 .Case("e500mc", true)
785 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000786 .Case("power3", true)
787 .Case("pwr3", true)
788 .Case("power4", true)
789 .Case("pwr4", true)
790 .Case("power5", true)
791 .Case("pwr5", true)
792 .Case("power5x", true)
793 .Case("pwr5x", true)
794 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000795 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000796 .Case("power6x", true)
797 .Case("pwr6x", true)
798 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000799 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000800 .Case("power8", true)
801 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000802 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000803 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000804 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000805 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000806 .Case("powerpc64le", true)
807 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000808 .Default(false);
809
810 if (CPUKnown)
811 CPU = Name;
812
813 return CPUKnown;
814 }
815
Ulrich Weigand8afad612014-07-28 13:17:52 +0000816
817 StringRef getABI() const override { return ABI; }
818
Craig Topper3164f332014-03-11 03:39:26 +0000819 void getTargetBuiltins(const Builtin::Info *&Records,
820 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000821 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000822 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000823 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000824
Craig Topper3164f332014-03-11 03:39:26 +0000825 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000826
Craig Topper3164f332014-03-11 03:39:26 +0000827 void getTargetDefines(const LangOptions &Opts,
828 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000829
Craig Topper3164f332014-03-11 03:39:26 +0000830 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000831
Craig Topper3164f332014-03-11 03:39:26 +0000832 bool handleTargetFeatures(std::vector<std::string> &Features,
833 DiagnosticsEngine &Diags) override;
834 bool hasFeature(StringRef Feature) const override;
835
836 void getGCCRegNames(const char * const *&Names,
837 unsigned &NumNames) const override;
838 void getGCCRegAliases(const GCCRegAlias *&Aliases,
839 unsigned &NumAliases) const override;
840 bool validateAsmConstraint(const char *&Name,
841 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000842 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000843 default: return false;
844 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000845 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000846 case 'b': // Base register
847 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000848 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000849 break;
850 // FIXME: The following are added to allow parsing.
851 // I just took a guess at what the actions should be.
852 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000853 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000854 case 'v': // Altivec vector register
855 Info.setAllowsRegister();
856 break;
857 case 'w':
858 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 case 'd':// VSX vector register to hold vector double data
860 case 'f':// VSX vector register to hold vector float data
861 case 's':// VSX vector register to hold scalar float data
862 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000863 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000864 break;
865 default:
866 return false;
867 }
868 Info.setAllowsRegister();
869 Name++; // Skip over 'w'.
870 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000871 case 'h': // `MQ', `CTR', or `LINK' register
872 case 'q': // `MQ' register
873 case 'c': // `CTR' register
874 case 'l': // `LINK' register
875 case 'x': // `CR' register (condition register) number 0
876 case 'y': // `CR' register (condition register)
877 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000878 Info.setAllowsRegister();
879 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000880 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000881 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000882 // (use `L' instead for SImode constants)
883 case 'K': // Unsigned 16-bit constant
884 case 'L': // Signed 16-bit constant shifted left 16 bits
885 case 'M': // Constant larger than 31
886 case 'N': // Exact power of 2
887 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000888 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000889 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000890 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000891 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000892 break;
893 case 'm': // Memory operand. Note that on PowerPC targets, m can
894 // include addresses that update the base register. It
895 // is therefore only safe to use `m' in an asm statement
896 // if that asm statement accesses the operand exactly once.
897 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000898 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000899 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000900 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000901 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000902 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
903 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000904 // register to be updated.
905 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000906 if (Name[1] != 's')
907 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000908 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000909 // include any automodification of the base register. Unlike
910 // `m', this constraint can be used in asm statements that
911 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000912 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000913 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000914 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000915 break;
916 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000917 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000918 case 'Z': // Memory operand that is an indexed or indirect from a
919 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000920 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000921 Info.setAllowsMemory();
922 Info.setAllowsRegister();
923 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000924 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000925 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000926 // register (`p' is preferable for asm statements)
927 case 'S': // Constant suitable as a 64-bit mask operand
928 case 'T': // Constant suitable as a 32-bit mask operand
929 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000930 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000931 // instructions
932 case 'W': // Vector constant that does not require memory
933 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000934 break;
935 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000936 }
John Thompson07a61a42010-06-24 22:44:13 +0000937 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000938 }
Craig Topper3164f332014-03-11 03:39:26 +0000939 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000940 std::string R;
941 switch (*Constraint) {
942 case 'e':
943 case 'w':
944 // Two-character constraint; add "^" hint for later parsing.
945 R = std::string("^") + std::string(Constraint, 2);
946 Constraint++;
947 break;
948 default:
949 return TargetInfo::convertConstraint(Constraint);
950 }
951 return R;
952 }
Craig Topper3164f332014-03-11 03:39:26 +0000953 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000954 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000955 }
Craig Topper3164f332014-03-11 03:39:26 +0000956 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000957 if (RegNo == 0) return 3;
958 if (RegNo == 1) return 4;
959 return -1;
960 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000961};
Anders Carlssonf511f642007-11-27 04:11:28 +0000962
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000963const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000964#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000965#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000966 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000967#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000968};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000969
Eric Christopher917e9522014-11-18 22:36:15 +0000970/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000971/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000972bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000973 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000974 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
975 // Ignore disabled features.
976 if (Features[i][0] == '-')
977 continue;
978
979 StringRef Feature = StringRef(Features[i]).substr(1);
980
981 if (Feature == "vsx") {
982 HasVSX = true;
983 continue;
984 }
985
Bill Schmidt59eb7672014-10-10 15:09:43 +0000986 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000987 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000988 continue;
989 }
990
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000991 if (Feature == "crypto") {
992 HasP8Crypto = true;
993 continue;
994 }
995
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000996 // TODO: Finish this list and add an assert that we've handled them
997 // all.
998 }
999
1000 return true;
1001}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001002
Chris Lattnerecd49032009-03-02 22:27:17 +00001003/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1004/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001005void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001006 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001007 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001008 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001009 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001010 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001011 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001012 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001013 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001014 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001015 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001016 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001017 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001018 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001019
Chris Lattnerecd49032009-03-02 22:27:17 +00001020 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001021 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1022 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001023 } else {
1024 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1025 getTriple().getOS() != llvm::Triple::OpenBSD)
1026 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001027 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001028
Ulrich Weigand8afad612014-07-28 13:17:52 +00001029 // ABI options.
1030 if (ABI == "elfv1")
1031 Builder.defineMacro("_CALL_ELF", "1");
1032 if (ABI == "elfv2")
1033 Builder.defineMacro("_CALL_ELF", "2");
1034
Chris Lattnerecd49032009-03-02 22:27:17 +00001035 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001036 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1037 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001038
Chris Lattnerecd49032009-03-02 22:27:17 +00001039 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001040 if (LongDoubleWidth == 128)
1041 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001042
John Thompsone467e192009-11-19 17:18:50 +00001043 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001044 Builder.defineMacro("__VEC__", "10206");
1045 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001046 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001047
1048 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001049 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1050 .Case("440", ArchDefineName)
1051 .Case("450", ArchDefineName | ArchDefine440)
1052 .Case("601", ArchDefineName)
1053 .Case("602", ArchDefineName | ArchDefinePpcgr)
1054 .Case("603", ArchDefineName | ArchDefinePpcgr)
1055 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1056 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1057 .Case("604", ArchDefineName | ArchDefinePpcgr)
1058 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1059 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001060 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001061 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1062 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1063 .Case("750", ArchDefineName | ArchDefinePpcgr)
1064 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1065 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001066 .Case("a2", ArchDefineA2)
1067 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 .Case("pwr3", ArchDefinePpcgr)
1069 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1070 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1071 | ArchDefinePpcsq)
1072 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1073 | ArchDefinePpcgr | ArchDefinePpcsq)
1074 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1075 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1076 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1077 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1078 | ArchDefinePpcsq)
1079 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1080 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001081 | ArchDefinePpcgr | ArchDefinePpcsq)
1082 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1083 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1084 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001085 .Case("power3", ArchDefinePpcgr)
1086 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1087 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1088 | ArchDefinePpcsq)
1089 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1090 | ArchDefinePpcgr | ArchDefinePpcsq)
1091 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1092 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1093 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1094 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1095 | ArchDefinePpcsq)
1096 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1097 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001098 | ArchDefinePpcgr | ArchDefinePpcsq)
1099 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1100 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1101 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001102 .Default(ArchDefineNone);
1103
1104 if (defs & ArchDefineName)
1105 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1106 if (defs & ArchDefinePpcgr)
1107 Builder.defineMacro("_ARCH_PPCGR");
1108 if (defs & ArchDefinePpcsq)
1109 Builder.defineMacro("_ARCH_PPCSQ");
1110 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001111 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001112 if (defs & ArchDefine603)
1113 Builder.defineMacro("_ARCH_603");
1114 if (defs & ArchDefine604)
1115 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001116 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001117 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001118 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001119 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001120 if (defs & ArchDefinePwr5x)
1121 Builder.defineMacro("_ARCH_PWR5X");
1122 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001123 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001124 if (defs & ArchDefinePwr6x)
1125 Builder.defineMacro("_ARCH_PWR6X");
1126 if (defs & ArchDefinePwr7)
1127 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001128 if (defs & ArchDefinePwr8)
1129 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001130 if (defs & ArchDefineA2)
1131 Builder.defineMacro("_ARCH_A2");
1132 if (defs & ArchDefineA2q) {
1133 Builder.defineMacro("_ARCH_A2Q");
1134 Builder.defineMacro("_ARCH_QP");
1135 }
1136
1137 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1138 Builder.defineMacro("__bg__");
1139 Builder.defineMacro("__THW_BLUEGENE__");
1140 Builder.defineMacro("__bgq__");
1141 Builder.defineMacro("__TOS_BGQ__");
1142 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001143
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001144 if (HasVSX)
1145 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001146 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001147 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001148 if (HasP8Crypto)
1149 Builder.defineMacro("__CRYPTO__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001150
Bill Schmidt38378a02013-02-01 20:23:10 +00001151 // FIXME: The following are not yet generated here by Clang, but are
1152 // generated by GCC:
1153 //
1154 // _SOFT_FLOAT_
1155 // __RECIP_PRECISION__
1156 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001157 // __RECIP__
1158 // __RECIPF__
1159 // __RSQRTE__
1160 // __RSQRTEF__
1161 // _SOFT_DOUBLE_
1162 // __NO_LWSYNC__
1163 // __HAVE_BSWAP__
1164 // __LONGDOUBLE128
1165 // __CMODEL_MEDIUM__
1166 // __CMODEL_LARGE__
1167 // _CALL_SYSV
1168 // _CALL_DARWIN
1169 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001170}
1171
1172void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1173 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1174 .Case("7400", true)
1175 .Case("g4", true)
1176 .Case("7450", true)
1177 .Case("g4+", true)
1178 .Case("970", true)
1179 .Case("g5", true)
1180 .Case("pwr6", true)
1181 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001182 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001183 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001184 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001185 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001186
1187 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001188 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1189 .Case("ppc64le", true)
1190 .Case("pwr8", true)
1191 .Default(false);
1192 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1193 .Case("ppc64le", true)
1194 .Case("pwr8", true)
1195 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001196}
1197
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001198bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001199 return llvm::StringSwitch<bool>(Feature)
1200 .Case("powerpc", true)
1201 .Case("vsx", HasVSX)
1202 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001203 .Case("crypto", HasP8Crypto)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001204 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001205}
Chris Lattner17df24e2008-04-21 18:56:49 +00001206
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001207const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001208 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1209 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1210 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1211 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1212 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1213 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1214 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1215 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001216 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001217 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001218 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001219 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1220 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1221 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1222 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001223 "vrsave", "vscr",
1224 "spe_acc", "spefscr",
1225 "sfp"
1226};
Chris Lattner10a5b382007-01-29 05:24:35 +00001227
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001228void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001229 unsigned &NumNames) const {
1230 Names = GCCRegNames;
1231 NumNames = llvm::array_lengthof(GCCRegNames);
1232}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001233
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001234const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1235 // While some of these aliases do map to different registers
1236 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001237 { { "0" }, "r0" },
1238 { { "1"}, "r1" },
1239 { { "2" }, "r2" },
1240 { { "3" }, "r3" },
1241 { { "4" }, "r4" },
1242 { { "5" }, "r5" },
1243 { { "6" }, "r6" },
1244 { { "7" }, "r7" },
1245 { { "8" }, "r8" },
1246 { { "9" }, "r9" },
1247 { { "10" }, "r10" },
1248 { { "11" }, "r11" },
1249 { { "12" }, "r12" },
1250 { { "13" }, "r13" },
1251 { { "14" }, "r14" },
1252 { { "15" }, "r15" },
1253 { { "16" }, "r16" },
1254 { { "17" }, "r17" },
1255 { { "18" }, "r18" },
1256 { { "19" }, "r19" },
1257 { { "20" }, "r20" },
1258 { { "21" }, "r21" },
1259 { { "22" }, "r22" },
1260 { { "23" }, "r23" },
1261 { { "24" }, "r24" },
1262 { { "25" }, "r25" },
1263 { { "26" }, "r26" },
1264 { { "27" }, "r27" },
1265 { { "28" }, "r28" },
1266 { { "29" }, "r29" },
1267 { { "30" }, "r30" },
1268 { { "31" }, "r31" },
1269 { { "fr0" }, "f0" },
1270 { { "fr1" }, "f1" },
1271 { { "fr2" }, "f2" },
1272 { { "fr3" }, "f3" },
1273 { { "fr4" }, "f4" },
1274 { { "fr5" }, "f5" },
1275 { { "fr6" }, "f6" },
1276 { { "fr7" }, "f7" },
1277 { { "fr8" }, "f8" },
1278 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001279 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001280 { { "fr11" }, "f11" },
1281 { { "fr12" }, "f12" },
1282 { { "fr13" }, "f13" },
1283 { { "fr14" }, "f14" },
1284 { { "fr15" }, "f15" },
1285 { { "fr16" }, "f16" },
1286 { { "fr17" }, "f17" },
1287 { { "fr18" }, "f18" },
1288 { { "fr19" }, "f19" },
1289 { { "fr20" }, "f20" },
1290 { { "fr21" }, "f21" },
1291 { { "fr22" }, "f22" },
1292 { { "fr23" }, "f23" },
1293 { { "fr24" }, "f24" },
1294 { { "fr25" }, "f25" },
1295 { { "fr26" }, "f26" },
1296 { { "fr27" }, "f27" },
1297 { { "fr28" }, "f28" },
1298 { { "fr29" }, "f29" },
1299 { { "fr30" }, "f30" },
1300 { { "fr31" }, "f31" },
1301 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001302};
1303
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001304void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001305 unsigned &NumAliases) const {
1306 Aliases = GCCRegAliases;
1307 NumAliases = llvm::array_lengthof(GCCRegAliases);
1308}
1309} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001310
Chris Lattner5ba61f02006-10-14 07:39:34 +00001311namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001312class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001313public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001314 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001315 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001316
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001317 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001318 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001319 case llvm::Triple::FreeBSD:
1320 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001321 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001322 PtrDiffType = SignedInt;
1323 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001324 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001325 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001326 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001327 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001328
Roman Divacky3ffe7462012-03-13 19:20:17 +00001329 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1330 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001331 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001332 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001333
1334 // PPC32 supports atomics up to 4 bytes.
1335 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001336 }
1337
Craig Topper3164f332014-03-11 03:39:26 +00001338 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001339 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001340 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001341 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001342};
1343} // end anonymous namespace.
1344
Bill Schmidt778d3872013-07-26 01:36:11 +00001345// Note: ABI differences may eventually require us to have a separate
1346// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001347namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001348class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001349public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001350 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001351 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001352 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001353 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001354
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001355 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1356 DescriptionString = "e-m:e-i64:64-n32:64";
1357 ABI = "elfv2";
1358 } else {
1359 DescriptionString = "E-m:e-i64:64-n32:64";
1360 ABI = "elfv1";
1361 }
1362
1363 switch (getTriple().getOS()) {
1364 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001365 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001366 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001367 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001368 case llvm::Triple::NetBSD:
1369 IntMaxType = SignedLongLong;
1370 Int64Type = SignedLongLong;
1371 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001372 default:
1373 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001374 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001375
1376 // PPC64 supports atomics up to 8 bytes.
1377 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001378 }
Craig Topper3164f332014-03-11 03:39:26 +00001379 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001380 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001381 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001382 // PPC64 Linux-specifc ABI options.
1383 bool setABI(const std::string &Name) override {
1384 if (Name == "elfv1" || Name == "elfv2") {
1385 ABI = Name;
1386 return true;
1387 }
1388 return false;
1389 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001390};
1391} // end anonymous namespace.
1392
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001393
1394namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001395class DarwinPPC32TargetInfo :
1396 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001397public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001398 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1399 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001400 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001401 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001402 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001403 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001404 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001405 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001406 }
Craig Topper3164f332014-03-11 03:39:26 +00001407 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001408 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001409 }
1410};
1411
1412class DarwinPPC64TargetInfo :
1413 public DarwinTargetInfo<PPC64TargetInfo> {
1414public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001415 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1416 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001417 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001418 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001419 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001420 }
1421};
1422} // end anonymous namespace.
1423
Chris Lattner5ba61f02006-10-14 07:39:34 +00001424namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001425 static const unsigned NVPTXAddrSpaceMap[] = {
1426 1, // opencl_global
1427 3, // opencl_local
1428 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001429 // FIXME: generic has to be added to the target
1430 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001431 1, // cuda_device
1432 4, // cuda_constant
1433 3, // cuda_shared
1434 };
1435 class NVPTXTargetInfo : public TargetInfo {
1436 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001437 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001438
1439 // The GPU profiles supported by the NVPTX backend
1440 enum GPUKind {
1441 GK_NONE,
1442 GK_SM20,
1443 GK_SM21,
1444 GK_SM30,
1445 GK_SM35,
1446 } GPU;
1447
Peter Collingbournec947aae2012-05-20 23:28:41 +00001448 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001449 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001450 BigEndian = false;
1451 TLSSupported = false;
1452 LongWidth = LongAlign = 64;
1453 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001454 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001455 // Define available target features
1456 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001457 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001458 // Set the default GPU to sm20
1459 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001460 }
Craig Topper3164f332014-03-11 03:39:26 +00001461 void getTargetDefines(const LangOptions &Opts,
1462 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001463 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001464 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001465 if (Opts.CUDAIsDevice) {
1466 // Set __CUDA_ARCH__ for the GPU specified.
1467 std::string CUDAArchCode;
1468 switch (GPU) {
1469 case GK_SM20:
1470 CUDAArchCode = "200";
1471 break;
1472 case GK_SM21:
1473 CUDAArchCode = "210";
1474 break;
1475 case GK_SM30:
1476 CUDAArchCode = "300";
1477 break;
1478 case GK_SM35:
1479 CUDAArchCode = "350";
1480 break;
1481 default:
1482 llvm_unreachable("Unhandled target CPU");
1483 }
1484 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1485 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001486 }
Craig Topper3164f332014-03-11 03:39:26 +00001487 void getTargetBuiltins(const Builtin::Info *&Records,
1488 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001489 Records = BuiltinInfo;
1490 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001491 }
Craig Topper3164f332014-03-11 03:39:26 +00001492 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001493 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001494 }
Craig Topper3164f332014-03-11 03:39:26 +00001495
1496 void getGCCRegNames(const char * const *&Names,
1497 unsigned &NumNames) const override;
1498 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1499 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001500 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001501 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001502 NumAliases = 0;
1503 }
Eric Christopher917e9522014-11-18 22:36:15 +00001504 bool
1505 validateAsmConstraint(const char *&Name,
1506 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001507 switch (*Name) {
1508 default: return false;
1509 case 'c':
1510 case 'h':
1511 case 'r':
1512 case 'l':
1513 case 'f':
1514 case 'd':
1515 Info.setAllowsRegister();
1516 return true;
1517 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001518 }
Craig Topper3164f332014-03-11 03:39:26 +00001519 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001520 // FIXME: Is this really right?
1521 return "";
1522 }
Craig Topper3164f332014-03-11 03:39:26 +00001523 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001524 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001525 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001526 }
Craig Topper3164f332014-03-11 03:39:26 +00001527 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001528 GPU = llvm::StringSwitch<GPUKind>(Name)
1529 .Case("sm_20", GK_SM20)
1530 .Case("sm_21", GK_SM21)
1531 .Case("sm_30", GK_SM30)
1532 .Case("sm_35", GK_SM35)
1533 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001534
Reid Klecknerbbc01782014-12-03 21:53:36 +00001535 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001536 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001537 };
1538
1539 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1540#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1541#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1542 ALL_LANGUAGES },
1543#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001544 };
1545
1546 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1547 "r0"
1548 };
1549
1550 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1551 unsigned &NumNames) const {
1552 Names = GCCRegNames;
1553 NumNames = llvm::array_lengthof(GCCRegNames);
1554 }
1555
1556 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1557 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001558 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001559 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001560 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1561 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001562 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001563 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001564 };
1565
1566 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1567 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001568 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001569 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001570 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1571 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001572 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001573 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001574 };
1575}
1576
1577namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001578
1579static const unsigned R600AddrSpaceMap[] = {
1580 1, // opencl_global
1581 3, // opencl_local
1582 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001583 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001584 1, // cuda_device
1585 2, // cuda_constant
1586 3 // cuda_shared
1587};
1588
Tom Stellarda96344b2014-08-21 13:58:40 +00001589// If you edit the description strings, make sure you update
1590// getPointerWidthV().
1591
Tom Stellardc74b1e02013-03-04 17:40:53 +00001592static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001593 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1594 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001595
1596static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001597 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1598 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001599
1600static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001601 "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 +00001602 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1603 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001604
Eli Friedmand13b41e2012-10-12 23:32:00 +00001605class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001606 static const Builtin::Info BuiltinInfo[];
1607
Tom Stellardc74b1e02013-03-04 17:40:53 +00001608 /// \brief The GPU profiles supported by the R600 target.
1609 enum GPUKind {
1610 GK_NONE,
1611 GK_R600,
1612 GK_R600_DOUBLE_OPS,
1613 GK_R700,
1614 GK_R700_DOUBLE_OPS,
1615 GK_EVERGREEN,
1616 GK_EVERGREEN_DOUBLE_OPS,
1617 GK_NORTHERN_ISLANDS,
1618 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001619 GK_SOUTHERN_ISLANDS,
1620 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001621 } GPU;
1622
Eli Friedmand13b41e2012-10-12 23:32:00 +00001623public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001624 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001625 : TargetInfo(Triple) {
1626
1627 if (Triple.getArch() == llvm::Triple::amdgcn) {
1628 DescriptionString = DescriptionStringSI;
1629 GPU = GK_SOUTHERN_ISLANDS;
1630 } else {
1631 DescriptionString = DescriptionStringR600;
1632 GPU = GK_R600;
1633 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001634 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001635 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001636 }
1637
Tom Stellarda96344b2014-08-21 13:58:40 +00001638 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1639 if (GPU <= GK_CAYMAN)
1640 return 32;
1641
1642 switch(AddrSpace) {
1643 default:
1644 return 64;
1645 case 0:
1646 case 3:
1647 case 5:
1648 return 32;
1649 }
1650 }
1651
Craig Topper3164f332014-03-11 03:39:26 +00001652 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001653 return "";
1654 }
1655
Craig Topper3164f332014-03-11 03:39:26 +00001656 void getGCCRegNames(const char * const *&Names,
1657 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001658 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001659 numNames = 0;
1660 }
1661
Craig Topper3164f332014-03-11 03:39:26 +00001662 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1663 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001664 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001665 NumAliases = 0;
1666 }
1667
Craig Topper3164f332014-03-11 03:39:26 +00001668 bool validateAsmConstraint(const char *&Name,
1669 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001670 return true;
1671 }
1672
Craig Topper3164f332014-03-11 03:39:26 +00001673 void getTargetBuiltins(const Builtin::Info *&Records,
1674 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001675 Records = BuiltinInfo;
1676 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001677 }
1678
Craig Topper3164f332014-03-11 03:39:26 +00001679 void getTargetDefines(const LangOptions &Opts,
1680 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001681 Builder.defineMacro("__R600__");
Tom Stellardfded50f2015-02-27 15:10:19 +00001682 if (GPU >= GK_SOUTHERN_ISLANDS && Opts.OpenCL)
1683 Builder.defineMacro("cl_khr_fp64");
Eli Friedmand13b41e2012-10-12 23:32:00 +00001684 }
1685
Craig Topper3164f332014-03-11 03:39:26 +00001686 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001687 return TargetInfo::CharPtrBuiltinVaList;
1688 }
1689
Craig Topper3164f332014-03-11 03:39:26 +00001690 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001691 GPU = llvm::StringSwitch<GPUKind>(Name)
1692 .Case("r600" , GK_R600)
1693 .Case("rv610", GK_R600)
1694 .Case("rv620", GK_R600)
1695 .Case("rv630", GK_R600)
1696 .Case("rv635", GK_R600)
1697 .Case("rs780", GK_R600)
1698 .Case("rs880", GK_R600)
1699 .Case("rv670", GK_R600_DOUBLE_OPS)
1700 .Case("rv710", GK_R700)
1701 .Case("rv730", GK_R700)
1702 .Case("rv740", GK_R700_DOUBLE_OPS)
1703 .Case("rv770", GK_R700_DOUBLE_OPS)
1704 .Case("palm", GK_EVERGREEN)
1705 .Case("cedar", GK_EVERGREEN)
1706 .Case("sumo", GK_EVERGREEN)
1707 .Case("sumo2", GK_EVERGREEN)
1708 .Case("redwood", GK_EVERGREEN)
1709 .Case("juniper", GK_EVERGREEN)
1710 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1711 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1712 .Case("barts", GK_NORTHERN_ISLANDS)
1713 .Case("turks", GK_NORTHERN_ISLANDS)
1714 .Case("caicos", GK_NORTHERN_ISLANDS)
1715 .Case("cayman", GK_CAYMAN)
1716 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001717 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001718 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1719 .Case("verde", GK_SOUTHERN_ISLANDS)
1720 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001721 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001722 .Case("bonaire", GK_SEA_ISLANDS)
1723 .Case("kabini", GK_SEA_ISLANDS)
1724 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001725 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001726 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001727 .Default(GK_NONE);
1728
1729 if (GPU == GK_NONE) {
1730 return false;
1731 }
1732
1733 // Set the correct data layout
1734 switch (GPU) {
1735 case GK_NONE:
1736 case GK_R600:
1737 case GK_R700:
1738 case GK_EVERGREEN:
1739 case GK_NORTHERN_ISLANDS:
1740 DescriptionString = DescriptionStringR600;
1741 break;
1742 case GK_R600_DOUBLE_OPS:
1743 case GK_R700_DOUBLE_OPS:
1744 case GK_EVERGREEN_DOUBLE_OPS:
1745 case GK_CAYMAN:
1746 DescriptionString = DescriptionStringR600DoubleOps;
1747 break;
1748 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001749 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001750 DescriptionString = DescriptionStringSI;
1751 break;
1752 }
1753
1754 return true;
1755 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001756};
1757
Matt Arsenault56f008d2014-06-24 20:45:01 +00001758const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1759#define BUILTIN(ID, TYPE, ATTRS) \
1760 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1761#include "clang/Basic/BuiltinsR600.def"
1762};
1763
Eli Friedmand13b41e2012-10-12 23:32:00 +00001764} // end anonymous namespace
1765
1766namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001767// Namespace for x86 abstract base class
1768const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001769#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001770#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001771 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001772#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001773};
Eli Friedmanb5366062008-05-20 14:21:01 +00001774
Nuno Lopescfca1f02009-12-23 17:49:57 +00001775static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001776 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1777 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001778 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001779 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1780 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1781 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001782 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001783 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1784 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001785};
1786
Eric Christophercdd36352011-06-21 00:05:20 +00001787const TargetInfo::AddlRegName AddlRegNames[] = {
1788 { { "al", "ah", "eax", "rax" }, 0 },
1789 { { "bl", "bh", "ebx", "rbx" }, 3 },
1790 { { "cl", "ch", "ecx", "rcx" }, 2 },
1791 { { "dl", "dh", "edx", "rdx" }, 1 },
1792 { { "esi", "rsi" }, 4 },
1793 { { "edi", "rdi" }, 5 },
1794 { { "esp", "rsp" }, 7 },
1795 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001796};
1797
1798// X86 target abstract base class; x86-32 and x86-64 are very close, so
1799// most of the implementation can be shared.
1800class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001801 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001802 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001803 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001804 enum MMX3DNowEnum {
1805 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1806 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001807 enum XOPEnum {
1808 NoXOP,
1809 SSE4A,
1810 FMA4,
1811 XOP
1812 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001813
Eric Christophere1ddaf92010-04-02 23:50:19 +00001814 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001815 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001816 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001817 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001818 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001819 bool HasBMI;
1820 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001821 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001822 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001823 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001824 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001825 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001826 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001827 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001828 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001829 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1830 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001831 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001832 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001833
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001834 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1835 ///
1836 /// Each enumeration represents a particular CPU supported by Clang. These
1837 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1838 enum CPUKind {
1839 CK_Generic,
1840
1841 /// \name i386
1842 /// i386-generation processors.
1843 //@{
1844 CK_i386,
1845 //@}
1846
1847 /// \name i486
1848 /// i486-generation processors.
1849 //@{
1850 CK_i486,
1851 CK_WinChipC6,
1852 CK_WinChip2,
1853 CK_C3,
1854 //@}
1855
1856 /// \name i586
1857 /// i586-generation processors, P5 microarchitecture based.
1858 //@{
1859 CK_i586,
1860 CK_Pentium,
1861 CK_PentiumMMX,
1862 //@}
1863
1864 /// \name i686
1865 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1866 //@{
1867 CK_i686,
1868 CK_PentiumPro,
1869 CK_Pentium2,
1870 CK_Pentium3,
1871 CK_Pentium3M,
1872 CK_PentiumM,
1873 CK_C3_2,
1874
1875 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1876 /// Clang however has some logic to suport this.
1877 // FIXME: Warn, deprecate, and potentially remove this.
1878 CK_Yonah,
1879 //@}
1880
1881 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001882 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001883 //@{
1884 CK_Pentium4,
1885 CK_Pentium4M,
1886 CK_Prescott,
1887 CK_Nocona,
1888 //@}
1889
1890 /// \name Core
1891 /// Core microarchitecture based processors.
1892 //@{
1893 CK_Core2,
1894
1895 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1896 /// codename which GCC no longer accepts as an option to -march, but Clang
1897 /// has some logic for recognizing it.
1898 // FIXME: Warn, deprecate, and potentially remove this.
1899 CK_Penryn,
1900 //@}
1901
1902 /// \name Atom
1903 /// Atom processors
1904 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001905 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001906 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001907 //@}
1908
1909 /// \name Nehalem
1910 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001911 CK_Nehalem,
1912
1913 /// \name Westmere
1914 /// Westmere microarchitecture based processors.
1915 CK_Westmere,
1916
1917 /// \name Sandy Bridge
1918 /// Sandy Bridge microarchitecture based processors.
1919 CK_SandyBridge,
1920
1921 /// \name Ivy Bridge
1922 /// Ivy Bridge microarchitecture based processors.
1923 CK_IvyBridge,
1924
1925 /// \name Haswell
1926 /// Haswell microarchitecture based processors.
1927 CK_Haswell,
1928
1929 /// \name Broadwell
1930 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001931 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001932
1933 /// \name Skylake
1934 /// Skylake microarchitecture based processors.
1935 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001936
Craig Topper449314e2013-08-20 07:09:39 +00001937 /// \name Knights Landing
1938 /// Knights Landing processor.
1939 CK_KNL,
1940
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001941 /// \name K6
1942 /// K6 architecture processors.
1943 //@{
1944 CK_K6,
1945 CK_K6_2,
1946 CK_K6_3,
1947 //@}
1948
1949 /// \name K7
1950 /// K7 architecture processors.
1951 //@{
1952 CK_Athlon,
1953 CK_AthlonThunderbird,
1954 CK_Athlon4,
1955 CK_AthlonXP,
1956 CK_AthlonMP,
1957 //@}
1958
1959 /// \name K8
1960 /// K8 architecture processors.
1961 //@{
1962 CK_Athlon64,
1963 CK_Athlon64SSE3,
1964 CK_AthlonFX,
1965 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001966 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001967 CK_Opteron,
1968 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001969 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001970 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001971
Benjamin Kramer569f2152012-01-10 11:50:18 +00001972 /// \name Bobcat
1973 /// Bobcat architecture processors.
1974 //@{
1975 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001976 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001977 //@}
1978
1979 /// \name Bulldozer
1980 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001981 //@{
1982 CK_BDVER1,
1983 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001984 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001985 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001986 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001987
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001988 /// This specification is deprecated and will be removed in the future.
1989 /// Users should prefer \see CK_K8.
1990 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001991 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001992 CK_x86_64,
1993 //@}
1994
1995 /// \name Geode
1996 /// Geode processors.
1997 //@{
1998 CK_Geode
1999 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002000 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002001
Rafael Espindolaeb265472013-08-21 21:59:03 +00002002 enum FPMathKind {
2003 FP_Default,
2004 FP_SSE,
2005 FP_387
2006 } FPMath;
2007
Eli Friedman3fd920a2008-08-20 02:34:37 +00002008public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002009 X86TargetInfo(const llvm::Triple &Triple)
2010 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002011 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002012 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2013 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2014 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2015 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2016 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2017 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002018 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002019 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002020 }
Craig Topper3164f332014-03-11 03:39:26 +00002021 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002022 // X87 evaluates with 80 bits "long double" precision.
2023 return SSELevel == NoSSE ? 2 : 0;
2024 }
Craig Topper3164f332014-03-11 03:39:26 +00002025 void getTargetBuiltins(const Builtin::Info *&Records,
2026 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002027 Records = BuiltinInfo;
2028 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002029 }
Craig Topper3164f332014-03-11 03:39:26 +00002030 void getGCCRegNames(const char * const *&Names,
2031 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002032 Names = GCCRegNames;
2033 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002034 }
Craig Topper3164f332014-03-11 03:39:26 +00002035 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2036 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002037 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002038 NumAliases = 0;
2039 }
Craig Topper3164f332014-03-11 03:39:26 +00002040 void getGCCAddlRegNames(const AddlRegName *&Names,
2041 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002042 Names = AddlRegNames;
2043 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002044 }
Craig Topper3164f332014-03-11 03:39:26 +00002045 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002046 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002047
Akira Hatanaka974131e2014-09-18 18:17:18 +00002048 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2049
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002050 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2051
Akira Hatanaka974131e2014-09-18 18:17:18 +00002052 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2053
Craig Topper3164f332014-03-11 03:39:26 +00002054 std::string convertConstraint(const char *&Constraint) const override;
2055 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002056 return "~{dirflag},~{fpsr},~{flags}";
2057 }
Craig Topper3164f332014-03-11 03:39:26 +00002058 void getTargetDefines(const LangOptions &Opts,
2059 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002060 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2061 bool Enabled);
2062 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2063 bool Enabled);
2064 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2065 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002066 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2067 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002068 setFeatureEnabledImpl(Features, Name, Enabled);
2069 }
2070 // This exists purely to cut down on the number of virtual calls in
2071 // getDefaultFeatures which calls this repeatedly.
2072 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2073 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002074 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2075 bool hasFeature(StringRef Feature) const override;
2076 bool handleTargetFeatures(std::vector<std::string> &Features,
2077 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002078 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002079 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002080 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002081 else if (getTriple().getArch() == llvm::Triple::x86 &&
2082 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002083 return "no-mmx";
2084 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002085 }
Craig Topper3164f332014-03-11 03:39:26 +00002086 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002087 CPU = llvm::StringSwitch<CPUKind>(Name)
2088 .Case("i386", CK_i386)
2089 .Case("i486", CK_i486)
2090 .Case("winchip-c6", CK_WinChipC6)
2091 .Case("winchip2", CK_WinChip2)
2092 .Case("c3", CK_C3)
2093 .Case("i586", CK_i586)
2094 .Case("pentium", CK_Pentium)
2095 .Case("pentium-mmx", CK_PentiumMMX)
2096 .Case("i686", CK_i686)
2097 .Case("pentiumpro", CK_PentiumPro)
2098 .Case("pentium2", CK_Pentium2)
2099 .Case("pentium3", CK_Pentium3)
2100 .Case("pentium3m", CK_Pentium3M)
2101 .Case("pentium-m", CK_PentiumM)
2102 .Case("c3-2", CK_C3_2)
2103 .Case("yonah", CK_Yonah)
2104 .Case("pentium4", CK_Pentium4)
2105 .Case("pentium4m", CK_Pentium4M)
2106 .Case("prescott", CK_Prescott)
2107 .Case("nocona", CK_Nocona)
2108 .Case("core2", CK_Core2)
2109 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002110 .Case("bonnell", CK_Bonnell)
2111 .Case("atom", CK_Bonnell) // Legacy name.
2112 .Case("silvermont", CK_Silvermont)
2113 .Case("slm", CK_Silvermont) // Legacy name.
2114 .Case("nehalem", CK_Nehalem)
2115 .Case("corei7", CK_Nehalem) // Legacy name.
2116 .Case("westmere", CK_Westmere)
2117 .Case("sandybridge", CK_SandyBridge)
2118 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2119 .Case("ivybridge", CK_IvyBridge)
2120 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2121 .Case("haswell", CK_Haswell)
2122 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002123 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002124 .Case("skylake", CK_Skylake)
2125 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002126 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002127 .Case("k6", CK_K6)
2128 .Case("k6-2", CK_K6_2)
2129 .Case("k6-3", CK_K6_3)
2130 .Case("athlon", CK_Athlon)
2131 .Case("athlon-tbird", CK_AthlonThunderbird)
2132 .Case("athlon-4", CK_Athlon4)
2133 .Case("athlon-xp", CK_AthlonXP)
2134 .Case("athlon-mp", CK_AthlonMP)
2135 .Case("athlon64", CK_Athlon64)
2136 .Case("athlon64-sse3", CK_Athlon64SSE3)
2137 .Case("athlon-fx", CK_AthlonFX)
2138 .Case("k8", CK_K8)
2139 .Case("k8-sse3", CK_K8SSE3)
2140 .Case("opteron", CK_Opteron)
2141 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002142 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002143 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002144 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002145 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002146 .Case("bdver1", CK_BDVER1)
2147 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002148 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002149 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002150 .Case("x86-64", CK_x86_64)
2151 .Case("geode", CK_Geode)
2152 .Default(CK_Generic);
2153
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002154 // Perform any per-CPU checks necessary to determine if this CPU is
2155 // acceptable.
2156 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2157 // invalid without explaining *why*.
2158 switch (CPU) {
2159 case CK_Generic:
2160 // No processor selected!
2161 return false;
2162
2163 case CK_i386:
2164 case CK_i486:
2165 case CK_WinChipC6:
2166 case CK_WinChip2:
2167 case CK_C3:
2168 case CK_i586:
2169 case CK_Pentium:
2170 case CK_PentiumMMX:
2171 case CK_i686:
2172 case CK_PentiumPro:
2173 case CK_Pentium2:
2174 case CK_Pentium3:
2175 case CK_Pentium3M:
2176 case CK_PentiumM:
2177 case CK_Yonah:
2178 case CK_C3_2:
2179 case CK_Pentium4:
2180 case CK_Pentium4M:
2181 case CK_Prescott:
2182 case CK_K6:
2183 case CK_K6_2:
2184 case CK_K6_3:
2185 case CK_Athlon:
2186 case CK_AthlonThunderbird:
2187 case CK_Athlon4:
2188 case CK_AthlonXP:
2189 case CK_AthlonMP:
2190 case CK_Geode:
2191 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002192 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002193 return false;
2194
2195 // Fallthrough
2196 case CK_Nocona:
2197 case CK_Core2:
2198 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002199 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002200 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002201 case CK_Nehalem:
2202 case CK_Westmere:
2203 case CK_SandyBridge:
2204 case CK_IvyBridge:
2205 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002206 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002207 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002208 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002209 case CK_Athlon64:
2210 case CK_Athlon64SSE3:
2211 case CK_AthlonFX:
2212 case CK_K8:
2213 case CK_K8SSE3:
2214 case CK_Opteron:
2215 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002216 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002217 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002218 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002219 case CK_BDVER1:
2220 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002221 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002222 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002223 case CK_x86_64:
2224 return true;
2225 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002226 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002227 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002228
Craig Topper3164f332014-03-11 03:39:26 +00002229 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002230
Craig Topper3164f332014-03-11 03:39:26 +00002231 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002232 // We accept all non-ARM calling conventions
2233 return (CC == CC_X86ThisCall ||
2234 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002235 CC == CC_X86StdCall ||
2236 CC == CC_X86VectorCall ||
2237 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002238 CC == CC_X86Pascal ||
2239 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002240 }
2241
Craig Topper3164f332014-03-11 03:39:26 +00002242 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002243 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002244 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002245};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002246
Rafael Espindolaeb265472013-08-21 21:59:03 +00002247bool X86TargetInfo::setFPMath(StringRef Name) {
2248 if (Name == "387") {
2249 FPMath = FP_387;
2250 return true;
2251 }
2252 if (Name == "sse") {
2253 FPMath = FP_SSE;
2254 return true;
2255 }
2256 return false;
2257}
2258
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002259void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002260 // FIXME: This *really* should not be here.
2261
2262 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002263 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002264 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002265
Chandler Carruth212334f2011-09-28 08:55:37 +00002266 switch (CPU) {
2267 case CK_Generic:
2268 case CK_i386:
2269 case CK_i486:
2270 case CK_i586:
2271 case CK_Pentium:
2272 case CK_i686:
2273 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002274 break;
2275 case CK_PentiumMMX:
2276 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002277 case CK_K6:
2278 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002279 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002280 break;
2281 case CK_Pentium3:
2282 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002283 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002284 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002285 break;
2286 case CK_PentiumM:
2287 case CK_Pentium4:
2288 case CK_Pentium4M:
2289 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002290 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002291 break;
2292 case CK_Yonah:
2293 case CK_Prescott:
2294 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002295 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002296 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002297 break;
2298 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002299 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002300 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002301 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002302 break;
2303 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002304 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002305 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002306 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002307 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002308 setFeatureEnabledImpl(Features, "avx512f", true);
2309 setFeatureEnabledImpl(Features, "avx512cd", true);
2310 setFeatureEnabledImpl(Features, "avx512dq", true);
2311 setFeatureEnabledImpl(Features, "avx512bw", true);
2312 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002313 // FALLTHROUGH
2314 case CK_Broadwell:
2315 setFeatureEnabledImpl(Features, "rdseed", true);
2316 setFeatureEnabledImpl(Features, "adx", true);
2317 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002318 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002319 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002320 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002321 setFeatureEnabledImpl(Features, "bmi", true);
2322 setFeatureEnabledImpl(Features, "bmi2", true);
2323 setFeatureEnabledImpl(Features, "rtm", true);
2324 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002325 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002326 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002327 setFeatureEnabledImpl(Features, "rdrnd", true);
2328 setFeatureEnabledImpl(Features, "f16c", true);
2329 setFeatureEnabledImpl(Features, "fsgsbase", true);
2330 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002331 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002332 setFeatureEnabledImpl(Features, "avx", true);
2333 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002334 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002335 case CK_Silvermont:
2336 setFeatureEnabledImpl(Features, "aes", true);
2337 setFeatureEnabledImpl(Features, "pclmul", true);
2338 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002339 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002340 setFeatureEnabledImpl(Features, "sse4.2", true);
2341 setFeatureEnabledImpl(Features, "cx16", true);
2342 break;
2343 case CK_KNL:
2344 setFeatureEnabledImpl(Features, "avx512f", true);
2345 setFeatureEnabledImpl(Features, "avx512cd", true);
2346 setFeatureEnabledImpl(Features, "avx512er", true);
2347 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002348 setFeatureEnabledImpl(Features, "rdseed", true);
2349 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002350 setFeatureEnabledImpl(Features, "lzcnt", true);
2351 setFeatureEnabledImpl(Features, "bmi", true);
2352 setFeatureEnabledImpl(Features, "bmi2", true);
2353 setFeatureEnabledImpl(Features, "rtm", true);
2354 setFeatureEnabledImpl(Features, "fma", true);
2355 setFeatureEnabledImpl(Features, "rdrnd", true);
2356 setFeatureEnabledImpl(Features, "f16c", true);
2357 setFeatureEnabledImpl(Features, "fsgsbase", true);
2358 setFeatureEnabledImpl(Features, "aes", true);
2359 setFeatureEnabledImpl(Features, "pclmul", true);
2360 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002361 break;
2362 case CK_K6_2:
2363 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002364 case CK_WinChip2:
2365 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002366 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002367 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002368 case CK_Athlon:
2369 case CK_AthlonThunderbird:
2370 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002371 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002372 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002373 case CK_Athlon4:
2374 case CK_AthlonXP:
2375 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002376 setFeatureEnabledImpl(Features, "sse", true);
2377 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002378 break;
2379 case CK_K8:
2380 case CK_Opteron:
2381 case CK_Athlon64:
2382 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002383 setFeatureEnabledImpl(Features, "sse2", true);
2384 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002385 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002386 case CK_AMDFAM10:
2387 setFeatureEnabledImpl(Features, "sse4a", true);
2388 setFeatureEnabledImpl(Features, "lzcnt", true);
2389 setFeatureEnabledImpl(Features, "popcnt", true);
2390 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002391 case CK_K8SSE3:
2392 case CK_OpteronSSE3:
2393 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002394 setFeatureEnabledImpl(Features, "sse3", true);
2395 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002396 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002397 case CK_BTVER2:
2398 setFeatureEnabledImpl(Features, "avx", true);
2399 setFeatureEnabledImpl(Features, "aes", true);
2400 setFeatureEnabledImpl(Features, "pclmul", true);
2401 setFeatureEnabledImpl(Features, "bmi", true);
2402 setFeatureEnabledImpl(Features, "f16c", true);
2403 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002404 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002405 setFeatureEnabledImpl(Features, "ssse3", true);
2406 setFeatureEnabledImpl(Features, "sse4a", true);
2407 setFeatureEnabledImpl(Features, "lzcnt", true);
2408 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002409 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002410 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002411 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002412 case CK_BDVER4:
2413 setFeatureEnabledImpl(Features, "avx2", true);
2414 setFeatureEnabledImpl(Features, "bmi2", true);
2415 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002416 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002417 setFeatureEnabledImpl(Features, "fsgsbase", true);
2418 // FALLTHROUGH
2419 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002420 setFeatureEnabledImpl(Features, "bmi", true);
2421 setFeatureEnabledImpl(Features, "fma", true);
2422 setFeatureEnabledImpl(Features, "f16c", true);
2423 setFeatureEnabledImpl(Features, "tbm", true);
2424 // FALLTHROUGH
2425 case CK_BDVER1:
2426 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002427 setFeatureEnabledImpl(Features, "xop", true);
2428 setFeatureEnabledImpl(Features, "lzcnt", true);
2429 setFeatureEnabledImpl(Features, "aes", true);
2430 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002431 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002432 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002433 break;
Eli Friedman33465822011-07-08 23:31:17 +00002434 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002435}
2436
Rafael Espindolae62e2792013-08-20 13:44:29 +00002437void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002438 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002439 if (Enabled) {
2440 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002441 case AVX512F:
2442 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002443 case AVX2:
2444 Features["avx2"] = true;
2445 case AVX:
2446 Features["avx"] = true;
2447 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002448 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002449 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002450 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002451 case SSSE3:
2452 Features["ssse3"] = true;
2453 case SSE3:
2454 Features["sse3"] = true;
2455 case SSE2:
2456 Features["sse2"] = true;
2457 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002458 Features["sse"] = true;
2459 case NoSSE:
2460 break;
2461 }
2462 return;
2463 }
2464
2465 switch (Level) {
2466 case NoSSE:
2467 case SSE1:
2468 Features["sse"] = false;
2469 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002470 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2471 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002472 case SSE3:
2473 Features["sse3"] = false;
2474 setXOPLevel(Features, NoXOP, false);
2475 case SSSE3:
2476 Features["ssse3"] = false;
2477 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002478 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002479 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002480 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002481 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002482 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002483 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002484 case AVX2:
2485 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002486 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002487 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002488 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2489 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002490 }
2491}
2492
2493void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002494 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002495 if (Enabled) {
2496 switch (Level) {
2497 case AMD3DNowAthlon:
2498 Features["3dnowa"] = true;
2499 case AMD3DNow:
2500 Features["3dnow"] = true;
2501 case MMX:
2502 Features["mmx"] = true;
2503 case NoMMX3DNow:
2504 break;
2505 }
2506 return;
2507 }
2508
2509 switch (Level) {
2510 case NoMMX3DNow:
2511 case MMX:
2512 Features["mmx"] = false;
2513 case AMD3DNow:
2514 Features["3dnow"] = false;
2515 case AMD3DNowAthlon:
2516 Features["3dnowa"] = false;
2517 }
2518}
2519
2520void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002521 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002522 if (Enabled) {
2523 switch (Level) {
2524 case XOP:
2525 Features["xop"] = true;
2526 case FMA4:
2527 Features["fma4"] = true;
2528 setSSELevel(Features, AVX, true);
2529 case SSE4A:
2530 Features["sse4a"] = true;
2531 setSSELevel(Features, SSE3, true);
2532 case NoXOP:
2533 break;
2534 }
2535 return;
2536 }
2537
2538 switch (Level) {
2539 case NoXOP:
2540 case SSE4A:
2541 Features["sse4a"] = false;
2542 case FMA4:
2543 Features["fma4"] = false;
2544 case XOP:
2545 Features["xop"] = false;
2546 }
2547}
2548
Craig Topper86d79ef2013-09-17 04:51:29 +00002549void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2550 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002551 // FIXME: This *really* should not be here. We need some way of translating
2552 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002553 if (Name == "sse4")
2554 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002555
Rafael Espindolae62e2792013-08-20 13:44:29 +00002556 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002557
Craig Topper29561122013-09-19 01:13:07 +00002558 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002559 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002560 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002561 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002562 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002563 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002564 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002565 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002566 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002567 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002568 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002569 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002570 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002571 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002572 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002573 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002574 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002575 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002576 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002577 if (Enabled)
2578 setSSELevel(Features, SSE2, Enabled);
2579 } else if (Name == "pclmul") {
2580 if (Enabled)
2581 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002582 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002583 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002584 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002585 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002586 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002587 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002588 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2589 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002590 if (Enabled)
2591 setSSELevel(Features, AVX512F, Enabled);
2592 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002593 if (Enabled)
2594 setSSELevel(Features, AVX, Enabled);
2595 } else if (Name == "fma4") {
2596 setXOPLevel(Features, FMA4, Enabled);
2597 } else if (Name == "xop") {
2598 setXOPLevel(Features, XOP, Enabled);
2599 } else if (Name == "sse4a") {
2600 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002601 } else if (Name == "f16c") {
2602 if (Enabled)
2603 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002604 } else if (Name == "sha") {
2605 if (Enabled)
2606 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002607 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002608}
2609
Eric Christopher3ff21b32013-10-16 21:26:26 +00002610/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002611/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002612bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002613 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002614 // Remember the maximum enabled sselevel.
2615 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2616 // Ignore disabled features.
2617 if (Features[i][0] == '-')
2618 continue;
2619
Benjamin Kramer27402c62012-03-05 15:10:44 +00002620 StringRef Feature = StringRef(Features[i]).substr(1);
2621
2622 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002623 HasAES = true;
2624 continue;
2625 }
2626
Craig Topper3f122a72012-05-31 05:18:48 +00002627 if (Feature == "pclmul") {
2628 HasPCLMUL = true;
2629 continue;
2630 }
2631
Benjamin Kramer27402c62012-03-05 15:10:44 +00002632 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002633 HasLZCNT = true;
2634 continue;
2635 }
2636
Rafael Espindola89049822013-08-23 20:21:37 +00002637 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002638 HasRDRND = true;
2639 continue;
2640 }
2641
Craig Topper8c7f2512014-11-03 06:51:41 +00002642 if (Feature == "fsgsbase") {
2643 HasFSGSBASE = true;
2644 continue;
2645 }
2646
Benjamin Kramer27402c62012-03-05 15:10:44 +00002647 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002648 HasBMI = true;
2649 continue;
2650 }
2651
Benjamin Kramer27402c62012-03-05 15:10:44 +00002652 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002653 HasBMI2 = true;
2654 continue;
2655 }
2656
Benjamin Kramer27402c62012-03-05 15:10:44 +00002657 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002658 HasPOPCNT = true;
2659 continue;
2660 }
2661
Michael Liao625a8752012-11-10 05:17:46 +00002662 if (Feature == "rtm") {
2663 HasRTM = true;
2664 continue;
2665 }
2666
Michael Liao74f4eaf2013-03-26 17:52:08 +00002667 if (Feature == "prfchw") {
2668 HasPRFCHW = true;
2669 continue;
2670 }
2671
Michael Liaoffaae352013-03-29 05:17:55 +00002672 if (Feature == "rdseed") {
2673 HasRDSEED = true;
2674 continue;
2675 }
2676
Robert Khasanov50e6f582014-09-19 09:53:48 +00002677 if (Feature == "adx") {
2678 HasADX = true;
2679 continue;
2680 }
2681
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002682 if (Feature == "tbm") {
2683 HasTBM = true;
2684 continue;
2685 }
2686
Craig Topperbba778b2012-06-03 21:46:30 +00002687 if (Feature == "fma") {
2688 HasFMA = true;
2689 continue;
2690 }
2691
Manman Rena45358c2012-10-11 00:59:55 +00002692 if (Feature == "f16c") {
2693 HasF16C = true;
2694 continue;
2695 }
2696
Craig Topper679b53a2013-08-21 05:29:10 +00002697 if (Feature == "avx512cd") {
2698 HasAVX512CD = true;
2699 continue;
2700 }
2701
2702 if (Feature == "avx512er") {
2703 HasAVX512ER = true;
2704 continue;
2705 }
2706
2707 if (Feature == "avx512pf") {
2708 HasAVX512PF = true;
2709 continue;
2710 }
2711
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002712 if (Feature == "avx512dq") {
2713 HasAVX512DQ = true;
2714 continue;
2715 }
2716
2717 if (Feature == "avx512bw") {
2718 HasAVX512BW = true;
2719 continue;
2720 }
2721
2722 if (Feature == "avx512vl") {
2723 HasAVX512VL = true;
2724 continue;
2725 }
2726
Ben Langmuir58078d02013-09-19 13:22:04 +00002727 if (Feature == "sha") {
2728 HasSHA = true;
2729 continue;
2730 }
2731
Nick Lewycky50e8f482013-10-05 20:14:27 +00002732 if (Feature == "cx16") {
2733 HasCX16 = true;
2734 continue;
2735 }
2736
Daniel Dunbar979586e2009-11-11 09:38:56 +00002737 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002738 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002739 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002740 .Case("avx2", AVX2)
2741 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002742 .Case("sse4.2", SSE42)
2743 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002744 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002745 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002746 .Case("sse2", SSE2)
2747 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002748 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002749 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002750
Eli Friedman33465822011-07-08 23:31:17 +00002751 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002752 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002753 .Case("3dnowa", AMD3DNowAthlon)
2754 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002755 .Case("mmx", MMX)
2756 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002757 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002758
2759 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2760 .Case("xop", XOP)
2761 .Case("fma4", FMA4)
2762 .Case("sse4a", SSE4A)
2763 .Default(NoXOP);
2764 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002765 }
Eli Friedman33465822011-07-08 23:31:17 +00002766
Craig Topper7481d8a2013-09-10 06:55:47 +00002767 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2768 // Can't do this earlier because we need to be able to explicitly enable
2769 // popcnt and still disable sse4.2.
2770 if (!HasPOPCNT && SSELevel >= SSE42 &&
2771 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2772 HasPOPCNT = true;
2773 Features.push_back("+popcnt");
2774 }
2775
Yunzhong Gao61089362013-10-16 19:07:02 +00002776 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2777 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2778 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2779 HasPRFCHW = true;
2780 Features.push_back("+prfchw");
2781 }
2782
Rafael Espindolaeb265472013-08-21 21:59:03 +00002783 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2784 // matches the selected sse level.
2785 if (FPMath == FP_SSE && SSELevel < SSE1) {
2786 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2787 return false;
2788 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2789 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2790 return false;
2791 }
2792
Eli Friedman33465822011-07-08 23:31:17 +00002793 // Don't tell the backend if we're turning off mmx; it will end up disabling
2794 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002795 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2796 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002797 std::vector<std::string>::iterator it;
2798 it = std::find(Features.begin(), Features.end(), "-mmx");
2799 if (it != Features.end())
2800 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002801 else if (SSELevel > NoSSE)
2802 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002803 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002804}
Chris Lattnerecd49032009-03-02 22:27:17 +00002805
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002806/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2807/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002808void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002809 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002810 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002811 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002812 Builder.defineMacro("__amd64__");
2813 Builder.defineMacro("__amd64");
2814 Builder.defineMacro("__x86_64");
2815 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002816 if (getTriple().getArchName() == "x86_64h") {
2817 Builder.defineMacro("__x86_64h");
2818 Builder.defineMacro("__x86_64h__");
2819 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002820 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002821 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002822 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002823
Chris Lattnerecd49032009-03-02 22:27:17 +00002824 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002825 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2826 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002827 switch (CPU) {
2828 case CK_Generic:
2829 break;
2830 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002831 // The rest are coming from the i386 define above.
2832 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002833 break;
2834 case CK_i486:
2835 case CK_WinChipC6:
2836 case CK_WinChip2:
2837 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002838 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002839 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002840 case CK_PentiumMMX:
2841 Builder.defineMacro("__pentium_mmx__");
2842 Builder.defineMacro("__tune_pentium_mmx__");
2843 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002844 case CK_i586:
2845 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002846 defineCPUMacros(Builder, "i586");
2847 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002848 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002849 case CK_Pentium3:
2850 case CK_Pentium3M:
2851 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002852 Builder.defineMacro("__tune_pentium3__");
2853 // Fallthrough
2854 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002855 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002856 Builder.defineMacro("__tune_pentium2__");
2857 // Fallthrough
2858 case CK_PentiumPro:
2859 Builder.defineMacro("__tune_i686__");
2860 Builder.defineMacro("__tune_pentiumpro__");
2861 // Fallthrough
2862 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002863 Builder.defineMacro("__i686");
2864 Builder.defineMacro("__i686__");
2865 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2866 Builder.defineMacro("__pentiumpro");
2867 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002868 break;
2869 case CK_Pentium4:
2870 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002871 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002872 break;
2873 case CK_Yonah:
2874 case CK_Prescott:
2875 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002876 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002877 break;
2878 case CK_Core2:
2879 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002880 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002881 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002882 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002883 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002884 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002885 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002886 defineCPUMacros(Builder, "slm");
2887 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002888 case CK_Nehalem:
2889 case CK_Westmere:
2890 case CK_SandyBridge:
2891 case CK_IvyBridge:
2892 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002893 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002894 // FIXME: Historically, we defined this legacy name, it would be nice to
2895 // remove it at some point. We've never exposed fine-grained names for
2896 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002897 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002898 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002899 case CK_Skylake:
2900 // FIXME: Historically, we defined this legacy name, it would be nice to
2901 // remove it at some point. This is the only fine-grained CPU macro in the
2902 // main intel CPU line, and it would be better to not have these and force
2903 // people to use ISA macros.
2904 defineCPUMacros(Builder, "skx");
2905 break;
Craig Topper449314e2013-08-20 07:09:39 +00002906 case CK_KNL:
2907 defineCPUMacros(Builder, "knl");
2908 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002909 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002910 Builder.defineMacro("__k6_2__");
2911 Builder.defineMacro("__tune_k6_2__");
2912 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002913 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002914 if (CPU != CK_K6_2) { // In case of fallthrough
2915 // FIXME: GCC may be enabling these in cases where some other k6
2916 // architecture is specified but -m3dnow is explicitly provided. The
2917 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002918 Builder.defineMacro("__k6_3__");
2919 Builder.defineMacro("__tune_k6_3__");
2920 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002921 // Fallthrough
2922 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002923 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002924 break;
2925 case CK_Athlon:
2926 case CK_AthlonThunderbird:
2927 case CK_Athlon4:
2928 case CK_AthlonXP:
2929 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002930 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002931 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002932 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002933 Builder.defineMacro("__tune_athlon_sse__");
2934 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002935 break;
2936 case CK_K8:
2937 case CK_K8SSE3:
2938 case CK_x86_64:
2939 case CK_Opteron:
2940 case CK_OpteronSSE3:
2941 case CK_Athlon64:
2942 case CK_Athlon64SSE3:
2943 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002944 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002945 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002946 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002947 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002948 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002949 case CK_BTVER1:
2950 defineCPUMacros(Builder, "btver1");
2951 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002952 case CK_BTVER2:
2953 defineCPUMacros(Builder, "btver2");
2954 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002955 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002956 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002957 break;
2958 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002959 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002960 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002961 case CK_BDVER3:
2962 defineCPUMacros(Builder, "bdver3");
2963 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002964 case CK_BDVER4:
2965 defineCPUMacros(Builder, "bdver4");
2966 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002967 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002968 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002969 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002970 }
Chris Lattner96e43572009-03-02 22:40:39 +00002971
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002972 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002973 Builder.defineMacro("__REGISTER_PREFIX__", "");
2974
Chris Lattner6df41af2009-04-19 17:32:33 +00002975 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2976 // functions in glibc header files that use FP Stack inline asm which the
2977 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002978 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002979
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002980 if (HasAES)
2981 Builder.defineMacro("__AES__");
2982
Craig Topper3f122a72012-05-31 05:18:48 +00002983 if (HasPCLMUL)
2984 Builder.defineMacro("__PCLMUL__");
2985
Craig Topper22967d42011-12-25 05:06:45 +00002986 if (HasLZCNT)
2987 Builder.defineMacro("__LZCNT__");
2988
Benjamin Kramer1e250392012-07-07 09:39:18 +00002989 if (HasRDRND)
2990 Builder.defineMacro("__RDRND__");
2991
Craig Topper8c7f2512014-11-03 06:51:41 +00002992 if (HasFSGSBASE)
2993 Builder.defineMacro("__FSGSBASE__");
2994
Craig Topper22967d42011-12-25 05:06:45 +00002995 if (HasBMI)
2996 Builder.defineMacro("__BMI__");
2997
2998 if (HasBMI2)
2999 Builder.defineMacro("__BMI2__");
3000
Craig Topper1de83482011-12-29 16:10:46 +00003001 if (HasPOPCNT)
3002 Builder.defineMacro("__POPCNT__");
3003
Michael Liao625a8752012-11-10 05:17:46 +00003004 if (HasRTM)
3005 Builder.defineMacro("__RTM__");
3006
Michael Liao74f4eaf2013-03-26 17:52:08 +00003007 if (HasPRFCHW)
3008 Builder.defineMacro("__PRFCHW__");
3009
Michael Liaoffaae352013-03-29 05:17:55 +00003010 if (HasRDSEED)
3011 Builder.defineMacro("__RDSEED__");
3012
Robert Khasanov50e6f582014-09-19 09:53:48 +00003013 if (HasADX)
3014 Builder.defineMacro("__ADX__");
3015
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003016 if (HasTBM)
3017 Builder.defineMacro("__TBM__");
3018
Rafael Espindolae62e2792013-08-20 13:44:29 +00003019 switch (XOPLevel) {
3020 case XOP:
3021 Builder.defineMacro("__XOP__");
3022 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003023 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003024 case SSE4A:
3025 Builder.defineMacro("__SSE4A__");
3026 case NoXOP:
3027 break;
3028 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003029
Craig Topperbba778b2012-06-03 21:46:30 +00003030 if (HasFMA)
3031 Builder.defineMacro("__FMA__");
3032
Manman Rena45358c2012-10-11 00:59:55 +00003033 if (HasF16C)
3034 Builder.defineMacro("__F16C__");
3035
Craig Topper679b53a2013-08-21 05:29:10 +00003036 if (HasAVX512CD)
3037 Builder.defineMacro("__AVX512CD__");
3038 if (HasAVX512ER)
3039 Builder.defineMacro("__AVX512ER__");
3040 if (HasAVX512PF)
3041 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003042 if (HasAVX512DQ)
3043 Builder.defineMacro("__AVX512DQ__");
3044 if (HasAVX512BW)
3045 Builder.defineMacro("__AVX512BW__");
3046 if (HasAVX512VL)
3047 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003048
Ben Langmuir58078d02013-09-19 13:22:04 +00003049 if (HasSHA)
3050 Builder.defineMacro("__SHA__");
3051
Nick Lewycky50e8f482013-10-05 20:14:27 +00003052 if (HasCX16)
3053 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3054
Chris Lattner96e43572009-03-02 22:40:39 +00003055 // Each case falls through to the previous one here.
3056 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003057 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003058 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003059 case AVX2:
3060 Builder.defineMacro("__AVX2__");
3061 case AVX:
3062 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003063 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003064 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003065 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003066 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003067 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003068 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003069 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003070 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003071 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003072 Builder.defineMacro("__SSE2__");
3073 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003074 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003075 Builder.defineMacro("__SSE__");
3076 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003077 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003078 break;
3079 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003080
Derek Schuffc7dd7222012-10-11 15:52:22 +00003081 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003082 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003083 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003084 case AVX2:
3085 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003086 case SSE42:
3087 case SSE41:
3088 case SSSE3:
3089 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003090 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003091 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003092 break;
3093 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003094 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003095 break;
3096 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003097 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003098 }
3099 }
3100
Anders Carlssone437c682010-01-27 03:47:49 +00003101 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003102 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003103 case AMD3DNowAthlon:
3104 Builder.defineMacro("__3dNOW_A__");
3105 case AMD3DNow:
3106 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003107 case MMX:
3108 Builder.defineMacro("__MMX__");
3109 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003110 break;
3111 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003112
3113 if (CPU >= CK_i486) {
3114 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3115 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3116 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3117 }
3118 if (CPU >= CK_i586)
3119 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003120}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003121
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003122bool X86TargetInfo::hasFeature(StringRef Feature) const {
3123 return llvm::StringSwitch<bool>(Feature)
3124 .Case("aes", HasAES)
3125 .Case("avx", SSELevel >= AVX)
3126 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003127 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003128 .Case("avx512cd", HasAVX512CD)
3129 .Case("avx512er", HasAVX512ER)
3130 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003131 .Case("avx512dq", HasAVX512DQ)
3132 .Case("avx512bw", HasAVX512BW)
3133 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003134 .Case("bmi", HasBMI)
3135 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003136 .Case("cx16", HasCX16)
3137 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003138 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003139 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003140 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003141 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003142 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3143 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3144 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003145 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003146 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003147 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003148 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003149 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003150 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003151 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003152 .Case("sse", SSELevel >= SSE1)
3153 .Case("sse2", SSELevel >= SSE2)
3154 .Case("sse3", SSELevel >= SSE3)
3155 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003156 .Case("sse4.1", SSELevel >= SSE41)
3157 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003158 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003159 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003160 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003161 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3162 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003163 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003164 .Default(false);
3165}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003166
Eli Friedman3fd920a2008-08-20 02:34:37 +00003167bool
Anders Carlsson58436352009-02-28 17:11:49 +00003168X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003169 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003170 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003171 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003172 case 'I':
3173 Info.setRequiresImmediate(0, 31);
3174 return true;
3175 case 'J':
3176 Info.setRequiresImmediate(0, 63);
3177 return true;
3178 case 'K':
3179 Info.setRequiresImmediate(-128, 127);
3180 return true;
3181 case 'L':
3182 // FIXME: properly analyze this constraint:
3183 // must be one of 0xff, 0xffff, or 0xffffffff
3184 return true;
3185 case 'M':
3186 Info.setRequiresImmediate(0, 3);
3187 return true;
3188 case 'N':
3189 Info.setRequiresImmediate(0, 255);
3190 return true;
3191 case 'O':
3192 Info.setRequiresImmediate(0, 127);
3193 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003194 case 'Y': // first letter of a pair:
3195 switch (*(Name+1)) {
3196 default: return false;
3197 case '0': // First SSE register.
3198 case 't': // Any SSE register, when SSE2 is enabled.
3199 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3200 case 'm': // any MMX register, when inter-unit moves enabled.
3201 break; // falls through to setAllowsRegister.
3202 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003203 case 'f': // any x87 floating point stack register.
3204 // Constraint 'f' cannot be used for output operands.
3205 if (Info.ConstraintStr[0] == '=')
3206 return false;
3207
3208 Info.setAllowsRegister();
3209 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003210 case 'a': // eax.
3211 case 'b': // ebx.
3212 case 'c': // ecx.
3213 case 'd': // edx.
3214 case 'S': // esi.
3215 case 'D': // edi.
3216 case 'A': // edx:eax.
3217 case 't': // top of floating point stack.
3218 case 'u': // second from top of floating point stack.
3219 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003220 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003221 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003222 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003223 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3224 case 'l': // "Index" registers: any general register that can be used as an
3225 // index in a base+index memory access.
3226 Info.setAllowsRegister();
3227 return true;
3228 case 'C': // SSE floating point constant.
3229 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003230 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003231 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003232 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003233 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003234 return true;
3235 }
3236}
3237
Akira Hatanaka974131e2014-09-18 18:17:18 +00003238bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3239 unsigned Size) const {
3240 // Strip off constraint modifiers.
3241 while (Constraint[0] == '=' ||
3242 Constraint[0] == '+' ||
3243 Constraint[0] == '&')
3244 Constraint = Constraint.substr(1);
3245
3246 return validateOperandSize(Constraint, Size);
3247}
3248
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003249bool X86TargetInfo::validateInputSize(StringRef Constraint,
3250 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003251 return validateOperandSize(Constraint, Size);
3252}
3253
3254bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3255 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003256 switch (Constraint[0]) {
3257 default: break;
3258 case 'y':
3259 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003260 case 'f':
3261 case 't':
3262 case 'u':
3263 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003264 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003265 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003266 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003267 }
3268
3269 return true;
3270}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003271
Eli Friedman3fd920a2008-08-20 02:34:37 +00003272std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003273X86TargetInfo::convertConstraint(const char *&Constraint) const {
3274 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003275 case 'a': return std::string("{ax}");
3276 case 'b': return std::string("{bx}");
3277 case 'c': return std::string("{cx}");
3278 case 'd': return std::string("{dx}");
3279 case 'S': return std::string("{si}");
3280 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003281 case 'p': // address
3282 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003283 case 't': // top of floating point stack.
3284 return std::string("{st}");
3285 case 'u': // second from top of floating point stack.
3286 return std::string("{st(1)}"); // second from top of floating point stack.
3287 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003288 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003289 }
3290}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003291} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003292
3293namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003294// X86-32 generic target
3295class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003296public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003297 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003298 DoubleAlign = LongLongAlign = 32;
3299 LongDoubleWidth = 96;
3300 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003301 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003302 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003303 SizeType = UnsignedInt;
3304 PtrDiffType = SignedInt;
3305 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003306 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003307
3308 // Use fpret for all types.
3309 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3310 (1 << TargetInfo::Double) |
3311 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003312
3313 // x86-32 has atomics up to 8 bytes
3314 // FIXME: Check that we actually have cmpxchg8b before setting
3315 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3316 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003317 }
Craig Topper3164f332014-03-11 03:39:26 +00003318 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003319 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003320 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003321
Craig Topper3164f332014-03-11 03:39:26 +00003322 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003323 if (RegNo == 0) return 0;
3324 if (RegNo == 1) return 2;
3325 return -1;
3326 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003327 bool validateOperandSize(StringRef Constraint,
3328 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003329 switch (Constraint[0]) {
3330 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003331 case 'R':
3332 case 'q':
3333 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003334 case 'a':
3335 case 'b':
3336 case 'c':
3337 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003338 case 'S':
3339 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003340 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003341 case 'A':
3342 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003343 }
3344
Akira Hatanaka974131e2014-09-18 18:17:18 +00003345 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003346 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003347};
3348} // end anonymous namespace
3349
3350namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003351class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3352public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003353 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3354 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003355
Craig Topper3164f332014-03-11 03:39:26 +00003356 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003357 unsigned Major, Minor, Micro;
3358 getTriple().getOSVersion(Major, Minor, Micro);
3359 // New NetBSD uses the default rounding mode.
3360 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3361 return X86_32TargetInfo::getFloatEvalMethod();
3362 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003363 return 1;
3364 }
3365};
3366} // end anonymous namespace
3367
3368namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003369class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3370public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003371 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3372 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003373 SizeType = UnsignedLong;
3374 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003375 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003376 }
3377};
3378} // end anonymous namespace
3379
3380namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003381class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3382public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003383 BitrigI386TargetInfo(const llvm::Triple &Triple)
3384 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003385 SizeType = UnsignedLong;
3386 IntPtrType = SignedLong;
3387 PtrDiffType = SignedLong;
3388 }
3389};
3390} // end anonymous namespace
3391
3392namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003393class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003394public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003395 DarwinI386TargetInfo(const llvm::Triple &Triple)
3396 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003397 LongDoubleWidth = 128;
3398 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003399 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003400 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003401 SizeType = UnsignedLong;
3402 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003403 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003404 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003405 }
3406
Eli Friedman3fd920a2008-08-20 02:34:37 +00003407};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003408} // end anonymous namespace
3409
3410namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003411// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003412class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003413public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003414 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3415 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003416 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003417 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003418 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003419 }
Craig Topper3164f332014-03-11 03:39:26 +00003420 void getTargetDefines(const LangOptions &Opts,
3421 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003422 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3423 }
3424};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003425
3426// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003427class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003428public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003429 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003430 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003431 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003432 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3433 }
Craig Topper3164f332014-03-11 03:39:26 +00003434 void getTargetDefines(const LangOptions &Opts,
3435 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003436 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3437 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3438 // The value of the following reflects processor type.
3439 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3440 // We lost the original triple, so we use the default.
3441 Builder.defineMacro("_M_IX86", "600");
3442 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003443};
3444} // end anonymous namespace
3445
Reid Kleckner47606832014-04-21 20:58:00 +00003446static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3447 Builder.defineMacro("__MSVCRT__");
3448 Builder.defineMacro("__MINGW32__");
3449
3450 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3451 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3452 // macro anyway for pre-processor compatibility.
3453 if (Opts.MicrosoftExt)
3454 Builder.defineMacro("__declspec", "__declspec");
3455 else
3456 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3457
3458 if (!Opts.MicrosoftExt) {
3459 // Provide macros for all the calling convention keywords. Provide both
3460 // single and double underscore prefixed variants. These are available on
3461 // x64 as well as x86, even though they have no effect.
3462 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3463 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003464 std::string GCCSpelling = "__attribute__((__";
3465 GCCSpelling += CC;
3466 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003467 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3468 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3469 }
3470 }
3471}
3472
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003473namespace {
3474// x86-32 MinGW target
3475class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3476public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003477 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3478 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003479 void getTargetDefines(const LangOptions &Opts,
3480 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003481 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003482 DefineStd(Builder, "WIN32", Opts);
3483 DefineStd(Builder, "WINNT", Opts);
3484 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003485 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003486 }
3487};
3488} // end anonymous namespace
3489
3490namespace {
3491// x86-32 Cygwin target
3492class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3493public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003494 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3495 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003496 TLSSupported = false;
3497 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003498 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003499 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003500 }
Craig Topper3164f332014-03-11 03:39:26 +00003501 void getTargetDefines(const LangOptions &Opts,
3502 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003503 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003504 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003505 Builder.defineMacro("__CYGWIN__");
3506 Builder.defineMacro("__CYGWIN32__");
3507 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003508 if (Opts.CPlusPlus)
3509 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003510 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003511};
3512} // end anonymous namespace
3513
3514namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003515// x86-32 Haiku target
3516class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3517public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003518 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003519 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003520 IntPtrType = SignedLong;
3521 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003522 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003523 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003524 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003525 }
Craig Topper3164f332014-03-11 03:39:26 +00003526 void getTargetDefines(const LangOptions &Opts,
3527 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003528 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3529 Builder.defineMacro("__INTEL__");
3530 Builder.defineMacro("__HAIKU__");
3531 }
3532};
3533} // end anonymous namespace
3534
Douglas Gregor9fabd852011-07-01 22:41:14 +00003535// RTEMS Target
3536template<typename Target>
3537class RTEMSTargetInfo : public OSTargetInfo<Target> {
3538protected:
Craig Topper3164f332014-03-11 03:39:26 +00003539 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3540 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003541 // RTEMS defines; list based off of gcc output
3542
Douglas Gregor9fabd852011-07-01 22:41:14 +00003543 Builder.defineMacro("__rtems__");
3544 Builder.defineMacro("__ELF__");
3545 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003546
Douglas Gregor9fabd852011-07-01 22:41:14 +00003547public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003548 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3549 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003550
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003551 switch (Triple.getArch()) {
3552 default:
3553 case llvm::Triple::x86:
3554 // this->MCountName = ".mcount";
3555 break;
3556 case llvm::Triple::mips:
3557 case llvm::Triple::mipsel:
3558 case llvm::Triple::ppc:
3559 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003560 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003561 // this->MCountName = "_mcount";
3562 break;
3563 case llvm::Triple::arm:
3564 // this->MCountName = "__mcount";
3565 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003566 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003567 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003568};
3569
3570namespace {
3571// x86-32 RTEMS target
3572class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3573public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003574 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003575 SizeType = UnsignedLong;
3576 IntPtrType = SignedLong;
3577 PtrDiffType = SignedLong;
3578 this->UserLabelPrefix = "";
3579 }
Craig Topper3164f332014-03-11 03:39:26 +00003580 void getTargetDefines(const LangOptions &Opts,
3581 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003582 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3583 Builder.defineMacro("__INTEL__");
3584 Builder.defineMacro("__rtems__");
3585 }
3586};
3587} // end anonymous namespace
3588
Chris Lattnerb986aba2010-04-11 19:29:39 +00003589namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003590// x86-64 generic target
3591class X86_64TargetInfo : public X86TargetInfo {
3592public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003593 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003594 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003595 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003596 LongDoubleWidth = 128;
3597 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003598 LargeArrayMinWidth = 128;
3599 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003600 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003601 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3602 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3603 IntPtrType = IsX32 ? SignedInt : SignedLong;
3604 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003605 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003606 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003607
Eric Christopher917e9522014-11-18 22:36:15 +00003608 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003609 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003610 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3611 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003612
3613 // Use fpret only for long double.
3614 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003615
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003616 // Use fp2ret for _Complex long double.
3617 ComplexLongDoubleUsesFP2Ret = true;
3618
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003619 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003620 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003621 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003622 }
Craig Topper3164f332014-03-11 03:39:26 +00003623 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003624 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003625 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003626
Craig Topper3164f332014-03-11 03:39:26 +00003627 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003628 if (RegNo == 0) return 0;
3629 if (RegNo == 1) return 1;
3630 return -1;
3631 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003632
Craig Topper3164f332014-03-11 03:39:26 +00003633 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003634 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003635 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003636 CC == CC_IntelOclBicc ||
3637 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003638 }
3639
Craig Topper3164f332014-03-11 03:39:26 +00003640 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003641 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003642 }
3643
Pavel Chupinfd223e12014-08-04 12:39:43 +00003644 // for x32 we need it here explicitly
3645 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003646};
3647} // end anonymous namespace
3648
3649namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003650// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003651class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003652public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003653 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3654 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003655 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003656 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003657 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003658 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003659 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003660 SizeType = UnsignedLongLong;
3661 PtrDiffType = SignedLongLong;
3662 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003663 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003664 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003665
Craig Topper3164f332014-03-11 03:39:26 +00003666 void getTargetDefines(const LangOptions &Opts,
3667 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003668 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003669 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003670 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003671
Craig Topper3164f332014-03-11 03:39:26 +00003672 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003673 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003674 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003675
Craig Topper3164f332014-03-11 03:39:26 +00003676 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003677 switch (CC) {
3678 case CC_X86StdCall:
3679 case CC_X86ThisCall:
3680 case CC_X86FastCall:
3681 return CCCR_Ignore;
3682 case CC_C:
3683 case CC_X86VectorCall:
3684 case CC_IntelOclBicc:
3685 case CC_X86_64SysV:
3686 return CCCR_OK;
3687 default:
3688 return CCCR_Warning;
3689 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003690 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003691};
3692} // end anonymous namespace
3693
3694namespace {
3695// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003696class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003697public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003698 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003699 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003700 LongDoubleWidth = LongDoubleAlign = 64;
3701 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003702 }
Craig Topper3164f332014-03-11 03:39:26 +00003703 void getTargetDefines(const LangOptions &Opts,
3704 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003705 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3706 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003707 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003708 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003709 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003710};
3711} // end anonymous namespace
3712
3713namespace {
3714// 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};
3731} // end anonymous namespace
3732
3733namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003734class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3735public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003736 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3737 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003738 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003739 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003740 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3741 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003742 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003743 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003744 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003745 }
3746};
3747} // end anonymous namespace
3748
3749namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003750class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3751public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003752 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3753 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003754 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003755 Int64Type = SignedLongLong;
3756 }
3757};
3758} // end anonymous namespace
3759
3760namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003761class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3762public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003763 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3764 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3765 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003766 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003767 }
3768};
Tim Northover9bb857a2013-01-31 12:13:10 +00003769}
3770
Eli Friedman9fa28852012-08-08 23:57:20 +00003771
3772namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003773class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003774 // Possible FPU choices.
3775 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003776 VFP2FPU = (1 << 0),
3777 VFP3FPU = (1 << 1),
3778 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003779 NeonFPU = (1 << 3),
3780 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003781 };
3782
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003783 // Possible HWDiv features.
3784 enum HWDivMode {
3785 HWDivThumb = (1 << 0),
3786 HWDivARM = (1 << 1)
3787 };
3788
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003789 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003790 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003791 }
3792
3793 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3794 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003795
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003796 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003797
Rafael Espindolaeb265472013-08-21 21:59:03 +00003798 enum {
3799 FP_Default,
3800 FP_VFP,
3801 FP_Neon
3802 } FPMath;
3803
Bernard Ogdenda13af32013-10-24 18:32:51 +00003804 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003805
Logan Chien57086ce2012-10-10 06:56:20 +00003806 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003807 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003808 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003809
3810 // Initialized via features.
3811 unsigned SoftFloat : 1;
3812 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003813
Bernard Ogden18b57012013-10-29 09:47:51 +00003814 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003815 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003816
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003817 // ACLE 6.5.1 Hardware floating point
3818 enum {
3819 HW_FP_HP = (1 << 1), /// half (16-bit)
3820 HW_FP_SP = (1 << 2), /// single (32-bit)
3821 HW_FP_DP = (1 << 3), /// double (64-bit)
3822 };
3823 uint32_t HW_FP;
3824
Chris Lattner5cc15e02010-03-03 19:03:45 +00003825 static const Builtin::Info BuiltinInfo[];
3826
Rafael Espindola101d5b92013-05-13 20:09:47 +00003827 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003828 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003829 if (T.getArch() == llvm::Triple::arm ||
3830 T.getArch() == llvm::Triple::armeb) {
3831 StringRef VersionStr;
3832 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003833 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003834 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003835 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003836 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003837 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003838 unsigned Version;
3839 if (VersionStr.getAsInteger(10, Version))
3840 return false;
3841 return Version >= 6;
3842 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003843 assert(T.getArch() == llvm::Triple::thumb ||
3844 T.getArch() == llvm::Triple::thumbeb);
3845 StringRef VersionStr;
3846 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003847 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003848 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003849 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003850 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003851 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003852 unsigned Version;
3853 if (VersionStr.getAsInteger(10, Version))
3854 return false;
3855 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003856 }
3857
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003858 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003859 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003860
3861 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003862 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003863
Renato Golin9ba39232015-02-27 16:35:48 +00003864 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3865 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3866 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003867 SizeType = UnsignedLong;
3868 else
3869 SizeType = UnsignedInt;
3870
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003871 switch (T.getOS()) {
3872 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003873 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003874 break;
3875 case llvm::Triple::Win32:
3876 WCharType = UnsignedShort;
3877 break;
3878 case llvm::Triple::Linux:
3879 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003880 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3881 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003882 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003883 }
3884
3885 UseBitFieldTypeAlignment = true;
3886
3887 ZeroLengthBitfieldBoundary = 0;
3888
Tim Northover147cd2f2014-10-14 22:12:21 +00003889 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3890 // so set preferred for small types to 32.
3891 if (T.isOSBinFormatMachO()) {
3892 DescriptionString =
3893 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3894 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3895 } else if (T.isOSWindows()) {
3896 // FIXME: this is invalid for WindowsCE
3897 assert(!BigEndian && "Windows on ARM does not support big endian");
3898 DescriptionString = "e"
3899 "-m:e"
3900 "-p:32:32"
3901 "-i64:64"
3902 "-v128:64:128"
3903 "-a:0:32"
3904 "-n32"
3905 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003906 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003907 DescriptionString =
3908 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3909 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003910 }
3911
3912 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003913 }
3914
3915 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003916 const llvm::Triple &T = getTriple();
3917
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003918 IsAAPCS = false;
3919
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003920 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003921
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003922 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003923 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003924 SizeType = UnsignedInt;
3925 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003926 SizeType = UnsignedLong;
3927
3928 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3929 WCharType = SignedInt;
3930
3931 // Do not respect the alignment of bit-field types when laying out
3932 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3933 UseBitFieldTypeAlignment = false;
3934
3935 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3936 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3937 /// gcc.
3938 ZeroLengthBitfieldBoundary = 32;
3939
Tim Northover147cd2f2014-10-14 22:12:21 +00003940 if (T.isOSBinFormatMachO())
3941 DescriptionString =
3942 BigEndian
3943 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3944 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3945 else
3946 DescriptionString =
3947 BigEndian
3948 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3949 : "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 +00003950
3951 // FIXME: Override "preferred align" for double and long long.
3952 }
3953
Chris Lattner17df24e2008-04-21 18:56:49 +00003954public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003955 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003956 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003957 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003958 BigEndian = IsBigEndian;
3959
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003960 switch (getTriple().getOS()) {
3961 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003962 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003963 break;
3964 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003965 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003966 break;
3967 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003968
Chris Lattner1a8f3942010-04-23 16:29:58 +00003969 // {} in inline assembly are neon specifiers, not assembly variant
3970 // specifiers.
3971 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003972
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003973 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003974 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003975
Eric Christopher0e261882014-12-05 01:06:59 +00003976 // FIXME: This duplicates code from the driver that sets the -target-abi
3977 // option - this code is used if -target-abi isn't passed and should
3978 // be unified in some way.
3979 if (Triple.isOSBinFormatMachO()) {
3980 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3981 // the frontend matches that.
3982 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3983 Triple.getOS() == llvm::Triple::UnknownOS ||
3984 StringRef(CPU).startswith("cortex-m")) {
3985 setABI("aapcs");
3986 } else {
3987 setABI("apcs-gnu");
3988 }
3989 } else if (Triple.isOSWindows()) {
3990 // FIXME: this is invalid for WindowsCE
3991 setABI("aapcs");
3992 } else {
3993 // Select the default based on the platform.
3994 switch (Triple.getEnvironment()) {
3995 case llvm::Triple::Android:
3996 case llvm::Triple::GNUEABI:
3997 case llvm::Triple::GNUEABIHF:
3998 setABI("aapcs-linux");
3999 break;
4000 case llvm::Triple::EABIHF:
4001 case llvm::Triple::EABI:
4002 setABI("aapcs");
4003 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004004 case llvm::Triple::GNU:
4005 setABI("apcs-gnu");
4006 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004007 default:
4008 if (Triple.getOS() == llvm::Triple::NetBSD)
4009 setABI("apcs-gnu");
4010 else
4011 setABI("aapcs");
4012 break;
4013 }
4014 }
John McCall86353412010-08-21 22:46:04 +00004015
4016 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004017 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004018
4019 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004020 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004021 if (shouldUseInlineAtomic(getTriple()))
4022 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004023
4024 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004025 // the alignment of the zero-length bitfield is greater than the member
4026 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004027 // zero length bitfield.
4028 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004029 }
Alp Toker4925ba72014-06-07 23:30:42 +00004030 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004031 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004032 ABI = Name;
4033
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004034 // The defaults (above) are for AAPCS, check if we need to change them.
4035 //
4036 // FIXME: We need support for -meabi... we could just mangle it into the
4037 // name.
4038 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004039 setABIAPCS();
4040 return true;
4041 }
4042 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4043 setABIAAPCS();
4044 return true;
4045 }
4046 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004047 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004048
Craig Topper3164f332014-03-11 03:39:26 +00004049 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004050 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004051 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4052 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004053 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004054 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004055 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004056 }
4057 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004058 Features["vfp4"] = true;
4059 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004060 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4061 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004062 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004063 Features["vfp4"] = true;
4064 Features["neon"] = true;
4065 Features["hwdiv"] = true;
4066 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004067 } else if (CPU == "cyclone") {
4068 Features["v8fp"] = true;
4069 Features["neon"] = true;
4070 Features["hwdiv"] = true;
4071 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004072 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004073 Features["fp-armv8"] = true;
4074 Features["neon"] = true;
4075 Features["hwdiv"] = true;
4076 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004077 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004078 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004079 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004080 // Enable the hwdiv extension for all v8a AArch32 cores by
4081 // default.
4082 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004083 ArchName == "armebv8a" || ArchName == "armebv8" ||
4084 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4085 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004086 Features["hwdiv"] = true;
4087 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004088 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
4089 CPU == "sc300") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004090 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004091 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004092 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004093
Craig Topper3164f332014-03-11 03:39:26 +00004094 bool handleTargetFeatures(std::vector<std::string> &Features,
4095 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004096 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004097 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004098 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004099 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004100 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004101
4102 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004103 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004104 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004105 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004106 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004107 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004108 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004109 HW_FP = HW_FP_SP | HW_FP_DP;
4110 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004111 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004112 HW_FP = HW_FP_SP | HW_FP_DP;
4113 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004114 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004115 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4116 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004117 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004118 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4119 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004120 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004121 HW_FP = HW_FP_SP | HW_FP_DP;
4122 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004123 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004124 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004125 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004126 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004127 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004128 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004129 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004130 } else if (Feature == "+fp-only-sp") {
4131 HW_FP &= ~HW_FP_DP;
4132 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004133 }
4134
Rafael Espindolaeb265472013-08-21 21:59:03 +00004135 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4136 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4137 return false;
4138 }
4139
4140 if (FPMath == FP_Neon)
4141 Features.push_back("+neonfp");
4142 else if (FPMath == FP_VFP)
4143 Features.push_back("-neonfp");
4144
Daniel Dunbar893d4752009-12-19 04:15:38 +00004145 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004146 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4147 for (const auto &FEFeature : FrontEndFeatures) {
4148 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4149 if (Feature != Features.end())
4150 Features.erase(Feature);
4151 }
4152
Rafael Espindolaeb265472013-08-21 21:59:03 +00004153 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004154 }
4155
Craig Topper3164f332014-03-11 03:39:26 +00004156 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004157 return llvm::StringSwitch<bool>(Feature)
4158 .Case("arm", true)
4159 .Case("softfloat", SoftFloat)
4160 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004161 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004162 .Case("hwdiv", HWDiv & HWDivThumb)
4163 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004164 .Default(false);
4165 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004166 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004167 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004168 return llvm::StringSwitch<const char *>(Name)
4169 .Cases("arm8", "arm810", "4")
4170 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4171 "4")
4172 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4173 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4174 .Case("ep9312", "4T")
4175 .Cases("arm10tdmi", "arm1020t", "5T")
4176 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4177 .Case("arm926ej-s", "5TEJ")
4178 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4179 .Cases("xscale", "iwmmxt", "5TE")
4180 .Case("arm1136j-s", "6J")
4181 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4182 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4183 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4184 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4185 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4186 "7A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004187 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004188 .Case("swift", "7S")
4189 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004190 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004191 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004192 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004193 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004194 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004195 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004196 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004197 return llvm::StringSwitch<const char *>(Name)
4198 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4199 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4200 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004201 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004202 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4203 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
4204 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004205 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004206 }
Craig Topper3164f332014-03-11 03:39:26 +00004207 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004208 if (!getCPUDefineSuffix(Name))
4209 return false;
4210
Tim Northovere8c37212014-07-09 09:24:43 +00004211 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4212 StringRef Profile = getCPUProfile(Name);
4213 if (Profile == "M" && MaxAtomicInlineWidth) {
4214 MaxAtomicPromoteWidth = 32;
4215 MaxAtomicInlineWidth = 32;
4216 }
4217
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004218 CPU = Name;
4219 return true;
4220 }
Craig Topper3164f332014-03-11 03:39:26 +00004221 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004222 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4223 unsigned CPUArchVer) const {
4224 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4225 (CPUArch.find('M') != StringRef::npos);
4226 }
4227 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4228 unsigned CPUArchVer) const {
4229 // We check both CPUArchVer and ArchName because when only triple is
4230 // specified, the default CPU is arm1136j-s.
4231 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4232 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4233 }
Craig Topper3164f332014-03-11 03:39:26 +00004234 void getTargetDefines(const LangOptions &Opts,
4235 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004236 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004237 Builder.defineMacro("__arm");
4238 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004239
Chris Lattnerecd49032009-03-02 22:27:17 +00004240 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004241 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004242
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004243 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004244 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004245 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004246 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004247 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004248
4249 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004250 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004251 StringRef ArchName = getTriple().getArchName();
4252
4253 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4254 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004255 if (CPUArch[0] >= '8') {
4256 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4257 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004258 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004259
4260 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4261 // is not defined for the M-profile.
4262 // NOTE that the deffault profile is assumed to be 'A'
4263 if (CPUProfile.empty() || CPUProfile != "M")
4264 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4265
4266 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4267 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4268 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4269 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4270 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4271 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4272 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4273
4274 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4275 // instruction set such as ARM or Thumb.
4276 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4277
4278 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4279
4280 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004281 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004282 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004283
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004284 // ACLE 6.5.1 Hardware Floating Point
4285 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004286 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004287
Yi Konga44c4d72014-06-27 21:25:42 +00004288 // ACLE predefines.
4289 Builder.defineMacro("__ARM_ACLE", "200");
4290
Mike Stump9d54bd72009-04-08 02:07:04 +00004291 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004292
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004293 // FIXME: It's more complicated than this and we don't really support
4294 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004295 // Windows on ARM does not "support" interworking
4296 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004297 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004298
David Tweed8f676532012-10-25 13:33:01 +00004299 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004300 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004301 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4302 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004303 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004304 Builder.defineMacro("__ARM_PCS", "1");
4305
David Tweed8f676532012-10-25 13:33:01 +00004306 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004307 Builder.defineMacro("__ARM_PCS_VFP", "1");
4308 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004309
Daniel Dunbar893d4752009-12-19 04:15:38 +00004310 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004311 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004312
4313 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004314 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004315
4316 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004317 Builder.defineMacro("__THUMBEL__");
4318 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004319 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004320 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004321 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004322 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4323 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004324
4325 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004326 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004327
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004328 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004329 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004330 if (FPU & VFP2FPU)
4331 Builder.defineMacro("__ARM_VFPV2__");
4332 if (FPU & VFP3FPU)
4333 Builder.defineMacro("__ARM_VFPV3__");
4334 if (FPU & VFP4FPU)
4335 Builder.defineMacro("__ARM_VFPV4__");
4336 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004337
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004338 // This only gets set when Neon instructions are actually available, unlike
4339 // the VFP define, hence the soft float and arch check. This is subtly
4340 // different from gcc, we follow the intent which was that it should be set
4341 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004342 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4343 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004344 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004345 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004346
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004347 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4348 Opts.ShortWChar ? "2" : "4");
4349
4350 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4351 Opts.ShortEnums ? "1" : "4");
4352
Bernard Ogden18b57012013-10-29 09:47:51 +00004353 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004354 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004355
Tim Northover02e38602014-02-03 17:28:04 +00004356 if (Crypto)
4357 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4358
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004359 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004360 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4362 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4363 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4364 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004365
4366 bool is5EOrAbove = (CPUArchVer >= 6 ||
4367 (CPUArchVer == 5 &&
4368 CPUArch.find('E') != StringRef::npos));
4369 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4370 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4371 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004372 }
Craig Topper3164f332014-03-11 03:39:26 +00004373 void getTargetBuiltins(const Builtin::Info *&Records,
4374 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004375 Records = BuiltinInfo;
4376 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004377 }
Craig Topper3164f332014-03-11 03:39:26 +00004378 bool isCLZForZeroUndef() const override { return false; }
4379 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004380 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004381 }
Craig Topper3164f332014-03-11 03:39:26 +00004382 void getGCCRegNames(const char * const *&Names,
4383 unsigned &NumNames) const override;
4384 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4385 unsigned &NumAliases) const override;
4386 bool validateAsmConstraint(const char *&Name,
4387 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004388 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004389 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004390 case 'l': // r0-r7
4391 case 'h': // r8-r15
4392 case 'w': // VFP Floating point register single precision
4393 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004394 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004395 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004396 case 'I':
4397 case 'J':
4398 case 'K':
4399 case 'L':
4400 case 'M':
4401 // FIXME
4402 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004403 case 'Q': // A memory address that is a single base register.
4404 Info.setAllowsMemory();
4405 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004406 case 'U': // a memory reference...
4407 switch (Name[1]) {
4408 case 'q': // ...ARMV4 ldrsb
4409 case 'v': // ...VFP load/store (reg+constant offset)
4410 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004411 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004412 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004413 case 'n': // valid address for Neon doubleword vector load/store
4414 case 'm': // valid address for Neon element and structure load/store
4415 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004416 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004417 Info.setAllowsMemory();
4418 Name++;
4419 return true;
4420 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004421 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004422 return false;
4423 }
Craig Topper3164f332014-03-11 03:39:26 +00004424 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004425 std::string R;
4426 switch (*Constraint) {
4427 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004428 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004429 Constraint++;
4430 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004431 case 'p': // 'p' should be translated to 'r' by default.
4432 R = std::string("r");
4433 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004434 default:
4435 return std::string(1, *Constraint);
4436 }
4437 return R;
4438 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004439 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004440 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004441 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004442 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004443 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004444
Bill Wendling9d1ee112012-10-25 23:28:48 +00004445 // Strip off constraint modifiers.
4446 while (Constraint[0] == '=' ||
4447 Constraint[0] == '+' ||
4448 Constraint[0] == '&')
4449 Constraint = Constraint.substr(1);
4450
4451 switch (Constraint[0]) {
4452 default: break;
4453 case 'r': {
4454 switch (Modifier) {
4455 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004456 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004457 case 'q':
4458 // A register of size 32 cannot fit a vector type.
4459 return false;
4460 }
4461 }
4462 }
4463
4464 return true;
4465 }
Craig Topper3164f332014-03-11 03:39:26 +00004466 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004467 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004468 return "";
4469 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004470
Craig Topper3164f332014-03-11 03:39:26 +00004471 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004472 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4473 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004474
Craig Topper3164f332014-03-11 03:39:26 +00004475 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004476 if (RegNo == 0) return 0;
4477 if (RegNo == 1) return 1;
4478 return -1;
4479 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004480};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004481
Rafael Espindolaeb265472013-08-21 21:59:03 +00004482bool ARMTargetInfo::setFPMath(StringRef Name) {
4483 if (Name == "neon") {
4484 FPMath = FP_Neon;
4485 return true;
4486 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4487 Name == "vfp4") {
4488 FPMath = FP_VFP;
4489 return true;
4490 }
4491 return false;
4492}
4493
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004494const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004495 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004496 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004497 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4498
4499 // Float registers
4500 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4501 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4502 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004503 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004504
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004505 // Double registers
4506 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4507 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004508 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4509 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004510
4511 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004512 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4513 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004514};
4515
4516void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004517 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004518 Names = GCCRegNames;
4519 NumNames = llvm::array_lengthof(GCCRegNames);
4520}
4521
4522const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004523 { { "a1" }, "r0" },
4524 { { "a2" }, "r1" },
4525 { { "a3" }, "r2" },
4526 { { "a4" }, "r3" },
4527 { { "v1" }, "r4" },
4528 { { "v2" }, "r5" },
4529 { { "v3" }, "r6" },
4530 { { "v4" }, "r7" },
4531 { { "v5" }, "r8" },
4532 { { "v6", "rfp" }, "r9" },
4533 { { "sl" }, "r10" },
4534 { { "fp" }, "r11" },
4535 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004536 { { "r13" }, "sp" },
4537 { { "r14" }, "lr" },
4538 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004539 // The S, D and Q registers overlap, but aren't really aliases; we
4540 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004541};
4542
4543void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4544 unsigned &NumAliases) const {
4545 Aliases = GCCRegAliases;
4546 NumAliases = llvm::array_lengthof(GCCRegAliases);
4547}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004548
4549const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004550#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004551#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004552 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004553#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004554
4555#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004556#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004557#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4558 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004559#include "clang/Basic/BuiltinsARM.def"
4560};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004561
4562class ARMleTargetInfo : public ARMTargetInfo {
4563public:
4564 ARMleTargetInfo(const llvm::Triple &Triple)
4565 : ARMTargetInfo(Triple, false) { }
4566 virtual void getTargetDefines(const LangOptions &Opts,
4567 MacroBuilder &Builder) const {
4568 Builder.defineMacro("__ARMEL__");
4569 ARMTargetInfo::getTargetDefines(Opts, Builder);
4570 }
4571};
4572
4573class ARMbeTargetInfo : public ARMTargetInfo {
4574public:
4575 ARMbeTargetInfo(const llvm::Triple &Triple)
4576 : ARMTargetInfo(Triple, true) { }
4577 virtual void getTargetDefines(const LangOptions &Opts,
4578 MacroBuilder &Builder) const {
4579 Builder.defineMacro("__ARMEB__");
4580 Builder.defineMacro("__ARM_BIG_ENDIAN");
4581 ARMTargetInfo::getTargetDefines(Opts, Builder);
4582 }
4583};
Chris Lattner17df24e2008-04-21 18:56:49 +00004584} // end anonymous namespace.
4585
Eli Friedmanf05b7722008-08-20 07:44:10 +00004586namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004587class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4588 const llvm::Triple Triple;
4589public:
4590 WindowsARMTargetInfo(const llvm::Triple &Triple)
4591 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4592 TLSSupported = false;
4593 WCharType = UnsignedShort;
4594 SizeType = UnsignedInt;
4595 UserLabelPrefix = "";
4596 }
4597 void getVisualStudioDefines(const LangOptions &Opts,
4598 MacroBuilder &Builder) const {
4599 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4600
4601 // FIXME: this is invalid for WindowsCE
4602 Builder.defineMacro("_M_ARM_NT", "1");
4603 Builder.defineMacro("_M_ARMT", "_M_ARM");
4604 Builder.defineMacro("_M_THUMB", "_M_ARM");
4605
4606 assert((Triple.getArch() == llvm::Triple::arm ||
4607 Triple.getArch() == llvm::Triple::thumb) &&
4608 "invalid architecture for Windows ARM target info");
4609 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4610 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4611
4612 // TODO map the complete set of values
4613 // 31: VFPv3 40: VFPv4
4614 Builder.defineMacro("_M_ARM_FP", "31");
4615 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004616 BuiltinVaListKind getBuiltinVaListKind() const override {
4617 return TargetInfo::CharPtrBuiltinVaList;
4618 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004619};
4620
4621// Windows ARM + Itanium C++ ABI Target
4622class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4623public:
4624 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4625 : WindowsARMTargetInfo(Triple) {
4626 TheCXXABI.set(TargetCXXABI::GenericARM);
4627 }
4628
4629 void getTargetDefines(const LangOptions &Opts,
4630 MacroBuilder &Builder) const override {
4631 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4632
4633 if (Opts.MSVCCompat)
4634 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4635 }
4636};
4637
4638// Windows ARM, MS (C++) ABI
4639class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4640public:
4641 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4642 : WindowsARMTargetInfo(Triple) {
4643 TheCXXABI.set(TargetCXXABI::Microsoft);
4644 }
4645
4646 void getTargetDefines(const LangOptions &Opts,
4647 MacroBuilder &Builder) const override {
4648 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4649 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4650 }
4651};
4652}
4653
4654
4655namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004656class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004657 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004658protected:
Craig Topper3164f332014-03-11 03:39:26 +00004659 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4660 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004661 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004662 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004663
Torok Edwinb2b37c62009-06-30 17:10:35 +00004664public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004665 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004666 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004667 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004668 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004669 // FIXME: This should be based off of the target features in
4670 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004671 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004672
4673 // Darwin on iOS uses a variant of the ARM C++ ABI.
4674 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004675 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004676};
4677} // end anonymous namespace.
4678
Tony Linthicum76329bf2011-12-12 21:14:55 +00004679
4680namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004681class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004682 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004683 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4684 static const char *const GCCRegNames[];
4685
James Molloy75f5f9e2014-04-16 15:33:48 +00004686 enum FPUModeEnum {
4687 FPUMode,
4688 NeonMode
4689 };
4690
4691 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004692 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004693 unsigned Crypto;
4694
Tim Northovera2ee4332014-03-29 15:09:45 +00004695 static const Builtin::Info BuiltinInfo[];
4696
4697 std::string ABI;
4698
4699public:
Tim Northover573cbee2014-05-24 12:52:07 +00004700 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004701 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004702
4703 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4704 WCharType = SignedInt;
4705
4706 // NetBSD apparently prefers consistency across ARM targets to consistency
4707 // across 64-bit targets.
4708 Int64Type = SignedLongLong;
4709 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004710 } else {
4711 WCharType = UnsignedInt;
4712 Int64Type = SignedLong;
4713 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004714 }
4715
Tim Northovera2ee4332014-03-29 15:09:45 +00004716 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004717 MaxVectorAlign = 128;
4718 RegParmMax = 8;
4719 MaxAtomicInlineWidth = 128;
4720 MaxAtomicPromoteWidth = 128;
4721
Tim Northovera6a19f12015-02-06 01:25:07 +00004722 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004723 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4724
Tim Northovera2ee4332014-03-29 15:09:45 +00004725 // {} in inline assembly are neon specifiers, not assembly variant
4726 // specifiers.
4727 NoAsmVariants = true;
4728
Tim Northover7ad87af2015-01-16 18:44:04 +00004729 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4730 // contributes to the alignment of the containing aggregate in the same way
4731 // a plain (non bit-field) member of that type would, without exception for
4732 // zero-sized or anonymous bit-fields."
4733 UseBitFieldTypeAlignment = true;
4734 UseZeroLengthBitfieldAlignment = true;
4735
Tim Northover573cbee2014-05-24 12:52:07 +00004736 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004737 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4738 }
4739
Alp Toker4925ba72014-06-07 23:30:42 +00004740 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004741 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004742 if (Name != "aapcs" && Name != "darwinpcs")
4743 return false;
4744
4745 ABI = Name;
4746 return true;
4747 }
4748
David Blaikie1cbb9712014-11-14 19:09:44 +00004749 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004750 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004751 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004752 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004753 .Case("cyclone", true)
4754 .Default(false);
4755 return CPUKnown;
4756 }
4757
4758 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004759 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004760 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004761 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004762
4763 // Target properties.
4764 Builder.defineMacro("_LP64");
4765 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004766
4767 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4768 Builder.defineMacro("__ARM_ACLE", "200");
4769 Builder.defineMacro("__ARM_ARCH", "8");
4770 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4771
4772 Builder.defineMacro("__ARM_64BIT_STATE");
4773 Builder.defineMacro("__ARM_PCS_AAPCS64");
4774 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4775
4776 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4777 Builder.defineMacro("__ARM_FEATURE_CLZ");
4778 Builder.defineMacro("__ARM_FEATURE_FMA");
4779 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004780 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4781 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4782 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4783 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004784
4785 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4786
4787 // 0xe implies support for half, single and double precision operations.
4788 Builder.defineMacro("__ARM_FP", "0xe");
4789
4790 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4791 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4792 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4793
4794 if (Opts.FastMath || Opts.FiniteMathOnly)
4795 Builder.defineMacro("__ARM_FP_FAST");
4796
Richard Smithab506ad2014-10-20 23:26:58 +00004797 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004798 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4799
4800 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4801
4802 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4803 Opts.ShortEnums ? "1" : "4");
4804
James Molloy75f5f9e2014-04-16 15:33:48 +00004805 if (FPU == NeonMode) {
4806 Builder.defineMacro("__ARM_NEON");
4807 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004808 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004809 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004810
Bradley Smith418c5932014-05-02 15:17:51 +00004811 if (CRC)
4812 Builder.defineMacro("__ARM_FEATURE_CRC32");
4813
James Molloy75f5f9e2014-04-16 15:33:48 +00004814 if (Crypto)
4815 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004816 }
4817
4818 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004819 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004820 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004821 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004822 }
4823
David Blaikie1cbb9712014-11-14 19:09:44 +00004824 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004825 return Feature == "aarch64" ||
4826 Feature == "arm64" ||
4827 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004828 }
4829
James Molloy5e73df52014-04-16 15:06:20 +00004830 bool handleTargetFeatures(std::vector<std::string> &Features,
4831 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004832 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004833 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004834 Crypto = 0;
4835 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4836 if (Features[i] == "+neon")
4837 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004838 if (Features[i] == "+crc")
4839 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004840 if (Features[i] == "+crypto")
4841 Crypto = 1;
4842 }
4843
James Molloy5e73df52014-04-16 15:06:20 +00004844 setDescriptionString();
4845
4846 return true;
4847 }
4848
David Blaikie1cbb9712014-11-14 19:09:44 +00004849 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004850
David Blaikie1cbb9712014-11-14 19:09:44 +00004851 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004852 return TargetInfo::AArch64ABIBuiltinVaList;
4853 }
4854
4855 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004856 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004857 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004858 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004859
Eric Christopher917e9522014-11-18 22:36:15 +00004860 virtual bool
4861 validateAsmConstraint(const char *&Name,
4862 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004863 switch (*Name) {
4864 default:
4865 return false;
4866 case 'w': // Floating point and SIMD registers (V0-V31)
4867 Info.setAllowsRegister();
4868 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004869 case 'I': // Constant that can be used with an ADD instruction
4870 case 'J': // Constant that can be used with a SUB instruction
4871 case 'K': // Constant that can be used with a 32-bit logical instruction
4872 case 'L': // Constant that can be used with a 64-bit logical instruction
4873 case 'M': // Constant that can be used as a 32-bit MOV immediate
4874 case 'N': // Constant that can be used as a 64-bit MOV immediate
4875 case 'Y': // Floating point constant zero
4876 case 'Z': // Integer constant zero
4877 return true;
4878 case 'Q': // A memory reference with base register and no offset
4879 Info.setAllowsMemory();
4880 return true;
4881 case 'S': // A symbolic address
4882 Info.setAllowsRegister();
4883 return true;
4884 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004885 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4886 // Utf: A memory address suitable for ldp/stp in TF mode.
4887 // Usa: An absolute symbolic address.
4888 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4889 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004890 case 'z': // Zero register, wzr or xzr
4891 Info.setAllowsRegister();
4892 return true;
4893 case 'x': // Floating point and SIMD registers (V0-V15)
4894 Info.setAllowsRegister();
4895 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004896 }
4897 return false;
4898 }
4899
Akira Hatanaka987f1862014-08-22 06:05:21 +00004900 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004901 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004902 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004903 // Strip off constraint modifiers.
4904 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4905 Constraint = Constraint.substr(1);
4906
4907 switch (Constraint[0]) {
4908 default:
4909 return true;
4910 case 'z':
4911 case 'r': {
4912 switch (Modifier) {
4913 case 'x':
4914 case 'w':
4915 // For now assume that the person knows what they're
4916 // doing with the modifier.
4917 return true;
4918 default:
4919 // By default an 'r' constraint will be in the 'x'
4920 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004921 if (Size == 64)
4922 return true;
4923
4924 SuggestedModifier = "w";
4925 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004926 }
4927 }
4928 }
4929 }
4930
David Blaikie1cbb9712014-11-14 19:09:44 +00004931 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004932
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004933 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004934 if (RegNo == 0)
4935 return 0;
4936 if (RegNo == 1)
4937 return 1;
4938 return -1;
4939 }
4940};
4941
Tim Northover573cbee2014-05-24 12:52:07 +00004942const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004943 // 32-bit Integer registers
4944 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4945 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4946 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4947
4948 // 64-bit Integer registers
4949 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4950 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4951 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4952
4953 // 32-bit floating point regsisters
4954 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4955 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4956 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4957
4958 // 64-bit floating point regsisters
4959 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4960 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4961 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4962
4963 // Vector registers
4964 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4965 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4966 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4967};
4968
Tim Northover573cbee2014-05-24 12:52:07 +00004969void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004970 unsigned &NumNames) const {
4971 Names = GCCRegNames;
4972 NumNames = llvm::array_lengthof(GCCRegNames);
4973}
4974
Tim Northover573cbee2014-05-24 12:52:07 +00004975const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004976 { { "w31" }, "wsp" },
4977 { { "x29" }, "fp" },
4978 { { "x30" }, "lr" },
4979 { { "x31" }, "sp" },
4980 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4981 // don't want to substitute one of these for a different-sized one.
4982};
4983
Tim Northover573cbee2014-05-24 12:52:07 +00004984void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004985 unsigned &NumAliases) const {
4986 Aliases = GCCRegAliases;
4987 NumAliases = llvm::array_lengthof(GCCRegAliases);
4988}
4989
Tim Northover573cbee2014-05-24 12:52:07 +00004990const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004991#define BUILTIN(ID, TYPE, ATTRS) \
4992 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4993#include "clang/Basic/BuiltinsNEON.def"
4994
4995#define BUILTIN(ID, TYPE, ATTRS) \
4996 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004997#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004998};
James Molloy5e73df52014-04-16 15:06:20 +00004999
Tim Northover573cbee2014-05-24 12:52:07 +00005000class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005001 void setDescriptionString() override {
5002 if (getTriple().isOSBinFormatMachO())
5003 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5004 else
5005 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5006 }
5007
5008public:
Tim Northover573cbee2014-05-24 12:52:07 +00005009 AArch64leTargetInfo(const llvm::Triple &Triple)
5010 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005011 BigEndian = false;
5012 }
5013 void getTargetDefines(const LangOptions &Opts,
5014 MacroBuilder &Builder) const override {
5015 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005016 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005017 }
5018};
5019
Tim Northover573cbee2014-05-24 12:52:07 +00005020class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005021 void setDescriptionString() override {
5022 assert(!getTriple().isOSBinFormatMachO());
5023 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5024 }
5025
5026public:
Tim Northover573cbee2014-05-24 12:52:07 +00005027 AArch64beTargetInfo(const llvm::Triple &Triple)
5028 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005029 void getTargetDefines(const LangOptions &Opts,
5030 MacroBuilder &Builder) const override {
5031 Builder.defineMacro("__AARCH64EB__");
5032 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5033 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005034 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005035 }
5036};
Tim Northovera2ee4332014-03-29 15:09:45 +00005037} // end anonymous namespace.
5038
5039namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00005040class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005041protected:
5042 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5043 MacroBuilder &Builder) const override {
5044 Builder.defineMacro("__AARCH64_SIMD__");
5045 Builder.defineMacro("__ARM64_ARCH_8__");
5046 Builder.defineMacro("__ARM_NEON__");
5047 Builder.defineMacro("__LITTLE_ENDIAN__");
5048 Builder.defineMacro("__REGISTER_PREFIX__", "");
5049 Builder.defineMacro("__arm64", "1");
5050 Builder.defineMacro("__arm64__", "1");
5051
5052 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5053 }
5054
Tim Northovera2ee4332014-03-29 15:09:45 +00005055public:
Tim Northover573cbee2014-05-24 12:52:07 +00005056 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5057 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005058 Int64Type = SignedLongLong;
5059 WCharType = SignedInt;
5060 UseSignedCharForObjCBool = false;
5061
Tim Northovera6a19f12015-02-06 01:25:07 +00005062 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005063 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5064
5065 TheCXXABI.set(TargetCXXABI::iOS64);
5066 }
5067
David Blaikie1cbb9712014-11-14 19:09:44 +00005068 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005069 return TargetInfo::CharPtrBuiltinVaList;
5070 }
5071};
5072} // end anonymous namespace
5073
5074namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005075// Hexagon abstract base class
5076class HexagonTargetInfo : public TargetInfo {
5077 static const Builtin::Info BuiltinInfo[];
5078 static const char * const GCCRegNames[];
5079 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5080 std::string CPU;
5081public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005082 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005083 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005084 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005085
5086 // {} in inline assembly are packet specifiers, not assembly variant
5087 // specifiers.
5088 NoAsmVariants = true;
5089 }
5090
Craig Topper3164f332014-03-11 03:39:26 +00005091 void getTargetBuiltins(const Builtin::Info *&Records,
5092 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005093 Records = BuiltinInfo;
5094 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5095 }
5096
Craig Topper3164f332014-03-11 03:39:26 +00005097 bool validateAsmConstraint(const char *&Name,
5098 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005099 return true;
5100 }
5101
Craig Topper3164f332014-03-11 03:39:26 +00005102 void getTargetDefines(const LangOptions &Opts,
5103 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005104
Craig Topper3164f332014-03-11 03:39:26 +00005105 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005106 return Feature == "hexagon";
5107 }
Craig Topper3164f332014-03-11 03:39:26 +00005108
5109 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005110 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005111 }
Craig Topper3164f332014-03-11 03:39:26 +00005112 void getGCCRegNames(const char * const *&Names,
5113 unsigned &NumNames) const override;
5114 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5115 unsigned &NumAliases) const override;
5116 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005117 return "";
5118 }
Sebastian Pop86500282012-01-13 20:37:10 +00005119
5120 static const char *getHexagonCPUSuffix(StringRef Name) {
5121 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005122 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005123 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005124 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005125 }
5126
Craig Topper3164f332014-03-11 03:39:26 +00005127 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005128 if (!getHexagonCPUSuffix(Name))
5129 return false;
5130
Tony Linthicum76329bf2011-12-12 21:14:55 +00005131 CPU = Name;
5132 return true;
5133 }
5134};
5135
5136void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5137 MacroBuilder &Builder) const {
5138 Builder.defineMacro("qdsp6");
5139 Builder.defineMacro("__qdsp6", "1");
5140 Builder.defineMacro("__qdsp6__", "1");
5141
5142 Builder.defineMacro("hexagon");
5143 Builder.defineMacro("__hexagon", "1");
5144 Builder.defineMacro("__hexagon__", "1");
5145
5146 if(CPU == "hexagonv1") {
5147 Builder.defineMacro("__HEXAGON_V1__");
5148 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5149 if(Opts.HexagonQdsp6Compat) {
5150 Builder.defineMacro("__QDSP6_V1__");
5151 Builder.defineMacro("__QDSP6_ARCH__", "1");
5152 }
5153 }
5154 else if(CPU == "hexagonv2") {
5155 Builder.defineMacro("__HEXAGON_V2__");
5156 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5157 if(Opts.HexagonQdsp6Compat) {
5158 Builder.defineMacro("__QDSP6_V2__");
5159 Builder.defineMacro("__QDSP6_ARCH__", "2");
5160 }
5161 }
5162 else if(CPU == "hexagonv3") {
5163 Builder.defineMacro("__HEXAGON_V3__");
5164 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5165 if(Opts.HexagonQdsp6Compat) {
5166 Builder.defineMacro("__QDSP6_V3__");
5167 Builder.defineMacro("__QDSP6_ARCH__", "3");
5168 }
5169 }
5170 else if(CPU == "hexagonv4") {
5171 Builder.defineMacro("__HEXAGON_V4__");
5172 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5173 if(Opts.HexagonQdsp6Compat) {
5174 Builder.defineMacro("__QDSP6_V4__");
5175 Builder.defineMacro("__QDSP6_ARCH__", "4");
5176 }
5177 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005178 else if(CPU == "hexagonv5") {
5179 Builder.defineMacro("__HEXAGON_V5__");
5180 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5181 if(Opts.HexagonQdsp6Compat) {
5182 Builder.defineMacro("__QDSP6_V5__");
5183 Builder.defineMacro("__QDSP6_ARCH__", "5");
5184 }
5185 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005186}
5187
5188const char * const HexagonTargetInfo::GCCRegNames[] = {
5189 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5190 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5191 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5192 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5193 "p0", "p1", "p2", "p3",
5194 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5195};
5196
5197void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5198 unsigned &NumNames) const {
5199 Names = GCCRegNames;
5200 NumNames = llvm::array_lengthof(GCCRegNames);
5201}
5202
5203
5204const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5205 { { "sp" }, "r29" },
5206 { { "fp" }, "r30" },
5207 { { "lr" }, "r31" },
5208 };
5209
5210void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5211 unsigned &NumAliases) const {
5212 Aliases = GCCRegAliases;
5213 NumAliases = llvm::array_lengthof(GCCRegAliases);
5214}
5215
5216
5217const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5218#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5219#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5220 ALL_LANGUAGES },
5221#include "clang/Basic/BuiltinsHexagon.def"
5222};
5223}
5224
5225
Chris Lattner5ba61f02006-10-14 07:39:34 +00005226namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005227// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5228class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005229 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5230 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005231 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005232public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005233 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005234
Craig Topper3164f332014-03-11 03:39:26 +00005235 bool handleTargetFeatures(std::vector<std::string> &Features,
5236 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005237 SoftFloat = false;
5238 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5239 if (Features[i] == "+soft-float")
5240 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005241 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005242 }
Craig Topper3164f332014-03-11 03:39:26 +00005243 void getTargetDefines(const LangOptions &Opts,
5244 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005245 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005246 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005247
5248 if (SoftFloat)
5249 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005250 }
Craig Topper3164f332014-03-11 03:39:26 +00005251
5252 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005253 return llvm::StringSwitch<bool>(Feature)
5254 .Case("softfloat", SoftFloat)
5255 .Case("sparc", true)
5256 .Default(false);
5257 }
Craig Topper3164f332014-03-11 03:39:26 +00005258
5259 void getTargetBuiltins(const Builtin::Info *&Records,
5260 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005261 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005262 }
Craig Topper3164f332014-03-11 03:39:26 +00005263 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005264 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005265 }
Craig Topper3164f332014-03-11 03:39:26 +00005266 void getGCCRegNames(const char * const *&Names,
5267 unsigned &NumNames) const override;
5268 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5269 unsigned &NumAliases) const override;
5270 bool validateAsmConstraint(const char *&Name,
5271 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005272 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005273 switch (*Name) {
5274 case 'I': // Signed 13-bit constant
5275 case 'J': // Zero
5276 case 'K': // 32-bit constant with the low 12 bits clear
5277 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5278 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5279 case 'N': // Same as 'K' but zext (required for SIMode)
5280 case 'O': // The constant 4096
5281 return true;
5282 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005283 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005284 }
Craig Topper3164f332014-03-11 03:39:26 +00005285 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005286 // FIXME: Implement!
5287 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005288 }
5289};
5290
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005291const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005292 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5293 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5294 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5295 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5296};
5297
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005298void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5299 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005300 Names = GCCRegNames;
5301 NumNames = llvm::array_lengthof(GCCRegNames);
5302}
5303
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005304const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005305 { { "g0" }, "r0" },
5306 { { "g1" }, "r1" },
5307 { { "g2" }, "r2" },
5308 { { "g3" }, "r3" },
5309 { { "g4" }, "r4" },
5310 { { "g5" }, "r5" },
5311 { { "g6" }, "r6" },
5312 { { "g7" }, "r7" },
5313 { { "o0" }, "r8" },
5314 { { "o1" }, "r9" },
5315 { { "o2" }, "r10" },
5316 { { "o3" }, "r11" },
5317 { { "o4" }, "r12" },
5318 { { "o5" }, "r13" },
5319 { { "o6", "sp" }, "r14" },
5320 { { "o7" }, "r15" },
5321 { { "l0" }, "r16" },
5322 { { "l1" }, "r17" },
5323 { { "l2" }, "r18" },
5324 { { "l3" }, "r19" },
5325 { { "l4" }, "r20" },
5326 { { "l5" }, "r21" },
5327 { { "l6" }, "r22" },
5328 { { "l7" }, "r23" },
5329 { { "i0" }, "r24" },
5330 { { "i1" }, "r25" },
5331 { { "i2" }, "r26" },
5332 { { "i3" }, "r27" },
5333 { { "i4" }, "r28" },
5334 { { "i5" }, "r29" },
5335 { { "i6", "fp" }, "r30" },
5336 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005337};
5338
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005339void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5340 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005341 Aliases = GCCRegAliases;
5342 NumAliases = llvm::array_lengthof(GCCRegAliases);
5343}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005344
5345// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5346class SparcV8TargetInfo : public SparcTargetInfo {
5347public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005348 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005349 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005350 }
5351
Craig Topper3164f332014-03-11 03:39:26 +00005352 void getTargetDefines(const LangOptions &Opts,
5353 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005354 SparcTargetInfo::getTargetDefines(Opts, Builder);
5355 Builder.defineMacro("__sparcv8");
5356 }
5357};
5358
5359// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5360class SparcV9TargetInfo : public SparcTargetInfo {
5361public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005362 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005363 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005364 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005365 // This is an LP64 platform.
5366 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005367
5368 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005369 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005370 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005371 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005372 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005373 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005374
5375 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5376 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5377 LongDoubleWidth = 128;
5378 LongDoubleAlign = 128;
5379 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005380 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005381 }
5382
Craig Topper3164f332014-03-11 03:39:26 +00005383 void getTargetDefines(const LangOptions &Opts,
5384 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005385 SparcTargetInfo::getTargetDefines(Opts, Builder);
5386 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005387 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005388 // Solaris doesn't need these variants, but the BSDs do.
5389 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005390 Builder.defineMacro("__sparc64__");
5391 Builder.defineMacro("__sparc_v9__");
5392 Builder.defineMacro("__sparcv9__");
5393 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005394 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005395
Craig Topper3164f332014-03-11 03:39:26 +00005396 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005397 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5398 .Case("v9", true)
5399 .Case("ultrasparc", true)
5400 .Case("ultrasparc3", true)
5401 .Case("niagara", true)
5402 .Case("niagara2", true)
5403 .Case("niagara3", true)
5404 .Case("niagara4", true)
5405 .Default(false);
5406
5407 // No need to store the CPU yet. There aren't any CPU-specific
5408 // macros to define.
5409 return CPUKnown;
5410 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005411};
5412
Gabor Greif49991682008-02-21 16:29:08 +00005413} // end anonymous namespace.
5414
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005415namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005416class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005417public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005418 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5419 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005420 SizeType = UnsignedInt;
5421 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005422 }
5423};
5424} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005425
Chris Lattnerb781dc792008-05-08 05:58:21 +00005426namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005427class SystemZTargetInfo : public TargetInfo {
5428 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005429
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005430public:
5431 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5432 TLSSupported = true;
5433 IntWidth = IntAlign = 32;
5434 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5435 PointerWidth = PointerAlign = 64;
5436 LongDoubleWidth = 128;
5437 LongDoubleAlign = 64;
5438 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5439 MinGlobalAlign = 16;
5440 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5441 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5442 }
5443 void getTargetDefines(const LangOptions &Opts,
5444 MacroBuilder &Builder) const override {
5445 Builder.defineMacro("__s390__");
5446 Builder.defineMacro("__s390x__");
5447 Builder.defineMacro("__zarch__");
5448 Builder.defineMacro("__LONG_DOUBLE_128__");
5449 }
5450 void getTargetBuiltins(const Builtin::Info *&Records,
5451 unsigned &NumRecords) const override {
5452 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005453 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005454 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005455 }
5456
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005457 void getGCCRegNames(const char *const *&Names,
5458 unsigned &NumNames) const override;
5459 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5460 unsigned &NumAliases) const override {
5461 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005462 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005463 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005464 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005465 bool validateAsmConstraint(const char *&Name,
5466 TargetInfo::ConstraintInfo &info) const override;
5467 const char *getClobbers() const override {
5468 // FIXME: Is this really right?
5469 return "";
5470 }
5471 BuiltinVaListKind getBuiltinVaListKind() const override {
5472 return TargetInfo::SystemZBuiltinVaList;
5473 }
5474 bool setCPU(const std::string &Name) override {
5475 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5476 .Case("z10", true)
5477 .Case("z196", true)
5478 .Case("zEC12", true)
5479 .Default(false);
5480
5481 // No need to store the CPU yet. There aren't any CPU-specific
5482 // macros to define.
5483 return CPUKnown;
5484 }
5485};
5486
5487const char *const SystemZTargetInfo::GCCRegNames[] = {
5488 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5489 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5490 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5491 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5492};
5493
5494void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5495 unsigned &NumNames) const {
5496 Names = GCCRegNames;
5497 NumNames = llvm::array_lengthof(GCCRegNames);
5498}
5499
5500bool SystemZTargetInfo::
5501validateAsmConstraint(const char *&Name,
5502 TargetInfo::ConstraintInfo &Info) const {
5503 switch (*Name) {
5504 default:
5505 return false;
5506
5507 case 'a': // Address register
5508 case 'd': // Data register (equivalent to 'r')
5509 case 'f': // Floating-point register
5510 Info.setAllowsRegister();
5511 return true;
5512
5513 case 'I': // Unsigned 8-bit constant
5514 case 'J': // Unsigned 12-bit constant
5515 case 'K': // Signed 16-bit constant
5516 case 'L': // Signed 20-bit displacement (on all targets we support)
5517 case 'M': // 0x7fffffff
5518 return true;
5519
5520 case 'Q': // Memory with base and unsigned 12-bit displacement
5521 case 'R': // Likewise, plus an index
5522 case 'S': // Memory with base and signed 20-bit displacement
5523 case 'T': // Likewise, plus an index
5524 Info.setAllowsMemory();
5525 return true;
5526 }
5527}
Ulrich Weigand47445072013-05-06 16:26:41 +00005528}
5529
5530namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005531 class MSP430TargetInfo : public TargetInfo {
5532 static const char * const GCCRegNames[];
5533 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005534 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005535 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005536 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005537 IntWidth = 16; IntAlign = 16;
5538 LongWidth = 32; LongLongWidth = 64;
5539 LongAlign = LongLongAlign = 16;
5540 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005541 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005542 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005543 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005544 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005545 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005546 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005547 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005548 }
5549 void getTargetDefines(const LangOptions &Opts,
5550 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005551 Builder.defineMacro("MSP430");
5552 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005553 // FIXME: defines for different 'flavours' of MCU
5554 }
Craig Topper3164f332014-03-11 03:39:26 +00005555 void getTargetBuiltins(const Builtin::Info *&Records,
5556 unsigned &NumRecords) const override {
5557 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005558 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005559 NumRecords = 0;
5560 }
Craig Topper3164f332014-03-11 03:39:26 +00005561 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005562 return Feature == "msp430";
5563 }
Craig Topper3164f332014-03-11 03:39:26 +00005564 void getGCCRegNames(const char * const *&Names,
5565 unsigned &NumNames) const override;
5566 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5567 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005568 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005569 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005570 NumAliases = 0;
5571 }
Eric Christopher917e9522014-11-18 22:36:15 +00005572 bool
5573 validateAsmConstraint(const char *&Name,
5574 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005575 // FIXME: implement
5576 switch (*Name) {
5577 case 'K': // the constant 1
5578 case 'L': // constant -1^20 .. 1^19
5579 case 'M': // constant 1-4:
5580 return true;
5581 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005582 // No target constraints for now.
5583 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005584 }
Craig Topper3164f332014-03-11 03:39:26 +00005585 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005586 // FIXME: Is this really right?
5587 return "";
5588 }
Craig Topper3164f332014-03-11 03:39:26 +00005589 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005590 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005591 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005592 }
5593 };
5594
5595 const char * const MSP430TargetInfo::GCCRegNames[] = {
5596 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5597 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5598 };
5599
5600 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5601 unsigned &NumNames) const {
5602 Names = GCCRegNames;
5603 NumNames = llvm::array_lengthof(GCCRegNames);
5604 }
5605}
5606
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005607namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005608
Mike Stump11289f42009-09-09 15:08:12 +00005609 // LLVM and Clang cannot be used directly to output native binaries for
5610 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005611 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005612 //
5613 // TCE uses the llvm bitcode as input and uses it for generating customized
5614 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005615 // publicly available in http://tce.cs.tut.fi
5616
Eli Friedman1f191002011-10-07 19:51:42 +00005617 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5618 3, // opencl_global
5619 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005620 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005621 // FIXME: generic has to be added to the target
5622 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005623 0, // cuda_device
5624 0, // cuda_constant
5625 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005626 };
5627
Eli Friedmana9c3d712009-08-19 20:47:07 +00005628 class TCETargetInfo : public TargetInfo{
5629 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005630 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005631 TLSSupported = false;
5632 IntWidth = 32;
5633 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005634 PointerWidth = 32;
5635 IntAlign = 32;
5636 LongAlign = LongLongAlign = 32;
5637 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005638 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005639 SizeType = UnsignedInt;
5640 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005641 IntPtrType = SignedInt;
5642 PtrDiffType = SignedInt;
5643 FloatWidth = 32;
5644 FloatAlign = 32;
5645 DoubleWidth = 32;
5646 DoubleAlign = 32;
5647 LongDoubleWidth = 32;
5648 LongDoubleAlign = 32;
5649 FloatFormat = &llvm::APFloat::IEEEsingle;
5650 DoubleFormat = &llvm::APFloat::IEEEsingle;
5651 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005652 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5653 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005654 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005655 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005656 }
5657
Craig Topper3164f332014-03-11 03:39:26 +00005658 void getTargetDefines(const LangOptions &Opts,
5659 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005660 DefineStd(Builder, "tce", Opts);
5661 Builder.defineMacro("__TCE__");
5662 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005663 }
Craig Topper3164f332014-03-11 03:39:26 +00005664 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005665 return Feature == "tce";
5666 }
Craig Topper3164f332014-03-11 03:39:26 +00005667
5668 void getTargetBuiltins(const Builtin::Info *&Records,
5669 unsigned &NumRecords) const override {}
5670 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005671 return "";
5672 }
Craig Topper3164f332014-03-11 03:39:26 +00005673 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005674 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005675 }
Craig Topper3164f332014-03-11 03:39:26 +00005676 void getGCCRegNames(const char * const *&Names,
5677 unsigned &NumNames) const override {}
5678 bool validateAsmConstraint(const char *&Name,
5679 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005680 return true;
5681 }
Craig Topper3164f332014-03-11 03:39:26 +00005682 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5683 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005684 };
5685}
5686
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005687namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005688class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005689 virtual void setDescriptionString() = 0;
5690
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005691 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005692 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005693 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005694 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005695 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005696 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005697 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005698 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005699 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005700 enum DspRevEnum {
5701 NoDSP, DSP1, DSP2
5702 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005703 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005704
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005705protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005706 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005707 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005708
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005709public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005710 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5711 const std::string &CPUStr)
5712 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005713 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005714 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5715 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5716 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005717
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005718 bool isNaN2008Default() const {
5719 return CPU == "mips32r6" || CPU == "mips64r6";
5720 }
5721
5722 bool isFP64Default() const {
5723 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5724 }
5725
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005726 bool isNan2008() const override {
5727 return IsNan2008;
5728 }
5729
Alp Toker4925ba72014-06-07 23:30:42 +00005730 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005731 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005732 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5733 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005734 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005735 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005736 .Case("mips1", IsMips32)
5737 .Case("mips2", IsMips32)
5738 .Case("mips3", true)
5739 .Case("mips4", true)
5740 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005741 .Case("mips32", IsMips32)
5742 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005743 .Case("mips32r3", IsMips32)
5744 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005745 .Case("mips32r6", IsMips32)
5746 .Case("mips64", true)
5747 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005748 .Case("mips64r3", true)
5749 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005750 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005751 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005752 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005753 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005754 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005755 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005756 if (CPU == "octeon")
5757 Features["mips64r2"] = Features["cnmips"] = true;
5758 else
5759 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005760 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005761
Craig Topper3164f332014-03-11 03:39:26 +00005762 void getTargetDefines(const LangOptions &Opts,
5763 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005764 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005765 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005766 if (Opts.GNUMode)
5767 Builder.defineMacro("mips");
5768
Simon Atanasyan683535b2012-08-29 19:14:58 +00005769 Builder.defineMacro("__REGISTER_PREFIX__", "");
5770
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005771 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005772 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005773 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005774 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005775 case SoftFloat:
5776 Builder.defineMacro("__mips_soft_float", Twine(1));
5777 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005778 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005779
Simon Atanasyan16071912013-04-14 14:07:30 +00005780 if (IsSingleFloat)
5781 Builder.defineMacro("__mips_single_float", Twine(1));
5782
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005783 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5784 Builder.defineMacro("_MIPS_FPSET",
5785 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5786
Simon Atanasyan72244b62012-07-05 16:06:06 +00005787 if (IsMips16)
5788 Builder.defineMacro("__mips16", Twine(1));
5789
Simon Atanasyan60777612013-04-14 14:07:51 +00005790 if (IsMicromips)
5791 Builder.defineMacro("__mips_micromips", Twine(1));
5792
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005793 if (IsNan2008)
5794 Builder.defineMacro("__mips_nan2008", Twine(1));
5795
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005796 switch (DspRev) {
5797 default:
5798 break;
5799 case DSP1:
5800 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5801 Builder.defineMacro("__mips_dsp", Twine(1));
5802 break;
5803 case DSP2:
5804 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5805 Builder.defineMacro("__mips_dspr2", Twine(1));
5806 Builder.defineMacro("__mips_dsp", Twine(1));
5807 break;
5808 }
5809
Jack Carter44ff1e52013-08-12 17:20:29 +00005810 if (HasMSA)
5811 Builder.defineMacro("__mips_msa", Twine(1));
5812
Simon Atanasyan26f19672012-04-05 19:28:31 +00005813 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5814 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5815 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005816
5817 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5818 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005819 }
5820
Craig Topper3164f332014-03-11 03:39:26 +00005821 void getTargetBuiltins(const Builtin::Info *&Records,
5822 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005823 Records = BuiltinInfo;
5824 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005825 }
Craig Topper3164f332014-03-11 03:39:26 +00005826 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005827 return llvm::StringSwitch<bool>(Feature)
5828 .Case("mips", true)
5829 .Case("fp64", HasFP64)
5830 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005831 }
Craig Topper3164f332014-03-11 03:39:26 +00005832 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005833 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005834 }
Craig Topper3164f332014-03-11 03:39:26 +00005835 void getGCCRegNames(const char * const *&Names,
5836 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005837 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005838 // CPU register names
5839 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005840 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5841 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5842 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005843 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5844 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005845 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5846 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5847 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5848 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005849 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005850 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005851 "$fcc5","$fcc6","$fcc7",
5852 // MSA register names
5853 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5854 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5855 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5856 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5857 // MSA control register names
5858 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5859 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005860 };
5861 Names = GCCRegNames;
5862 NumNames = llvm::array_lengthof(GCCRegNames);
5863 }
Craig Topper3164f332014-03-11 03:39:26 +00005864 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5865 unsigned &NumAliases) const override = 0;
5866 bool validateAsmConstraint(const char *&Name,
5867 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005868 switch (*Name) {
5869 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005870 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005871 case 'r': // CPU registers.
5872 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005873 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005874 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005875 case 'c': // $25 for indirect jumps
5876 case 'l': // lo register
5877 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005878 Info.setAllowsRegister();
5879 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005880 case 'I': // Signed 16-bit constant
5881 case 'J': // Integer 0
5882 case 'K': // Unsigned 16-bit constant
5883 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5884 case 'M': // Constants not loadable via lui, addiu, or ori
5885 case 'N': // Constant -1 to -65535
5886 case 'O': // A signed 15-bit constant
5887 case 'P': // A constant between 1 go 65535
5888 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005889 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005890 Info.setAllowsMemory();
5891 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005892 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005893 }
5894
Craig Topper3164f332014-03-11 03:39:26 +00005895 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005896 // In GCC, $1 is not widely used in generated code (it's used only in a few
5897 // specific situations), so there is no real need for users to add it to
5898 // the clobbers list if they want to use it in their inline assembly code.
5899 //
5900 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5901 // code generation, so using it in inline assembly without adding it to the
5902 // clobbers list can cause conflicts between the inline assembly code and
5903 // the surrounding generated code.
5904 //
5905 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5906 // operands, which will conflict with the ".set at" assembler option (which
5907 // we use only for inline assembly, in order to maintain compatibility with
5908 // GCC) and will also conflict with the user's usage of $1.
5909 //
5910 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5911 // register for generated code is to automatically clobber $1 for all inline
5912 // assembly code.
5913 //
5914 // FIXME: We should automatically clobber $1 only for inline assembly code
5915 // which actually uses it. This would allow LLVM to use $1 for inline
5916 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005917 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005918 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005919
Craig Topper3164f332014-03-11 03:39:26 +00005920 bool handleTargetFeatures(std::vector<std::string> &Features,
5921 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005922 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005923 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005924 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005925 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005926 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005927 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005928 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005929
5930 for (std::vector<std::string>::iterator it = Features.begin(),
5931 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005932 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005933 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005934 else if (*it == "+soft-float")
5935 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005936 else if (*it == "+mips16")
5937 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005938 else if (*it == "+micromips")
5939 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005940 else if (*it == "+dsp")
5941 DspRev = std::max(DspRev, DSP1);
5942 else if (*it == "+dspr2")
5943 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005944 else if (*it == "+msa")
5945 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005946 else if (*it == "+fp64")
5947 HasFP64 = true;
5948 else if (*it == "-fp64")
5949 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005950 else if (*it == "+nan2008")
5951 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005952 else if (*it == "-nan2008")
5953 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005954 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005955
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005956 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005957 std::vector<std::string>::iterator it =
5958 std::find(Features.begin(), Features.end(), "+soft-float");
5959 if (it != Features.end())
5960 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005961
Akira Hatanaka9064e362013-10-29 18:30:33 +00005962 setDescriptionString();
5963
Rafael Espindolaeb265472013-08-21 21:59:03 +00005964 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005965 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005966
Craig Topper3164f332014-03-11 03:39:26 +00005967 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005968 if (RegNo == 0) return 4;
5969 if (RegNo == 1) return 5;
5970 return -1;
5971 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005972
5973 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005974};
5975
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005976const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5977#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5978#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5979 ALL_LANGUAGES },
5980#include "clang/Basic/BuiltinsMips.def"
5981};
5982
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005983class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005984public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005985 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005986 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005987 SizeType = UnsignedInt;
5988 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00005989 Int64Type = SignedLongLong;
5990 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005991 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005992 }
Craig Topper3164f332014-03-11 03:39:26 +00005993 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005994 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005995 ABI = Name;
5996 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005997 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005998 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005999 }
Craig Topper3164f332014-03-11 03:39:26 +00006000 void getTargetDefines(const LangOptions &Opts,
6001 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006002 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006003
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006004 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006005 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6006
6007 const std::string& CPUStr = getCPU();
6008 if (CPUStr == "mips32")
6009 Builder.defineMacro("__mips_isa_rev", "1");
6010 else if (CPUStr == "mips32r2")
6011 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006012 else if (CPUStr == "mips32r3")
6013 Builder.defineMacro("__mips_isa_rev", "3");
6014 else if (CPUStr == "mips32r5")
6015 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006016 else if (CPUStr == "mips32r6")
6017 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006018
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006019 if (ABI == "o32") {
6020 Builder.defineMacro("__mips_o32");
6021 Builder.defineMacro("_ABIO32", "1");
6022 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6023 }
6024 else if (ABI == "eabi")
6025 Builder.defineMacro("__mips_eabi");
6026 else
David Blaikie83d382b2011-09-23 05:06:16 +00006027 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006028 }
Craig Topper3164f332014-03-11 03:39:26 +00006029 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6030 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006031 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6032 { { "at" }, "$1" },
6033 { { "v0" }, "$2" },
6034 { { "v1" }, "$3" },
6035 { { "a0" }, "$4" },
6036 { { "a1" }, "$5" },
6037 { { "a2" }, "$6" },
6038 { { "a3" }, "$7" },
6039 { { "t0" }, "$8" },
6040 { { "t1" }, "$9" },
6041 { { "t2" }, "$10" },
6042 { { "t3" }, "$11" },
6043 { { "t4" }, "$12" },
6044 { { "t5" }, "$13" },
6045 { { "t6" }, "$14" },
6046 { { "t7" }, "$15" },
6047 { { "s0" }, "$16" },
6048 { { "s1" }, "$17" },
6049 { { "s2" }, "$18" },
6050 { { "s3" }, "$19" },
6051 { { "s4" }, "$20" },
6052 { { "s5" }, "$21" },
6053 { { "s6" }, "$22" },
6054 { { "s7" }, "$23" },
6055 { { "t8" }, "$24" },
6056 { { "t9" }, "$25" },
6057 { { "k0" }, "$26" },
6058 { { "k1" }, "$27" },
6059 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006060 { { "sp","$sp" }, "$29" },
6061 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006062 { { "ra" }, "$31" }
6063 };
6064 Aliases = GCCRegAliases;
6065 NumAliases = llvm::array_lengthof(GCCRegAliases);
6066 }
6067};
6068
6069class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006070 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006071 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006072 }
6073
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006074public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006075 Mips32EBTargetInfo(const llvm::Triple &Triple)
6076 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006077 }
Craig Topper3164f332014-03-11 03:39:26 +00006078 void getTargetDefines(const LangOptions &Opts,
6079 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006080 DefineStd(Builder, "MIPSEB", Opts);
6081 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006082 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006083 }
6084};
6085
6086class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006087 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006088 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006089 }
6090
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006091public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006092 Mips32ELTargetInfo(const llvm::Triple &Triple)
6093 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006094 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006095 }
Craig Topper3164f332014-03-11 03:39:26 +00006096 void getTargetDefines(const LangOptions &Opts,
6097 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006098 DefineStd(Builder, "MIPSEL", Opts);
6099 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006100 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006101 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006102};
Akira Hatanakabef17452011-09-20 19:21:49 +00006103
6104class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006105public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006106 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006107 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006108 LongDoubleWidth = LongDoubleAlign = 128;
6109 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006110 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6111 LongDoubleWidth = LongDoubleAlign = 64;
6112 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6113 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006114 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006115 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006116 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006117 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006118
6119 void setN64ABITypes() {
6120 LongWidth = LongAlign = 64;
6121 PointerWidth = PointerAlign = 64;
6122 SizeType = UnsignedLong;
6123 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006124 Int64Type = SignedLong;
6125 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006126 }
6127
6128 void setN32ABITypes() {
6129 LongWidth = LongAlign = 32;
6130 PointerWidth = PointerAlign = 32;
6131 SizeType = UnsignedInt;
6132 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006133 Int64Type = SignedLongLong;
6134 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006135 }
6136
Craig Topper3164f332014-03-11 03:39:26 +00006137 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006138 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006139 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006140 ABI = Name;
6141 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006142 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006143 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006144 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006145 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006146 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006147 }
6148 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006149 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006150
Craig Topper3164f332014-03-11 03:39:26 +00006151 void getTargetDefines(const LangOptions &Opts,
6152 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006153 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006154
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006155 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006156 Builder.defineMacro("__mips64");
6157 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006158 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6159
6160 const std::string& CPUStr = getCPU();
6161 if (CPUStr == "mips64")
6162 Builder.defineMacro("__mips_isa_rev", "1");
6163 else if (CPUStr == "mips64r2")
6164 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006165 else if (CPUStr == "mips64r3")
6166 Builder.defineMacro("__mips_isa_rev", "3");
6167 else if (CPUStr == "mips64r5")
6168 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006169 else if (CPUStr == "mips64r6")
6170 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006171
Akira Hatanakabef17452011-09-20 19:21:49 +00006172 if (ABI == "n32") {
6173 Builder.defineMacro("__mips_n32");
6174 Builder.defineMacro("_ABIN32", "2");
6175 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6176 }
6177 else if (ABI == "n64") {
6178 Builder.defineMacro("__mips_n64");
6179 Builder.defineMacro("_ABI64", "3");
6180 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6181 }
6182 else
David Blaikie83d382b2011-09-23 05:06:16 +00006183 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006184 }
Craig Topper3164f332014-03-11 03:39:26 +00006185 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6186 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006187 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6188 { { "at" }, "$1" },
6189 { { "v0" }, "$2" },
6190 { { "v1" }, "$3" },
6191 { { "a0" }, "$4" },
6192 { { "a1" }, "$5" },
6193 { { "a2" }, "$6" },
6194 { { "a3" }, "$7" },
6195 { { "a4" }, "$8" },
6196 { { "a5" }, "$9" },
6197 { { "a6" }, "$10" },
6198 { { "a7" }, "$11" },
6199 { { "t0" }, "$12" },
6200 { { "t1" }, "$13" },
6201 { { "t2" }, "$14" },
6202 { { "t3" }, "$15" },
6203 { { "s0" }, "$16" },
6204 { { "s1" }, "$17" },
6205 { { "s2" }, "$18" },
6206 { { "s3" }, "$19" },
6207 { { "s4" }, "$20" },
6208 { { "s5" }, "$21" },
6209 { { "s6" }, "$22" },
6210 { { "s7" }, "$23" },
6211 { { "t8" }, "$24" },
6212 { { "t9" }, "$25" },
6213 { { "k0" }, "$26" },
6214 { { "k1" }, "$27" },
6215 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006216 { { "sp","$sp" }, "$29" },
6217 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006218 { { "ra" }, "$31" }
6219 };
6220 Aliases = GCCRegAliases;
6221 NumAliases = llvm::array_lengthof(GCCRegAliases);
6222 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006223
6224 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006225};
6226
6227class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006228 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006229 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006230 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 +00006231 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006232 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006233
Akira Hatanakabef17452011-09-20 19:21:49 +00006234 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006235
Akira Hatanakabef17452011-09-20 19:21:49 +00006236public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006237 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006238 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006239 void getTargetDefines(const LangOptions &Opts,
6240 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006241 DefineStd(Builder, "MIPSEB", Opts);
6242 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006243 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006244 }
6245};
6246
6247class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006248 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006249 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006250 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 +00006251 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006252 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006253 }
6254public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006255 Mips64ELTargetInfo(const llvm::Triple &Triple)
6256 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006257 // Default ABI is n64.
6258 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006259 }
Craig Topper3164f332014-03-11 03:39:26 +00006260 void getTargetDefines(const LangOptions &Opts,
6261 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006262 DefineStd(Builder, "MIPSEL", Opts);
6263 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006264 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006265 }
6266};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006267} // end anonymous namespace.
6268
Ivan Krasindd7403e2011-08-24 20:22:22 +00006269namespace {
6270class PNaClTargetInfo : public TargetInfo {
6271public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006272 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006273 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006274 this->UserLabelPrefix = "";
6275 this->LongAlign = 32;
6276 this->LongWidth = 32;
6277 this->PointerAlign = 32;
6278 this->PointerWidth = 32;
6279 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006280 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006281 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006282 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006283 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006284 this->SizeType = TargetInfo::UnsignedInt;
6285 this->PtrDiffType = TargetInfo::SignedInt;
6286 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006287 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006288 }
6289
Craig Topper3164f332014-03-11 03:39:26 +00006290 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006291 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006292 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006293 Builder.defineMacro("__le32__");
6294 Builder.defineMacro("__pnacl__");
6295 }
Craig Topper3164f332014-03-11 03:39:26 +00006296 void getTargetDefines(const LangOptions &Opts,
6297 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006298 getArchDefines(Opts, Builder);
6299 }
Craig Topper3164f332014-03-11 03:39:26 +00006300 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006301 return Feature == "pnacl";
6302 }
Craig Topper3164f332014-03-11 03:39:26 +00006303 void getTargetBuiltins(const Builtin::Info *&Records,
6304 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006305 }
Craig Topper3164f332014-03-11 03:39:26 +00006306 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006307 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006308 }
Craig Topper3164f332014-03-11 03:39:26 +00006309 void getGCCRegNames(const char * const *&Names,
6310 unsigned &NumNames) const override;
6311 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6312 unsigned &NumAliases) const override;
6313 bool validateAsmConstraint(const char *&Name,
6314 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006315 return false;
6316 }
6317
Craig Topper3164f332014-03-11 03:39:26 +00006318 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006319 return "";
6320 }
6321};
6322
6323void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6324 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006325 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006326 NumNames = 0;
6327}
6328
6329void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6330 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006331 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006332 NumAliases = 0;
6333}
6334} // end anonymous namespace.
6335
Guy Benyeib798fc92012-12-11 21:38:14 +00006336namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006337class Le64TargetInfo : public TargetInfo {
6338 static const Builtin::Info BuiltinInfo[];
6339
6340public:
6341 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6342 BigEndian = false;
6343 NoAsmVariants = true;
6344 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6345 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6346 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006347 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006348 }
6349
6350 void getTargetDefines(const LangOptions &Opts,
6351 MacroBuilder &Builder) const override {
6352 DefineStd(Builder, "unix", Opts);
6353 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6354 Builder.defineMacro("__ELF__");
6355 }
6356 void getTargetBuiltins(const Builtin::Info *&Records,
6357 unsigned &NumRecords) const override {
6358 Records = BuiltinInfo;
6359 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6360 }
6361 BuiltinVaListKind getBuiltinVaListKind() const override {
6362 return TargetInfo::PNaClABIBuiltinVaList;
6363 }
6364 const char *getClobbers() const override { return ""; }
6365 void getGCCRegNames(const char *const *&Names,
6366 unsigned &NumNames) const override {
6367 Names = nullptr;
6368 NumNames = 0;
6369 }
6370 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6371 unsigned &NumAliases) const override {
6372 Aliases = nullptr;
6373 NumAliases = 0;
6374 }
6375 bool validateAsmConstraint(const char *&Name,
6376 TargetInfo::ConstraintInfo &Info) const override {
6377 return false;
6378 }
6379
6380 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006381};
6382} // end anonymous namespace.
6383
6384const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6385#define BUILTIN(ID, TYPE, ATTRS) \
6386 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6387#include "clang/Basic/BuiltinsLe64.def"
6388};
6389
6390namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006391 static const unsigned SPIRAddrSpaceMap[] = {
6392 1, // opencl_global
6393 3, // opencl_local
6394 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006395 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006396 0, // cuda_device
6397 0, // cuda_constant
6398 0 // cuda_shared
6399 };
6400 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006401 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006402 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006403 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6404 "SPIR target must use unknown OS");
6405 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6406 "SPIR target must use unknown environment type");
6407 BigEndian = false;
6408 TLSSupported = false;
6409 LongWidth = LongAlign = 64;
6410 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006411 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006412 // Define available target features
6413 // These must be defined in sorted order!
6414 NoAsmVariants = true;
6415 }
Craig Topper3164f332014-03-11 03:39:26 +00006416 void getTargetDefines(const LangOptions &Opts,
6417 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006418 DefineStd(Builder, "SPIR", Opts);
6419 }
Craig Topper3164f332014-03-11 03:39:26 +00006420 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006421 return Feature == "spir";
6422 }
Craig Topper3164f332014-03-11 03:39:26 +00006423
6424 void getTargetBuiltins(const Builtin::Info *&Records,
6425 unsigned &NumRecords) const override {}
6426 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006427 return "";
6428 }
Craig Topper3164f332014-03-11 03:39:26 +00006429 void getGCCRegNames(const char * const *&Names,
6430 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006431 bool
6432 validateAsmConstraint(const char *&Name,
6433 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006434 return true;
6435 }
Craig Topper3164f332014-03-11 03:39:26 +00006436 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6437 unsigned &NumAliases) const override {}
6438 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006439 return TargetInfo::VoidPtrBuiltinVaList;
6440 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006441
6442 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6443 return (CC == CC_SpirFunction ||
6444 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6445 }
6446
6447 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6448 return CC_SpirFunction;
6449 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006450 };
6451
6452
6453 class SPIR32TargetInfo : public SPIRTargetInfo {
6454 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006455 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006456 PointerWidth = PointerAlign = 32;
6457 SizeType = TargetInfo::UnsignedInt;
6458 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6459 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006460 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6461 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006462 }
Craig Topper3164f332014-03-11 03:39:26 +00006463 void getTargetDefines(const LangOptions &Opts,
6464 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006465 DefineStd(Builder, "SPIR32", Opts);
6466 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006467 };
6468
6469 class SPIR64TargetInfo : public SPIRTargetInfo {
6470 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006471 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006472 PointerWidth = PointerAlign = 64;
6473 SizeType = TargetInfo::UnsignedLong;
6474 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006475 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6476 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006477 }
Craig Topper3164f332014-03-11 03:39:26 +00006478 void getTargetDefines(const LangOptions &Opts,
6479 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006480 DefineStd(Builder, "SPIR64", Opts);
6481 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006482 };
6483}
6484
Robert Lytton0e076492013-08-13 09:43:10 +00006485namespace {
6486class XCoreTargetInfo : public TargetInfo {
6487 static const Builtin::Info BuiltinInfo[];
6488public:
6489 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6490 BigEndian = false;
6491 NoAsmVariants = true;
6492 LongLongAlign = 32;
6493 SuitableAlign = 32;
6494 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006495 SizeType = UnsignedInt;
6496 PtrDiffType = SignedInt;
6497 IntPtrType = SignedInt;
6498 WCharType = UnsignedChar;
6499 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006500 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006501 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 +00006502 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006503 }
Craig Topper3164f332014-03-11 03:39:26 +00006504 void getTargetDefines(const LangOptions &Opts,
6505 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006506 Builder.defineMacro("__XS1B__");
6507 }
Craig Topper3164f332014-03-11 03:39:26 +00006508 void getTargetBuiltins(const Builtin::Info *&Records,
6509 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006510 Records = BuiltinInfo;
6511 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6512 }
Craig Topper3164f332014-03-11 03:39:26 +00006513 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006514 return TargetInfo::VoidPtrBuiltinVaList;
6515 }
Craig Topper3164f332014-03-11 03:39:26 +00006516 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006517 return "";
6518 }
Craig Topper3164f332014-03-11 03:39:26 +00006519 void getGCCRegNames(const char * const *&Names,
6520 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006521 static const char * const GCCRegNames[] = {
6522 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6523 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6524 };
6525 Names = GCCRegNames;
6526 NumNames = llvm::array_lengthof(GCCRegNames);
6527 }
Craig Topper3164f332014-03-11 03:39:26 +00006528 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6529 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006530 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006531 NumAliases = 0;
6532 }
Craig Topper3164f332014-03-11 03:39:26 +00006533 bool validateAsmConstraint(const char *&Name,
6534 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006535 return false;
6536 }
Craig Topper3164f332014-03-11 03:39:26 +00006537 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006538 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6539 return (RegNo < 2)? RegNo : -1;
6540 }
Robert Lytton0e076492013-08-13 09:43:10 +00006541};
6542
6543const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6544#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6545#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6546 ALL_LANGUAGES },
6547#include "clang/Basic/BuiltinsXCore.def"
6548};
6549} // end anonymous namespace.
6550
Ivan Krasindd7403e2011-08-24 20:22:22 +00006551
Chris Lattner5ba61f02006-10-14 07:39:34 +00006552//===----------------------------------------------------------------------===//
6553// Driver code
6554//===----------------------------------------------------------------------===//
6555
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006556static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006557 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006558
Daniel Dunbar52322032009-08-18 05:47:58 +00006559 switch (Triple.getArch()) {
6560 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006561 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006562
Tim Northover2a0783d2014-05-30 14:14:07 +00006563 case llvm::Triple::xcore:
6564 return new XCoreTargetInfo(Triple);
6565
6566 case llvm::Triple::hexagon:
6567 return new HexagonTargetInfo(Triple);
6568
6569 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006570 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006571 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006572
6573 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006574 case llvm::Triple::FreeBSD:
6575 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006576 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006577 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006578 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006579 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006580 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006581 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006582 }
6583
Christian Pirker9b019ae2014-02-25 13:51:00 +00006584 case llvm::Triple::aarch64_be:
6585 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006586 case llvm::Triple::FreeBSD:
6587 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006588 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006589 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006590 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006591 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006592 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006593 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006594 }
6595
Daniel Dunbar52322032009-08-18 05:47:58 +00006596 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006597 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006598 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006599 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006600
Daniel Dunbar52322032009-08-18 05:47:58 +00006601 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006602 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006603 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006604 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006605 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006606 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006607 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006608 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006609 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006610 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006611 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006612 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006613 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006614 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006615 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006616 case llvm::Triple::Win32:
6617 switch (Triple.getEnvironment()) {
6618 default:
6619 return new ARMleTargetInfo(Triple);
6620 case llvm::Triple::Itanium:
6621 return new ItaniumWindowsARMleTargetInfo(Triple);
6622 case llvm::Triple::MSVC:
6623 return new MicrosoftARMleTargetInfo(Triple);
6624 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006625 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006626 return new ARMleTargetInfo(Triple);
6627 }
6628
6629 case llvm::Triple::armeb:
6630 case llvm::Triple::thumbeb:
6631 if (Triple.isOSDarwin())
6632 return new DarwinARMTargetInfo(Triple);
6633
6634 switch (os) {
6635 case llvm::Triple::Linux:
6636 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6637 case llvm::Triple::FreeBSD:
6638 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6639 case llvm::Triple::NetBSD:
6640 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6641 case llvm::Triple::OpenBSD:
6642 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6643 case llvm::Triple::Bitrig:
6644 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6645 case llvm::Triple::RTEMS:
6646 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6647 case llvm::Triple::NaCl:
6648 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6649 default:
6650 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006651 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006652
Daniel Dunbar52322032009-08-18 05:47:58 +00006653 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006654 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006655
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006656 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006657 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006658 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006659 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006660 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006661 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006662 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006663 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006664 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006665 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006666 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006667 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006668 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006669
6670 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006671 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006672 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006673 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006674 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006675 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006676 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006677 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006678 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006679 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006680 case llvm::Triple::NaCl:
6681 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006682 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006683 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006684 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006685
Akira Hatanakabef17452011-09-20 19:21:49 +00006686 case llvm::Triple::mips64:
6687 switch (os) {
6688 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006689 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006690 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006691 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006692 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006693 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006694 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006695 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006696 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006697 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006698 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006699 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006700 }
6701
6702 case llvm::Triple::mips64el:
6703 switch (os) {
6704 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006705 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006706 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006707 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006708 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006709 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006710 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006711 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006712 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006713 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006714 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006715 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006716 }
6717
Ivan Krasindd7403e2011-08-24 20:22:22 +00006718 case llvm::Triple::le32:
6719 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006720 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006721 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006722 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006723 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006724 }
6725
JF Bastien643817d2014-09-12 17:52:47 +00006726 case llvm::Triple::le64:
6727 return new Le64TargetInfo(Triple);
6728
Daniel Dunbar52322032009-08-18 05:47:58 +00006729 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006730 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006731 return new DarwinPPC32TargetInfo(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<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006735 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006736 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006737 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006738 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006739 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006740 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006741 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006742 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006743 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006744 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006745 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006746
6747 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006748 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006749 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006750 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006751 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006752 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006753 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006754 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006755 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006756 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006757 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006758 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006759 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006760 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006761 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006762
Bill Schmidt778d3872013-07-26 01:36:11 +00006763 case llvm::Triple::ppc64le:
6764 switch (os) {
6765 case llvm::Triple::Linux:
6766 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6767 default:
6768 return new PPC64TargetInfo(Triple);
6769 }
6770
Peter Collingbournec947aae2012-05-20 23:28:41 +00006771 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006772 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006773 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006774 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006775
Tom Stellardd8e38a32015-01-06 20:34:47 +00006776 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006777 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006778 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006779
Daniel Dunbar52322032009-08-18 05:47:58 +00006780 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006781 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006782 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006783 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006784 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006785 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006786 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006787 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006788 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006789 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006790 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006791 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006792 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006793 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006794 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006795
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006796 case llvm::Triple::sparcv9:
6797 switch (os) {
6798 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006799 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006800 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006801 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006802 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006803 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006804 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006805 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006806 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006807 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006808 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006809 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006810 }
6811
Ulrich Weigand47445072013-05-06 16:26:41 +00006812 case llvm::Triple::systemz:
6813 switch (os) {
6814 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006815 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006816 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006817 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006818 }
6819
Eli Friedmana9c3d712009-08-19 20:47:07 +00006820 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006821 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006822
Daniel Dunbar52322032009-08-18 05:47:58 +00006823 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006824 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006825 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006826
Daniel Dunbar52322032009-08-18 05:47:58 +00006827 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006828 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006829 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006830 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006831 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006832 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006833 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006834 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006835 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006836 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006837 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006838 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006839 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006840 case llvm::Triple::KFreeBSD:
6841 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006842 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006843 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006844 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006845 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006846 case llvm::Triple::Win32: {
6847 switch (Triple.getEnvironment()) {
6848 default:
6849 return new X86_32TargetInfo(Triple);
6850 case llvm::Triple::Cygnus:
6851 return new CygwinX86_32TargetInfo(Triple);
6852 case llvm::Triple::GNU:
6853 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006854 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006855 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006856 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006857 }
6858 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006859 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006860 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006861 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006862 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006863 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006864 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006865 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006866 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006867 }
6868
6869 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006870 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006871 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006872
Daniel Dunbar52322032009-08-18 05:47:58 +00006873 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006874 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006875 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006876 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006877 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006878 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006879 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006880 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006881 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006882 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006883 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006884 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006885 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006886 case llvm::Triple::KFreeBSD:
6887 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006888 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006889 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006890 case llvm::Triple::Win32: {
6891 switch (Triple.getEnvironment()) {
6892 default:
6893 return new X86_64TargetInfo(Triple);
6894 case llvm::Triple::GNU:
6895 return new MinGWX86_64TargetInfo(Triple);
6896 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006897 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006898 }
6899 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006900 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006901 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006902 case llvm::Triple::PS4:
6903 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006904 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006905 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006906 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006907
6908 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006909 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006910 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006911 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006912 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006913 }
6914 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006915 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006916 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006917 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006918 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006919 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006920 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006921}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006922
6923/// CreateTargetInfo - Return the target info object for the specified target
6924/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006925TargetInfo *
6926TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6927 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006928 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006929
6930 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006931 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006932 if (!Target) {
6933 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006934 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006935 }
Alp Toker80758082014-07-06 05:26:44 +00006936 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006937
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006938 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006939 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6940 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006941 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006942 }
6943
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006944 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006945 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6946 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006947 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006948 }
6949
Rafael Espindolaeb265472013-08-21 21:59:03 +00006950 // Set the fp math unit.
6951 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6952 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006953 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006954 }
6955
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006956 // Compute the default target features, we need the target to handle this
6957 // because features may have dependencies on one another.
6958 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006959 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006960
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006961 // Apply the user specified deltas.
6962 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6963 I < N; ++I) {
6964 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006965 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006966 bool Enabled = Name[0] == '+';
6967 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006968 }
6969
6970 // Add the features to the compile options.
6971 //
6972 // FIXME: If we are completely confident that we have the right set, we only
6973 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006974 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006975 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6976 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006977 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006978 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006979 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006980
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006981 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006982}