blob: 03cd853d66ea89b5dd8bbbbce6b487e3969944da [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__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000366 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000367 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000368 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000369 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000370 if (Opts.CPlusPlus)
371 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000372 }
373public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000375 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000376 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000377
378 switch (Triple.getArch()) {
379 default:
380 break;
381 case llvm::Triple::ppc:
382 case llvm::Triple::ppc64:
383 case llvm::Triple::ppc64le:
384 this->MCountName = "_mcount";
385 break;
386 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000387 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000388
Craig Topper3164f332014-03-11 03:39:26 +0000389 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000390 return ".text.startup";
391 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000392};
393
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000394// NetBSD Target
395template<typename Target>
396class NetBSDTargetInfo : public OSTargetInfo<Target> {
397protected:
Craig Topper3164f332014-03-11 03:39:26 +0000398 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
399 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000400 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000401 Builder.defineMacro("__NetBSD__");
402 Builder.defineMacro("__unix__");
403 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000404 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000405 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000406
407 switch (Triple.getArch()) {
408 default:
409 break;
410 case llvm::Triple::arm:
411 case llvm::Triple::armeb:
412 case llvm::Triple::thumb:
413 case llvm::Triple::thumbeb:
414 Builder.defineMacro("__ARM_DWARF_EH__");
415 break;
416 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000417 }
418public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000419 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
420 this->UserLabelPrefix = "";
421 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000422};
423
Torok Edwinb2b37c62009-06-30 17:10:35 +0000424// OpenBSD Target
425template<typename Target>
426class OpenBSDTargetInfo : public OSTargetInfo<Target> {
427protected:
Craig Topper3164f332014-03-11 03:39:26 +0000428 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
429 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000430 // OpenBSD defines; list based off of gcc output
431
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000432 Builder.defineMacro("__OpenBSD__");
433 DefineStd(Builder, "unix", Opts);
434 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000435 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000436 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000437 }
438public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000439 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
440 this->UserLabelPrefix = "";
441 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000442
Eli Friedman3715d1f2011-12-15 02:15:56 +0000443 switch (Triple.getArch()) {
444 default:
445 case llvm::Triple::x86:
446 case llvm::Triple::x86_64:
447 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000448 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000449 this->MCountName = "__mcount";
450 break;
451 case llvm::Triple::mips64:
452 case llvm::Triple::mips64el:
453 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000454 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000455 this->MCountName = "_mcount";
456 break;
457 }
458 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000459};
460
Eli Friedman9fa28852012-08-08 23:57:20 +0000461// Bitrig Target
462template<typename Target>
463class BitrigTargetInfo : public OSTargetInfo<Target> {
464protected:
Craig Topper3164f332014-03-11 03:39:26 +0000465 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
466 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000467 // Bitrig defines; list based off of gcc output
468
469 Builder.defineMacro("__Bitrig__");
470 DefineStd(Builder, "unix", Opts);
471 Builder.defineMacro("__ELF__");
472 if (Opts.POSIXThreads)
473 Builder.defineMacro("_REENTRANT");
474 }
475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000476 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
477 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000478 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000479 }
480};
481
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000482// PSP Target
483template<typename Target>
484class PSPTargetInfo : public OSTargetInfo<Target> {
485protected:
Craig Topper3164f332014-03-11 03:39:26 +0000486 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
487 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000488 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000489 Builder.defineMacro("PSP");
490 Builder.defineMacro("_PSP");
491 Builder.defineMacro("__psp__");
492 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000493 }
494public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000495 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000496 this->UserLabelPrefix = "";
497 }
498};
499
John Thompsone467e192009-11-19 17:18:50 +0000500// PS3 PPU Target
501template<typename Target>
502class PS3PPUTargetInfo : public OSTargetInfo<Target> {
503protected:
Craig Topper3164f332014-03-11 03:39:26 +0000504 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
505 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000506 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000507 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000508 Builder.defineMacro("__PPU__");
509 Builder.defineMacro("__CELLOS_LV2__");
510 Builder.defineMacro("__ELF__");
511 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000512 Builder.defineMacro("_ARCH_PPC64");
513 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000514 }
515public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000516 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000517 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000518 this->LongWidth = this->LongAlign = 32;
519 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000520 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000521 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000522 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000523 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000524 }
525};
526
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000527template <typename Target>
528class PS4OSTargetInfo : public OSTargetInfo<Target> {
529protected:
530 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
531 MacroBuilder &Builder) const override {
532 Builder.defineMacro("__FreeBSD__", "9");
533 Builder.defineMacro("__FreeBSD_cc_version", "900001");
534 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
535 DefineStd(Builder, "unix", Opts);
536 Builder.defineMacro("__ELF__");
537 Builder.defineMacro("__PS4__");
538 }
539public:
540 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
541 this->WCharType = this->UnsignedShort;
542
543 this->UserLabelPrefix = "";
544
545 switch (Triple.getArch()) {
546 default:
547 case llvm::Triple::x86_64:
548 this->MCountName = ".mcount";
549 break;
550 }
551 }
552};
553
Torok Edwinb2b37c62009-06-30 17:10:35 +0000554// Solaris target
555template<typename Target>
556class SolarisTargetInfo : public OSTargetInfo<Target> {
557protected:
Craig Topper3164f332014-03-11 03:39:26 +0000558 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
559 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000560 DefineStd(Builder, "sun", Opts);
561 DefineStd(Builder, "unix", Opts);
562 Builder.defineMacro("__ELF__");
563 Builder.defineMacro("__svr4__");
564 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000565 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
566 // newer, but to 500 for everything else. feature_test.h has a check to
567 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000568 // with a new version.
569 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000570 Builder.defineMacro("_XOPEN_SOURCE", "600");
571 else
572 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000573 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000574 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000575 Builder.defineMacro("_LARGEFILE_SOURCE");
576 Builder.defineMacro("_LARGEFILE64_SOURCE");
577 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000578 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000579 }
580public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000581 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000582 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000583 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000584 // FIXME: WIntType should be SignedLong
585 }
586};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000587
588// Windows target
589template<typename Target>
590class WindowsTargetInfo : public OSTargetInfo<Target> {
591protected:
Craig Topper3164f332014-03-11 03:39:26 +0000592 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
593 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000594 Builder.defineMacro("_WIN32");
595 }
596 void getVisualStudioDefines(const LangOptions &Opts,
597 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000598 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000599 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000600 Builder.defineMacro("_CPPRTTI");
601
Reid Kleckner16514352015-01-30 21:42:55 +0000602 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000603 Builder.defineMacro("_CPPUNWIND");
604 }
605
606 if (!Opts.CharIsSigned)
607 Builder.defineMacro("_CHAR_UNSIGNED");
608
609 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
610 // but it works for now.
611 if (Opts.POSIXThreads)
612 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000613
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000614 if (Opts.MSCompatibilityVersion) {
615 Builder.defineMacro("_MSC_VER",
616 Twine(Opts.MSCompatibilityVersion / 100000));
617 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000618 // FIXME We cannot encode the revision information into 32-bits
619 Builder.defineMacro("_MSC_BUILD", Twine(1));
620 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000621
622 if (Opts.MicrosoftExt) {
623 Builder.defineMacro("_MSC_EXTENSIONS");
624
625 if (Opts.CPlusPlus11) {
626 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
627 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
628 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
629 }
630 }
631
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000632 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000633 }
634
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000635public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000636 WindowsTargetInfo(const llvm::Triple &Triple)
637 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000638};
639
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000640template <typename Target>
641class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000642protected:
Craig Topper3164f332014-03-11 03:39:26 +0000643 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
644 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000645 if (Opts.POSIXThreads)
646 Builder.defineMacro("_REENTRANT");
647 if (Opts.CPlusPlus)
648 Builder.defineMacro("_GNU_SOURCE");
649
650 DefineStd(Builder, "unix", Opts);
651 Builder.defineMacro("__ELF__");
652 Builder.defineMacro("__native_client__");
653 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000654
655public:
656 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000657 this->UserLabelPrefix = "";
658 this->LongAlign = 32;
659 this->LongWidth = 32;
660 this->PointerAlign = 32;
661 this->PointerWidth = 32;
662 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000663 this->Int64Type = TargetInfo::SignedLongLong;
664 this->DoubleAlign = 64;
665 this->LongDoubleWidth = 64;
666 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000667 this->LongLongWidth = 64;
668 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000669 this->SizeType = TargetInfo::UnsignedInt;
670 this->PtrDiffType = TargetInfo::SignedInt;
671 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000672 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000673 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000674 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000675 this->DescriptionString =
676 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000677 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000678 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000679 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000680 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000681 } else if (Triple.getArch() == llvm::Triple::mipsel) {
682 // Handled on mips' setDescriptionString.
683 } else {
684 assert(Triple.getArch() == llvm::Triple::le32);
685 this->DescriptionString = "e-p:32:32-i64:64";
686 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000687 }
688};
Mike Stump11289f42009-09-09 15:08:12 +0000689} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000690
Chris Lattner09d98f52008-10-05 21:50:58 +0000691//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000692// Specific target implementations.
693//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000694
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000695namespace {
696// PPC abstract base class
697class PPCTargetInfo : public TargetInfo {
698 static const Builtin::Info BuiltinInfo[];
699 static const char * const GCCRegNames[];
700 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000701 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000702
703 // Target cpu features.
704 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000705 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000706
Ulrich Weigand8afad612014-07-28 13:17:52 +0000707protected:
708 std::string ABI;
709
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000710public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000711 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000712 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000713 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000714 LongDoubleWidth = LongDoubleAlign = 128;
715 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
716 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000717
Hal Finkel6b984f02012-07-03 16:51:04 +0000718 /// \brief Flags for architecture specific defines.
719 typedef enum {
720 ArchDefineNone = 0,
721 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
722 ArchDefinePpcgr = 1 << 1,
723 ArchDefinePpcsq = 1 << 2,
724 ArchDefine440 = 1 << 3,
725 ArchDefine603 = 1 << 4,
726 ArchDefine604 = 1 << 5,
727 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000728 ArchDefinePwr5 = 1 << 7,
729 ArchDefinePwr5x = 1 << 8,
730 ArchDefinePwr6 = 1 << 9,
731 ArchDefinePwr6x = 1 << 10,
732 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000733 ArchDefinePwr8 = 1 << 12,
734 ArchDefineA2 = 1 << 13,
735 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000736 } ArchDefineTypes;
737
Bill Schmidt38378a02013-02-01 20:23:10 +0000738 // Note: GCC recognizes the following additional cpus:
739 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
740 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
741 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000742 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000743 bool CPUKnown = llvm::StringSwitch<bool>(Name)
744 .Case("generic", true)
745 .Case("440", true)
746 .Case("450", true)
747 .Case("601", true)
748 .Case("602", true)
749 .Case("603", true)
750 .Case("603e", true)
751 .Case("603ev", true)
752 .Case("604", true)
753 .Case("604e", true)
754 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000755 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000756 .Case("g3", true)
757 .Case("7400", true)
758 .Case("g4", true)
759 .Case("7450", true)
760 .Case("g4+", true)
761 .Case("750", true)
762 .Case("970", true)
763 .Case("g5", true)
764 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000765 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000766 .Case("e500mc", true)
767 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000768 .Case("power3", true)
769 .Case("pwr3", true)
770 .Case("power4", true)
771 .Case("pwr4", true)
772 .Case("power5", true)
773 .Case("pwr5", true)
774 .Case("power5x", true)
775 .Case("pwr5x", true)
776 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000777 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000778 .Case("power6x", true)
779 .Case("pwr6x", true)
780 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000781 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000782 .Case("power8", true)
783 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000784 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000785 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000786 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000787 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000788 .Case("powerpc64le", true)
789 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000790 .Default(false);
791
792 if (CPUKnown)
793 CPU = Name;
794
795 return CPUKnown;
796 }
797
Ulrich Weigand8afad612014-07-28 13:17:52 +0000798
799 StringRef getABI() const override { return ABI; }
800
Craig Topper3164f332014-03-11 03:39:26 +0000801 void getTargetBuiltins(const Builtin::Info *&Records,
802 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000803 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000804 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000805 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000806
Craig Topper3164f332014-03-11 03:39:26 +0000807 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000808
Craig Topper3164f332014-03-11 03:39:26 +0000809 void getTargetDefines(const LangOptions &Opts,
810 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000811
Craig Topper3164f332014-03-11 03:39:26 +0000812 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000813
Craig Topper3164f332014-03-11 03:39:26 +0000814 bool handleTargetFeatures(std::vector<std::string> &Features,
815 DiagnosticsEngine &Diags) override;
816 bool hasFeature(StringRef Feature) const override;
817
818 void getGCCRegNames(const char * const *&Names,
819 unsigned &NumNames) const override;
820 void getGCCRegAliases(const GCCRegAlias *&Aliases,
821 unsigned &NumAliases) const override;
822 bool validateAsmConstraint(const char *&Name,
823 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000824 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000825 default: return false;
826 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000827 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000828 case 'b': // Base register
829 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000830 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000831 break;
832 // FIXME: The following are added to allow parsing.
833 // I just took a guess at what the actions should be.
834 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000835 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000836 case 'v': // Altivec vector register
837 Info.setAllowsRegister();
838 break;
839 case 'w':
840 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000841 case 'd':// VSX vector register to hold vector double data
842 case 'f':// VSX vector register to hold vector float data
843 case 's':// VSX vector register to hold scalar float data
844 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000845 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000846 break;
847 default:
848 return false;
849 }
850 Info.setAllowsRegister();
851 Name++; // Skip over 'w'.
852 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000853 case 'h': // `MQ', `CTR', or `LINK' register
854 case 'q': // `MQ' register
855 case 'c': // `CTR' register
856 case 'l': // `LINK' register
857 case 'x': // `CR' register (condition register) number 0
858 case 'y': // `CR' register (condition register)
859 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000860 Info.setAllowsRegister();
861 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000862 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000863 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000864 // (use `L' instead for SImode constants)
865 case 'K': // Unsigned 16-bit constant
866 case 'L': // Signed 16-bit constant shifted left 16 bits
867 case 'M': // Constant larger than 31
868 case 'N': // Exact power of 2
869 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000870 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000871 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000872 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000873 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000874 break;
875 case 'm': // Memory operand. Note that on PowerPC targets, m can
876 // include addresses that update the base register. It
877 // is therefore only safe to use `m' in an asm statement
878 // if that asm statement accesses the operand exactly once.
879 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000880 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000881 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000882 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000883 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000884 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
885 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000886 // register to be updated.
887 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000888 if (Name[1] != 's')
889 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000890 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000891 // include any automodification of the base register. Unlike
892 // `m', this constraint can be used in asm statements that
893 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000894 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000895 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000896 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000897 break;
898 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000899 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000900 case 'Z': // Memory operand that is an indexed or indirect from a
901 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000902 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000903 Info.setAllowsMemory();
904 Info.setAllowsRegister();
905 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000906 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000907 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000908 // register (`p' is preferable for asm statements)
909 case 'S': // Constant suitable as a 64-bit mask operand
910 case 'T': // Constant suitable as a 32-bit mask operand
911 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000912 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000913 // instructions
914 case 'W': // Vector constant that does not require memory
915 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000916 break;
917 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000918 }
John Thompson07a61a42010-06-24 22:44:13 +0000919 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000920 }
Craig Topper3164f332014-03-11 03:39:26 +0000921 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000922 std::string R;
923 switch (*Constraint) {
924 case 'e':
925 case 'w':
926 // Two-character constraint; add "^" hint for later parsing.
927 R = std::string("^") + std::string(Constraint, 2);
928 Constraint++;
929 break;
930 default:
931 return TargetInfo::convertConstraint(Constraint);
932 }
933 return R;
934 }
Craig Topper3164f332014-03-11 03:39:26 +0000935 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000936 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000937 }
Craig Topper3164f332014-03-11 03:39:26 +0000938 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000939 if (RegNo == 0) return 3;
940 if (RegNo == 1) return 4;
941 return -1;
942 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000943};
Anders Carlssonf511f642007-11-27 04:11:28 +0000944
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000945const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000946#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000947#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000948 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000949#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000950};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000951
Eric Christopher917e9522014-11-18 22:36:15 +0000952/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000953/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000954bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000955 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000956 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
957 // Ignore disabled features.
958 if (Features[i][0] == '-')
959 continue;
960
961 StringRef Feature = StringRef(Features[i]).substr(1);
962
963 if (Feature == "vsx") {
964 HasVSX = true;
965 continue;
966 }
967
Bill Schmidt59eb7672014-10-10 15:09:43 +0000968 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000969 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000970 continue;
971 }
972
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000973 // TODO: Finish this list and add an assert that we've handled them
974 // all.
975 }
976
977 return true;
978}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000979
Chris Lattnerecd49032009-03-02 22:27:17 +0000980/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
981/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000982void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000983 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000984 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000985 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000986 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000987 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000988 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000989 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000990 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000991 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000992 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000993 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000994 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000995 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000996
Chris Lattnerecd49032009-03-02 22:27:17 +0000997 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000998 if (getTriple().getArch() == llvm::Triple::ppc64le) {
999 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001000 } else {
1001 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1002 getTriple().getOS() != llvm::Triple::OpenBSD)
1003 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001004 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001005
Ulrich Weigand8afad612014-07-28 13:17:52 +00001006 // ABI options.
1007 if (ABI == "elfv1")
1008 Builder.defineMacro("_CALL_ELF", "1");
1009 if (ABI == "elfv2")
1010 Builder.defineMacro("_CALL_ELF", "2");
1011
Chris Lattnerecd49032009-03-02 22:27:17 +00001012 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001013 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1014 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001015
Chris Lattnerecd49032009-03-02 22:27:17 +00001016 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001017 if (LongDoubleWidth == 128)
1018 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001019
John Thompsone467e192009-11-19 17:18:50 +00001020 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001021 Builder.defineMacro("__VEC__", "10206");
1022 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001023 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001024
1025 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001026 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1027 .Case("440", ArchDefineName)
1028 .Case("450", ArchDefineName | ArchDefine440)
1029 .Case("601", ArchDefineName)
1030 .Case("602", ArchDefineName | ArchDefinePpcgr)
1031 .Case("603", ArchDefineName | ArchDefinePpcgr)
1032 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1033 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1034 .Case("604", ArchDefineName | ArchDefinePpcgr)
1035 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1036 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001037 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001038 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1039 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1040 .Case("750", ArchDefineName | ArchDefinePpcgr)
1041 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1042 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001043 .Case("a2", ArchDefineA2)
1044 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001045 .Case("pwr3", ArchDefinePpcgr)
1046 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1047 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1048 | ArchDefinePpcsq)
1049 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1050 | ArchDefinePpcgr | ArchDefinePpcsq)
1051 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1052 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1053 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1054 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1055 | ArchDefinePpcsq)
1056 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1057 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001058 | ArchDefinePpcgr | ArchDefinePpcsq)
1059 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1060 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1061 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001062 .Case("power3", ArchDefinePpcgr)
1063 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1064 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1065 | ArchDefinePpcsq)
1066 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1067 | ArchDefinePpcgr | ArchDefinePpcsq)
1068 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1069 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1070 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1071 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1072 | ArchDefinePpcsq)
1073 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1074 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001075 | ArchDefinePpcgr | ArchDefinePpcsq)
1076 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1077 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1078 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001079 .Default(ArchDefineNone);
1080
1081 if (defs & ArchDefineName)
1082 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1083 if (defs & ArchDefinePpcgr)
1084 Builder.defineMacro("_ARCH_PPCGR");
1085 if (defs & ArchDefinePpcsq)
1086 Builder.defineMacro("_ARCH_PPCSQ");
1087 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001088 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001089 if (defs & ArchDefine603)
1090 Builder.defineMacro("_ARCH_603");
1091 if (defs & ArchDefine604)
1092 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001093 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001094 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001095 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001096 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001097 if (defs & ArchDefinePwr5x)
1098 Builder.defineMacro("_ARCH_PWR5X");
1099 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001100 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001101 if (defs & ArchDefinePwr6x)
1102 Builder.defineMacro("_ARCH_PWR6X");
1103 if (defs & ArchDefinePwr7)
1104 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001105 if (defs & ArchDefinePwr8)
1106 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001107 if (defs & ArchDefineA2)
1108 Builder.defineMacro("_ARCH_A2");
1109 if (defs & ArchDefineA2q) {
1110 Builder.defineMacro("_ARCH_A2Q");
1111 Builder.defineMacro("_ARCH_QP");
1112 }
1113
1114 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1115 Builder.defineMacro("__bg__");
1116 Builder.defineMacro("__THW_BLUEGENE__");
1117 Builder.defineMacro("__bgq__");
1118 Builder.defineMacro("__TOS_BGQ__");
1119 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001120
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001121 if (HasVSX)
1122 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001123 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001124 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001125
Bill Schmidt38378a02013-02-01 20:23:10 +00001126 // FIXME: The following are not yet generated here by Clang, but are
1127 // generated by GCC:
1128 //
1129 // _SOFT_FLOAT_
1130 // __RECIP_PRECISION__
1131 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001132 // __RECIP__
1133 // __RECIPF__
1134 // __RSQRTE__
1135 // __RSQRTEF__
1136 // _SOFT_DOUBLE_
1137 // __NO_LWSYNC__
1138 // __HAVE_BSWAP__
1139 // __LONGDOUBLE128
1140 // __CMODEL_MEDIUM__
1141 // __CMODEL_LARGE__
1142 // _CALL_SYSV
1143 // _CALL_DARWIN
1144 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001145}
1146
1147void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1148 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1149 .Case("7400", true)
1150 .Case("g4", true)
1151 .Case("7450", true)
1152 .Case("g4+", true)
1153 .Case("970", true)
1154 .Case("g5", true)
1155 .Case("pwr6", true)
1156 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001157 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001158 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001159 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001160 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001161
1162 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001163}
1164
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001165bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001166 return llvm::StringSwitch<bool>(Feature)
1167 .Case("powerpc", true)
1168 .Case("vsx", HasVSX)
1169 .Case("power8-vector", HasP8Vector)
1170 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001171}
Chris Lattner17df24e2008-04-21 18:56:49 +00001172
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001173const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001174 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1175 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1176 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1177 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1178 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1179 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1180 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1181 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001182 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001183 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001184 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001185 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1186 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1187 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1188 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001189 "vrsave", "vscr",
1190 "spe_acc", "spefscr",
1191 "sfp"
1192};
Chris Lattner10a5b382007-01-29 05:24:35 +00001193
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001194void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001195 unsigned &NumNames) const {
1196 Names = GCCRegNames;
1197 NumNames = llvm::array_lengthof(GCCRegNames);
1198}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001199
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001200const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1201 // While some of these aliases do map to different registers
1202 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001203 { { "0" }, "r0" },
1204 { { "1"}, "r1" },
1205 { { "2" }, "r2" },
1206 { { "3" }, "r3" },
1207 { { "4" }, "r4" },
1208 { { "5" }, "r5" },
1209 { { "6" }, "r6" },
1210 { { "7" }, "r7" },
1211 { { "8" }, "r8" },
1212 { { "9" }, "r9" },
1213 { { "10" }, "r10" },
1214 { { "11" }, "r11" },
1215 { { "12" }, "r12" },
1216 { { "13" }, "r13" },
1217 { { "14" }, "r14" },
1218 { { "15" }, "r15" },
1219 { { "16" }, "r16" },
1220 { { "17" }, "r17" },
1221 { { "18" }, "r18" },
1222 { { "19" }, "r19" },
1223 { { "20" }, "r20" },
1224 { { "21" }, "r21" },
1225 { { "22" }, "r22" },
1226 { { "23" }, "r23" },
1227 { { "24" }, "r24" },
1228 { { "25" }, "r25" },
1229 { { "26" }, "r26" },
1230 { { "27" }, "r27" },
1231 { { "28" }, "r28" },
1232 { { "29" }, "r29" },
1233 { { "30" }, "r30" },
1234 { { "31" }, "r31" },
1235 { { "fr0" }, "f0" },
1236 { { "fr1" }, "f1" },
1237 { { "fr2" }, "f2" },
1238 { { "fr3" }, "f3" },
1239 { { "fr4" }, "f4" },
1240 { { "fr5" }, "f5" },
1241 { { "fr6" }, "f6" },
1242 { { "fr7" }, "f7" },
1243 { { "fr8" }, "f8" },
1244 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001245 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001246 { { "fr11" }, "f11" },
1247 { { "fr12" }, "f12" },
1248 { { "fr13" }, "f13" },
1249 { { "fr14" }, "f14" },
1250 { { "fr15" }, "f15" },
1251 { { "fr16" }, "f16" },
1252 { { "fr17" }, "f17" },
1253 { { "fr18" }, "f18" },
1254 { { "fr19" }, "f19" },
1255 { { "fr20" }, "f20" },
1256 { { "fr21" }, "f21" },
1257 { { "fr22" }, "f22" },
1258 { { "fr23" }, "f23" },
1259 { { "fr24" }, "f24" },
1260 { { "fr25" }, "f25" },
1261 { { "fr26" }, "f26" },
1262 { { "fr27" }, "f27" },
1263 { { "fr28" }, "f28" },
1264 { { "fr29" }, "f29" },
1265 { { "fr30" }, "f30" },
1266 { { "fr31" }, "f31" },
1267 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001268};
1269
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001270void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001271 unsigned &NumAliases) const {
1272 Aliases = GCCRegAliases;
1273 NumAliases = llvm::array_lengthof(GCCRegAliases);
1274}
1275} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001276
Chris Lattner5ba61f02006-10-14 07:39:34 +00001277namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001278class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001279public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001280 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001281 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001282
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001283 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001284 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001285 case llvm::Triple::FreeBSD:
1286 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001287 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001288 PtrDiffType = SignedInt;
1289 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001290 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001291 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001292 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001293 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001294
Roman Divacky3ffe7462012-03-13 19:20:17 +00001295 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1296 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001297 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001298 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001299
1300 // PPC32 supports atomics up to 4 bytes.
1301 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001302 }
1303
Craig Topper3164f332014-03-11 03:39:26 +00001304 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001305 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001306 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001307 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001308};
1309} // end anonymous namespace.
1310
Bill Schmidt778d3872013-07-26 01:36:11 +00001311// Note: ABI differences may eventually require us to have a separate
1312// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001313namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001314class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001315public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001316 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001317 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001318 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001319 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001320
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001321 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1322 DescriptionString = "e-m:e-i64:64-n32:64";
1323 ABI = "elfv2";
1324 } else {
1325 DescriptionString = "E-m:e-i64:64-n32:64";
1326 ABI = "elfv1";
1327 }
1328
1329 switch (getTriple().getOS()) {
1330 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001331 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001332 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001333 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001334 case llvm::Triple::NetBSD:
1335 IntMaxType = SignedLongLong;
1336 Int64Type = SignedLongLong;
1337 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001338 default:
1339 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001340 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001341
1342 // PPC64 supports atomics up to 8 bytes.
1343 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001344 }
Craig Topper3164f332014-03-11 03:39:26 +00001345 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001346 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001347 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001348 // PPC64 Linux-specifc ABI options.
1349 bool setABI(const std::string &Name) override {
1350 if (Name == "elfv1" || Name == "elfv2") {
1351 ABI = Name;
1352 return true;
1353 }
1354 return false;
1355 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001356};
1357} // end anonymous namespace.
1358
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001359
1360namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001361class DarwinPPC32TargetInfo :
1362 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001363public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001364 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1365 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001366 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001367 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001368 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001369 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001370 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001371 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001372 }
Craig Topper3164f332014-03-11 03:39:26 +00001373 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001374 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001375 }
1376};
1377
1378class DarwinPPC64TargetInfo :
1379 public DarwinTargetInfo<PPC64TargetInfo> {
1380public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001381 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1382 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001383 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001384 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001385 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001386 }
1387};
1388} // end anonymous namespace.
1389
Chris Lattner5ba61f02006-10-14 07:39:34 +00001390namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001391 static const unsigned NVPTXAddrSpaceMap[] = {
1392 1, // opencl_global
1393 3, // opencl_local
1394 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001395 // FIXME: generic has to be added to the target
1396 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001397 1, // cuda_device
1398 4, // cuda_constant
1399 3, // cuda_shared
1400 };
1401 class NVPTXTargetInfo : public TargetInfo {
1402 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001403 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001404
1405 // The GPU profiles supported by the NVPTX backend
1406 enum GPUKind {
1407 GK_NONE,
1408 GK_SM20,
1409 GK_SM21,
1410 GK_SM30,
1411 GK_SM35,
1412 } GPU;
1413
Peter Collingbournec947aae2012-05-20 23:28:41 +00001414 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001415 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001416 BigEndian = false;
1417 TLSSupported = false;
1418 LongWidth = LongAlign = 64;
1419 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001420 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001421 // Define available target features
1422 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001423 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001424 // Set the default GPU to sm20
1425 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001426 }
Craig Topper3164f332014-03-11 03:39:26 +00001427 void getTargetDefines(const LangOptions &Opts,
1428 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001429 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001430 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001431 if (Opts.CUDAIsDevice) {
1432 // Set __CUDA_ARCH__ for the GPU specified.
1433 std::string CUDAArchCode;
1434 switch (GPU) {
1435 case GK_SM20:
1436 CUDAArchCode = "200";
1437 break;
1438 case GK_SM21:
1439 CUDAArchCode = "210";
1440 break;
1441 case GK_SM30:
1442 CUDAArchCode = "300";
1443 break;
1444 case GK_SM35:
1445 CUDAArchCode = "350";
1446 break;
1447 default:
1448 llvm_unreachable("Unhandled target CPU");
1449 }
1450 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1451 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001452 }
Craig Topper3164f332014-03-11 03:39:26 +00001453 void getTargetBuiltins(const Builtin::Info *&Records,
1454 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001455 Records = BuiltinInfo;
1456 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001457 }
Craig Topper3164f332014-03-11 03:39:26 +00001458 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001459 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001460 }
Craig Topper3164f332014-03-11 03:39:26 +00001461
1462 void getGCCRegNames(const char * const *&Names,
1463 unsigned &NumNames) const override;
1464 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1465 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001466 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001467 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001468 NumAliases = 0;
1469 }
Eric Christopher917e9522014-11-18 22:36:15 +00001470 bool
1471 validateAsmConstraint(const char *&Name,
1472 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001473 switch (*Name) {
1474 default: return false;
1475 case 'c':
1476 case 'h':
1477 case 'r':
1478 case 'l':
1479 case 'f':
1480 case 'd':
1481 Info.setAllowsRegister();
1482 return true;
1483 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001484 }
Craig Topper3164f332014-03-11 03:39:26 +00001485 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001486 // FIXME: Is this really right?
1487 return "";
1488 }
Craig Topper3164f332014-03-11 03:39:26 +00001489 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001490 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001491 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001492 }
Craig Topper3164f332014-03-11 03:39:26 +00001493 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001494 GPU = llvm::StringSwitch<GPUKind>(Name)
1495 .Case("sm_20", GK_SM20)
1496 .Case("sm_21", GK_SM21)
1497 .Case("sm_30", GK_SM30)
1498 .Case("sm_35", GK_SM35)
1499 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001500
Reid Klecknerbbc01782014-12-03 21:53:36 +00001501 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001502 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001503 };
1504
1505 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1506#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1507#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1508 ALL_LANGUAGES },
1509#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001510 };
1511
1512 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1513 "r0"
1514 };
1515
1516 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1517 unsigned &NumNames) const {
1518 Names = GCCRegNames;
1519 NumNames = llvm::array_lengthof(GCCRegNames);
1520 }
1521
1522 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1523 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001524 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001525 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001526 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1527 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001528 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001529 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001530 };
1531
1532 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1533 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001534 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001535 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001536 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1537 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001538 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001539 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001540 };
1541}
1542
1543namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001544
1545static const unsigned R600AddrSpaceMap[] = {
1546 1, // opencl_global
1547 3, // opencl_local
1548 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001549 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001550 1, // cuda_device
1551 2, // cuda_constant
1552 3 // cuda_shared
1553};
1554
Tom Stellarda96344b2014-08-21 13:58:40 +00001555// If you edit the description strings, make sure you update
1556// getPointerWidthV().
1557
Tom Stellardc74b1e02013-03-04 17:40:53 +00001558static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001559 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1560 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001561
1562static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001563 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1564 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001565
1566static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001567 "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 +00001568 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1569 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001570
Eli Friedmand13b41e2012-10-12 23:32:00 +00001571class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001572 static const Builtin::Info BuiltinInfo[];
1573
Tom Stellardc74b1e02013-03-04 17:40:53 +00001574 /// \brief The GPU profiles supported by the R600 target.
1575 enum GPUKind {
1576 GK_NONE,
1577 GK_R600,
1578 GK_R600_DOUBLE_OPS,
1579 GK_R700,
1580 GK_R700_DOUBLE_OPS,
1581 GK_EVERGREEN,
1582 GK_EVERGREEN_DOUBLE_OPS,
1583 GK_NORTHERN_ISLANDS,
1584 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001585 GK_SOUTHERN_ISLANDS,
1586 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001587 } GPU;
1588
Eli Friedmand13b41e2012-10-12 23:32:00 +00001589public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001590 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001591 : TargetInfo(Triple) {
1592
1593 if (Triple.getArch() == llvm::Triple::amdgcn) {
1594 DescriptionString = DescriptionStringSI;
1595 GPU = GK_SOUTHERN_ISLANDS;
1596 } else {
1597 DescriptionString = DescriptionStringR600;
1598 GPU = GK_R600;
1599 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001600 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001601 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001602 }
1603
Tom Stellarda96344b2014-08-21 13:58:40 +00001604 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1605 if (GPU <= GK_CAYMAN)
1606 return 32;
1607
1608 switch(AddrSpace) {
1609 default:
1610 return 64;
1611 case 0:
1612 case 3:
1613 case 5:
1614 return 32;
1615 }
1616 }
1617
Craig Topper3164f332014-03-11 03:39:26 +00001618 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001619 return "";
1620 }
1621
Craig Topper3164f332014-03-11 03:39:26 +00001622 void getGCCRegNames(const char * const *&Names,
1623 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001624 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001625 numNames = 0;
1626 }
1627
Craig Topper3164f332014-03-11 03:39:26 +00001628 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1629 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001630 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001631 NumAliases = 0;
1632 }
1633
Craig Topper3164f332014-03-11 03:39:26 +00001634 bool validateAsmConstraint(const char *&Name,
1635 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001636 return true;
1637 }
1638
Craig Topper3164f332014-03-11 03:39:26 +00001639 void getTargetBuiltins(const Builtin::Info *&Records,
1640 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001641 Records = BuiltinInfo;
1642 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001643 }
1644
Craig Topper3164f332014-03-11 03:39:26 +00001645 void getTargetDefines(const LangOptions &Opts,
1646 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001647 Builder.defineMacro("__R600__");
1648 }
1649
Craig Topper3164f332014-03-11 03:39:26 +00001650 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001651 return TargetInfo::CharPtrBuiltinVaList;
1652 }
1653
Craig Topper3164f332014-03-11 03:39:26 +00001654 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001655 GPU = llvm::StringSwitch<GPUKind>(Name)
1656 .Case("r600" , GK_R600)
1657 .Case("rv610", GK_R600)
1658 .Case("rv620", GK_R600)
1659 .Case("rv630", GK_R600)
1660 .Case("rv635", GK_R600)
1661 .Case("rs780", GK_R600)
1662 .Case("rs880", GK_R600)
1663 .Case("rv670", GK_R600_DOUBLE_OPS)
1664 .Case("rv710", GK_R700)
1665 .Case("rv730", GK_R700)
1666 .Case("rv740", GK_R700_DOUBLE_OPS)
1667 .Case("rv770", GK_R700_DOUBLE_OPS)
1668 .Case("palm", GK_EVERGREEN)
1669 .Case("cedar", GK_EVERGREEN)
1670 .Case("sumo", GK_EVERGREEN)
1671 .Case("sumo2", GK_EVERGREEN)
1672 .Case("redwood", GK_EVERGREEN)
1673 .Case("juniper", GK_EVERGREEN)
1674 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1675 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1676 .Case("barts", GK_NORTHERN_ISLANDS)
1677 .Case("turks", GK_NORTHERN_ISLANDS)
1678 .Case("caicos", GK_NORTHERN_ISLANDS)
1679 .Case("cayman", GK_CAYMAN)
1680 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001681 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001682 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1683 .Case("verde", GK_SOUTHERN_ISLANDS)
1684 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001685 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001686 .Case("bonaire", GK_SEA_ISLANDS)
1687 .Case("kabini", GK_SEA_ISLANDS)
1688 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001689 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001690 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001691 .Default(GK_NONE);
1692
1693 if (GPU == GK_NONE) {
1694 return false;
1695 }
1696
1697 // Set the correct data layout
1698 switch (GPU) {
1699 case GK_NONE:
1700 case GK_R600:
1701 case GK_R700:
1702 case GK_EVERGREEN:
1703 case GK_NORTHERN_ISLANDS:
1704 DescriptionString = DescriptionStringR600;
1705 break;
1706 case GK_R600_DOUBLE_OPS:
1707 case GK_R700_DOUBLE_OPS:
1708 case GK_EVERGREEN_DOUBLE_OPS:
1709 case GK_CAYMAN:
1710 DescriptionString = DescriptionStringR600DoubleOps;
1711 break;
1712 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001713 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001714 DescriptionString = DescriptionStringSI;
1715 break;
1716 }
1717
1718 return true;
1719 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001720};
1721
Matt Arsenault56f008d2014-06-24 20:45:01 +00001722const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1723#define BUILTIN(ID, TYPE, ATTRS) \
1724 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1725#include "clang/Basic/BuiltinsR600.def"
1726};
1727
Eli Friedmand13b41e2012-10-12 23:32:00 +00001728} // end anonymous namespace
1729
1730namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001731// Namespace for x86 abstract base class
1732const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001733#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001734#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001735 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001736#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001737};
Eli Friedmanb5366062008-05-20 14:21:01 +00001738
Nuno Lopescfca1f02009-12-23 17:49:57 +00001739static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001740 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1741 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001742 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001743 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1744 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1745 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001746 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001747 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1748 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001749};
1750
Eric Christophercdd36352011-06-21 00:05:20 +00001751const TargetInfo::AddlRegName AddlRegNames[] = {
1752 { { "al", "ah", "eax", "rax" }, 0 },
1753 { { "bl", "bh", "ebx", "rbx" }, 3 },
1754 { { "cl", "ch", "ecx", "rcx" }, 2 },
1755 { { "dl", "dh", "edx", "rdx" }, 1 },
1756 { { "esi", "rsi" }, 4 },
1757 { { "edi", "rdi" }, 5 },
1758 { { "esp", "rsp" }, 7 },
1759 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001760};
1761
1762// X86 target abstract base class; x86-32 and x86-64 are very close, so
1763// most of the implementation can be shared.
1764class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001765 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001766 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001767 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001768 enum MMX3DNowEnum {
1769 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1770 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001771 enum XOPEnum {
1772 NoXOP,
1773 SSE4A,
1774 FMA4,
1775 XOP
1776 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001777
Eric Christophere1ddaf92010-04-02 23:50:19 +00001778 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001779 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001780 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001781 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001782 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001783 bool HasBMI;
1784 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001785 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001786 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001787 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001788 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001789 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001790 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001791 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001792 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001793 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1794 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001795 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001796 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001797
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001798 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1799 ///
1800 /// Each enumeration represents a particular CPU supported by Clang. These
1801 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1802 enum CPUKind {
1803 CK_Generic,
1804
1805 /// \name i386
1806 /// i386-generation processors.
1807 //@{
1808 CK_i386,
1809 //@}
1810
1811 /// \name i486
1812 /// i486-generation processors.
1813 //@{
1814 CK_i486,
1815 CK_WinChipC6,
1816 CK_WinChip2,
1817 CK_C3,
1818 //@}
1819
1820 /// \name i586
1821 /// i586-generation processors, P5 microarchitecture based.
1822 //@{
1823 CK_i586,
1824 CK_Pentium,
1825 CK_PentiumMMX,
1826 //@}
1827
1828 /// \name i686
1829 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1830 //@{
1831 CK_i686,
1832 CK_PentiumPro,
1833 CK_Pentium2,
1834 CK_Pentium3,
1835 CK_Pentium3M,
1836 CK_PentiumM,
1837 CK_C3_2,
1838
1839 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1840 /// Clang however has some logic to suport this.
1841 // FIXME: Warn, deprecate, and potentially remove this.
1842 CK_Yonah,
1843 //@}
1844
1845 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001846 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001847 //@{
1848 CK_Pentium4,
1849 CK_Pentium4M,
1850 CK_Prescott,
1851 CK_Nocona,
1852 //@}
1853
1854 /// \name Core
1855 /// Core microarchitecture based processors.
1856 //@{
1857 CK_Core2,
1858
1859 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1860 /// codename which GCC no longer accepts as an option to -march, but Clang
1861 /// has some logic for recognizing it.
1862 // FIXME: Warn, deprecate, and potentially remove this.
1863 CK_Penryn,
1864 //@}
1865
1866 /// \name Atom
1867 /// Atom processors
1868 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001869 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001870 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001871 //@}
1872
1873 /// \name Nehalem
1874 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001875 CK_Nehalem,
1876
1877 /// \name Westmere
1878 /// Westmere microarchitecture based processors.
1879 CK_Westmere,
1880
1881 /// \name Sandy Bridge
1882 /// Sandy Bridge microarchitecture based processors.
1883 CK_SandyBridge,
1884
1885 /// \name Ivy Bridge
1886 /// Ivy Bridge microarchitecture based processors.
1887 CK_IvyBridge,
1888
1889 /// \name Haswell
1890 /// Haswell microarchitecture based processors.
1891 CK_Haswell,
1892
1893 /// \name Broadwell
1894 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001895 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001896
1897 /// \name Skylake
1898 /// Skylake microarchitecture based processors.
1899 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001900
Craig Topper449314e2013-08-20 07:09:39 +00001901 /// \name Knights Landing
1902 /// Knights Landing processor.
1903 CK_KNL,
1904
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001905 /// \name K6
1906 /// K6 architecture processors.
1907 //@{
1908 CK_K6,
1909 CK_K6_2,
1910 CK_K6_3,
1911 //@}
1912
1913 /// \name K7
1914 /// K7 architecture processors.
1915 //@{
1916 CK_Athlon,
1917 CK_AthlonThunderbird,
1918 CK_Athlon4,
1919 CK_AthlonXP,
1920 CK_AthlonMP,
1921 //@}
1922
1923 /// \name K8
1924 /// K8 architecture processors.
1925 //@{
1926 CK_Athlon64,
1927 CK_Athlon64SSE3,
1928 CK_AthlonFX,
1929 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001930 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001931 CK_Opteron,
1932 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001933 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001934 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001935
Benjamin Kramer569f2152012-01-10 11:50:18 +00001936 /// \name Bobcat
1937 /// Bobcat architecture processors.
1938 //@{
1939 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001940 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001941 //@}
1942
1943 /// \name Bulldozer
1944 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001945 //@{
1946 CK_BDVER1,
1947 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001948 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001949 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001950 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001951
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001952 /// This specification is deprecated and will be removed in the future.
1953 /// Users should prefer \see CK_K8.
1954 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001955 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001956 CK_x86_64,
1957 //@}
1958
1959 /// \name Geode
1960 /// Geode processors.
1961 //@{
1962 CK_Geode
1963 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001964 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001965
Rafael Espindolaeb265472013-08-21 21:59:03 +00001966 enum FPMathKind {
1967 FP_Default,
1968 FP_SSE,
1969 FP_387
1970 } FPMath;
1971
Eli Friedman3fd920a2008-08-20 02:34:37 +00001972public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001973 X86TargetInfo(const llvm::Triple &Triple)
1974 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001975 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001976 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1977 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1978 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1979 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1980 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1981 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001982 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001983 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001984 }
Craig Topper3164f332014-03-11 03:39:26 +00001985 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001986 // X87 evaluates with 80 bits "long double" precision.
1987 return SSELevel == NoSSE ? 2 : 0;
1988 }
Craig Topper3164f332014-03-11 03:39:26 +00001989 void getTargetBuiltins(const Builtin::Info *&Records,
1990 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001991 Records = BuiltinInfo;
1992 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001993 }
Craig Topper3164f332014-03-11 03:39:26 +00001994 void getGCCRegNames(const char * const *&Names,
1995 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001996 Names = GCCRegNames;
1997 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001998 }
Craig Topper3164f332014-03-11 03:39:26 +00001999 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2000 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002001 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002002 NumAliases = 0;
2003 }
Craig Topper3164f332014-03-11 03:39:26 +00002004 void getGCCAddlRegNames(const AddlRegName *&Names,
2005 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002006 Names = AddlRegNames;
2007 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002008 }
Craig Topper3164f332014-03-11 03:39:26 +00002009 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002010 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002011
Akira Hatanaka974131e2014-09-18 18:17:18 +00002012 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2013
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002014 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2015
Akira Hatanaka974131e2014-09-18 18:17:18 +00002016 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2017
Craig Topper3164f332014-03-11 03:39:26 +00002018 std::string convertConstraint(const char *&Constraint) const override;
2019 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002020 return "~{dirflag},~{fpsr},~{flags}";
2021 }
Craig Topper3164f332014-03-11 03:39:26 +00002022 void getTargetDefines(const LangOptions &Opts,
2023 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002024 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2025 bool Enabled);
2026 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2027 bool Enabled);
2028 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2029 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002030 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2031 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002032 setFeatureEnabledImpl(Features, Name, Enabled);
2033 }
2034 // This exists purely to cut down on the number of virtual calls in
2035 // getDefaultFeatures which calls this repeatedly.
2036 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2037 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002038 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2039 bool hasFeature(StringRef Feature) const override;
2040 bool handleTargetFeatures(std::vector<std::string> &Features,
2041 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002042 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002043 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002044 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002045 else if (getTriple().getArch() == llvm::Triple::x86 &&
2046 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002047 return "no-mmx";
2048 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002049 }
Craig Topper3164f332014-03-11 03:39:26 +00002050 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002051 CPU = llvm::StringSwitch<CPUKind>(Name)
2052 .Case("i386", CK_i386)
2053 .Case("i486", CK_i486)
2054 .Case("winchip-c6", CK_WinChipC6)
2055 .Case("winchip2", CK_WinChip2)
2056 .Case("c3", CK_C3)
2057 .Case("i586", CK_i586)
2058 .Case("pentium", CK_Pentium)
2059 .Case("pentium-mmx", CK_PentiumMMX)
2060 .Case("i686", CK_i686)
2061 .Case("pentiumpro", CK_PentiumPro)
2062 .Case("pentium2", CK_Pentium2)
2063 .Case("pentium3", CK_Pentium3)
2064 .Case("pentium3m", CK_Pentium3M)
2065 .Case("pentium-m", CK_PentiumM)
2066 .Case("c3-2", CK_C3_2)
2067 .Case("yonah", CK_Yonah)
2068 .Case("pentium4", CK_Pentium4)
2069 .Case("pentium4m", CK_Pentium4M)
2070 .Case("prescott", CK_Prescott)
2071 .Case("nocona", CK_Nocona)
2072 .Case("core2", CK_Core2)
2073 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002074 .Case("bonnell", CK_Bonnell)
2075 .Case("atom", CK_Bonnell) // Legacy name.
2076 .Case("silvermont", CK_Silvermont)
2077 .Case("slm", CK_Silvermont) // Legacy name.
2078 .Case("nehalem", CK_Nehalem)
2079 .Case("corei7", CK_Nehalem) // Legacy name.
2080 .Case("westmere", CK_Westmere)
2081 .Case("sandybridge", CK_SandyBridge)
2082 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2083 .Case("ivybridge", CK_IvyBridge)
2084 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2085 .Case("haswell", CK_Haswell)
2086 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002087 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002088 .Case("skylake", CK_Skylake)
2089 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002090 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002091 .Case("k6", CK_K6)
2092 .Case("k6-2", CK_K6_2)
2093 .Case("k6-3", CK_K6_3)
2094 .Case("athlon", CK_Athlon)
2095 .Case("athlon-tbird", CK_AthlonThunderbird)
2096 .Case("athlon-4", CK_Athlon4)
2097 .Case("athlon-xp", CK_AthlonXP)
2098 .Case("athlon-mp", CK_AthlonMP)
2099 .Case("athlon64", CK_Athlon64)
2100 .Case("athlon64-sse3", CK_Athlon64SSE3)
2101 .Case("athlon-fx", CK_AthlonFX)
2102 .Case("k8", CK_K8)
2103 .Case("k8-sse3", CK_K8SSE3)
2104 .Case("opteron", CK_Opteron)
2105 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002106 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002107 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002108 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002109 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002110 .Case("bdver1", CK_BDVER1)
2111 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002112 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002113 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002114 .Case("x86-64", CK_x86_64)
2115 .Case("geode", CK_Geode)
2116 .Default(CK_Generic);
2117
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002118 // Perform any per-CPU checks necessary to determine if this CPU is
2119 // acceptable.
2120 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2121 // invalid without explaining *why*.
2122 switch (CPU) {
2123 case CK_Generic:
2124 // No processor selected!
2125 return false;
2126
2127 case CK_i386:
2128 case CK_i486:
2129 case CK_WinChipC6:
2130 case CK_WinChip2:
2131 case CK_C3:
2132 case CK_i586:
2133 case CK_Pentium:
2134 case CK_PentiumMMX:
2135 case CK_i686:
2136 case CK_PentiumPro:
2137 case CK_Pentium2:
2138 case CK_Pentium3:
2139 case CK_Pentium3M:
2140 case CK_PentiumM:
2141 case CK_Yonah:
2142 case CK_C3_2:
2143 case CK_Pentium4:
2144 case CK_Pentium4M:
2145 case CK_Prescott:
2146 case CK_K6:
2147 case CK_K6_2:
2148 case CK_K6_3:
2149 case CK_Athlon:
2150 case CK_AthlonThunderbird:
2151 case CK_Athlon4:
2152 case CK_AthlonXP:
2153 case CK_AthlonMP:
2154 case CK_Geode:
2155 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002156 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002157 return false;
2158
2159 // Fallthrough
2160 case CK_Nocona:
2161 case CK_Core2:
2162 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002163 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002164 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002165 case CK_Nehalem:
2166 case CK_Westmere:
2167 case CK_SandyBridge:
2168 case CK_IvyBridge:
2169 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002170 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002171 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002172 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002173 case CK_Athlon64:
2174 case CK_Athlon64SSE3:
2175 case CK_AthlonFX:
2176 case CK_K8:
2177 case CK_K8SSE3:
2178 case CK_Opteron:
2179 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002180 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002181 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002182 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002183 case CK_BDVER1:
2184 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002185 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002186 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002187 case CK_x86_64:
2188 return true;
2189 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002190 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002191 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002192
Craig Topper3164f332014-03-11 03:39:26 +00002193 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002194
Craig Topper3164f332014-03-11 03:39:26 +00002195 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002196 // We accept all non-ARM calling conventions
2197 return (CC == CC_X86ThisCall ||
2198 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002199 CC == CC_X86StdCall ||
2200 CC == CC_X86VectorCall ||
2201 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002202 CC == CC_X86Pascal ||
2203 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002204 }
2205
Craig Topper3164f332014-03-11 03:39:26 +00002206 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002207 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002208 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002209};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002210
Rafael Espindolaeb265472013-08-21 21:59:03 +00002211bool X86TargetInfo::setFPMath(StringRef Name) {
2212 if (Name == "387") {
2213 FPMath = FP_387;
2214 return true;
2215 }
2216 if (Name == "sse") {
2217 FPMath = FP_SSE;
2218 return true;
2219 }
2220 return false;
2221}
2222
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002223void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002224 // FIXME: This *really* should not be here.
2225
2226 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002227 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002228 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002229
Chandler Carruth212334f2011-09-28 08:55:37 +00002230 switch (CPU) {
2231 case CK_Generic:
2232 case CK_i386:
2233 case CK_i486:
2234 case CK_i586:
2235 case CK_Pentium:
2236 case CK_i686:
2237 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002238 break;
2239 case CK_PentiumMMX:
2240 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002241 case CK_K6:
2242 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002243 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002244 break;
2245 case CK_Pentium3:
2246 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002247 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002248 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002249 break;
2250 case CK_PentiumM:
2251 case CK_Pentium4:
2252 case CK_Pentium4M:
2253 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002254 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002255 break;
2256 case CK_Yonah:
2257 case CK_Prescott:
2258 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002259 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002260 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002261 break;
2262 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002263 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002264 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002265 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002266 break;
2267 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002268 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002269 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002270 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002271 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002272 setFeatureEnabledImpl(Features, "avx512f", true);
2273 setFeatureEnabledImpl(Features, "avx512cd", true);
2274 setFeatureEnabledImpl(Features, "avx512dq", true);
2275 setFeatureEnabledImpl(Features, "avx512bw", true);
2276 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002277 // FALLTHROUGH
2278 case CK_Broadwell:
2279 setFeatureEnabledImpl(Features, "rdseed", true);
2280 setFeatureEnabledImpl(Features, "adx", true);
2281 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002282 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002283 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002284 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002285 setFeatureEnabledImpl(Features, "bmi", true);
2286 setFeatureEnabledImpl(Features, "bmi2", true);
2287 setFeatureEnabledImpl(Features, "rtm", true);
2288 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002289 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002290 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002291 setFeatureEnabledImpl(Features, "rdrnd", true);
2292 setFeatureEnabledImpl(Features, "f16c", true);
2293 setFeatureEnabledImpl(Features, "fsgsbase", true);
2294 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002295 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002296 setFeatureEnabledImpl(Features, "avx", true);
2297 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002298 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002299 case CK_Silvermont:
2300 setFeatureEnabledImpl(Features, "aes", true);
2301 setFeatureEnabledImpl(Features, "pclmul", true);
2302 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002303 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002304 setFeatureEnabledImpl(Features, "sse4.2", true);
2305 setFeatureEnabledImpl(Features, "cx16", true);
2306 break;
2307 case CK_KNL:
2308 setFeatureEnabledImpl(Features, "avx512f", true);
2309 setFeatureEnabledImpl(Features, "avx512cd", true);
2310 setFeatureEnabledImpl(Features, "avx512er", true);
2311 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002312 setFeatureEnabledImpl(Features, "rdseed", true);
2313 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002314 setFeatureEnabledImpl(Features, "lzcnt", true);
2315 setFeatureEnabledImpl(Features, "bmi", true);
2316 setFeatureEnabledImpl(Features, "bmi2", true);
2317 setFeatureEnabledImpl(Features, "rtm", true);
2318 setFeatureEnabledImpl(Features, "fma", true);
2319 setFeatureEnabledImpl(Features, "rdrnd", true);
2320 setFeatureEnabledImpl(Features, "f16c", true);
2321 setFeatureEnabledImpl(Features, "fsgsbase", true);
2322 setFeatureEnabledImpl(Features, "aes", true);
2323 setFeatureEnabledImpl(Features, "pclmul", true);
2324 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002325 break;
2326 case CK_K6_2:
2327 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002328 case CK_WinChip2:
2329 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002330 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002331 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002332 case CK_Athlon:
2333 case CK_AthlonThunderbird:
2334 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002335 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002336 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002337 case CK_Athlon4:
2338 case CK_AthlonXP:
2339 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002340 setFeatureEnabledImpl(Features, "sse", true);
2341 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002342 break;
2343 case CK_K8:
2344 case CK_Opteron:
2345 case CK_Athlon64:
2346 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002347 setFeatureEnabledImpl(Features, "sse2", true);
2348 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002349 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002350 case CK_AMDFAM10:
2351 setFeatureEnabledImpl(Features, "sse4a", true);
2352 setFeatureEnabledImpl(Features, "lzcnt", true);
2353 setFeatureEnabledImpl(Features, "popcnt", true);
2354 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002355 case CK_K8SSE3:
2356 case CK_OpteronSSE3:
2357 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002358 setFeatureEnabledImpl(Features, "sse3", true);
2359 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002360 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002361 case CK_BTVER2:
2362 setFeatureEnabledImpl(Features, "avx", true);
2363 setFeatureEnabledImpl(Features, "aes", true);
2364 setFeatureEnabledImpl(Features, "pclmul", true);
2365 setFeatureEnabledImpl(Features, "bmi", true);
2366 setFeatureEnabledImpl(Features, "f16c", true);
2367 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002368 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002369 setFeatureEnabledImpl(Features, "ssse3", true);
2370 setFeatureEnabledImpl(Features, "sse4a", true);
2371 setFeatureEnabledImpl(Features, "lzcnt", true);
2372 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002373 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002374 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002375 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002376 case CK_BDVER4:
2377 setFeatureEnabledImpl(Features, "avx2", true);
2378 setFeatureEnabledImpl(Features, "bmi2", true);
2379 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002380 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002381 setFeatureEnabledImpl(Features, "fsgsbase", true);
2382 // FALLTHROUGH
2383 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002384 setFeatureEnabledImpl(Features, "bmi", true);
2385 setFeatureEnabledImpl(Features, "fma", true);
2386 setFeatureEnabledImpl(Features, "f16c", true);
2387 setFeatureEnabledImpl(Features, "tbm", true);
2388 // FALLTHROUGH
2389 case CK_BDVER1:
2390 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002391 setFeatureEnabledImpl(Features, "xop", true);
2392 setFeatureEnabledImpl(Features, "lzcnt", true);
2393 setFeatureEnabledImpl(Features, "aes", true);
2394 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002395 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002396 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002397 break;
Eli Friedman33465822011-07-08 23:31:17 +00002398 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002399}
2400
Rafael Espindolae62e2792013-08-20 13:44:29 +00002401void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002402 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002403 if (Enabled) {
2404 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002405 case AVX512F:
2406 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002407 case AVX2:
2408 Features["avx2"] = true;
2409 case AVX:
2410 Features["avx"] = true;
2411 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002412 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002413 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002414 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002415 case SSSE3:
2416 Features["ssse3"] = true;
2417 case SSE3:
2418 Features["sse3"] = true;
2419 case SSE2:
2420 Features["sse2"] = true;
2421 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002422 Features["sse"] = true;
2423 case NoSSE:
2424 break;
2425 }
2426 return;
2427 }
2428
2429 switch (Level) {
2430 case NoSSE:
2431 case SSE1:
2432 Features["sse"] = false;
2433 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002434 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2435 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002436 case SSE3:
2437 Features["sse3"] = false;
2438 setXOPLevel(Features, NoXOP, false);
2439 case SSSE3:
2440 Features["ssse3"] = false;
2441 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002442 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002443 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002444 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002445 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002446 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002447 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002448 case AVX2:
2449 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002450 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002451 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002452 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2453 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002454 }
2455}
2456
2457void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002458 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002459 if (Enabled) {
2460 switch (Level) {
2461 case AMD3DNowAthlon:
2462 Features["3dnowa"] = true;
2463 case AMD3DNow:
2464 Features["3dnow"] = true;
2465 case MMX:
2466 Features["mmx"] = true;
2467 case NoMMX3DNow:
2468 break;
2469 }
2470 return;
2471 }
2472
2473 switch (Level) {
2474 case NoMMX3DNow:
2475 case MMX:
2476 Features["mmx"] = false;
2477 case AMD3DNow:
2478 Features["3dnow"] = false;
2479 case AMD3DNowAthlon:
2480 Features["3dnowa"] = false;
2481 }
2482}
2483
2484void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002485 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002486 if (Enabled) {
2487 switch (Level) {
2488 case XOP:
2489 Features["xop"] = true;
2490 case FMA4:
2491 Features["fma4"] = true;
2492 setSSELevel(Features, AVX, true);
2493 case SSE4A:
2494 Features["sse4a"] = true;
2495 setSSELevel(Features, SSE3, true);
2496 case NoXOP:
2497 break;
2498 }
2499 return;
2500 }
2501
2502 switch (Level) {
2503 case NoXOP:
2504 case SSE4A:
2505 Features["sse4a"] = false;
2506 case FMA4:
2507 Features["fma4"] = false;
2508 case XOP:
2509 Features["xop"] = false;
2510 }
2511}
2512
Craig Topper86d79ef2013-09-17 04:51:29 +00002513void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2514 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002515 // FIXME: This *really* should not be here. We need some way of translating
2516 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002517 if (Name == "sse4")
2518 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002519
Rafael Espindolae62e2792013-08-20 13:44:29 +00002520 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002521
Craig Topper29561122013-09-19 01:13:07 +00002522 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002523 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002524 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002525 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002526 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002527 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002528 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002529 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002530 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002531 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002532 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002533 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002534 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002535 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002536 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002537 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002538 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002539 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002540 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002541 if (Enabled)
2542 setSSELevel(Features, SSE2, Enabled);
2543 } else if (Name == "pclmul") {
2544 if (Enabled)
2545 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002546 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002547 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002548 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002549 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002550 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002551 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002552 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2553 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002554 if (Enabled)
2555 setSSELevel(Features, AVX512F, Enabled);
2556 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002557 if (Enabled)
2558 setSSELevel(Features, AVX, Enabled);
2559 } else if (Name == "fma4") {
2560 setXOPLevel(Features, FMA4, Enabled);
2561 } else if (Name == "xop") {
2562 setXOPLevel(Features, XOP, Enabled);
2563 } else if (Name == "sse4a") {
2564 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002565 } else if (Name == "f16c") {
2566 if (Enabled)
2567 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002568 } else if (Name == "sha") {
2569 if (Enabled)
2570 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002571 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002572}
2573
Eric Christopher3ff21b32013-10-16 21:26:26 +00002574/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002575/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002576bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002577 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002578 // Remember the maximum enabled sselevel.
2579 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2580 // Ignore disabled features.
2581 if (Features[i][0] == '-')
2582 continue;
2583
Benjamin Kramer27402c62012-03-05 15:10:44 +00002584 StringRef Feature = StringRef(Features[i]).substr(1);
2585
2586 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002587 HasAES = true;
2588 continue;
2589 }
2590
Craig Topper3f122a72012-05-31 05:18:48 +00002591 if (Feature == "pclmul") {
2592 HasPCLMUL = true;
2593 continue;
2594 }
2595
Benjamin Kramer27402c62012-03-05 15:10:44 +00002596 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002597 HasLZCNT = true;
2598 continue;
2599 }
2600
Rafael Espindola89049822013-08-23 20:21:37 +00002601 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002602 HasRDRND = true;
2603 continue;
2604 }
2605
Craig Topper8c7f2512014-11-03 06:51:41 +00002606 if (Feature == "fsgsbase") {
2607 HasFSGSBASE = true;
2608 continue;
2609 }
2610
Benjamin Kramer27402c62012-03-05 15:10:44 +00002611 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002612 HasBMI = true;
2613 continue;
2614 }
2615
Benjamin Kramer27402c62012-03-05 15:10:44 +00002616 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002617 HasBMI2 = true;
2618 continue;
2619 }
2620
Benjamin Kramer27402c62012-03-05 15:10:44 +00002621 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002622 HasPOPCNT = true;
2623 continue;
2624 }
2625
Michael Liao625a8752012-11-10 05:17:46 +00002626 if (Feature == "rtm") {
2627 HasRTM = true;
2628 continue;
2629 }
2630
Michael Liao74f4eaf2013-03-26 17:52:08 +00002631 if (Feature == "prfchw") {
2632 HasPRFCHW = true;
2633 continue;
2634 }
2635
Michael Liaoffaae352013-03-29 05:17:55 +00002636 if (Feature == "rdseed") {
2637 HasRDSEED = true;
2638 continue;
2639 }
2640
Robert Khasanov50e6f582014-09-19 09:53:48 +00002641 if (Feature == "adx") {
2642 HasADX = true;
2643 continue;
2644 }
2645
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002646 if (Feature == "tbm") {
2647 HasTBM = true;
2648 continue;
2649 }
2650
Craig Topperbba778b2012-06-03 21:46:30 +00002651 if (Feature == "fma") {
2652 HasFMA = true;
2653 continue;
2654 }
2655
Manman Rena45358c2012-10-11 00:59:55 +00002656 if (Feature == "f16c") {
2657 HasF16C = true;
2658 continue;
2659 }
2660
Craig Topper679b53a2013-08-21 05:29:10 +00002661 if (Feature == "avx512cd") {
2662 HasAVX512CD = true;
2663 continue;
2664 }
2665
2666 if (Feature == "avx512er") {
2667 HasAVX512ER = true;
2668 continue;
2669 }
2670
2671 if (Feature == "avx512pf") {
2672 HasAVX512PF = true;
2673 continue;
2674 }
2675
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002676 if (Feature == "avx512dq") {
2677 HasAVX512DQ = true;
2678 continue;
2679 }
2680
2681 if (Feature == "avx512bw") {
2682 HasAVX512BW = true;
2683 continue;
2684 }
2685
2686 if (Feature == "avx512vl") {
2687 HasAVX512VL = true;
2688 continue;
2689 }
2690
Ben Langmuir58078d02013-09-19 13:22:04 +00002691 if (Feature == "sha") {
2692 HasSHA = true;
2693 continue;
2694 }
2695
Nick Lewycky50e8f482013-10-05 20:14:27 +00002696 if (Feature == "cx16") {
2697 HasCX16 = true;
2698 continue;
2699 }
2700
Daniel Dunbar979586e2009-11-11 09:38:56 +00002701 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002702 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002703 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002704 .Case("avx2", AVX2)
2705 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002706 .Case("sse4.2", SSE42)
2707 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002708 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002709 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002710 .Case("sse2", SSE2)
2711 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002712 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002713 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002714
Eli Friedman33465822011-07-08 23:31:17 +00002715 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002716 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002717 .Case("3dnowa", AMD3DNowAthlon)
2718 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002719 .Case("mmx", MMX)
2720 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002721 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002722
2723 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2724 .Case("xop", XOP)
2725 .Case("fma4", FMA4)
2726 .Case("sse4a", SSE4A)
2727 .Default(NoXOP);
2728 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002729 }
Eli Friedman33465822011-07-08 23:31:17 +00002730
Craig Topper7481d8a2013-09-10 06:55:47 +00002731 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2732 // Can't do this earlier because we need to be able to explicitly enable
2733 // popcnt and still disable sse4.2.
2734 if (!HasPOPCNT && SSELevel >= SSE42 &&
2735 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2736 HasPOPCNT = true;
2737 Features.push_back("+popcnt");
2738 }
2739
Yunzhong Gao61089362013-10-16 19:07:02 +00002740 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2741 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2742 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2743 HasPRFCHW = true;
2744 Features.push_back("+prfchw");
2745 }
2746
Rafael Espindolaeb265472013-08-21 21:59:03 +00002747 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2748 // matches the selected sse level.
2749 if (FPMath == FP_SSE && SSELevel < SSE1) {
2750 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2751 return false;
2752 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2753 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2754 return false;
2755 }
2756
Eli Friedman33465822011-07-08 23:31:17 +00002757 // Don't tell the backend if we're turning off mmx; it will end up disabling
2758 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002759 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2760 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002761 std::vector<std::string>::iterator it;
2762 it = std::find(Features.begin(), Features.end(), "-mmx");
2763 if (it != Features.end())
2764 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002765 else if (SSELevel > NoSSE)
2766 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002767 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002768}
Chris Lattnerecd49032009-03-02 22:27:17 +00002769
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002770/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2771/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002772void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002773 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002774 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002775 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002776 Builder.defineMacro("__amd64__");
2777 Builder.defineMacro("__amd64");
2778 Builder.defineMacro("__x86_64");
2779 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002780 if (getTriple().getArchName() == "x86_64h") {
2781 Builder.defineMacro("__x86_64h");
2782 Builder.defineMacro("__x86_64h__");
2783 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002784 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002785 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002786 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002787
Chris Lattnerecd49032009-03-02 22:27:17 +00002788 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002789 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2790 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002791 switch (CPU) {
2792 case CK_Generic:
2793 break;
2794 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002795 // The rest are coming from the i386 define above.
2796 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002797 break;
2798 case CK_i486:
2799 case CK_WinChipC6:
2800 case CK_WinChip2:
2801 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002802 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002803 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002804 case CK_PentiumMMX:
2805 Builder.defineMacro("__pentium_mmx__");
2806 Builder.defineMacro("__tune_pentium_mmx__");
2807 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002808 case CK_i586:
2809 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002810 defineCPUMacros(Builder, "i586");
2811 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002812 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002813 case CK_Pentium3:
2814 case CK_Pentium3M:
2815 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002816 Builder.defineMacro("__tune_pentium3__");
2817 // Fallthrough
2818 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002819 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002820 Builder.defineMacro("__tune_pentium2__");
2821 // Fallthrough
2822 case CK_PentiumPro:
2823 Builder.defineMacro("__tune_i686__");
2824 Builder.defineMacro("__tune_pentiumpro__");
2825 // Fallthrough
2826 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002827 Builder.defineMacro("__i686");
2828 Builder.defineMacro("__i686__");
2829 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2830 Builder.defineMacro("__pentiumpro");
2831 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002832 break;
2833 case CK_Pentium4:
2834 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002835 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002836 break;
2837 case CK_Yonah:
2838 case CK_Prescott:
2839 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002840 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002841 break;
2842 case CK_Core2:
2843 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002844 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002845 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002846 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002847 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002848 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002849 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002850 defineCPUMacros(Builder, "slm");
2851 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002852 case CK_Nehalem:
2853 case CK_Westmere:
2854 case CK_SandyBridge:
2855 case CK_IvyBridge:
2856 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002857 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002858 // FIXME: Historically, we defined this legacy name, it would be nice to
2859 // remove it at some point. We've never exposed fine-grained names for
2860 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002861 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002862 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002863 case CK_Skylake:
2864 // FIXME: Historically, we defined this legacy name, it would be nice to
2865 // remove it at some point. This is the only fine-grained CPU macro in the
2866 // main intel CPU line, and it would be better to not have these and force
2867 // people to use ISA macros.
2868 defineCPUMacros(Builder, "skx");
2869 break;
Craig Topper449314e2013-08-20 07:09:39 +00002870 case CK_KNL:
2871 defineCPUMacros(Builder, "knl");
2872 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002873 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002874 Builder.defineMacro("__k6_2__");
2875 Builder.defineMacro("__tune_k6_2__");
2876 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002877 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002878 if (CPU != CK_K6_2) { // In case of fallthrough
2879 // FIXME: GCC may be enabling these in cases where some other k6
2880 // architecture is specified but -m3dnow is explicitly provided. The
2881 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002882 Builder.defineMacro("__k6_3__");
2883 Builder.defineMacro("__tune_k6_3__");
2884 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002885 // Fallthrough
2886 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002887 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002888 break;
2889 case CK_Athlon:
2890 case CK_AthlonThunderbird:
2891 case CK_Athlon4:
2892 case CK_AthlonXP:
2893 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002894 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002895 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002896 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002897 Builder.defineMacro("__tune_athlon_sse__");
2898 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002899 break;
2900 case CK_K8:
2901 case CK_K8SSE3:
2902 case CK_x86_64:
2903 case CK_Opteron:
2904 case CK_OpteronSSE3:
2905 case CK_Athlon64:
2906 case CK_Athlon64SSE3:
2907 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002908 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002909 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002910 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002911 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002912 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002913 case CK_BTVER1:
2914 defineCPUMacros(Builder, "btver1");
2915 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002916 case CK_BTVER2:
2917 defineCPUMacros(Builder, "btver2");
2918 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002919 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002920 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002921 break;
2922 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002923 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002924 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002925 case CK_BDVER3:
2926 defineCPUMacros(Builder, "bdver3");
2927 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002928 case CK_BDVER4:
2929 defineCPUMacros(Builder, "bdver4");
2930 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002931 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002932 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002933 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002934 }
Chris Lattner96e43572009-03-02 22:40:39 +00002935
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002936 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002937 Builder.defineMacro("__REGISTER_PREFIX__", "");
2938
Chris Lattner6df41af2009-04-19 17:32:33 +00002939 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2940 // functions in glibc header files that use FP Stack inline asm which the
2941 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002942 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002943
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002944 if (HasAES)
2945 Builder.defineMacro("__AES__");
2946
Craig Topper3f122a72012-05-31 05:18:48 +00002947 if (HasPCLMUL)
2948 Builder.defineMacro("__PCLMUL__");
2949
Craig Topper22967d42011-12-25 05:06:45 +00002950 if (HasLZCNT)
2951 Builder.defineMacro("__LZCNT__");
2952
Benjamin Kramer1e250392012-07-07 09:39:18 +00002953 if (HasRDRND)
2954 Builder.defineMacro("__RDRND__");
2955
Craig Topper8c7f2512014-11-03 06:51:41 +00002956 if (HasFSGSBASE)
2957 Builder.defineMacro("__FSGSBASE__");
2958
Craig Topper22967d42011-12-25 05:06:45 +00002959 if (HasBMI)
2960 Builder.defineMacro("__BMI__");
2961
2962 if (HasBMI2)
2963 Builder.defineMacro("__BMI2__");
2964
Craig Topper1de83482011-12-29 16:10:46 +00002965 if (HasPOPCNT)
2966 Builder.defineMacro("__POPCNT__");
2967
Michael Liao625a8752012-11-10 05:17:46 +00002968 if (HasRTM)
2969 Builder.defineMacro("__RTM__");
2970
Michael Liao74f4eaf2013-03-26 17:52:08 +00002971 if (HasPRFCHW)
2972 Builder.defineMacro("__PRFCHW__");
2973
Michael Liaoffaae352013-03-29 05:17:55 +00002974 if (HasRDSEED)
2975 Builder.defineMacro("__RDSEED__");
2976
Robert Khasanov50e6f582014-09-19 09:53:48 +00002977 if (HasADX)
2978 Builder.defineMacro("__ADX__");
2979
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002980 if (HasTBM)
2981 Builder.defineMacro("__TBM__");
2982
Rafael Espindolae62e2792013-08-20 13:44:29 +00002983 switch (XOPLevel) {
2984 case XOP:
2985 Builder.defineMacro("__XOP__");
2986 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002987 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002988 case SSE4A:
2989 Builder.defineMacro("__SSE4A__");
2990 case NoXOP:
2991 break;
2992 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002993
Craig Topperbba778b2012-06-03 21:46:30 +00002994 if (HasFMA)
2995 Builder.defineMacro("__FMA__");
2996
Manman Rena45358c2012-10-11 00:59:55 +00002997 if (HasF16C)
2998 Builder.defineMacro("__F16C__");
2999
Craig Topper679b53a2013-08-21 05:29:10 +00003000 if (HasAVX512CD)
3001 Builder.defineMacro("__AVX512CD__");
3002 if (HasAVX512ER)
3003 Builder.defineMacro("__AVX512ER__");
3004 if (HasAVX512PF)
3005 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003006 if (HasAVX512DQ)
3007 Builder.defineMacro("__AVX512DQ__");
3008 if (HasAVX512BW)
3009 Builder.defineMacro("__AVX512BW__");
3010 if (HasAVX512VL)
3011 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003012
Ben Langmuir58078d02013-09-19 13:22:04 +00003013 if (HasSHA)
3014 Builder.defineMacro("__SHA__");
3015
Nick Lewycky50e8f482013-10-05 20:14:27 +00003016 if (HasCX16)
3017 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3018
Chris Lattner96e43572009-03-02 22:40:39 +00003019 // Each case falls through to the previous one here.
3020 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003021 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003022 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003023 case AVX2:
3024 Builder.defineMacro("__AVX2__");
3025 case AVX:
3026 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003027 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003028 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003029 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003030 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003031 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003032 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003033 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003034 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003035 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003036 Builder.defineMacro("__SSE2__");
3037 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003038 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003039 Builder.defineMacro("__SSE__");
3040 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003041 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003042 break;
3043 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003044
Derek Schuffc7dd7222012-10-11 15:52:22 +00003045 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003046 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003047 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003048 case AVX2:
3049 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003050 case SSE42:
3051 case SSE41:
3052 case SSSE3:
3053 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003054 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003055 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003056 break;
3057 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003058 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003059 break;
3060 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003061 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003062 }
3063 }
3064
Anders Carlssone437c682010-01-27 03:47:49 +00003065 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003066 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003067 case AMD3DNowAthlon:
3068 Builder.defineMacro("__3dNOW_A__");
3069 case AMD3DNow:
3070 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003071 case MMX:
3072 Builder.defineMacro("__MMX__");
3073 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003074 break;
3075 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003076
3077 if (CPU >= CK_i486) {
3078 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3079 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3080 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3081 }
3082 if (CPU >= CK_i586)
3083 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003084}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003085
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003086bool X86TargetInfo::hasFeature(StringRef Feature) const {
3087 return llvm::StringSwitch<bool>(Feature)
3088 .Case("aes", HasAES)
3089 .Case("avx", SSELevel >= AVX)
3090 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003091 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003092 .Case("avx512cd", HasAVX512CD)
3093 .Case("avx512er", HasAVX512ER)
3094 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003095 .Case("avx512dq", HasAVX512DQ)
3096 .Case("avx512bw", HasAVX512BW)
3097 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003098 .Case("bmi", HasBMI)
3099 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003100 .Case("cx16", HasCX16)
3101 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003102 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003103 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003104 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003105 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003106 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3107 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3108 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003109 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003110 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003111 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003112 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003113 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003114 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003115 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003116 .Case("sse", SSELevel >= SSE1)
3117 .Case("sse2", SSELevel >= SSE2)
3118 .Case("sse3", SSELevel >= SSE3)
3119 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003120 .Case("sse4.1", SSELevel >= SSE41)
3121 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003122 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003123 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003124 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003125 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3126 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003127 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003128 .Default(false);
3129}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003130
Eli Friedman3fd920a2008-08-20 02:34:37 +00003131bool
Anders Carlsson58436352009-02-28 17:11:49 +00003132X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003133 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003134 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003135 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003136 case 'I':
3137 Info.setRequiresImmediate(0, 31);
3138 return true;
3139 case 'J':
3140 Info.setRequiresImmediate(0, 63);
3141 return true;
3142 case 'K':
3143 Info.setRequiresImmediate(-128, 127);
3144 return true;
3145 case 'L':
3146 // FIXME: properly analyze this constraint:
3147 // must be one of 0xff, 0xffff, or 0xffffffff
3148 return true;
3149 case 'M':
3150 Info.setRequiresImmediate(0, 3);
3151 return true;
3152 case 'N':
3153 Info.setRequiresImmediate(0, 255);
3154 return true;
3155 case 'O':
3156 Info.setRequiresImmediate(0, 127);
3157 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003158 case 'Y': // first letter of a pair:
3159 switch (*(Name+1)) {
3160 default: return false;
3161 case '0': // First SSE register.
3162 case 't': // Any SSE register, when SSE2 is enabled.
3163 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3164 case 'm': // any MMX register, when inter-unit moves enabled.
3165 break; // falls through to setAllowsRegister.
3166 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003167 case 'f': // any x87 floating point stack register.
3168 // Constraint 'f' cannot be used for output operands.
3169 if (Info.ConstraintStr[0] == '=')
3170 return false;
3171
3172 Info.setAllowsRegister();
3173 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003174 case 'a': // eax.
3175 case 'b': // ebx.
3176 case 'c': // ecx.
3177 case 'd': // edx.
3178 case 'S': // esi.
3179 case 'D': // edi.
3180 case 'A': // edx:eax.
3181 case 't': // top of floating point stack.
3182 case 'u': // second from top of floating point stack.
3183 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003184 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003185 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003186 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003187 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3188 case 'l': // "Index" registers: any general register that can be used as an
3189 // index in a base+index memory access.
3190 Info.setAllowsRegister();
3191 return true;
3192 case 'C': // SSE floating point constant.
3193 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003194 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003195 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003196 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003197 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003198 return true;
3199 }
3200}
3201
Akira Hatanaka974131e2014-09-18 18:17:18 +00003202bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3203 unsigned Size) const {
3204 // Strip off constraint modifiers.
3205 while (Constraint[0] == '=' ||
3206 Constraint[0] == '+' ||
3207 Constraint[0] == '&')
3208 Constraint = Constraint.substr(1);
3209
3210 return validateOperandSize(Constraint, Size);
3211}
3212
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003213bool X86TargetInfo::validateInputSize(StringRef Constraint,
3214 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003215 return validateOperandSize(Constraint, Size);
3216}
3217
3218bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3219 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003220 switch (Constraint[0]) {
3221 default: break;
3222 case 'y':
3223 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003224 case 'f':
3225 case 't':
3226 case 'u':
3227 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003228 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003229 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003230 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003231 }
3232
3233 return true;
3234}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003235
Eli Friedman3fd920a2008-08-20 02:34:37 +00003236std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003237X86TargetInfo::convertConstraint(const char *&Constraint) const {
3238 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003239 case 'a': return std::string("{ax}");
3240 case 'b': return std::string("{bx}");
3241 case 'c': return std::string("{cx}");
3242 case 'd': return std::string("{dx}");
3243 case 'S': return std::string("{si}");
3244 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003245 case 'p': // address
3246 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003247 case 't': // top of floating point stack.
3248 return std::string("{st}");
3249 case 'u': // second from top of floating point stack.
3250 return std::string("{st(1)}"); // second from top of floating point stack.
3251 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003252 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003253 }
3254}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003255} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003256
3257namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003258// X86-32 generic target
3259class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003260public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003261 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003262 DoubleAlign = LongLongAlign = 32;
3263 LongDoubleWidth = 96;
3264 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003265 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003266 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003267 SizeType = UnsignedInt;
3268 PtrDiffType = SignedInt;
3269 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003270 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003271
3272 // Use fpret for all types.
3273 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3274 (1 << TargetInfo::Double) |
3275 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003276
3277 // x86-32 has atomics up to 8 bytes
3278 // FIXME: Check that we actually have cmpxchg8b before setting
3279 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3280 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003281 }
Craig Topper3164f332014-03-11 03:39:26 +00003282 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003283 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003284 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003285
Craig Topper3164f332014-03-11 03:39:26 +00003286 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003287 if (RegNo == 0) return 0;
3288 if (RegNo == 1) return 2;
3289 return -1;
3290 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003291 bool validateOperandSize(StringRef Constraint,
3292 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003293 switch (Constraint[0]) {
3294 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003295 case 'R':
3296 case 'q':
3297 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003298 case 'a':
3299 case 'b':
3300 case 'c':
3301 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003302 case 'S':
3303 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003304 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003305 case 'A':
3306 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003307 }
3308
Akira Hatanaka974131e2014-09-18 18:17:18 +00003309 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003310 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003311};
3312} // end anonymous namespace
3313
3314namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003315class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3316public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003317 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3318 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003319
Craig Topper3164f332014-03-11 03:39:26 +00003320 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003321 unsigned Major, Minor, Micro;
3322 getTriple().getOSVersion(Major, Minor, Micro);
3323 // New NetBSD uses the default rounding mode.
3324 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3325 return X86_32TargetInfo::getFloatEvalMethod();
3326 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003327 return 1;
3328 }
3329};
3330} // end anonymous namespace
3331
3332namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003333class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3334public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003335 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3336 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003337 SizeType = UnsignedLong;
3338 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003339 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003340 }
3341};
3342} // end anonymous namespace
3343
3344namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003345class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3346public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003347 BitrigI386TargetInfo(const llvm::Triple &Triple)
3348 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003349 SizeType = UnsignedLong;
3350 IntPtrType = SignedLong;
3351 PtrDiffType = SignedLong;
3352 }
3353};
3354} // end anonymous namespace
3355
3356namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003357class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003358public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003359 DarwinI386TargetInfo(const llvm::Triple &Triple)
3360 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003361 LongDoubleWidth = 128;
3362 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003363 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003364 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003365 SizeType = UnsignedLong;
3366 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003367 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003368 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003369 }
3370
Eli Friedman3fd920a2008-08-20 02:34:37 +00003371};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003372} // end anonymous namespace
3373
3374namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003375// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003376class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003377public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003378 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3379 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003380 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003381 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003382 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003383 }
Craig Topper3164f332014-03-11 03:39:26 +00003384 void getTargetDefines(const LangOptions &Opts,
3385 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003386 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3387 }
3388};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003389
3390// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003391class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003392public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003393 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003394 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003395 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003396 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3397 }
Craig Topper3164f332014-03-11 03:39:26 +00003398 void getTargetDefines(const LangOptions &Opts,
3399 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003400 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3401 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3402 // The value of the following reflects processor type.
3403 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3404 // We lost the original triple, so we use the default.
3405 Builder.defineMacro("_M_IX86", "600");
3406 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003407};
3408} // end anonymous namespace
3409
Reid Kleckner47606832014-04-21 20:58:00 +00003410static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3411 Builder.defineMacro("__MSVCRT__");
3412 Builder.defineMacro("__MINGW32__");
3413
3414 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3415 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3416 // macro anyway for pre-processor compatibility.
3417 if (Opts.MicrosoftExt)
3418 Builder.defineMacro("__declspec", "__declspec");
3419 else
3420 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3421
3422 if (!Opts.MicrosoftExt) {
3423 // Provide macros for all the calling convention keywords. Provide both
3424 // single and double underscore prefixed variants. These are available on
3425 // x64 as well as x86, even though they have no effect.
3426 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3427 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003428 std::string GCCSpelling = "__attribute__((__";
3429 GCCSpelling += CC;
3430 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003431 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3432 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3433 }
3434 }
3435}
3436
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003437namespace {
3438// x86-32 MinGW target
3439class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3440public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003441 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3442 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003443 void getTargetDefines(const LangOptions &Opts,
3444 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003445 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003446 DefineStd(Builder, "WIN32", Opts);
3447 DefineStd(Builder, "WINNT", Opts);
3448 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003449 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003450 }
3451};
3452} // end anonymous namespace
3453
3454namespace {
3455// x86-32 Cygwin target
3456class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3457public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003458 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3459 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003460 TLSSupported = false;
3461 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003462 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003463 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003464 }
Craig Topper3164f332014-03-11 03:39:26 +00003465 void getTargetDefines(const LangOptions &Opts,
3466 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003467 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003468 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003469 Builder.defineMacro("__CYGWIN__");
3470 Builder.defineMacro("__CYGWIN32__");
3471 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003472 if (Opts.CPlusPlus)
3473 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003474 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003475};
3476} // end anonymous namespace
3477
3478namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003479// x86-32 Haiku target
3480class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3481public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003482 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003483 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003484 IntPtrType = SignedLong;
3485 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003486 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003487 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003488 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003489 }
Craig Topper3164f332014-03-11 03:39:26 +00003490 void getTargetDefines(const LangOptions &Opts,
3491 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003492 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3493 Builder.defineMacro("__INTEL__");
3494 Builder.defineMacro("__HAIKU__");
3495 }
3496};
3497} // end anonymous namespace
3498
Douglas Gregor9fabd852011-07-01 22:41:14 +00003499// RTEMS Target
3500template<typename Target>
3501class RTEMSTargetInfo : public OSTargetInfo<Target> {
3502protected:
Craig Topper3164f332014-03-11 03:39:26 +00003503 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3504 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003505 // RTEMS defines; list based off of gcc output
3506
Douglas Gregor9fabd852011-07-01 22:41:14 +00003507 Builder.defineMacro("__rtems__");
3508 Builder.defineMacro("__ELF__");
3509 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003510
Douglas Gregor9fabd852011-07-01 22:41:14 +00003511public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003512 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3513 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003514
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003515 switch (Triple.getArch()) {
3516 default:
3517 case llvm::Triple::x86:
3518 // this->MCountName = ".mcount";
3519 break;
3520 case llvm::Triple::mips:
3521 case llvm::Triple::mipsel:
3522 case llvm::Triple::ppc:
3523 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003524 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003525 // this->MCountName = "_mcount";
3526 break;
3527 case llvm::Triple::arm:
3528 // this->MCountName = "__mcount";
3529 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003530 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003531 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003532};
3533
3534namespace {
3535// x86-32 RTEMS target
3536class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3537public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003538 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003539 SizeType = UnsignedLong;
3540 IntPtrType = SignedLong;
3541 PtrDiffType = SignedLong;
3542 this->UserLabelPrefix = "";
3543 }
Craig Topper3164f332014-03-11 03:39:26 +00003544 void getTargetDefines(const LangOptions &Opts,
3545 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003546 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3547 Builder.defineMacro("__INTEL__");
3548 Builder.defineMacro("__rtems__");
3549 }
3550};
3551} // end anonymous namespace
3552
Chris Lattnerb986aba2010-04-11 19:29:39 +00003553namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003554// x86-64 generic target
3555class X86_64TargetInfo : public X86TargetInfo {
3556public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003557 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003558 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003559 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003560 LongDoubleWidth = 128;
3561 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003562 LargeArrayMinWidth = 128;
3563 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003564 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003565 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3566 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3567 IntPtrType = IsX32 ? SignedInt : SignedLong;
3568 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003569 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003570 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003571
Eric Christopher917e9522014-11-18 22:36:15 +00003572 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003573 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003574 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3575 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003576
3577 // Use fpret only for long double.
3578 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003579
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003580 // Use fp2ret for _Complex long double.
3581 ComplexLongDoubleUsesFP2Ret = true;
3582
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003583 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003584 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003585 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003586 }
Craig Topper3164f332014-03-11 03:39:26 +00003587 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003588 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003589 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003590
Craig Topper3164f332014-03-11 03:39:26 +00003591 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003592 if (RegNo == 0) return 0;
3593 if (RegNo == 1) return 1;
3594 return -1;
3595 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003596
Craig Topper3164f332014-03-11 03:39:26 +00003597 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003598 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003599 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003600 CC == CC_IntelOclBicc ||
3601 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003602 }
3603
Craig Topper3164f332014-03-11 03:39:26 +00003604 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003605 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003606 }
3607
Pavel Chupinfd223e12014-08-04 12:39:43 +00003608 // for x32 we need it here explicitly
3609 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003610};
3611} // end anonymous namespace
3612
3613namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003614// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003615class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003616public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003617 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3618 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003619 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003620 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003621 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003622 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003623 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003624 SizeType = UnsignedLongLong;
3625 PtrDiffType = SignedLongLong;
3626 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003627 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003628 }
Craig Topper3164f332014-03-11 03:39:26 +00003629 void getTargetDefines(const LangOptions &Opts,
3630 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003631 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003632 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003633 }
Craig Topper3164f332014-03-11 03:39:26 +00003634 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003635 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003636 }
Craig Topper3164f332014-03-11 03:39:26 +00003637 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003638 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003639 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003640 CC == CC_IntelOclBicc ||
3641 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3642 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003643};
3644} // end anonymous namespace
3645
3646namespace {
3647// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003648class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003649public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003650 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003651 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003652 LongDoubleWidth = LongDoubleAlign = 64;
3653 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003654 }
Craig Topper3164f332014-03-11 03:39:26 +00003655 void getTargetDefines(const LangOptions &Opts,
3656 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003657 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3658 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003659 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003660 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003661 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003662};
3663} // end anonymous namespace
3664
3665namespace {
3666// x86-64 MinGW target
3667class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3668public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003669 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3670 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003671 void getTargetDefines(const LangOptions &Opts,
3672 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003673 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003674 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003675 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003676 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003677
3678 // GCC defines this macro when it is using __gxx_personality_seh0.
3679 if (!Opts.SjLjExceptions)
3680 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003681 }
3682};
3683} // end anonymous namespace
3684
3685namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003686class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3687public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003688 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3689 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003690 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003691 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003692 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3693 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003694 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003695 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003696 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003697 }
3698};
3699} // end anonymous namespace
3700
3701namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003702class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3703public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003704 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3705 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003706 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003707 Int64Type = SignedLongLong;
3708 }
3709};
3710} // end anonymous namespace
3711
3712namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003713class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3714public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003715 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3716 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3717 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003718 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003719 }
3720};
Tim Northover9bb857a2013-01-31 12:13:10 +00003721}
3722
Eli Friedman9fa28852012-08-08 23:57:20 +00003723
3724namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003725class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003726 // Possible FPU choices.
3727 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003728 VFP2FPU = (1 << 0),
3729 VFP3FPU = (1 << 1),
3730 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003731 NeonFPU = (1 << 3),
3732 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003733 };
3734
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003735 // Possible HWDiv features.
3736 enum HWDivMode {
3737 HWDivThumb = (1 << 0),
3738 HWDivARM = (1 << 1)
3739 };
3740
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003741 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003742 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003743 }
3744
3745 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3746 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003747
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003748 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003749
Rafael Espindolaeb265472013-08-21 21:59:03 +00003750 enum {
3751 FP_Default,
3752 FP_VFP,
3753 FP_Neon
3754 } FPMath;
3755
Bernard Ogdenda13af32013-10-24 18:32:51 +00003756 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003757
Logan Chien57086ce2012-10-10 06:56:20 +00003758 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003759 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003760 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003761
3762 // Initialized via features.
3763 unsigned SoftFloat : 1;
3764 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003765
Bernard Ogden18b57012013-10-29 09:47:51 +00003766 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003767 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003768
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003769 // ACLE 6.5.1 Hardware floating point
3770 enum {
3771 HW_FP_HP = (1 << 1), /// half (16-bit)
3772 HW_FP_SP = (1 << 2), /// single (32-bit)
3773 HW_FP_DP = (1 << 3), /// double (64-bit)
3774 };
3775 uint32_t HW_FP;
3776
Chris Lattner5cc15e02010-03-03 19:03:45 +00003777 static const Builtin::Info BuiltinInfo[];
3778
Rafael Espindola101d5b92013-05-13 20:09:47 +00003779 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003780 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003781 if (T.getArch() == llvm::Triple::arm ||
3782 T.getArch() == llvm::Triple::armeb) {
3783 StringRef VersionStr;
3784 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003785 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003786 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003787 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003788 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003789 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003790 unsigned Version;
3791 if (VersionStr.getAsInteger(10, Version))
3792 return false;
3793 return Version >= 6;
3794 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003795 assert(T.getArch() == llvm::Triple::thumb ||
3796 T.getArch() == llvm::Triple::thumbeb);
3797 StringRef VersionStr;
3798 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003799 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003800 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003801 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003802 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003803 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003804 unsigned Version;
3805 if (VersionStr.getAsInteger(10, Version))
3806 return false;
3807 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003808 }
3809
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003810 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003811 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003812
3813 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003814 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003815
Tim Northover00853e52014-08-05 11:07:26 +00003816 // size_t is unsigned long on MachO-derived environments and NetBSD.
3817 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003818 SizeType = UnsignedLong;
3819 else
3820 SizeType = UnsignedInt;
3821
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003822 switch (T.getOS()) {
3823 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003824 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003825 break;
3826 case llvm::Triple::Win32:
3827 WCharType = UnsignedShort;
3828 break;
3829 case llvm::Triple::Linux:
3830 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003831 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3832 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003833 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003834 }
3835
3836 UseBitFieldTypeAlignment = true;
3837
3838 ZeroLengthBitfieldBoundary = 0;
3839
Tim Northover147cd2f2014-10-14 22:12:21 +00003840 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3841 // so set preferred for small types to 32.
3842 if (T.isOSBinFormatMachO()) {
3843 DescriptionString =
3844 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3845 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3846 } else if (T.isOSWindows()) {
3847 // FIXME: this is invalid for WindowsCE
3848 assert(!BigEndian && "Windows on ARM does not support big endian");
3849 DescriptionString = "e"
3850 "-m:e"
3851 "-p:32:32"
3852 "-i64:64"
3853 "-v128:64:128"
3854 "-a:0:32"
3855 "-n32"
3856 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003857 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003858 DescriptionString =
3859 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3860 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003861 }
3862
3863 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003864 }
3865
3866 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003867 const llvm::Triple &T = getTriple();
3868
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003869 IsAAPCS = false;
3870
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003871 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003872
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003873 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003874 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003875 SizeType = UnsignedInt;
3876 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003877 SizeType = UnsignedLong;
3878
3879 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3880 WCharType = SignedInt;
3881
3882 // Do not respect the alignment of bit-field types when laying out
3883 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3884 UseBitFieldTypeAlignment = false;
3885
3886 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3887 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3888 /// gcc.
3889 ZeroLengthBitfieldBoundary = 32;
3890
Tim Northover147cd2f2014-10-14 22:12:21 +00003891 if (T.isOSBinFormatMachO())
3892 DescriptionString =
3893 BigEndian
3894 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3895 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3896 else
3897 DescriptionString =
3898 BigEndian
3899 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3900 : "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 +00003901
3902 // FIXME: Override "preferred align" for double and long long.
3903 }
3904
Chris Lattner17df24e2008-04-21 18:56:49 +00003905public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003906 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003907 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003908 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003909 BigEndian = IsBigEndian;
3910
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003911 switch (getTriple().getOS()) {
3912 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003913 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003914 break;
3915 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003916 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003917 break;
3918 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003919
Chris Lattner1a8f3942010-04-23 16:29:58 +00003920 // {} in inline assembly are neon specifiers, not assembly variant
3921 // specifiers.
3922 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003923
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003924 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003925 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003926
Eric Christopher0e261882014-12-05 01:06:59 +00003927 // FIXME: This duplicates code from the driver that sets the -target-abi
3928 // option - this code is used if -target-abi isn't passed and should
3929 // be unified in some way.
3930 if (Triple.isOSBinFormatMachO()) {
3931 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3932 // the frontend matches that.
3933 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3934 Triple.getOS() == llvm::Triple::UnknownOS ||
3935 StringRef(CPU).startswith("cortex-m")) {
3936 setABI("aapcs");
3937 } else {
3938 setABI("apcs-gnu");
3939 }
3940 } else if (Triple.isOSWindows()) {
3941 // FIXME: this is invalid for WindowsCE
3942 setABI("aapcs");
3943 } else {
3944 // Select the default based on the platform.
3945 switch (Triple.getEnvironment()) {
3946 case llvm::Triple::Android:
3947 case llvm::Triple::GNUEABI:
3948 case llvm::Triple::GNUEABIHF:
3949 setABI("aapcs-linux");
3950 break;
3951 case llvm::Triple::EABIHF:
3952 case llvm::Triple::EABI:
3953 setABI("aapcs");
3954 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00003955 case llvm::Triple::GNU:
3956 setABI("apcs-gnu");
3957 break;
Eric Christopher0e261882014-12-05 01:06:59 +00003958 default:
3959 if (Triple.getOS() == llvm::Triple::NetBSD)
3960 setABI("apcs-gnu");
3961 else
3962 setABI("aapcs");
3963 break;
3964 }
3965 }
John McCall86353412010-08-21 22:46:04 +00003966
3967 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003968 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003969
3970 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003971 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003972 if (shouldUseInlineAtomic(getTriple()))
3973 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003974
3975 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00003976 // the alignment of the zero-length bitfield is greater than the member
3977 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00003978 // zero length bitfield.
3979 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003980 }
Alp Toker4925ba72014-06-07 23:30:42 +00003981 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003982 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003983 ABI = Name;
3984
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003985 // The defaults (above) are for AAPCS, check if we need to change them.
3986 //
3987 // FIXME: We need support for -meabi... we could just mangle it into the
3988 // name.
3989 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003990 setABIAPCS();
3991 return true;
3992 }
3993 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3994 setABIAAPCS();
3995 return true;
3996 }
3997 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003998 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003999
Craig Topper3164f332014-03-11 03:39:26 +00004000 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004001 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004002 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4003 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004004 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004005 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004006 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004007 }
4008 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004009 Features["vfp4"] = true;
4010 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004011 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4012 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004013 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004014 Features["vfp4"] = true;
4015 Features["neon"] = true;
4016 Features["hwdiv"] = true;
4017 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004018 } else if (CPU == "cyclone") {
4019 Features["v8fp"] = true;
4020 Features["neon"] = true;
4021 Features["hwdiv"] = true;
4022 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004023 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004024 Features["fp-armv8"] = true;
4025 Features["neon"] = true;
4026 Features["hwdiv"] = true;
4027 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004028 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004029 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004030 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004031 // Enable the hwdiv extension for all v8a AArch32 cores by
4032 // default.
4033 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004034 ArchName == "armebv8a" || ArchName == "armebv8" ||
4035 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4036 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004037 Features["hwdiv"] = true;
4038 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004039 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
4040 CPU == "sc300") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004041 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004042 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004043 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004044
Craig Topper3164f332014-03-11 03:39:26 +00004045 bool handleTargetFeatures(std::vector<std::string> &Features,
4046 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004047 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004048 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004049 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004050 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004051 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004052
4053 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004054 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004055 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004056 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004057 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004058 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004059 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004060 HW_FP = HW_FP_SP | HW_FP_DP;
4061 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004062 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004063 HW_FP = HW_FP_SP | HW_FP_DP;
4064 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004065 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004066 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4067 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004068 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004069 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4070 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004071 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004072 HW_FP = HW_FP_SP | HW_FP_DP;
4073 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004074 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004075 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004076 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004077 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004078 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004079 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004080 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004081 } else if (Feature == "+fp-only-sp") {
4082 HW_FP &= ~HW_FP_DP;
4083 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004084 }
4085
Rafael Espindolaeb265472013-08-21 21:59:03 +00004086 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4087 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4088 return false;
4089 }
4090
4091 if (FPMath == FP_Neon)
4092 Features.push_back("+neonfp");
4093 else if (FPMath == FP_VFP)
4094 Features.push_back("-neonfp");
4095
Daniel Dunbar893d4752009-12-19 04:15:38 +00004096 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004097 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4098 for (const auto &FEFeature : FrontEndFeatures) {
4099 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4100 if (Feature != Features.end())
4101 Features.erase(Feature);
4102 }
4103
Rafael Espindolaeb265472013-08-21 21:59:03 +00004104 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004105 }
4106
Craig Topper3164f332014-03-11 03:39:26 +00004107 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004108 return llvm::StringSwitch<bool>(Feature)
4109 .Case("arm", true)
4110 .Case("softfloat", SoftFloat)
4111 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004112 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004113 .Case("hwdiv", HWDiv & HWDivThumb)
4114 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004115 .Default(false);
4116 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004117 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004118 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004119 return llvm::StringSwitch<const char *>(Name)
4120 .Cases("arm8", "arm810", "4")
4121 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4122 "4")
4123 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4124 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4125 .Case("ep9312", "4T")
4126 .Cases("arm10tdmi", "arm1020t", "5T")
4127 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4128 .Case("arm926ej-s", "5TEJ")
4129 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4130 .Cases("xscale", "iwmmxt", "5TE")
4131 .Case("arm1136j-s", "6J")
4132 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4133 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4134 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4135 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4136 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4137 "7A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004138 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004139 .Case("swift", "7S")
4140 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004141 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004142 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004143 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004144 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004145 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004146 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004147 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004148 return llvm::StringSwitch<const char *>(Name)
4149 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4150 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4151 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004152 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004153 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4154 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
4155 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004156 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004157 }
Craig Topper3164f332014-03-11 03:39:26 +00004158 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004159 if (!getCPUDefineSuffix(Name))
4160 return false;
4161
Tim Northovere8c37212014-07-09 09:24:43 +00004162 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4163 StringRef Profile = getCPUProfile(Name);
4164 if (Profile == "M" && MaxAtomicInlineWidth) {
4165 MaxAtomicPromoteWidth = 32;
4166 MaxAtomicInlineWidth = 32;
4167 }
4168
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004169 CPU = Name;
4170 return true;
4171 }
Craig Topper3164f332014-03-11 03:39:26 +00004172 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004173 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4174 unsigned CPUArchVer) const {
4175 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4176 (CPUArch.find('M') != StringRef::npos);
4177 }
4178 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4179 unsigned CPUArchVer) const {
4180 // We check both CPUArchVer and ArchName because when only triple is
4181 // specified, the default CPU is arm1136j-s.
4182 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4183 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4184 }
Craig Topper3164f332014-03-11 03:39:26 +00004185 void getTargetDefines(const LangOptions &Opts,
4186 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004187 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004188 Builder.defineMacro("__arm");
4189 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004190
Chris Lattnerecd49032009-03-02 22:27:17 +00004191 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004192 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004193
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004194 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004195 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004196 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004197 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004198 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004199
4200 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004201 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004202 StringRef ArchName = getTriple().getArchName();
4203
4204 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4205 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004206 if (CPUArch[0] >= '8') {
4207 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4208 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004209 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004210
4211 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4212 // is not defined for the M-profile.
4213 // NOTE that the deffault profile is assumed to be 'A'
4214 if (CPUProfile.empty() || CPUProfile != "M")
4215 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4216
4217 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4218 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4219 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4220 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4221 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4222 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4223 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4224
4225 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4226 // instruction set such as ARM or Thumb.
4227 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4228
4229 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4230
4231 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004232 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004233 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004234
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004235 // ACLE 6.5.1 Hardware Floating Point
4236 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004237 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004238
Yi Konga44c4d72014-06-27 21:25:42 +00004239 // ACLE predefines.
4240 Builder.defineMacro("__ARM_ACLE", "200");
4241
Mike Stump9d54bd72009-04-08 02:07:04 +00004242 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004243
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004244 // FIXME: It's more complicated than this and we don't really support
4245 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004246 // Windows on ARM does not "support" interworking
4247 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004248 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004249
David Tweed8f676532012-10-25 13:33:01 +00004250 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004251 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004252 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4253 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004254 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004255 Builder.defineMacro("__ARM_PCS", "1");
4256
David Tweed8f676532012-10-25 13:33:01 +00004257 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004258 Builder.defineMacro("__ARM_PCS_VFP", "1");
4259 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004260
Daniel Dunbar893d4752009-12-19 04:15:38 +00004261 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004262 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004263
4264 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004265 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004266
4267 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004268 Builder.defineMacro("__THUMBEL__");
4269 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004270 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004271 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004272 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004273 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4274 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004275
4276 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004277 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004278
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004279 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004280 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004281 if (FPU & VFP2FPU)
4282 Builder.defineMacro("__ARM_VFPV2__");
4283 if (FPU & VFP3FPU)
4284 Builder.defineMacro("__ARM_VFPV3__");
4285 if (FPU & VFP4FPU)
4286 Builder.defineMacro("__ARM_VFPV4__");
4287 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004288
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004289 // This only gets set when Neon instructions are actually available, unlike
4290 // the VFP define, hence the soft float and arch check. This is subtly
4291 // different from gcc, we follow the intent which was that it should be set
4292 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004293 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4294 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004295 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004296 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004297
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004298 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4299 Opts.ShortWChar ? "2" : "4");
4300
4301 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4302 Opts.ShortEnums ? "1" : "4");
4303
Bernard Ogden18b57012013-10-29 09:47:51 +00004304 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004305 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004306
Tim Northover02e38602014-02-03 17:28:04 +00004307 if (Crypto)
4308 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4309
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004310 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004311 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4312 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4313 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4314 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4315 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004316
4317 bool is5EOrAbove = (CPUArchVer >= 6 ||
4318 (CPUArchVer == 5 &&
4319 CPUArch.find('E') != StringRef::npos));
4320 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4321 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4322 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004323 }
Craig Topper3164f332014-03-11 03:39:26 +00004324 void getTargetBuiltins(const Builtin::Info *&Records,
4325 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004326 Records = BuiltinInfo;
4327 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004328 }
Craig Topper3164f332014-03-11 03:39:26 +00004329 bool isCLZForZeroUndef() const override { return false; }
4330 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004331 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004332 }
Craig Topper3164f332014-03-11 03:39:26 +00004333 void getGCCRegNames(const char * const *&Names,
4334 unsigned &NumNames) const override;
4335 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4336 unsigned &NumAliases) const override;
4337 bool validateAsmConstraint(const char *&Name,
4338 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004339 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004340 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004341 case 'l': // r0-r7
4342 case 'h': // r8-r15
4343 case 'w': // VFP Floating point register single precision
4344 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004345 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004346 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004347 case 'I':
4348 case 'J':
4349 case 'K':
4350 case 'L':
4351 case 'M':
4352 // FIXME
4353 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004354 case 'Q': // A memory address that is a single base register.
4355 Info.setAllowsMemory();
4356 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004357 case 'U': // a memory reference...
4358 switch (Name[1]) {
4359 case 'q': // ...ARMV4 ldrsb
4360 case 'v': // ...VFP load/store (reg+constant offset)
4361 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004362 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004363 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004364 case 'n': // valid address for Neon doubleword vector load/store
4365 case 'm': // valid address for Neon element and structure load/store
4366 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004367 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004368 Info.setAllowsMemory();
4369 Name++;
4370 return true;
4371 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004372 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004373 return false;
4374 }
Craig Topper3164f332014-03-11 03:39:26 +00004375 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004376 std::string R;
4377 switch (*Constraint) {
4378 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004379 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004380 Constraint++;
4381 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004382 case 'p': // 'p' should be translated to 'r' by default.
4383 R = std::string("r");
4384 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004385 default:
4386 return std::string(1, *Constraint);
4387 }
4388 return R;
4389 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004390 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004391 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004392 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004393 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004394 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004395
Bill Wendling9d1ee112012-10-25 23:28:48 +00004396 // Strip off constraint modifiers.
4397 while (Constraint[0] == '=' ||
4398 Constraint[0] == '+' ||
4399 Constraint[0] == '&')
4400 Constraint = Constraint.substr(1);
4401
4402 switch (Constraint[0]) {
4403 default: break;
4404 case 'r': {
4405 switch (Modifier) {
4406 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004407 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004408 case 'q':
4409 // A register of size 32 cannot fit a vector type.
4410 return false;
4411 }
4412 }
4413 }
4414
4415 return true;
4416 }
Craig Topper3164f332014-03-11 03:39:26 +00004417 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004418 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004419 return "";
4420 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004421
Craig Topper3164f332014-03-11 03:39:26 +00004422 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004423 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4424 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004425
Craig Topper3164f332014-03-11 03:39:26 +00004426 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004427 if (RegNo == 0) return 0;
4428 if (RegNo == 1) return 1;
4429 return -1;
4430 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004431};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004432
Rafael Espindolaeb265472013-08-21 21:59:03 +00004433bool ARMTargetInfo::setFPMath(StringRef Name) {
4434 if (Name == "neon") {
4435 FPMath = FP_Neon;
4436 return true;
4437 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4438 Name == "vfp4") {
4439 FPMath = FP_VFP;
4440 return true;
4441 }
4442 return false;
4443}
4444
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004445const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004446 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004447 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004448 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4449
4450 // Float registers
4451 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4452 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4453 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004454 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004455
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004456 // Double registers
4457 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4458 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004459 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4460 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004461
4462 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004463 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4464 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004465};
4466
4467void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004468 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004469 Names = GCCRegNames;
4470 NumNames = llvm::array_lengthof(GCCRegNames);
4471}
4472
4473const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004474 { { "a1" }, "r0" },
4475 { { "a2" }, "r1" },
4476 { { "a3" }, "r2" },
4477 { { "a4" }, "r3" },
4478 { { "v1" }, "r4" },
4479 { { "v2" }, "r5" },
4480 { { "v3" }, "r6" },
4481 { { "v4" }, "r7" },
4482 { { "v5" }, "r8" },
4483 { { "v6", "rfp" }, "r9" },
4484 { { "sl" }, "r10" },
4485 { { "fp" }, "r11" },
4486 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004487 { { "r13" }, "sp" },
4488 { { "r14" }, "lr" },
4489 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004490 // The S, D and Q registers overlap, but aren't really aliases; we
4491 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004492};
4493
4494void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4495 unsigned &NumAliases) const {
4496 Aliases = GCCRegAliases;
4497 NumAliases = llvm::array_lengthof(GCCRegAliases);
4498}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004499
4500const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004501#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004502#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004503 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004504#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004505
4506#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004507#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004508#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4509 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004510#include "clang/Basic/BuiltinsARM.def"
4511};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004512
4513class ARMleTargetInfo : public ARMTargetInfo {
4514public:
4515 ARMleTargetInfo(const llvm::Triple &Triple)
4516 : ARMTargetInfo(Triple, false) { }
4517 virtual void getTargetDefines(const LangOptions &Opts,
4518 MacroBuilder &Builder) const {
4519 Builder.defineMacro("__ARMEL__");
4520 ARMTargetInfo::getTargetDefines(Opts, Builder);
4521 }
4522};
4523
4524class ARMbeTargetInfo : public ARMTargetInfo {
4525public:
4526 ARMbeTargetInfo(const llvm::Triple &Triple)
4527 : ARMTargetInfo(Triple, true) { }
4528 virtual void getTargetDefines(const LangOptions &Opts,
4529 MacroBuilder &Builder) const {
4530 Builder.defineMacro("__ARMEB__");
4531 Builder.defineMacro("__ARM_BIG_ENDIAN");
4532 ARMTargetInfo::getTargetDefines(Opts, Builder);
4533 }
4534};
Chris Lattner17df24e2008-04-21 18:56:49 +00004535} // end anonymous namespace.
4536
Eli Friedmanf05b7722008-08-20 07:44:10 +00004537namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004538class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4539 const llvm::Triple Triple;
4540public:
4541 WindowsARMTargetInfo(const llvm::Triple &Triple)
4542 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4543 TLSSupported = false;
4544 WCharType = UnsignedShort;
4545 SizeType = UnsignedInt;
4546 UserLabelPrefix = "";
4547 }
4548 void getVisualStudioDefines(const LangOptions &Opts,
4549 MacroBuilder &Builder) const {
4550 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4551
4552 // FIXME: this is invalid for WindowsCE
4553 Builder.defineMacro("_M_ARM_NT", "1");
4554 Builder.defineMacro("_M_ARMT", "_M_ARM");
4555 Builder.defineMacro("_M_THUMB", "_M_ARM");
4556
4557 assert((Triple.getArch() == llvm::Triple::arm ||
4558 Triple.getArch() == llvm::Triple::thumb) &&
4559 "invalid architecture for Windows ARM target info");
4560 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4561 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4562
4563 // TODO map the complete set of values
4564 // 31: VFPv3 40: VFPv4
4565 Builder.defineMacro("_M_ARM_FP", "31");
4566 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004567 BuiltinVaListKind getBuiltinVaListKind() const override {
4568 return TargetInfo::CharPtrBuiltinVaList;
4569 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004570};
4571
4572// Windows ARM + Itanium C++ ABI Target
4573class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4574public:
4575 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4576 : WindowsARMTargetInfo(Triple) {
4577 TheCXXABI.set(TargetCXXABI::GenericARM);
4578 }
4579
4580 void getTargetDefines(const LangOptions &Opts,
4581 MacroBuilder &Builder) const override {
4582 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4583
4584 if (Opts.MSVCCompat)
4585 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4586 }
4587};
4588
4589// Windows ARM, MS (C++) ABI
4590class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4591public:
4592 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4593 : WindowsARMTargetInfo(Triple) {
4594 TheCXXABI.set(TargetCXXABI::Microsoft);
4595 }
4596
4597 void getTargetDefines(const LangOptions &Opts,
4598 MacroBuilder &Builder) const override {
4599 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4600 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4601 }
4602};
4603}
4604
4605
4606namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004607class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004608 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004609protected:
Craig Topper3164f332014-03-11 03:39:26 +00004610 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4611 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004612 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004613 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004614
Torok Edwinb2b37c62009-06-30 17:10:35 +00004615public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004616 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004617 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004618 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004619 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004620 // FIXME: This should be based off of the target features in
4621 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004622 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004623
4624 // Darwin on iOS uses a variant of the ARM C++ ABI.
4625 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004626 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004627};
4628} // end anonymous namespace.
4629
Tony Linthicum76329bf2011-12-12 21:14:55 +00004630
4631namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004632class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004633 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004634 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4635 static const char *const GCCRegNames[];
4636
James Molloy75f5f9e2014-04-16 15:33:48 +00004637 enum FPUModeEnum {
4638 FPUMode,
4639 NeonMode
4640 };
4641
4642 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004643 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004644 unsigned Crypto;
4645
Tim Northovera2ee4332014-03-29 15:09:45 +00004646 static const Builtin::Info BuiltinInfo[];
4647
4648 std::string ABI;
4649
4650public:
Tim Northover573cbee2014-05-24 12:52:07 +00004651 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004652 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004653
4654 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4655 WCharType = SignedInt;
4656
4657 // NetBSD apparently prefers consistency across ARM targets to consistency
4658 // across 64-bit targets.
4659 Int64Type = SignedLongLong;
4660 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004661 } else {
4662 WCharType = UnsignedInt;
4663 Int64Type = SignedLong;
4664 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004665 }
4666
Tim Northovera2ee4332014-03-29 15:09:45 +00004667 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004668 MaxVectorAlign = 128;
4669 RegParmMax = 8;
4670 MaxAtomicInlineWidth = 128;
4671 MaxAtomicPromoteWidth = 128;
4672
Tim Northovera6a19f12015-02-06 01:25:07 +00004673 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004674 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4675
Tim Northovera2ee4332014-03-29 15:09:45 +00004676 // {} in inline assembly are neon specifiers, not assembly variant
4677 // specifiers.
4678 NoAsmVariants = true;
4679
Tim Northover7ad87af2015-01-16 18:44:04 +00004680 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4681 // contributes to the alignment of the containing aggregate in the same way
4682 // a plain (non bit-field) member of that type would, without exception for
4683 // zero-sized or anonymous bit-fields."
4684 UseBitFieldTypeAlignment = true;
4685 UseZeroLengthBitfieldAlignment = true;
4686
Tim Northover573cbee2014-05-24 12:52:07 +00004687 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004688 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4689 }
4690
Alp Toker4925ba72014-06-07 23:30:42 +00004691 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004692 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004693 if (Name != "aapcs" && Name != "darwinpcs")
4694 return false;
4695
4696 ABI = Name;
4697 return true;
4698 }
4699
David Blaikie1cbb9712014-11-14 19:09:44 +00004700 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004701 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004702 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004703 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004704 .Case("cyclone", true)
4705 .Default(false);
4706 return CPUKnown;
4707 }
4708
4709 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004710 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004711 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004712 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004713
4714 // Target properties.
4715 Builder.defineMacro("_LP64");
4716 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004717
4718 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4719 Builder.defineMacro("__ARM_ACLE", "200");
4720 Builder.defineMacro("__ARM_ARCH", "8");
4721 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4722
4723 Builder.defineMacro("__ARM_64BIT_STATE");
4724 Builder.defineMacro("__ARM_PCS_AAPCS64");
4725 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4726
4727 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4728 Builder.defineMacro("__ARM_FEATURE_CLZ");
4729 Builder.defineMacro("__ARM_FEATURE_FMA");
4730 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004731 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4732 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4733 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4734 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004735
4736 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4737
4738 // 0xe implies support for half, single and double precision operations.
4739 Builder.defineMacro("__ARM_FP", "0xe");
4740
4741 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4742 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4743 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4744
4745 if (Opts.FastMath || Opts.FiniteMathOnly)
4746 Builder.defineMacro("__ARM_FP_FAST");
4747
Richard Smithab506ad2014-10-20 23:26:58 +00004748 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004749 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4750
4751 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4752
4753 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4754 Opts.ShortEnums ? "1" : "4");
4755
James Molloy75f5f9e2014-04-16 15:33:48 +00004756 if (FPU == NeonMode) {
4757 Builder.defineMacro("__ARM_NEON");
4758 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004759 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004760 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004761
Bradley Smith418c5932014-05-02 15:17:51 +00004762 if (CRC)
4763 Builder.defineMacro("__ARM_FEATURE_CRC32");
4764
James Molloy75f5f9e2014-04-16 15:33:48 +00004765 if (Crypto)
4766 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004767 }
4768
4769 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004770 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004771 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004772 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004773 }
4774
David Blaikie1cbb9712014-11-14 19:09:44 +00004775 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004776 return Feature == "aarch64" ||
4777 Feature == "arm64" ||
4778 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004779 }
4780
James Molloy5e73df52014-04-16 15:06:20 +00004781 bool handleTargetFeatures(std::vector<std::string> &Features,
4782 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004783 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004784 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004785 Crypto = 0;
4786 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4787 if (Features[i] == "+neon")
4788 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004789 if (Features[i] == "+crc")
4790 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004791 if (Features[i] == "+crypto")
4792 Crypto = 1;
4793 }
4794
James Molloy5e73df52014-04-16 15:06:20 +00004795 setDescriptionString();
4796
4797 return true;
4798 }
4799
David Blaikie1cbb9712014-11-14 19:09:44 +00004800 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004801
David Blaikie1cbb9712014-11-14 19:09:44 +00004802 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004803 return TargetInfo::AArch64ABIBuiltinVaList;
4804 }
4805
4806 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004807 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004808 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004809 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004810
Eric Christopher917e9522014-11-18 22:36:15 +00004811 virtual bool
4812 validateAsmConstraint(const char *&Name,
4813 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004814 switch (*Name) {
4815 default:
4816 return false;
4817 case 'w': // Floating point and SIMD registers (V0-V31)
4818 Info.setAllowsRegister();
4819 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004820 case 'I': // Constant that can be used with an ADD instruction
4821 case 'J': // Constant that can be used with a SUB instruction
4822 case 'K': // Constant that can be used with a 32-bit logical instruction
4823 case 'L': // Constant that can be used with a 64-bit logical instruction
4824 case 'M': // Constant that can be used as a 32-bit MOV immediate
4825 case 'N': // Constant that can be used as a 64-bit MOV immediate
4826 case 'Y': // Floating point constant zero
4827 case 'Z': // Integer constant zero
4828 return true;
4829 case 'Q': // A memory reference with base register and no offset
4830 Info.setAllowsMemory();
4831 return true;
4832 case 'S': // A symbolic address
4833 Info.setAllowsRegister();
4834 return true;
4835 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004836 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4837 // Utf: A memory address suitable for ldp/stp in TF mode.
4838 // Usa: An absolute symbolic address.
4839 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4840 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004841 case 'z': // Zero register, wzr or xzr
4842 Info.setAllowsRegister();
4843 return true;
4844 case 'x': // Floating point and SIMD registers (V0-V15)
4845 Info.setAllowsRegister();
4846 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004847 }
4848 return false;
4849 }
4850
Akira Hatanaka987f1862014-08-22 06:05:21 +00004851 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004852 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004853 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004854 // Strip off constraint modifiers.
4855 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4856 Constraint = Constraint.substr(1);
4857
4858 switch (Constraint[0]) {
4859 default:
4860 return true;
4861 case 'z':
4862 case 'r': {
4863 switch (Modifier) {
4864 case 'x':
4865 case 'w':
4866 // For now assume that the person knows what they're
4867 // doing with the modifier.
4868 return true;
4869 default:
4870 // By default an 'r' constraint will be in the 'x'
4871 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004872 if (Size == 64)
4873 return true;
4874
4875 SuggestedModifier = "w";
4876 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004877 }
4878 }
4879 }
4880 }
4881
David Blaikie1cbb9712014-11-14 19:09:44 +00004882 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004883
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004884 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004885 if (RegNo == 0)
4886 return 0;
4887 if (RegNo == 1)
4888 return 1;
4889 return -1;
4890 }
4891};
4892
Tim Northover573cbee2014-05-24 12:52:07 +00004893const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004894 // 32-bit Integer registers
4895 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4896 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4897 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4898
4899 // 64-bit Integer registers
4900 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4901 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4902 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4903
4904 // 32-bit floating point regsisters
4905 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4906 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4907 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4908
4909 // 64-bit floating point regsisters
4910 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4911 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4912 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4913
4914 // Vector registers
4915 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4916 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4917 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4918};
4919
Tim Northover573cbee2014-05-24 12:52:07 +00004920void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004921 unsigned &NumNames) const {
4922 Names = GCCRegNames;
4923 NumNames = llvm::array_lengthof(GCCRegNames);
4924}
4925
Tim Northover573cbee2014-05-24 12:52:07 +00004926const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004927 { { "w31" }, "wsp" },
4928 { { "x29" }, "fp" },
4929 { { "x30" }, "lr" },
4930 { { "x31" }, "sp" },
4931 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4932 // don't want to substitute one of these for a different-sized one.
4933};
4934
Tim Northover573cbee2014-05-24 12:52:07 +00004935void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004936 unsigned &NumAliases) const {
4937 Aliases = GCCRegAliases;
4938 NumAliases = llvm::array_lengthof(GCCRegAliases);
4939}
4940
Tim Northover573cbee2014-05-24 12:52:07 +00004941const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004942#define BUILTIN(ID, TYPE, ATTRS) \
4943 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4944#include "clang/Basic/BuiltinsNEON.def"
4945
4946#define BUILTIN(ID, TYPE, ATTRS) \
4947 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004948#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004949};
James Molloy5e73df52014-04-16 15:06:20 +00004950
Tim Northover573cbee2014-05-24 12:52:07 +00004951class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004952 void setDescriptionString() override {
4953 if (getTriple().isOSBinFormatMachO())
4954 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4955 else
4956 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4957 }
4958
4959public:
Tim Northover573cbee2014-05-24 12:52:07 +00004960 AArch64leTargetInfo(const llvm::Triple &Triple)
4961 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004962 BigEndian = false;
4963 }
4964 void getTargetDefines(const LangOptions &Opts,
4965 MacroBuilder &Builder) const override {
4966 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004967 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004968 }
4969};
4970
Tim Northover573cbee2014-05-24 12:52:07 +00004971class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004972 void setDescriptionString() override {
4973 assert(!getTriple().isOSBinFormatMachO());
4974 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4975 }
4976
4977public:
Tim Northover573cbee2014-05-24 12:52:07 +00004978 AArch64beTargetInfo(const llvm::Triple &Triple)
4979 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004980 void getTargetDefines(const LangOptions &Opts,
4981 MacroBuilder &Builder) const override {
4982 Builder.defineMacro("__AARCH64EB__");
4983 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4984 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004985 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004986 }
4987};
Tim Northovera2ee4332014-03-29 15:09:45 +00004988} // end anonymous namespace.
4989
4990namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004991class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004992protected:
4993 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4994 MacroBuilder &Builder) const override {
4995 Builder.defineMacro("__AARCH64_SIMD__");
4996 Builder.defineMacro("__ARM64_ARCH_8__");
4997 Builder.defineMacro("__ARM_NEON__");
4998 Builder.defineMacro("__LITTLE_ENDIAN__");
4999 Builder.defineMacro("__REGISTER_PREFIX__", "");
5000 Builder.defineMacro("__arm64", "1");
5001 Builder.defineMacro("__arm64__", "1");
5002
5003 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5004 }
5005
Tim Northovera2ee4332014-03-29 15:09:45 +00005006public:
Tim Northover573cbee2014-05-24 12:52:07 +00005007 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5008 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005009 Int64Type = SignedLongLong;
5010 WCharType = SignedInt;
5011 UseSignedCharForObjCBool = false;
5012
Tim Northovera6a19f12015-02-06 01:25:07 +00005013 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005014 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5015
5016 TheCXXABI.set(TargetCXXABI::iOS64);
5017 }
5018
David Blaikie1cbb9712014-11-14 19:09:44 +00005019 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005020 return TargetInfo::CharPtrBuiltinVaList;
5021 }
5022};
5023} // end anonymous namespace
5024
5025namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005026// Hexagon abstract base class
5027class HexagonTargetInfo : public TargetInfo {
5028 static const Builtin::Info BuiltinInfo[];
5029 static const char * const GCCRegNames[];
5030 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5031 std::string CPU;
5032public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005033 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005034 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005035 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005036
5037 // {} in inline assembly are packet specifiers, not assembly variant
5038 // specifiers.
5039 NoAsmVariants = true;
5040 }
5041
Craig Topper3164f332014-03-11 03:39:26 +00005042 void getTargetBuiltins(const Builtin::Info *&Records,
5043 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005044 Records = BuiltinInfo;
5045 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5046 }
5047
Craig Topper3164f332014-03-11 03:39:26 +00005048 bool validateAsmConstraint(const char *&Name,
5049 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005050 return true;
5051 }
5052
Craig Topper3164f332014-03-11 03:39:26 +00005053 void getTargetDefines(const LangOptions &Opts,
5054 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005055
Craig Topper3164f332014-03-11 03:39:26 +00005056 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005057 return Feature == "hexagon";
5058 }
Craig Topper3164f332014-03-11 03:39:26 +00005059
5060 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005061 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005062 }
Craig Topper3164f332014-03-11 03:39:26 +00005063 void getGCCRegNames(const char * const *&Names,
5064 unsigned &NumNames) const override;
5065 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5066 unsigned &NumAliases) const override;
5067 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005068 return "";
5069 }
Sebastian Pop86500282012-01-13 20:37:10 +00005070
5071 static const char *getHexagonCPUSuffix(StringRef Name) {
5072 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005073 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005074 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005075 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005076 }
5077
Craig Topper3164f332014-03-11 03:39:26 +00005078 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005079 if (!getHexagonCPUSuffix(Name))
5080 return false;
5081
Tony Linthicum76329bf2011-12-12 21:14:55 +00005082 CPU = Name;
5083 return true;
5084 }
5085};
5086
5087void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5088 MacroBuilder &Builder) const {
5089 Builder.defineMacro("qdsp6");
5090 Builder.defineMacro("__qdsp6", "1");
5091 Builder.defineMacro("__qdsp6__", "1");
5092
5093 Builder.defineMacro("hexagon");
5094 Builder.defineMacro("__hexagon", "1");
5095 Builder.defineMacro("__hexagon__", "1");
5096
5097 if(CPU == "hexagonv1") {
5098 Builder.defineMacro("__HEXAGON_V1__");
5099 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5100 if(Opts.HexagonQdsp6Compat) {
5101 Builder.defineMacro("__QDSP6_V1__");
5102 Builder.defineMacro("__QDSP6_ARCH__", "1");
5103 }
5104 }
5105 else if(CPU == "hexagonv2") {
5106 Builder.defineMacro("__HEXAGON_V2__");
5107 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5108 if(Opts.HexagonQdsp6Compat) {
5109 Builder.defineMacro("__QDSP6_V2__");
5110 Builder.defineMacro("__QDSP6_ARCH__", "2");
5111 }
5112 }
5113 else if(CPU == "hexagonv3") {
5114 Builder.defineMacro("__HEXAGON_V3__");
5115 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5116 if(Opts.HexagonQdsp6Compat) {
5117 Builder.defineMacro("__QDSP6_V3__");
5118 Builder.defineMacro("__QDSP6_ARCH__", "3");
5119 }
5120 }
5121 else if(CPU == "hexagonv4") {
5122 Builder.defineMacro("__HEXAGON_V4__");
5123 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5124 if(Opts.HexagonQdsp6Compat) {
5125 Builder.defineMacro("__QDSP6_V4__");
5126 Builder.defineMacro("__QDSP6_ARCH__", "4");
5127 }
5128 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005129 else if(CPU == "hexagonv5") {
5130 Builder.defineMacro("__HEXAGON_V5__");
5131 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5132 if(Opts.HexagonQdsp6Compat) {
5133 Builder.defineMacro("__QDSP6_V5__");
5134 Builder.defineMacro("__QDSP6_ARCH__", "5");
5135 }
5136 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005137}
5138
5139const char * const HexagonTargetInfo::GCCRegNames[] = {
5140 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5141 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5142 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5143 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5144 "p0", "p1", "p2", "p3",
5145 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5146};
5147
5148void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5149 unsigned &NumNames) const {
5150 Names = GCCRegNames;
5151 NumNames = llvm::array_lengthof(GCCRegNames);
5152}
5153
5154
5155const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5156 { { "sp" }, "r29" },
5157 { { "fp" }, "r30" },
5158 { { "lr" }, "r31" },
5159 };
5160
5161void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5162 unsigned &NumAliases) const {
5163 Aliases = GCCRegAliases;
5164 NumAliases = llvm::array_lengthof(GCCRegAliases);
5165}
5166
5167
5168const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5169#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5170#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5171 ALL_LANGUAGES },
5172#include "clang/Basic/BuiltinsHexagon.def"
5173};
5174}
5175
5176
Chris Lattner5ba61f02006-10-14 07:39:34 +00005177namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005178// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5179class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005180 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5181 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005182 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005183public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005184 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005185
Craig Topper3164f332014-03-11 03:39:26 +00005186 bool handleTargetFeatures(std::vector<std::string> &Features,
5187 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005188 SoftFloat = false;
5189 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5190 if (Features[i] == "+soft-float")
5191 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005192 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005193 }
Craig Topper3164f332014-03-11 03:39:26 +00005194 void getTargetDefines(const LangOptions &Opts,
5195 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005196 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005197 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005198
5199 if (SoftFloat)
5200 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005201 }
Craig Topper3164f332014-03-11 03:39:26 +00005202
5203 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005204 return llvm::StringSwitch<bool>(Feature)
5205 .Case("softfloat", SoftFloat)
5206 .Case("sparc", true)
5207 .Default(false);
5208 }
Craig Topper3164f332014-03-11 03:39:26 +00005209
5210 void getTargetBuiltins(const Builtin::Info *&Records,
5211 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005212 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005213 }
Craig Topper3164f332014-03-11 03:39:26 +00005214 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005215 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005216 }
Craig Topper3164f332014-03-11 03:39:26 +00005217 void getGCCRegNames(const char * const *&Names,
5218 unsigned &NumNames) const override;
5219 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5220 unsigned &NumAliases) const override;
5221 bool validateAsmConstraint(const char *&Name,
5222 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005223 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005224 switch (*Name) {
5225 case 'I': // Signed 13-bit constant
5226 case 'J': // Zero
5227 case 'K': // 32-bit constant with the low 12 bits clear
5228 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5229 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5230 case 'N': // Same as 'K' but zext (required for SIMode)
5231 case 'O': // The constant 4096
5232 return true;
5233 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005234 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005235 }
Craig Topper3164f332014-03-11 03:39:26 +00005236 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005237 // FIXME: Implement!
5238 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005239 }
5240};
5241
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005242const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005243 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5244 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5245 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5246 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5247};
5248
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005249void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5250 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005251 Names = GCCRegNames;
5252 NumNames = llvm::array_lengthof(GCCRegNames);
5253}
5254
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005255const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005256 { { "g0" }, "r0" },
5257 { { "g1" }, "r1" },
5258 { { "g2" }, "r2" },
5259 { { "g3" }, "r3" },
5260 { { "g4" }, "r4" },
5261 { { "g5" }, "r5" },
5262 { { "g6" }, "r6" },
5263 { { "g7" }, "r7" },
5264 { { "o0" }, "r8" },
5265 { { "o1" }, "r9" },
5266 { { "o2" }, "r10" },
5267 { { "o3" }, "r11" },
5268 { { "o4" }, "r12" },
5269 { { "o5" }, "r13" },
5270 { { "o6", "sp" }, "r14" },
5271 { { "o7" }, "r15" },
5272 { { "l0" }, "r16" },
5273 { { "l1" }, "r17" },
5274 { { "l2" }, "r18" },
5275 { { "l3" }, "r19" },
5276 { { "l4" }, "r20" },
5277 { { "l5" }, "r21" },
5278 { { "l6" }, "r22" },
5279 { { "l7" }, "r23" },
5280 { { "i0" }, "r24" },
5281 { { "i1" }, "r25" },
5282 { { "i2" }, "r26" },
5283 { { "i3" }, "r27" },
5284 { { "i4" }, "r28" },
5285 { { "i5" }, "r29" },
5286 { { "i6", "fp" }, "r30" },
5287 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005288};
5289
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005290void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5291 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005292 Aliases = GCCRegAliases;
5293 NumAliases = llvm::array_lengthof(GCCRegAliases);
5294}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005295
5296// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5297class SparcV8TargetInfo : public SparcTargetInfo {
5298public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005299 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005300 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005301 }
5302
Craig Topper3164f332014-03-11 03:39:26 +00005303 void getTargetDefines(const LangOptions &Opts,
5304 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005305 SparcTargetInfo::getTargetDefines(Opts, Builder);
5306 Builder.defineMacro("__sparcv8");
5307 }
5308};
5309
5310// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5311class SparcV9TargetInfo : public SparcTargetInfo {
5312public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005313 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005314 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005315 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005316 // This is an LP64 platform.
5317 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005318
5319 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005320 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005321 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005322 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005323 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005324 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005325
5326 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5327 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5328 LongDoubleWidth = 128;
5329 LongDoubleAlign = 128;
5330 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005331 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005332 }
5333
Craig Topper3164f332014-03-11 03:39:26 +00005334 void getTargetDefines(const LangOptions &Opts,
5335 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005336 SparcTargetInfo::getTargetDefines(Opts, Builder);
5337 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005338 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005339 // Solaris doesn't need these variants, but the BSDs do.
5340 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005341 Builder.defineMacro("__sparc64__");
5342 Builder.defineMacro("__sparc_v9__");
5343 Builder.defineMacro("__sparcv9__");
5344 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005345 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005346
Craig Topper3164f332014-03-11 03:39:26 +00005347 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005348 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5349 .Case("v9", true)
5350 .Case("ultrasparc", true)
5351 .Case("ultrasparc3", true)
5352 .Case("niagara", true)
5353 .Case("niagara2", true)
5354 .Case("niagara3", true)
5355 .Case("niagara4", true)
5356 .Default(false);
5357
5358 // No need to store the CPU yet. There aren't any CPU-specific
5359 // macros to define.
5360 return CPUKnown;
5361 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005362};
5363
Gabor Greif49991682008-02-21 16:29:08 +00005364} // end anonymous namespace.
5365
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005366namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005367class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005368public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005369 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5370 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005371 SizeType = UnsignedInt;
5372 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005373 }
5374};
5375} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005376
Chris Lattnerb781dc792008-05-08 05:58:21 +00005377namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005378class SystemZTargetInfo : public TargetInfo {
5379 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005380
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005381public:
5382 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5383 TLSSupported = true;
5384 IntWidth = IntAlign = 32;
5385 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5386 PointerWidth = PointerAlign = 64;
5387 LongDoubleWidth = 128;
5388 LongDoubleAlign = 64;
5389 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5390 MinGlobalAlign = 16;
5391 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5392 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5393 }
5394 void getTargetDefines(const LangOptions &Opts,
5395 MacroBuilder &Builder) const override {
5396 Builder.defineMacro("__s390__");
5397 Builder.defineMacro("__s390x__");
5398 Builder.defineMacro("__zarch__");
5399 Builder.defineMacro("__LONG_DOUBLE_128__");
5400 }
5401 void getTargetBuiltins(const Builtin::Info *&Records,
5402 unsigned &NumRecords) const override {
5403 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005404 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005405 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005406 }
5407
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005408 void getGCCRegNames(const char *const *&Names,
5409 unsigned &NumNames) const override;
5410 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5411 unsigned &NumAliases) const override {
5412 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005413 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005414 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005415 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005416 bool validateAsmConstraint(const char *&Name,
5417 TargetInfo::ConstraintInfo &info) const override;
5418 const char *getClobbers() const override {
5419 // FIXME: Is this really right?
5420 return "";
5421 }
5422 BuiltinVaListKind getBuiltinVaListKind() const override {
5423 return TargetInfo::SystemZBuiltinVaList;
5424 }
5425 bool setCPU(const std::string &Name) override {
5426 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5427 .Case("z10", true)
5428 .Case("z196", true)
5429 .Case("zEC12", true)
5430 .Default(false);
5431
5432 // No need to store the CPU yet. There aren't any CPU-specific
5433 // macros to define.
5434 return CPUKnown;
5435 }
5436};
5437
5438const char *const SystemZTargetInfo::GCCRegNames[] = {
5439 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5440 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5441 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5442 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5443};
5444
5445void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5446 unsigned &NumNames) const {
5447 Names = GCCRegNames;
5448 NumNames = llvm::array_lengthof(GCCRegNames);
5449}
5450
5451bool SystemZTargetInfo::
5452validateAsmConstraint(const char *&Name,
5453 TargetInfo::ConstraintInfo &Info) const {
5454 switch (*Name) {
5455 default:
5456 return false;
5457
5458 case 'a': // Address register
5459 case 'd': // Data register (equivalent to 'r')
5460 case 'f': // Floating-point register
5461 Info.setAllowsRegister();
5462 return true;
5463
5464 case 'I': // Unsigned 8-bit constant
5465 case 'J': // Unsigned 12-bit constant
5466 case 'K': // Signed 16-bit constant
5467 case 'L': // Signed 20-bit displacement (on all targets we support)
5468 case 'M': // 0x7fffffff
5469 return true;
5470
5471 case 'Q': // Memory with base and unsigned 12-bit displacement
5472 case 'R': // Likewise, plus an index
5473 case 'S': // Memory with base and signed 20-bit displacement
5474 case 'T': // Likewise, plus an index
5475 Info.setAllowsMemory();
5476 return true;
5477 }
5478}
Ulrich Weigand47445072013-05-06 16:26:41 +00005479}
5480
5481namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005482 class MSP430TargetInfo : public TargetInfo {
5483 static const char * const GCCRegNames[];
5484 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005485 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005486 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005487 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005488 IntWidth = 16; IntAlign = 16;
5489 LongWidth = 32; LongLongWidth = 64;
5490 LongAlign = LongLongAlign = 16;
5491 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005492 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005493 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005494 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005495 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005496 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005497 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005498 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005499 }
5500 void getTargetDefines(const LangOptions &Opts,
5501 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005502 Builder.defineMacro("MSP430");
5503 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005504 // FIXME: defines for different 'flavours' of MCU
5505 }
Craig Topper3164f332014-03-11 03:39:26 +00005506 void getTargetBuiltins(const Builtin::Info *&Records,
5507 unsigned &NumRecords) const override {
5508 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005509 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005510 NumRecords = 0;
5511 }
Craig Topper3164f332014-03-11 03:39:26 +00005512 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005513 return Feature == "msp430";
5514 }
Craig Topper3164f332014-03-11 03:39:26 +00005515 void getGCCRegNames(const char * const *&Names,
5516 unsigned &NumNames) const override;
5517 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5518 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005519 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005520 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005521 NumAliases = 0;
5522 }
Eric Christopher917e9522014-11-18 22:36:15 +00005523 bool
5524 validateAsmConstraint(const char *&Name,
5525 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005526 // FIXME: implement
5527 switch (*Name) {
5528 case 'K': // the constant 1
5529 case 'L': // constant -1^20 .. 1^19
5530 case 'M': // constant 1-4:
5531 return true;
5532 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005533 // No target constraints for now.
5534 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005535 }
Craig Topper3164f332014-03-11 03:39:26 +00005536 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005537 // FIXME: Is this really right?
5538 return "";
5539 }
Craig Topper3164f332014-03-11 03:39:26 +00005540 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005541 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005542 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005543 }
5544 };
5545
5546 const char * const MSP430TargetInfo::GCCRegNames[] = {
5547 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5548 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5549 };
5550
5551 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5552 unsigned &NumNames) const {
5553 Names = GCCRegNames;
5554 NumNames = llvm::array_lengthof(GCCRegNames);
5555 }
5556}
5557
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005558namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005559
Mike Stump11289f42009-09-09 15:08:12 +00005560 // LLVM and Clang cannot be used directly to output native binaries for
5561 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005562 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005563 //
5564 // TCE uses the llvm bitcode as input and uses it for generating customized
5565 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005566 // publicly available in http://tce.cs.tut.fi
5567
Eli Friedman1f191002011-10-07 19:51:42 +00005568 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5569 3, // opencl_global
5570 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005571 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005572 // FIXME: generic has to be added to the target
5573 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005574 0, // cuda_device
5575 0, // cuda_constant
5576 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005577 };
5578
Eli Friedmana9c3d712009-08-19 20:47:07 +00005579 class TCETargetInfo : public TargetInfo{
5580 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005581 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005582 TLSSupported = false;
5583 IntWidth = 32;
5584 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005585 PointerWidth = 32;
5586 IntAlign = 32;
5587 LongAlign = LongLongAlign = 32;
5588 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005589 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005590 SizeType = UnsignedInt;
5591 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005592 IntPtrType = SignedInt;
5593 PtrDiffType = SignedInt;
5594 FloatWidth = 32;
5595 FloatAlign = 32;
5596 DoubleWidth = 32;
5597 DoubleAlign = 32;
5598 LongDoubleWidth = 32;
5599 LongDoubleAlign = 32;
5600 FloatFormat = &llvm::APFloat::IEEEsingle;
5601 DoubleFormat = &llvm::APFloat::IEEEsingle;
5602 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005603 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5604 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005605 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005606 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005607 }
5608
Craig Topper3164f332014-03-11 03:39:26 +00005609 void getTargetDefines(const LangOptions &Opts,
5610 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005611 DefineStd(Builder, "tce", Opts);
5612 Builder.defineMacro("__TCE__");
5613 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005614 }
Craig Topper3164f332014-03-11 03:39:26 +00005615 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005616 return Feature == "tce";
5617 }
Craig Topper3164f332014-03-11 03:39:26 +00005618
5619 void getTargetBuiltins(const Builtin::Info *&Records,
5620 unsigned &NumRecords) const override {}
5621 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005622 return "";
5623 }
Craig Topper3164f332014-03-11 03:39:26 +00005624 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005625 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005626 }
Craig Topper3164f332014-03-11 03:39:26 +00005627 void getGCCRegNames(const char * const *&Names,
5628 unsigned &NumNames) const override {}
5629 bool validateAsmConstraint(const char *&Name,
5630 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005631 return true;
5632 }
Craig Topper3164f332014-03-11 03:39:26 +00005633 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5634 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005635 };
5636}
5637
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005638namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005639class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005640 virtual void setDescriptionString() = 0;
5641
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005642 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005643 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005644 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005645 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005646 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005647 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005648 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005649 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005650 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005651 enum DspRevEnum {
5652 NoDSP, DSP1, DSP2
5653 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005654 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005655
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005656protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005657 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005658 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005659
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005660public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005661 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5662 const std::string &CPUStr)
5663 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005664 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005665 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5666 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5667 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005668
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005669 bool isNaN2008Default() const {
5670 return CPU == "mips32r6" || CPU == "mips64r6";
5671 }
5672
5673 bool isFP64Default() const {
5674 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5675 }
5676
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005677 bool isNan2008() const override {
5678 return IsNan2008;
5679 }
5680
Alp Toker4925ba72014-06-07 23:30:42 +00005681 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005682 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005683 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5684 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005685 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005686 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005687 .Case("mips1", IsMips32)
5688 .Case("mips2", IsMips32)
5689 .Case("mips3", true)
5690 .Case("mips4", true)
5691 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005692 .Case("mips32", IsMips32)
5693 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005694 .Case("mips32r3", IsMips32)
5695 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005696 .Case("mips32r6", IsMips32)
5697 .Case("mips64", true)
5698 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005699 .Case("mips64r3", true)
5700 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005701 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005702 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005703 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005704 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005705 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005706 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005707 if (CPU == "octeon")
5708 Features["mips64r2"] = Features["cnmips"] = true;
5709 else
5710 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005711 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005712
Craig Topper3164f332014-03-11 03:39:26 +00005713 void getTargetDefines(const LangOptions &Opts,
5714 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005715 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005716 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005717 if (Opts.GNUMode)
5718 Builder.defineMacro("mips");
5719
Simon Atanasyan683535b2012-08-29 19:14:58 +00005720 Builder.defineMacro("__REGISTER_PREFIX__", "");
5721
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005722 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005723 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005724 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005725 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005726 case SoftFloat:
5727 Builder.defineMacro("__mips_soft_float", Twine(1));
5728 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005729 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005730
Simon Atanasyan16071912013-04-14 14:07:30 +00005731 if (IsSingleFloat)
5732 Builder.defineMacro("__mips_single_float", Twine(1));
5733
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005734 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5735 Builder.defineMacro("_MIPS_FPSET",
5736 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5737
Simon Atanasyan72244b62012-07-05 16:06:06 +00005738 if (IsMips16)
5739 Builder.defineMacro("__mips16", Twine(1));
5740
Simon Atanasyan60777612013-04-14 14:07:51 +00005741 if (IsMicromips)
5742 Builder.defineMacro("__mips_micromips", Twine(1));
5743
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005744 if (IsNan2008)
5745 Builder.defineMacro("__mips_nan2008", Twine(1));
5746
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005747 switch (DspRev) {
5748 default:
5749 break;
5750 case DSP1:
5751 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5752 Builder.defineMacro("__mips_dsp", Twine(1));
5753 break;
5754 case DSP2:
5755 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5756 Builder.defineMacro("__mips_dspr2", Twine(1));
5757 Builder.defineMacro("__mips_dsp", Twine(1));
5758 break;
5759 }
5760
Jack Carter44ff1e52013-08-12 17:20:29 +00005761 if (HasMSA)
5762 Builder.defineMacro("__mips_msa", Twine(1));
5763
Simon Atanasyan26f19672012-04-05 19:28:31 +00005764 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5765 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5766 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005767
5768 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5769 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005770 }
5771
Craig Topper3164f332014-03-11 03:39:26 +00005772 void getTargetBuiltins(const Builtin::Info *&Records,
5773 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005774 Records = BuiltinInfo;
5775 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005776 }
Craig Topper3164f332014-03-11 03:39:26 +00005777 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005778 return llvm::StringSwitch<bool>(Feature)
5779 .Case("mips", true)
5780 .Case("fp64", HasFP64)
5781 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005782 }
Craig Topper3164f332014-03-11 03:39:26 +00005783 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005784 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005785 }
Craig Topper3164f332014-03-11 03:39:26 +00005786 void getGCCRegNames(const char * const *&Names,
5787 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005788 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005789 // CPU register names
5790 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005791 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5792 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5793 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005794 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5795 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005796 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5797 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5798 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5799 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005800 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005801 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005802 "$fcc5","$fcc6","$fcc7",
5803 // MSA register names
5804 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5805 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5806 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5807 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5808 // MSA control register names
5809 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5810 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005811 };
5812 Names = GCCRegNames;
5813 NumNames = llvm::array_lengthof(GCCRegNames);
5814 }
Craig Topper3164f332014-03-11 03:39:26 +00005815 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5816 unsigned &NumAliases) const override = 0;
5817 bool validateAsmConstraint(const char *&Name,
5818 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005819 switch (*Name) {
5820 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005821 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005822 case 'r': // CPU registers.
5823 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005824 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005825 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005826 case 'c': // $25 for indirect jumps
5827 case 'l': // lo register
5828 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005829 Info.setAllowsRegister();
5830 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005831 case 'I': // Signed 16-bit constant
5832 case 'J': // Integer 0
5833 case 'K': // Unsigned 16-bit constant
5834 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5835 case 'M': // Constants not loadable via lui, addiu, or ori
5836 case 'N': // Constant -1 to -65535
5837 case 'O': // A signed 15-bit constant
5838 case 'P': // A constant between 1 go 65535
5839 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005840 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005841 Info.setAllowsMemory();
5842 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005843 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005844 }
5845
Craig Topper3164f332014-03-11 03:39:26 +00005846 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005847 // In GCC, $1 is not widely used in generated code (it's used only in a few
5848 // specific situations), so there is no real need for users to add it to
5849 // the clobbers list if they want to use it in their inline assembly code.
5850 //
5851 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5852 // code generation, so using it in inline assembly without adding it to the
5853 // clobbers list can cause conflicts between the inline assembly code and
5854 // the surrounding generated code.
5855 //
5856 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5857 // operands, which will conflict with the ".set at" assembler option (which
5858 // we use only for inline assembly, in order to maintain compatibility with
5859 // GCC) and will also conflict with the user's usage of $1.
5860 //
5861 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5862 // register for generated code is to automatically clobber $1 for all inline
5863 // assembly code.
5864 //
5865 // FIXME: We should automatically clobber $1 only for inline assembly code
5866 // which actually uses it. This would allow LLVM to use $1 for inline
5867 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005868 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005869 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005870
Craig Topper3164f332014-03-11 03:39:26 +00005871 bool handleTargetFeatures(std::vector<std::string> &Features,
5872 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005873 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005874 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005875 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005876 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005877 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005878 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005879 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005880
5881 for (std::vector<std::string>::iterator it = Features.begin(),
5882 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005883 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005884 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005885 else if (*it == "+soft-float")
5886 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005887 else if (*it == "+mips16")
5888 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005889 else if (*it == "+micromips")
5890 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005891 else if (*it == "+dsp")
5892 DspRev = std::max(DspRev, DSP1);
5893 else if (*it == "+dspr2")
5894 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005895 else if (*it == "+msa")
5896 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005897 else if (*it == "+fp64")
5898 HasFP64 = true;
5899 else if (*it == "-fp64")
5900 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005901 else if (*it == "+nan2008")
5902 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005903 else if (*it == "-nan2008")
5904 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005905 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005906
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005907 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005908 std::vector<std::string>::iterator it =
5909 std::find(Features.begin(), Features.end(), "+soft-float");
5910 if (it != Features.end())
5911 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005912
Akira Hatanaka9064e362013-10-29 18:30:33 +00005913 setDescriptionString();
5914
Rafael Espindolaeb265472013-08-21 21:59:03 +00005915 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005916 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005917
Craig Topper3164f332014-03-11 03:39:26 +00005918 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005919 if (RegNo == 0) return 4;
5920 if (RegNo == 1) return 5;
5921 return -1;
5922 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005923
5924 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005925};
5926
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005927const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5928#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5929#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5930 ALL_LANGUAGES },
5931#include "clang/Basic/BuiltinsMips.def"
5932};
5933
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005934class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005935public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005936 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005937 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005938 SizeType = UnsignedInt;
5939 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00005940 Int64Type = SignedLongLong;
5941 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005942 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005943 }
Craig Topper3164f332014-03-11 03:39:26 +00005944 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005945 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005946 ABI = Name;
5947 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005948 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005949 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005950 }
Craig Topper3164f332014-03-11 03:39:26 +00005951 void getTargetDefines(const LangOptions &Opts,
5952 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005953 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005954
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005955 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005956 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5957
5958 const std::string& CPUStr = getCPU();
5959 if (CPUStr == "mips32")
5960 Builder.defineMacro("__mips_isa_rev", "1");
5961 else if (CPUStr == "mips32r2")
5962 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00005963 else if (CPUStr == "mips32r3")
5964 Builder.defineMacro("__mips_isa_rev", "3");
5965 else if (CPUStr == "mips32r5")
5966 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00005967 else if (CPUStr == "mips32r6")
5968 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005969
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005970 if (ABI == "o32") {
5971 Builder.defineMacro("__mips_o32");
5972 Builder.defineMacro("_ABIO32", "1");
5973 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5974 }
5975 else if (ABI == "eabi")
5976 Builder.defineMacro("__mips_eabi");
5977 else
David Blaikie83d382b2011-09-23 05:06:16 +00005978 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005979 }
Craig Topper3164f332014-03-11 03:39:26 +00005980 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5981 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005982 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5983 { { "at" }, "$1" },
5984 { { "v0" }, "$2" },
5985 { { "v1" }, "$3" },
5986 { { "a0" }, "$4" },
5987 { { "a1" }, "$5" },
5988 { { "a2" }, "$6" },
5989 { { "a3" }, "$7" },
5990 { { "t0" }, "$8" },
5991 { { "t1" }, "$9" },
5992 { { "t2" }, "$10" },
5993 { { "t3" }, "$11" },
5994 { { "t4" }, "$12" },
5995 { { "t5" }, "$13" },
5996 { { "t6" }, "$14" },
5997 { { "t7" }, "$15" },
5998 { { "s0" }, "$16" },
5999 { { "s1" }, "$17" },
6000 { { "s2" }, "$18" },
6001 { { "s3" }, "$19" },
6002 { { "s4" }, "$20" },
6003 { { "s5" }, "$21" },
6004 { { "s6" }, "$22" },
6005 { { "s7" }, "$23" },
6006 { { "t8" }, "$24" },
6007 { { "t9" }, "$25" },
6008 { { "k0" }, "$26" },
6009 { { "k1" }, "$27" },
6010 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006011 { { "sp","$sp" }, "$29" },
6012 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006013 { { "ra" }, "$31" }
6014 };
6015 Aliases = GCCRegAliases;
6016 NumAliases = llvm::array_lengthof(GCCRegAliases);
6017 }
6018};
6019
6020class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006021 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006022 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006023 }
6024
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006025public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006026 Mips32EBTargetInfo(const llvm::Triple &Triple)
6027 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006028 }
Craig Topper3164f332014-03-11 03:39:26 +00006029 void getTargetDefines(const LangOptions &Opts,
6030 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006031 DefineStd(Builder, "MIPSEB", Opts);
6032 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006033 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006034 }
6035};
6036
6037class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006038 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006039 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006040 }
6041
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006042public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006043 Mips32ELTargetInfo(const llvm::Triple &Triple)
6044 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006045 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006046 }
Craig Topper3164f332014-03-11 03:39:26 +00006047 void getTargetDefines(const LangOptions &Opts,
6048 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006049 DefineStd(Builder, "MIPSEL", Opts);
6050 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006051 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006052 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006053};
Akira Hatanakabef17452011-09-20 19:21:49 +00006054
6055class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006056public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006057 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006058 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006059 LongDoubleWidth = LongDoubleAlign = 128;
6060 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006061 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6062 LongDoubleWidth = LongDoubleAlign = 64;
6063 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6064 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006065 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006066 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006067 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006068 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006069
6070 void setN64ABITypes() {
6071 LongWidth = LongAlign = 64;
6072 PointerWidth = PointerAlign = 64;
6073 SizeType = UnsignedLong;
6074 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006075 Int64Type = SignedLong;
6076 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006077 }
6078
6079 void setN32ABITypes() {
6080 LongWidth = LongAlign = 32;
6081 PointerWidth = PointerAlign = 32;
6082 SizeType = UnsignedInt;
6083 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006084 Int64Type = SignedLongLong;
6085 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006086 }
6087
Craig Topper3164f332014-03-11 03:39:26 +00006088 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006089 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006090 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006091 ABI = Name;
6092 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006093 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006094 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006095 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006096 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006097 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006098 }
6099 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006100 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006101
Craig Topper3164f332014-03-11 03:39:26 +00006102 void getTargetDefines(const LangOptions &Opts,
6103 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006104 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006105
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006106 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006107 Builder.defineMacro("__mips64");
6108 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006109 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6110
6111 const std::string& CPUStr = getCPU();
6112 if (CPUStr == "mips64")
6113 Builder.defineMacro("__mips_isa_rev", "1");
6114 else if (CPUStr == "mips64r2")
6115 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006116 else if (CPUStr == "mips64r3")
6117 Builder.defineMacro("__mips_isa_rev", "3");
6118 else if (CPUStr == "mips64r5")
6119 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006120 else if (CPUStr == "mips64r6")
6121 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006122
Akira Hatanakabef17452011-09-20 19:21:49 +00006123 if (ABI == "n32") {
6124 Builder.defineMacro("__mips_n32");
6125 Builder.defineMacro("_ABIN32", "2");
6126 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6127 }
6128 else if (ABI == "n64") {
6129 Builder.defineMacro("__mips_n64");
6130 Builder.defineMacro("_ABI64", "3");
6131 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6132 }
6133 else
David Blaikie83d382b2011-09-23 05:06:16 +00006134 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006135 }
Craig Topper3164f332014-03-11 03:39:26 +00006136 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6137 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006138 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6139 { { "at" }, "$1" },
6140 { { "v0" }, "$2" },
6141 { { "v1" }, "$3" },
6142 { { "a0" }, "$4" },
6143 { { "a1" }, "$5" },
6144 { { "a2" }, "$6" },
6145 { { "a3" }, "$7" },
6146 { { "a4" }, "$8" },
6147 { { "a5" }, "$9" },
6148 { { "a6" }, "$10" },
6149 { { "a7" }, "$11" },
6150 { { "t0" }, "$12" },
6151 { { "t1" }, "$13" },
6152 { { "t2" }, "$14" },
6153 { { "t3" }, "$15" },
6154 { { "s0" }, "$16" },
6155 { { "s1" }, "$17" },
6156 { { "s2" }, "$18" },
6157 { { "s3" }, "$19" },
6158 { { "s4" }, "$20" },
6159 { { "s5" }, "$21" },
6160 { { "s6" }, "$22" },
6161 { { "s7" }, "$23" },
6162 { { "t8" }, "$24" },
6163 { { "t9" }, "$25" },
6164 { { "k0" }, "$26" },
6165 { { "k1" }, "$27" },
6166 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006167 { { "sp","$sp" }, "$29" },
6168 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006169 { { "ra" }, "$31" }
6170 };
6171 Aliases = GCCRegAliases;
6172 NumAliases = llvm::array_lengthof(GCCRegAliases);
6173 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006174
6175 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006176};
6177
6178class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006179 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006180 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006181 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 +00006182 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006183 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006184
Akira Hatanakabef17452011-09-20 19:21:49 +00006185 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006186
Akira Hatanakabef17452011-09-20 19:21:49 +00006187public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006188 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006189 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006190 void getTargetDefines(const LangOptions &Opts,
6191 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006192 DefineStd(Builder, "MIPSEB", Opts);
6193 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006194 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006195 }
6196};
6197
6198class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006199 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006200 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006201 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 +00006202 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006203 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006204 }
6205public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006206 Mips64ELTargetInfo(const llvm::Triple &Triple)
6207 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006208 // Default ABI is n64.
6209 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006210 }
Craig Topper3164f332014-03-11 03:39:26 +00006211 void getTargetDefines(const LangOptions &Opts,
6212 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006213 DefineStd(Builder, "MIPSEL", Opts);
6214 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006215 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006216 }
6217};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006218} // end anonymous namespace.
6219
Ivan Krasindd7403e2011-08-24 20:22:22 +00006220namespace {
6221class PNaClTargetInfo : public TargetInfo {
6222public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006223 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006224 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006225 this->UserLabelPrefix = "";
6226 this->LongAlign = 32;
6227 this->LongWidth = 32;
6228 this->PointerAlign = 32;
6229 this->PointerWidth = 32;
6230 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006231 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006232 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006233 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006234 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006235 this->SizeType = TargetInfo::UnsignedInt;
6236 this->PtrDiffType = TargetInfo::SignedInt;
6237 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006238 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006239 }
6240
Craig Topper3164f332014-03-11 03:39:26 +00006241 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006242 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006243 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006244 Builder.defineMacro("__le32__");
6245 Builder.defineMacro("__pnacl__");
6246 }
Craig Topper3164f332014-03-11 03:39:26 +00006247 void getTargetDefines(const LangOptions &Opts,
6248 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006249 getArchDefines(Opts, Builder);
6250 }
Craig Topper3164f332014-03-11 03:39:26 +00006251 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006252 return Feature == "pnacl";
6253 }
Craig Topper3164f332014-03-11 03:39:26 +00006254 void getTargetBuiltins(const Builtin::Info *&Records,
6255 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006256 }
Craig Topper3164f332014-03-11 03:39:26 +00006257 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006258 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006259 }
Craig Topper3164f332014-03-11 03:39:26 +00006260 void getGCCRegNames(const char * const *&Names,
6261 unsigned &NumNames) const override;
6262 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6263 unsigned &NumAliases) const override;
6264 bool validateAsmConstraint(const char *&Name,
6265 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006266 return false;
6267 }
6268
Craig Topper3164f332014-03-11 03:39:26 +00006269 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006270 return "";
6271 }
6272};
6273
6274void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6275 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006276 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006277 NumNames = 0;
6278}
6279
6280void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6281 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006282 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006283 NumAliases = 0;
6284}
6285} // end anonymous namespace.
6286
Guy Benyeib798fc92012-12-11 21:38:14 +00006287namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006288class Le64TargetInfo : public TargetInfo {
6289 static const Builtin::Info BuiltinInfo[];
6290
6291public:
6292 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6293 BigEndian = false;
6294 NoAsmVariants = true;
6295 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6296 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6297 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006298 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006299 }
6300
6301 void getTargetDefines(const LangOptions &Opts,
6302 MacroBuilder &Builder) const override {
6303 DefineStd(Builder, "unix", Opts);
6304 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6305 Builder.defineMacro("__ELF__");
6306 }
6307 void getTargetBuiltins(const Builtin::Info *&Records,
6308 unsigned &NumRecords) const override {
6309 Records = BuiltinInfo;
6310 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6311 }
6312 BuiltinVaListKind getBuiltinVaListKind() const override {
6313 return TargetInfo::PNaClABIBuiltinVaList;
6314 }
6315 const char *getClobbers() const override { return ""; }
6316 void getGCCRegNames(const char *const *&Names,
6317 unsigned &NumNames) const override {
6318 Names = nullptr;
6319 NumNames = 0;
6320 }
6321 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6322 unsigned &NumAliases) const override {
6323 Aliases = nullptr;
6324 NumAliases = 0;
6325 }
6326 bool validateAsmConstraint(const char *&Name,
6327 TargetInfo::ConstraintInfo &Info) const override {
6328 return false;
6329 }
6330
6331 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006332};
6333} // end anonymous namespace.
6334
6335const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6336#define BUILTIN(ID, TYPE, ATTRS) \
6337 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6338#include "clang/Basic/BuiltinsLe64.def"
6339};
6340
6341namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006342 static const unsigned SPIRAddrSpaceMap[] = {
6343 1, // opencl_global
6344 3, // opencl_local
6345 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006346 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006347 0, // cuda_device
6348 0, // cuda_constant
6349 0 // cuda_shared
6350 };
6351 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006352 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006353 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006354 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6355 "SPIR target must use unknown OS");
6356 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6357 "SPIR target must use unknown environment type");
6358 BigEndian = false;
6359 TLSSupported = false;
6360 LongWidth = LongAlign = 64;
6361 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006362 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006363 // Define available target features
6364 // These must be defined in sorted order!
6365 NoAsmVariants = true;
6366 }
Craig Topper3164f332014-03-11 03:39:26 +00006367 void getTargetDefines(const LangOptions &Opts,
6368 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006369 DefineStd(Builder, "SPIR", Opts);
6370 }
Craig Topper3164f332014-03-11 03:39:26 +00006371 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006372 return Feature == "spir";
6373 }
Craig Topper3164f332014-03-11 03:39:26 +00006374
6375 void getTargetBuiltins(const Builtin::Info *&Records,
6376 unsigned &NumRecords) const override {}
6377 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006378 return "";
6379 }
Craig Topper3164f332014-03-11 03:39:26 +00006380 void getGCCRegNames(const char * const *&Names,
6381 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006382 bool
6383 validateAsmConstraint(const char *&Name,
6384 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006385 return true;
6386 }
Craig Topper3164f332014-03-11 03:39:26 +00006387 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6388 unsigned &NumAliases) const override {}
6389 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006390 return TargetInfo::VoidPtrBuiltinVaList;
6391 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006392
6393 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6394 return (CC == CC_SpirFunction ||
6395 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6396 }
6397
6398 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6399 return CC_SpirFunction;
6400 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006401 };
6402
6403
6404 class SPIR32TargetInfo : public SPIRTargetInfo {
6405 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006406 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006407 PointerWidth = PointerAlign = 32;
6408 SizeType = TargetInfo::UnsignedInt;
6409 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6410 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006411 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6412 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006413 }
Craig Topper3164f332014-03-11 03:39:26 +00006414 void getTargetDefines(const LangOptions &Opts,
6415 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006416 DefineStd(Builder, "SPIR32", Opts);
6417 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006418 };
6419
6420 class SPIR64TargetInfo : public SPIRTargetInfo {
6421 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006422 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006423 PointerWidth = PointerAlign = 64;
6424 SizeType = TargetInfo::UnsignedLong;
6425 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006426 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6427 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006428 }
Craig Topper3164f332014-03-11 03:39:26 +00006429 void getTargetDefines(const LangOptions &Opts,
6430 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006431 DefineStd(Builder, "SPIR64", Opts);
6432 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006433 };
6434}
6435
Robert Lytton0e076492013-08-13 09:43:10 +00006436namespace {
6437class XCoreTargetInfo : public TargetInfo {
6438 static const Builtin::Info BuiltinInfo[];
6439public:
6440 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6441 BigEndian = false;
6442 NoAsmVariants = true;
6443 LongLongAlign = 32;
6444 SuitableAlign = 32;
6445 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006446 SizeType = UnsignedInt;
6447 PtrDiffType = SignedInt;
6448 IntPtrType = SignedInt;
6449 WCharType = UnsignedChar;
6450 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006451 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006452 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 +00006453 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006454 }
Craig Topper3164f332014-03-11 03:39:26 +00006455 void getTargetDefines(const LangOptions &Opts,
6456 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006457 Builder.defineMacro("__XS1B__");
6458 }
Craig Topper3164f332014-03-11 03:39:26 +00006459 void getTargetBuiltins(const Builtin::Info *&Records,
6460 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006461 Records = BuiltinInfo;
6462 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6463 }
Craig Topper3164f332014-03-11 03:39:26 +00006464 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006465 return TargetInfo::VoidPtrBuiltinVaList;
6466 }
Craig Topper3164f332014-03-11 03:39:26 +00006467 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006468 return "";
6469 }
Craig Topper3164f332014-03-11 03:39:26 +00006470 void getGCCRegNames(const char * const *&Names,
6471 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006472 static const char * const GCCRegNames[] = {
6473 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6474 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6475 };
6476 Names = GCCRegNames;
6477 NumNames = llvm::array_lengthof(GCCRegNames);
6478 }
Craig Topper3164f332014-03-11 03:39:26 +00006479 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6480 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006481 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006482 NumAliases = 0;
6483 }
Craig Topper3164f332014-03-11 03:39:26 +00006484 bool validateAsmConstraint(const char *&Name,
6485 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006486 return false;
6487 }
Craig Topper3164f332014-03-11 03:39:26 +00006488 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006489 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6490 return (RegNo < 2)? RegNo : -1;
6491 }
Robert Lytton0e076492013-08-13 09:43:10 +00006492};
6493
6494const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6495#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6496#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6497 ALL_LANGUAGES },
6498#include "clang/Basic/BuiltinsXCore.def"
6499};
6500} // end anonymous namespace.
6501
Ivan Krasindd7403e2011-08-24 20:22:22 +00006502
Chris Lattner5ba61f02006-10-14 07:39:34 +00006503//===----------------------------------------------------------------------===//
6504// Driver code
6505//===----------------------------------------------------------------------===//
6506
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006507static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006508 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006509
Daniel Dunbar52322032009-08-18 05:47:58 +00006510 switch (Triple.getArch()) {
6511 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006512 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006513
Tim Northover2a0783d2014-05-30 14:14:07 +00006514 case llvm::Triple::xcore:
6515 return new XCoreTargetInfo(Triple);
6516
6517 case llvm::Triple::hexagon:
6518 return new HexagonTargetInfo(Triple);
6519
6520 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006521 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006522 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006523
6524 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006525 case llvm::Triple::FreeBSD:
6526 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006527 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006528 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006529 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006530 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006531 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006532 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006533 }
6534
Christian Pirker9b019ae2014-02-25 13:51:00 +00006535 case llvm::Triple::aarch64_be:
6536 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006537 case llvm::Triple::FreeBSD:
6538 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006539 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006540 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006541 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006542 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006543 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006544 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006545 }
6546
Daniel Dunbar52322032009-08-18 05:47:58 +00006547 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006548 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006549 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006550 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006551
Daniel Dunbar52322032009-08-18 05:47:58 +00006552 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006553 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006554 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006555 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006556 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006557 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006558 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006559 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006560 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006561 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006562 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006563 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006564 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006565 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006566 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006567 case llvm::Triple::Win32:
6568 switch (Triple.getEnvironment()) {
6569 default:
6570 return new ARMleTargetInfo(Triple);
6571 case llvm::Triple::Itanium:
6572 return new ItaniumWindowsARMleTargetInfo(Triple);
6573 case llvm::Triple::MSVC:
6574 return new MicrosoftARMleTargetInfo(Triple);
6575 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006576 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006577 return new ARMleTargetInfo(Triple);
6578 }
6579
6580 case llvm::Triple::armeb:
6581 case llvm::Triple::thumbeb:
6582 if (Triple.isOSDarwin())
6583 return new DarwinARMTargetInfo(Triple);
6584
6585 switch (os) {
6586 case llvm::Triple::Linux:
6587 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6588 case llvm::Triple::FreeBSD:
6589 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6590 case llvm::Triple::NetBSD:
6591 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6592 case llvm::Triple::OpenBSD:
6593 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6594 case llvm::Triple::Bitrig:
6595 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6596 case llvm::Triple::RTEMS:
6597 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6598 case llvm::Triple::NaCl:
6599 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6600 default:
6601 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006602 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006603
Daniel Dunbar52322032009-08-18 05:47:58 +00006604 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006605 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006606
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006607 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006608 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006609 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006610 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006611 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006612 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006613 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006614 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006615 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006616 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006617 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006618 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006619 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006620
6621 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006622 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006623 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006624 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006625 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006626 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006627 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006628 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006629 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006630 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006631 case llvm::Triple::NaCl:
6632 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006633 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006634 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006635 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006636
Akira Hatanakabef17452011-09-20 19:21:49 +00006637 case llvm::Triple::mips64:
6638 switch (os) {
6639 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006640 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006641 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006642 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006643 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006644 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006645 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006646 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006647 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006648 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006649 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006650 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006651 }
6652
6653 case llvm::Triple::mips64el:
6654 switch (os) {
6655 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006656 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006657 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006658 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006659 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006660 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006661 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006662 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006663 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006664 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006665 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006666 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006667 }
6668
Ivan Krasindd7403e2011-08-24 20:22:22 +00006669 case llvm::Triple::le32:
6670 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006671 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006672 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006673 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006674 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006675 }
6676
JF Bastien643817d2014-09-12 17:52:47 +00006677 case llvm::Triple::le64:
6678 return new Le64TargetInfo(Triple);
6679
Daniel Dunbar52322032009-08-18 05:47:58 +00006680 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006681 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006682 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006683 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006684 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006685 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006686 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006687 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006688 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006689 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006690 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006691 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006692 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006693 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006694 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006695 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006696 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006697
6698 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006699 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006700 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006701 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006702 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006703 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006704 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006705 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006706 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006707 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006708 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006709 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006710 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006711 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006712 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006713
Bill Schmidt778d3872013-07-26 01:36:11 +00006714 case llvm::Triple::ppc64le:
6715 switch (os) {
6716 case llvm::Triple::Linux:
6717 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6718 default:
6719 return new PPC64TargetInfo(Triple);
6720 }
6721
Peter Collingbournec947aae2012-05-20 23:28:41 +00006722 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006723 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006724 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006725 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006726
Tom Stellardd8e38a32015-01-06 20:34:47 +00006727 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006728 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006729 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006730
Daniel Dunbar52322032009-08-18 05:47:58 +00006731 case llvm::Triple::sparc:
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<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006735 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006736 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006737 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006738 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006739 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006740 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006741 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006742 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006743 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006744 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006745 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006746
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006747 case llvm::Triple::sparcv9:
6748 switch (os) {
6749 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006750 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006751 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006752 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006753 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006754 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006755 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006756 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006757 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006758 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006759 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006760 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006761 }
6762
Ulrich Weigand47445072013-05-06 16:26:41 +00006763 case llvm::Triple::systemz:
6764 switch (os) {
6765 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006766 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006767 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006768 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006769 }
6770
Eli Friedmana9c3d712009-08-19 20:47:07 +00006771 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006772 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006773
Daniel Dunbar52322032009-08-18 05:47:58 +00006774 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006775 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006776 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006777
Daniel Dunbar52322032009-08-18 05:47:58 +00006778 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006779 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006780 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006781 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006782 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006783 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006784 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006785 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006786 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006787 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006788 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006789 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006790 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006791 case llvm::Triple::KFreeBSD:
6792 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006793 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006794 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006795 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006796 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006797 case llvm::Triple::Win32: {
6798 switch (Triple.getEnvironment()) {
6799 default:
6800 return new X86_32TargetInfo(Triple);
6801 case llvm::Triple::Cygnus:
6802 return new CygwinX86_32TargetInfo(Triple);
6803 case llvm::Triple::GNU:
6804 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006805 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006806 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006807 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006808 }
6809 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006810 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006811 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006812 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006813 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006814 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006815 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006816 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006817 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006818 }
6819
6820 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006821 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006822 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006823
Daniel Dunbar52322032009-08-18 05:47:58 +00006824 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006825 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006826 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006827 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006828 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006829 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006830 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006831 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006832 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006833 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006834 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006835 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006836 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006837 case llvm::Triple::KFreeBSD:
6838 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006839 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006840 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006841 case llvm::Triple::Win32: {
6842 switch (Triple.getEnvironment()) {
6843 default:
6844 return new X86_64TargetInfo(Triple);
6845 case llvm::Triple::GNU:
6846 return new MinGWX86_64TargetInfo(Triple);
6847 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006848 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006849 }
6850 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006851 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006852 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006853 case llvm::Triple::PS4:
6854 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006855 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006856 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006857 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006858
6859 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006860 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006861 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006862 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006863 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006864 }
6865 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006866 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006867 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006868 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006869 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006870 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006871 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006872}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006873
6874/// CreateTargetInfo - Return the target info object for the specified target
6875/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006876TargetInfo *
6877TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6878 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006879 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006880
6881 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006882 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006883 if (!Target) {
6884 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006885 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006886 }
Alp Toker80758082014-07-06 05:26:44 +00006887 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006888
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006889 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006890 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6891 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006892 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006893 }
6894
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006895 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006896 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6897 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006898 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006899 }
6900
Rafael Espindolaeb265472013-08-21 21:59:03 +00006901 // Set the fp math unit.
6902 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6903 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006904 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006905 }
6906
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006907 // Compute the default target features, we need the target to handle this
6908 // because features may have dependencies on one another.
6909 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006910 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006911
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006912 // Apply the user specified deltas.
6913 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6914 I < N; ++I) {
6915 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006916 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006917 bool Enabled = Name[0] == '+';
6918 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006919 }
6920
6921 // Add the features to the compile options.
6922 //
6923 // FIXME: If we are completely confident that we have the right set, we only
6924 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006925 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006926 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6927 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006928 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006929 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006930 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006931
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006932 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006933}