blob: 24b415d193ba6f2bee58c0d7ec9c843cf62ac724 [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"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000024#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000025#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000026#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000027#include "llvm/IR/Type.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.
Will Dietzf54319c2013-01-18 11:30:38 +000096 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000097
John McCall5d36a8c2011-06-16 00:03:19 +000098 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +000099 // __weak is always defined, for use in blocks and with objc pointers.
100 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000101
John McCall31168b02011-06-15 23:02:42 +0000102 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000103 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000104 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
105 else
106 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000107
John McCall31168b02011-06-15 23:02:42 +0000108 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
109 // allow this in C, since one might have block pointers in structs that
110 // are used in pure C code and in Objective-C ARC.
111 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000112 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000113
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000114 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000118
119 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000121
Daniel Dunbarecf13562011-04-19 21:40:34 +0000122 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000124 if (Triple.isMacOSX()) {
125 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000126 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000128 Triple.getOSVersion(Maj, Min, Rev);
129 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000130 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000131
Sebastian Pop422377c2012-01-20 22:01:23 +0000132 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000133 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000134 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
135 if (PlatformName == "win32") {
136 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
137 return;
138 }
139
Evan Cheng31dd9a62014-01-26 23:12:43 +0000140 // Set the appropriate OS version define.
141 if (Triple.isiOS()) {
142 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
143 char Str[6];
144 Str[0] = '0' + Maj;
145 Str[1] = '0' + (Min / 10);
146 Str[2] = '0' + (Min % 10);
147 Str[3] = '0' + (Rev / 10);
148 Str[4] = '0' + (Rev % 10);
149 Str[5] = '\0';
150 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
151 Str);
152 } else if (Triple.isMacOSX()) {
153 // Note that the Driver allows versions which aren't representable in the
154 // define (because we only get a single digit for the minor and micro
155 // revision numbers). So, we limit them to the maximum representable
156 // version.
157 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000158 char Str[7];
159 if (Maj < 10 || (Maj == 10 && Min < 10)) {
160 Str[0] = '0' + (Maj / 10);
161 Str[1] = '0' + (Maj % 10);
162 Str[2] = '0' + std::min(Min, 9U);
163 Str[3] = '0' + std::min(Rev, 9U);
164 Str[4] = '\0';
165 } else {
166 // Handle versions > 10.9.
167 Str[0] = '0' + (Maj / 10);
168 Str[1] = '0' + (Maj % 10);
169 Str[2] = '0' + (Min / 10);
170 Str[3] = '0' + (Min % 10);
171 Str[4] = '0' + (Rev / 10);
172 Str[5] = '0' + (Rev % 10);
173 Str[6] = '\0';
174 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000175 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000176 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000177
Tim Northover157d9112014-01-16 08:48:16 +0000178 // Tell users about the kernel if there is one.
179 if (Triple.isOSDarwin())
180 Builder.defineMacro("__MACH__");
181
Daniel Dunbarecf13562011-04-19 21:40:34 +0000182 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000183}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000184
Chris Lattner30ba6742009-08-10 19:03:04 +0000185namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000186template<typename Target>
187class DarwinTargetInfo : public OSTargetInfo<Target> {
188protected:
Craig Topper3164f332014-03-11 03:39:26 +0000189 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
190 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000191 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000192 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000193 }
Mike Stump11289f42009-09-09 15:08:12 +0000194
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000196 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
197 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
198 this->MCountName = "\01mcount";
199 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000200
Craig Topper3164f332014-03-11 03:39:26 +0000201 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000202 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000203 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000204 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000205 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000206 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000207 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000208 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000209
Craig Topper3164f332014-03-11 03:39:26 +0000210 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000211 // FIXME: We should return 0 when building kexts.
212 return "__TEXT,__StaticInit,regular,pure_instructions";
213 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000214
John McCalleed64c72012-01-29 01:20:30 +0000215 /// Darwin does not support protected visibility. Darwin's "default"
216 /// is very similar to ELF's "protected"; Darwin requires a "weak"
217 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000218 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000219 return false;
220 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221};
222
Chris Lattner30ba6742009-08-10 19:03:04 +0000223
Torok Edwinb2b37c62009-06-30 17:10:35 +0000224// DragonFlyBSD Target
225template<typename Target>
226class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
227protected:
Craig Topper3164f332014-03-11 03:39:26 +0000228 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
229 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000231 Builder.defineMacro("__DragonFly__");
232 Builder.defineMacro("__DragonFly_cc_version", "100001");
233 Builder.defineMacro("__ELF__");
234 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
235 Builder.defineMacro("__tune_i386__");
236 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000237 }
238public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000239 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
240 : OSTargetInfo<Target>(Triple) {
241 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000242
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000243 switch (Triple.getArch()) {
244 default:
245 case llvm::Triple::x86:
246 case llvm::Triple::x86_64:
247 this->MCountName = ".mcount";
248 break;
249 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000250 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000251};
252
253// FreeBSD Target
254template<typename Target>
255class FreeBSDTargetInfo : public OSTargetInfo<Target> {
256protected:
Craig Topper3164f332014-03-11 03:39:26 +0000257 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
258 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000259 // FreeBSD defines; list based off of gcc output
260
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000261 unsigned Release = Triple.getOSMajorVersion();
262 if (Release == 0U)
263 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000264
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000265 Builder.defineMacro("__FreeBSD__", Twine(Release));
266 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000267 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
268 DefineStd(Builder, "unix", Opts);
269 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000270
271 // On FreeBSD, wchar_t contains the number of the code point as
272 // used by the character set of the locale. These character sets are
273 // not necessarily a superset of ASCII.
274 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000275 }
276public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000277 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
278 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000279
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000280 switch (Triple.getArch()) {
281 default:
282 case llvm::Triple::x86:
283 case llvm::Triple::x86_64:
284 this->MCountName = ".mcount";
285 break;
286 case llvm::Triple::mips:
287 case llvm::Triple::mipsel:
288 case llvm::Triple::ppc:
289 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000290 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000291 this->MCountName = "_mcount";
292 break;
293 case llvm::Triple::arm:
294 this->MCountName = "__mcount";
295 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000296 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000297 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000298};
299
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000300// GNU/kFreeBSD Target
301template<typename Target>
302class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
303protected:
Craig Topper3164f332014-03-11 03:39:26 +0000304 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
305 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000306 // GNU/kFreeBSD defines; list based off of gcc output
307
308 DefineStd(Builder, "unix", Opts);
309 Builder.defineMacro("__FreeBSD_kernel__");
310 Builder.defineMacro("__GLIBC__");
311 Builder.defineMacro("__ELF__");
312 if (Opts.POSIXThreads)
313 Builder.defineMacro("_REENTRANT");
314 if (Opts.CPlusPlus)
315 Builder.defineMacro("_GNU_SOURCE");
316 }
317public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000318 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000319 this->UserLabelPrefix = "";
320 }
321};
322
Chris Lattner3e2ee142010-07-07 16:01:42 +0000323// Minix Target
324template<typename Target>
325class MinixTargetInfo : public OSTargetInfo<Target> {
326protected:
Craig Topper3164f332014-03-11 03:39:26 +0000327 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
328 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000329 // Minix defines
330
331 Builder.defineMacro("__minix", "3");
332 Builder.defineMacro("_EM_WSIZE", "4");
333 Builder.defineMacro("_EM_PSIZE", "4");
334 Builder.defineMacro("_EM_SSIZE", "2");
335 Builder.defineMacro("_EM_LSIZE", "4");
336 Builder.defineMacro("_EM_FSIZE", "4");
337 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000338 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000339 DefineStd(Builder, "unix", Opts);
340 }
341public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000342 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
343 this->UserLabelPrefix = "";
344 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000345};
346
Torok Edwinb2b37c62009-06-30 17:10:35 +0000347// Linux target
348template<typename Target>
349class LinuxTargetInfo : public OSTargetInfo<Target> {
350protected:
Craig Topper3164f332014-03-11 03:39:26 +0000351 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
352 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000353 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000354 DefineStd(Builder, "unix", Opts);
355 DefineStd(Builder, "linux", Opts);
356 Builder.defineMacro("__gnu_linux__");
357 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000358 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000359 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000360 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000361 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000362 if (Opts.CPlusPlus)
363 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000364 }
365public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000366 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000367 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000368 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000369
370 switch (Triple.getArch()) {
371 default:
372 break;
373 case llvm::Triple::ppc:
374 case llvm::Triple::ppc64:
375 case llvm::Triple::ppc64le:
376 this->MCountName = "_mcount";
377 break;
378 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000379 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000380
Craig Topper3164f332014-03-11 03:39:26 +0000381 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000382 return ".text.startup";
383 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000384};
385
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000386// NetBSD Target
387template<typename Target>
388class NetBSDTargetInfo : public OSTargetInfo<Target> {
389protected:
Craig Topper3164f332014-03-11 03:39:26 +0000390 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
391 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000392 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000393 Builder.defineMacro("__NetBSD__");
394 Builder.defineMacro("__unix__");
395 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000396 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000397 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000398
399 switch (Triple.getArch()) {
400 default:
401 break;
402 case llvm::Triple::arm:
403 case llvm::Triple::armeb:
404 case llvm::Triple::thumb:
405 case llvm::Triple::thumbeb:
406 Builder.defineMacro("__ARM_DWARF_EH__");
407 break;
408 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000409 }
410public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000411 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
412 this->UserLabelPrefix = "";
413 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000414};
415
Torok Edwinb2b37c62009-06-30 17:10:35 +0000416// OpenBSD Target
417template<typename Target>
418class OpenBSDTargetInfo : public OSTargetInfo<Target> {
419protected:
Craig Topper3164f332014-03-11 03:39:26 +0000420 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
421 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000422 // OpenBSD defines; list based off of gcc output
423
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000424 Builder.defineMacro("__OpenBSD__");
425 DefineStd(Builder, "unix", Opts);
426 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000427 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000428 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000429 }
430public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000431 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
432 this->UserLabelPrefix = "";
433 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000434
Eli Friedman3715d1f2011-12-15 02:15:56 +0000435 switch (Triple.getArch()) {
436 default:
437 case llvm::Triple::x86:
438 case llvm::Triple::x86_64:
439 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000440 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000441 this->MCountName = "__mcount";
442 break;
443 case llvm::Triple::mips64:
444 case llvm::Triple::mips64el:
445 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000446 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000447 this->MCountName = "_mcount";
448 break;
449 }
450 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451};
452
Eli Friedman9fa28852012-08-08 23:57:20 +0000453// Bitrig Target
454template<typename Target>
455class BitrigTargetInfo : public OSTargetInfo<Target> {
456protected:
Craig Topper3164f332014-03-11 03:39:26 +0000457 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
458 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000459 // Bitrig defines; list based off of gcc output
460
461 Builder.defineMacro("__Bitrig__");
462 DefineStd(Builder, "unix", Opts);
463 Builder.defineMacro("__ELF__");
464 if (Opts.POSIXThreads)
465 Builder.defineMacro("_REENTRANT");
466 }
467public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000468 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
469 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000470 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000471 }
472};
473
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000474// PSP Target
475template<typename Target>
476class PSPTargetInfo : public OSTargetInfo<Target> {
477protected:
Craig Topper3164f332014-03-11 03:39:26 +0000478 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
479 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000480 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000481 Builder.defineMacro("PSP");
482 Builder.defineMacro("_PSP");
483 Builder.defineMacro("__psp__");
484 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000485 }
486public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000487 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000488 this->UserLabelPrefix = "";
489 }
490};
491
John Thompsone467e192009-11-19 17:18:50 +0000492// PS3 PPU Target
493template<typename Target>
494class PS3PPUTargetInfo : public OSTargetInfo<Target> {
495protected:
Craig Topper3164f332014-03-11 03:39:26 +0000496 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
497 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000498 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000499 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000500 Builder.defineMacro("__PPU__");
501 Builder.defineMacro("__CELLOS_LV2__");
502 Builder.defineMacro("__ELF__");
503 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000504 Builder.defineMacro("_ARCH_PPC64");
505 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000506 }
507public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000508 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000509 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000510 this->LongWidth = this->LongAlign = 32;
511 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000512 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000513 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000514 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000515 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000516 }
517};
518
Torok Edwinb2b37c62009-06-30 17:10:35 +0000519// Solaris target
520template<typename Target>
521class SolarisTargetInfo : public OSTargetInfo<Target> {
522protected:
Craig Topper3164f332014-03-11 03:39:26 +0000523 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000525 DefineStd(Builder, "sun", Opts);
526 DefineStd(Builder, "unix", Opts);
527 Builder.defineMacro("__ELF__");
528 Builder.defineMacro("__svr4__");
529 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000530 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
531 // newer, but to 500 for everything else. feature_test.h has a check to
532 // ensure that you are not using C99 with an old version of X/Open or C89
533 // with a new version.
534 if (Opts.C99 || Opts.C11)
535 Builder.defineMacro("_XOPEN_SOURCE", "600");
536 else
537 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000538 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000539 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000540 Builder.defineMacro("_LARGEFILE_SOURCE");
541 Builder.defineMacro("_LARGEFILE64_SOURCE");
542 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000543 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000544 }
545public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000546 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000547 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000548 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000549 // FIXME: WIntType should be SignedLong
550 }
551};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000552
553// Windows target
554template<typename Target>
555class WindowsTargetInfo : public OSTargetInfo<Target> {
556protected:
Craig Topper3164f332014-03-11 03:39:26 +0000557 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
558 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000559 Builder.defineMacro("_WIN32");
560 }
561 void getVisualStudioDefines(const LangOptions &Opts,
562 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000563 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000564 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000565 Builder.defineMacro("_CPPRTTI");
566
567 if (Opts.Exceptions)
568 Builder.defineMacro("_CPPUNWIND");
569 }
570
571 if (!Opts.CharIsSigned)
572 Builder.defineMacro("_CHAR_UNSIGNED");
573
574 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
575 // but it works for now.
576 if (Opts.POSIXThreads)
577 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000578
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000579 if (Opts.MSCompatibilityVersion) {
580 Builder.defineMacro("_MSC_VER",
581 Twine(Opts.MSCompatibilityVersion / 100000));
582 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000583 // FIXME We cannot encode the revision information into 32-bits
584 Builder.defineMacro("_MSC_BUILD", Twine(1));
585 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000586
587 if (Opts.MicrosoftExt) {
588 Builder.defineMacro("_MSC_EXTENSIONS");
589
590 if (Opts.CPlusPlus11) {
591 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
592 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
593 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
594 }
595 }
596
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000597 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000598 }
599
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000600public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000601 WindowsTargetInfo(const llvm::Triple &Triple)
602 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000603};
604
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000605template <typename Target>
606class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000607protected:
Craig Topper3164f332014-03-11 03:39:26 +0000608 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
609 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000610 if (Opts.POSIXThreads)
611 Builder.defineMacro("_REENTRANT");
612 if (Opts.CPlusPlus)
613 Builder.defineMacro("_GNU_SOURCE");
614
615 DefineStd(Builder, "unix", Opts);
616 Builder.defineMacro("__ELF__");
617 Builder.defineMacro("__native_client__");
618 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000619
620public:
621 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000622 this->UserLabelPrefix = "";
623 this->LongAlign = 32;
624 this->LongWidth = 32;
625 this->PointerAlign = 32;
626 this->PointerWidth = 32;
627 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000628 this->Int64Type = TargetInfo::SignedLongLong;
629 this->DoubleAlign = 64;
630 this->LongDoubleWidth = 64;
631 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000632 this->LongLongWidth = 64;
633 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000634 this->SizeType = TargetInfo::UnsignedInt;
635 this->PtrDiffType = TargetInfo::SignedInt;
636 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000637 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000638 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000639 if (Triple.getArch() == llvm::Triple::arm) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000640 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000641 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000642 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000643 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000644 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000645 } else if (Triple.getArch() == llvm::Triple::mipsel) {
646 // Handled on mips' setDescriptionString.
647 } else {
648 assert(Triple.getArch() == llvm::Triple::le32);
649 this->DescriptionString = "e-p:32:32-i64:64";
650 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000651 }
Craig Topper3164f332014-03-11 03:39:26 +0000652 typename Target::CallingConvCheckResult checkCallingConvention(
653 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000654 return CC == CC_PnaclCall ? Target::CCCR_OK :
655 Target::checkCallingConvention(CC);
656 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000657};
Mike Stump11289f42009-09-09 15:08:12 +0000658} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000659
Chris Lattner09d98f52008-10-05 21:50:58 +0000660//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000661// Specific target implementations.
662//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000663
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000664namespace {
665// PPC abstract base class
666class PPCTargetInfo : public TargetInfo {
667 static const Builtin::Info BuiltinInfo[];
668 static const char * const GCCRegNames[];
669 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000670 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000671
672 // Target cpu features.
673 bool HasVSX;
674
Ulrich Weigand8afad612014-07-28 13:17:52 +0000675protected:
676 std::string ABI;
677
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000678public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000679 PPCTargetInfo(const llvm::Triple &Triple)
680 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000681 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000682 LongDoubleWidth = LongDoubleAlign = 128;
683 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
684 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000685
Hal Finkel6b984f02012-07-03 16:51:04 +0000686 /// \brief Flags for architecture specific defines.
687 typedef enum {
688 ArchDefineNone = 0,
689 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
690 ArchDefinePpcgr = 1 << 1,
691 ArchDefinePpcsq = 1 << 2,
692 ArchDefine440 = 1 << 3,
693 ArchDefine603 = 1 << 4,
694 ArchDefine604 = 1 << 5,
695 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000696 ArchDefinePwr5 = 1 << 7,
697 ArchDefinePwr5x = 1 << 8,
698 ArchDefinePwr6 = 1 << 9,
699 ArchDefinePwr6x = 1 << 10,
700 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000701 ArchDefinePwr8 = 1 << 12,
702 ArchDefineA2 = 1 << 13,
703 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000704 } ArchDefineTypes;
705
Bill Schmidt38378a02013-02-01 20:23:10 +0000706 // Note: GCC recognizes the following additional cpus:
707 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
708 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
709 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000710 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000711 bool CPUKnown = llvm::StringSwitch<bool>(Name)
712 .Case("generic", true)
713 .Case("440", true)
714 .Case("450", true)
715 .Case("601", true)
716 .Case("602", true)
717 .Case("603", true)
718 .Case("603e", true)
719 .Case("603ev", true)
720 .Case("604", true)
721 .Case("604e", true)
722 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000723 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000724 .Case("g3", true)
725 .Case("7400", true)
726 .Case("g4", true)
727 .Case("7450", true)
728 .Case("g4+", true)
729 .Case("750", true)
730 .Case("970", true)
731 .Case("g5", true)
732 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000733 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000734 .Case("e500mc", true)
735 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000736 .Case("power3", true)
737 .Case("pwr3", true)
738 .Case("power4", true)
739 .Case("pwr4", true)
740 .Case("power5", true)
741 .Case("pwr5", true)
742 .Case("power5x", true)
743 .Case("pwr5x", true)
744 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000745 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000746 .Case("power6x", true)
747 .Case("pwr6x", true)
748 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000749 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000750 .Case("power8", true)
751 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000752 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000753 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000754 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000755 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000756 .Case("powerpc64le", true)
757 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000758 .Default(false);
759
760 if (CPUKnown)
761 CPU = Name;
762
763 return CPUKnown;
764 }
765
Ulrich Weigand8afad612014-07-28 13:17:52 +0000766
767 StringRef getABI() const override { return ABI; }
768
Craig Topper3164f332014-03-11 03:39:26 +0000769 void getTargetBuiltins(const Builtin::Info *&Records,
770 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000771 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000772 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000773 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000774
Craig Topper3164f332014-03-11 03:39:26 +0000775 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000776
Craig Topper3164f332014-03-11 03:39:26 +0000777 void getTargetDefines(const LangOptions &Opts,
778 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000779
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000781
Craig Topper3164f332014-03-11 03:39:26 +0000782 bool handleTargetFeatures(std::vector<std::string> &Features,
783 DiagnosticsEngine &Diags) override;
784 bool hasFeature(StringRef Feature) const override;
785
786 void getGCCRegNames(const char * const *&Names,
787 unsigned &NumNames) const override;
788 void getGCCRegAliases(const GCCRegAlias *&Aliases,
789 unsigned &NumAliases) const override;
790 bool validateAsmConstraint(const char *&Name,
791 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000792 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000793 default: return false;
794 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000795 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000796 case 'b': // Base register
797 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000798 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000799 break;
800 // FIXME: The following are added to allow parsing.
801 // I just took a guess at what the actions should be.
802 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000803 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000804 case 'v': // Altivec vector register
805 Info.setAllowsRegister();
806 break;
807 case 'w':
808 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000809 case 'd':// VSX vector register to hold vector double data
810 case 'f':// VSX vector register to hold vector float data
811 case 's':// VSX vector register to hold scalar float data
812 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000813 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000814 break;
815 default:
816 return false;
817 }
818 Info.setAllowsRegister();
819 Name++; // Skip over 'w'.
820 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000821 case 'h': // `MQ', `CTR', or `LINK' register
822 case 'q': // `MQ' register
823 case 'c': // `CTR' register
824 case 'l': // `LINK' register
825 case 'x': // `CR' register (condition register) number 0
826 case 'y': // `CR' register (condition register)
827 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000828 Info.setAllowsRegister();
829 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000830 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000831 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000832 // (use `L' instead for SImode constants)
833 case 'K': // Unsigned 16-bit constant
834 case 'L': // Signed 16-bit constant shifted left 16 bits
835 case 'M': // Constant larger than 31
836 case 'N': // Exact power of 2
837 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000838 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000839 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000840 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000841 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000842 break;
843 case 'm': // Memory operand. Note that on PowerPC targets, m can
844 // include addresses that update the base register. It
845 // is therefore only safe to use `m' in an asm statement
846 // if that asm statement accesses the operand exactly once.
847 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000848 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000849 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000850 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000851 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000852 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
853 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 // register to be updated.
855 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000856 if (Name[1] != 's')
857 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000858 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000859 // include any automodification of the base register. Unlike
860 // `m', this constraint can be used in asm statements that
861 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000862 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000863 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000864 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000865 break;
866 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000867 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000868 case 'Z': // Memory operand that is an indexed or indirect from a
869 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000870 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000871 Info.setAllowsMemory();
872 Info.setAllowsRegister();
873 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000874 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000875 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000876 // register (`p' is preferable for asm statements)
877 case 'S': // Constant suitable as a 64-bit mask operand
878 case 'T': // Constant suitable as a 32-bit mask operand
879 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000880 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000881 // instructions
882 case 'W': // Vector constant that does not require memory
883 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000884 break;
885 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000886 }
John Thompson07a61a42010-06-24 22:44:13 +0000887 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000888 }
Craig Topper3164f332014-03-11 03:39:26 +0000889 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000890 std::string R;
891 switch (*Constraint) {
892 case 'e':
893 case 'w':
894 // Two-character constraint; add "^" hint for later parsing.
895 R = std::string("^") + std::string(Constraint, 2);
896 Constraint++;
897 break;
898 default:
899 return TargetInfo::convertConstraint(Constraint);
900 }
901 return R;
902 }
Craig Topper3164f332014-03-11 03:39:26 +0000903 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000904 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000905 }
Craig Topper3164f332014-03-11 03:39:26 +0000906 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000907 if (RegNo == 0) return 3;
908 if (RegNo == 1) return 4;
909 return -1;
910 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000911};
Anders Carlssonf511f642007-11-27 04:11:28 +0000912
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000913const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000914#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000915#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000916 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000917#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000918};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000919
Eric Christopher3ff21b32013-10-16 21:26:26 +0000920 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000921/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000922bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000923 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000924 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
925 // Ignore disabled features.
926 if (Features[i][0] == '-')
927 continue;
928
929 StringRef Feature = StringRef(Features[i]).substr(1);
930
931 if (Feature == "vsx") {
932 HasVSX = true;
933 continue;
934 }
935
936 // TODO: Finish this list and add an assert that we've handled them
937 // all.
938 }
939
940 return true;
941}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000942
Chris Lattnerecd49032009-03-02 22:27:17 +0000943/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
944/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000945void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000946 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000947 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000948 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000949 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000950 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000951 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000952 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000953 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000954 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000955 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000956 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000957 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000958 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000959
Chris Lattnerecd49032009-03-02 22:27:17 +0000960 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000961 if (getTriple().getArch() == llvm::Triple::ppc64le) {
962 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000963 } else {
964 if (getTriple().getOS() != llvm::Triple::NetBSD &&
965 getTriple().getOS() != llvm::Triple::OpenBSD)
966 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000967 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000968
Ulrich Weigand8afad612014-07-28 13:17:52 +0000969 // ABI options.
970 if (ABI == "elfv1")
971 Builder.defineMacro("_CALL_ELF", "1");
972 if (ABI == "elfv2")
973 Builder.defineMacro("_CALL_ELF", "2");
974
Chris Lattnerecd49032009-03-02 22:27:17 +0000975 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000976 Builder.defineMacro("__NATURAL_ALIGNMENT__");
977 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Chris Lattnerecd49032009-03-02 22:27:17 +0000979 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000980 if (LongDoubleWidth == 128)
981 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000982
John Thompsone467e192009-11-19 17:18:50 +0000983 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000984 Builder.defineMacro("__VEC__", "10206");
985 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000986 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000987
988 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000989 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
990 .Case("440", ArchDefineName)
991 .Case("450", ArchDefineName | ArchDefine440)
992 .Case("601", ArchDefineName)
993 .Case("602", ArchDefineName | ArchDefinePpcgr)
994 .Case("603", ArchDefineName | ArchDefinePpcgr)
995 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
996 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
997 .Case("604", ArchDefineName | ArchDefinePpcgr)
998 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
999 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001000 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001001 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1002 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1003 .Case("750", ArchDefineName | ArchDefinePpcgr)
1004 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1005 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001006 .Case("a2", ArchDefineA2)
1007 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001008 .Case("pwr3", ArchDefinePpcgr)
1009 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1010 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1011 | ArchDefinePpcsq)
1012 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1013 | ArchDefinePpcgr | ArchDefinePpcsq)
1014 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1015 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1016 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1017 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1018 | ArchDefinePpcsq)
1019 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1020 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001021 | ArchDefinePpcgr | ArchDefinePpcsq)
1022 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1023 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1024 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001025 .Case("power3", ArchDefinePpcgr)
1026 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1027 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1028 | ArchDefinePpcsq)
1029 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1030 | ArchDefinePpcgr | ArchDefinePpcsq)
1031 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1032 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1033 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1034 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1035 | ArchDefinePpcsq)
1036 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1037 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001038 | ArchDefinePpcgr | ArchDefinePpcsq)
1039 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1040 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1041 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001042 .Default(ArchDefineNone);
1043
1044 if (defs & ArchDefineName)
1045 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1046 if (defs & ArchDefinePpcgr)
1047 Builder.defineMacro("_ARCH_PPCGR");
1048 if (defs & ArchDefinePpcsq)
1049 Builder.defineMacro("_ARCH_PPCSQ");
1050 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001051 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001052 if (defs & ArchDefine603)
1053 Builder.defineMacro("_ARCH_603");
1054 if (defs & ArchDefine604)
1055 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001056 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001057 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001058 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001059 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001060 if (defs & ArchDefinePwr5x)
1061 Builder.defineMacro("_ARCH_PWR5X");
1062 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001063 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001064 if (defs & ArchDefinePwr6x)
1065 Builder.defineMacro("_ARCH_PWR6X");
1066 if (defs & ArchDefinePwr7)
1067 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001068 if (defs & ArchDefinePwr8)
1069 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001070 if (defs & ArchDefineA2)
1071 Builder.defineMacro("_ARCH_A2");
1072 if (defs & ArchDefineA2q) {
1073 Builder.defineMacro("_ARCH_A2Q");
1074 Builder.defineMacro("_ARCH_QP");
1075 }
1076
1077 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1078 Builder.defineMacro("__bg__");
1079 Builder.defineMacro("__THW_BLUEGENE__");
1080 Builder.defineMacro("__bgq__");
1081 Builder.defineMacro("__TOS_BGQ__");
1082 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001083
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001084 if (HasVSX)
1085 Builder.defineMacro("__VSX__");
1086
Bill Schmidt38378a02013-02-01 20:23:10 +00001087 // FIXME: The following are not yet generated here by Clang, but are
1088 // generated by GCC:
1089 //
1090 // _SOFT_FLOAT_
1091 // __RECIP_PRECISION__
1092 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001093 // __RECIP__
1094 // __RECIPF__
1095 // __RSQRTE__
1096 // __RSQRTEF__
1097 // _SOFT_DOUBLE_
1098 // __NO_LWSYNC__
1099 // __HAVE_BSWAP__
1100 // __LONGDOUBLE128
1101 // __CMODEL_MEDIUM__
1102 // __CMODEL_LARGE__
1103 // _CALL_SYSV
1104 // _CALL_DARWIN
1105 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001106}
1107
1108void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1109 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1110 .Case("7400", true)
1111 .Case("g4", true)
1112 .Case("7450", true)
1113 .Case("g4+", true)
1114 .Case("970", true)
1115 .Case("g5", true)
1116 .Case("pwr6", true)
1117 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001118 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001119 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001120 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001121 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001122
1123 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001124
1125 if (!ABI.empty())
1126 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001127}
1128
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001129bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1130 return Feature == "powerpc";
1131}
Chris Lattner17df24e2008-04-21 18:56:49 +00001132
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001133
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001134const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001135 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1136 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1137 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1138 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1139 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1140 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1141 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1142 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001143 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001144 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001145 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001146 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1147 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1148 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1149 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001150 "vrsave", "vscr",
1151 "spe_acc", "spefscr",
1152 "sfp"
1153};
Chris Lattner10a5b382007-01-29 05:24:35 +00001154
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001155void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001156 unsigned &NumNames) const {
1157 Names = GCCRegNames;
1158 NumNames = llvm::array_lengthof(GCCRegNames);
1159}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001160
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001161const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1162 // While some of these aliases do map to different registers
1163 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001164 { { "0" }, "r0" },
1165 { { "1"}, "r1" },
1166 { { "2" }, "r2" },
1167 { { "3" }, "r3" },
1168 { { "4" }, "r4" },
1169 { { "5" }, "r5" },
1170 { { "6" }, "r6" },
1171 { { "7" }, "r7" },
1172 { { "8" }, "r8" },
1173 { { "9" }, "r9" },
1174 { { "10" }, "r10" },
1175 { { "11" }, "r11" },
1176 { { "12" }, "r12" },
1177 { { "13" }, "r13" },
1178 { { "14" }, "r14" },
1179 { { "15" }, "r15" },
1180 { { "16" }, "r16" },
1181 { { "17" }, "r17" },
1182 { { "18" }, "r18" },
1183 { { "19" }, "r19" },
1184 { { "20" }, "r20" },
1185 { { "21" }, "r21" },
1186 { { "22" }, "r22" },
1187 { { "23" }, "r23" },
1188 { { "24" }, "r24" },
1189 { { "25" }, "r25" },
1190 { { "26" }, "r26" },
1191 { { "27" }, "r27" },
1192 { { "28" }, "r28" },
1193 { { "29" }, "r29" },
1194 { { "30" }, "r30" },
1195 { { "31" }, "r31" },
1196 { { "fr0" }, "f0" },
1197 { { "fr1" }, "f1" },
1198 { { "fr2" }, "f2" },
1199 { { "fr3" }, "f3" },
1200 { { "fr4" }, "f4" },
1201 { { "fr5" }, "f5" },
1202 { { "fr6" }, "f6" },
1203 { { "fr7" }, "f7" },
1204 { { "fr8" }, "f8" },
1205 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001206 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001207 { { "fr11" }, "f11" },
1208 { { "fr12" }, "f12" },
1209 { { "fr13" }, "f13" },
1210 { { "fr14" }, "f14" },
1211 { { "fr15" }, "f15" },
1212 { { "fr16" }, "f16" },
1213 { { "fr17" }, "f17" },
1214 { { "fr18" }, "f18" },
1215 { { "fr19" }, "f19" },
1216 { { "fr20" }, "f20" },
1217 { { "fr21" }, "f21" },
1218 { { "fr22" }, "f22" },
1219 { { "fr23" }, "f23" },
1220 { { "fr24" }, "f24" },
1221 { { "fr25" }, "f25" },
1222 { { "fr26" }, "f26" },
1223 { { "fr27" }, "f27" },
1224 { { "fr28" }, "f28" },
1225 { { "fr29" }, "f29" },
1226 { { "fr30" }, "f30" },
1227 { { "fr31" }, "f31" },
1228 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001229};
1230
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001231void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001232 unsigned &NumAliases) const {
1233 Aliases = GCCRegAliases;
1234 NumAliases = llvm::array_lengthof(GCCRegAliases);
1235}
1236} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001237
Chris Lattner5ba61f02006-10-14 07:39:34 +00001238namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001239class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001240public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001241 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001242 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001243
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001244 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001245 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001246 case llvm::Triple::FreeBSD:
1247 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001248 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001249 PtrDiffType = SignedInt;
1250 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001251 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001252 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001253 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001254 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001255
Roman Divacky3ffe7462012-03-13 19:20:17 +00001256 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1257 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001258 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001259 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001260
1261 // PPC32 supports atomics up to 4 bytes.
1262 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001263 }
1264
Craig Topper3164f332014-03-11 03:39:26 +00001265 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001266 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001267 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001268 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001269};
1270} // end anonymous namespace.
1271
Bill Schmidt778d3872013-07-26 01:36:11 +00001272// Note: ABI differences may eventually require us to have a separate
1273// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001274namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001275class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001276public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001277 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001278 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001279 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001280 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001281
Roman Divacky3ffe7462012-03-13 19:20:17 +00001282 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1283 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001284 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001285 DescriptionString = "E-m:e-i64:64-n32:64";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001286 } else {
1287 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1288 DescriptionString = "e-m:e-i64:64-n32:64";
Ulrich Weigand8afad612014-07-28 13:17:52 +00001289 ABI = "elfv2";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001290 } else {
1291 DescriptionString = "E-m:e-i64:64-n32:64";
Ulrich Weigand8afad612014-07-28 13:17:52 +00001292 ABI = "elfv1";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001293 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001294 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001295
1296 // PPC64 supports atomics up to 8 bytes.
1297 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001298 }
Craig Topper3164f332014-03-11 03:39:26 +00001299 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001300 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001301 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001302 // PPC64 Linux-specifc ABI options.
1303 bool setABI(const std::string &Name) override {
1304 if (Name == "elfv1" || Name == "elfv2") {
1305 ABI = Name;
1306 return true;
1307 }
1308 return false;
1309 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001310};
1311} // end anonymous namespace.
1312
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001313
1314namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001315class DarwinPPC32TargetInfo :
1316 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001317public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001318 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1319 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001320 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001321 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001322 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001323 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001324 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001325 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001326 }
Craig Topper3164f332014-03-11 03:39:26 +00001327 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001328 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001329 }
1330};
1331
1332class DarwinPPC64TargetInfo :
1333 public DarwinTargetInfo<PPC64TargetInfo> {
1334public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001335 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1336 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001337 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001338 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001339 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001340 }
1341};
1342} // end anonymous namespace.
1343
Chris Lattner5ba61f02006-10-14 07:39:34 +00001344namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001345 static const unsigned NVPTXAddrSpaceMap[] = {
1346 1, // opencl_global
1347 3, // opencl_local
1348 4, // opencl_constant
1349 1, // cuda_device
1350 4, // cuda_constant
1351 3, // cuda_shared
1352 };
1353 class NVPTXTargetInfo : public TargetInfo {
1354 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001355 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001356 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001357 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001358 BigEndian = false;
1359 TLSSupported = false;
1360 LongWidth = LongAlign = 64;
1361 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001362 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001363 // Define available target features
1364 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001365 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001366 }
Craig Topper3164f332014-03-11 03:39:26 +00001367 void getTargetDefines(const LangOptions &Opts,
1368 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001369 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001370 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001371 }
Craig Topper3164f332014-03-11 03:39:26 +00001372 void getTargetBuiltins(const Builtin::Info *&Records,
1373 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001374 Records = BuiltinInfo;
1375 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001376 }
Craig Topper3164f332014-03-11 03:39:26 +00001377 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001378 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001379 }
Craig Topper3164f332014-03-11 03:39:26 +00001380
1381 void getGCCRegNames(const char * const *&Names,
1382 unsigned &NumNames) const override;
1383 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1384 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001385 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001386 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001387 NumAliases = 0;
1388 }
Craig Topper3164f332014-03-11 03:39:26 +00001389 bool validateAsmConstraint(const char *&Name,
1390 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001391 switch (*Name) {
1392 default: return false;
1393 case 'c':
1394 case 'h':
1395 case 'r':
1396 case 'l':
1397 case 'f':
1398 case 'd':
1399 Info.setAllowsRegister();
1400 return true;
1401 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001402 }
Craig Topper3164f332014-03-11 03:39:26 +00001403 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001404 // FIXME: Is this really right?
1405 return "";
1406 }
Craig Topper3164f332014-03-11 03:39:26 +00001407 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001408 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001409 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001410 }
Craig Topper3164f332014-03-11 03:39:26 +00001411 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001412 bool Valid = llvm::StringSwitch<bool>(Name)
1413 .Case("sm_20", true)
1414 .Case("sm_21", true)
1415 .Case("sm_30", true)
1416 .Case("sm_35", true)
1417 .Default(false);
1418
1419 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001420 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001421 };
1422
1423 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1424#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1425#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1426 ALL_LANGUAGES },
1427#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001428 };
1429
1430 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1431 "r0"
1432 };
1433
1434 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1435 unsigned &NumNames) const {
1436 Names = GCCRegNames;
1437 NumNames = llvm::array_lengthof(GCCRegNames);
1438 }
1439
1440 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1441 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001442 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001443 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001444 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1445 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001446 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001447 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001448 };
1449
1450 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1451 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001452 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001453 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001454 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1455 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001456 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001457 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001458 };
1459}
1460
1461namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001462
1463static const unsigned R600AddrSpaceMap[] = {
1464 1, // opencl_global
1465 3, // opencl_local
1466 2, // opencl_constant
1467 1, // cuda_device
1468 2, // cuda_constant
1469 3 // cuda_shared
1470};
1471
Tom Stellardc74b1e02013-03-04 17:40:53 +00001472static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001473 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1474 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001475
1476static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001477 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1478 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001479
1480static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001481 "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 +00001482 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1483 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001484
Eli Friedmand13b41e2012-10-12 23:32:00 +00001485class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001486 static const Builtin::Info BuiltinInfo[];
1487
Tom Stellardc74b1e02013-03-04 17:40:53 +00001488 /// \brief The GPU profiles supported by the R600 target.
1489 enum GPUKind {
1490 GK_NONE,
1491 GK_R600,
1492 GK_R600_DOUBLE_OPS,
1493 GK_R700,
1494 GK_R700_DOUBLE_OPS,
1495 GK_EVERGREEN,
1496 GK_EVERGREEN_DOUBLE_OPS,
1497 GK_NORTHERN_ISLANDS,
1498 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001499 GK_SOUTHERN_ISLANDS,
1500 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001501 } GPU;
1502
Eli Friedmand13b41e2012-10-12 23:32:00 +00001503public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001504 R600TargetInfo(const llvm::Triple &Triple)
1505 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001506 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001507 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001508 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001509 }
1510
Craig Topper3164f332014-03-11 03:39:26 +00001511 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001512 return "";
1513 }
1514
Craig Topper3164f332014-03-11 03:39:26 +00001515 void getGCCRegNames(const char * const *&Names,
1516 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001517 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001518 numNames = 0;
1519 }
1520
Craig Topper3164f332014-03-11 03:39:26 +00001521 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1522 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001523 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001524 NumAliases = 0;
1525 }
1526
Craig Topper3164f332014-03-11 03:39:26 +00001527 bool validateAsmConstraint(const char *&Name,
1528 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001529 return true;
1530 }
1531
Craig Topper3164f332014-03-11 03:39:26 +00001532 void getTargetBuiltins(const Builtin::Info *&Records,
1533 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001534 Records = BuiltinInfo;
1535 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001536 }
1537
Craig Topper3164f332014-03-11 03:39:26 +00001538 void getTargetDefines(const LangOptions &Opts,
1539 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001540 Builder.defineMacro("__R600__");
1541 }
1542
Craig Topper3164f332014-03-11 03:39:26 +00001543 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001544 return TargetInfo::CharPtrBuiltinVaList;
1545 }
1546
Craig Topper3164f332014-03-11 03:39:26 +00001547 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001548 GPU = llvm::StringSwitch<GPUKind>(Name)
1549 .Case("r600" , GK_R600)
1550 .Case("rv610", GK_R600)
1551 .Case("rv620", GK_R600)
1552 .Case("rv630", GK_R600)
1553 .Case("rv635", GK_R600)
1554 .Case("rs780", GK_R600)
1555 .Case("rs880", GK_R600)
1556 .Case("rv670", GK_R600_DOUBLE_OPS)
1557 .Case("rv710", GK_R700)
1558 .Case("rv730", GK_R700)
1559 .Case("rv740", GK_R700_DOUBLE_OPS)
1560 .Case("rv770", GK_R700_DOUBLE_OPS)
1561 .Case("palm", GK_EVERGREEN)
1562 .Case("cedar", GK_EVERGREEN)
1563 .Case("sumo", GK_EVERGREEN)
1564 .Case("sumo2", GK_EVERGREEN)
1565 .Case("redwood", GK_EVERGREEN)
1566 .Case("juniper", GK_EVERGREEN)
1567 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1568 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1569 .Case("barts", GK_NORTHERN_ISLANDS)
1570 .Case("turks", GK_NORTHERN_ISLANDS)
1571 .Case("caicos", GK_NORTHERN_ISLANDS)
1572 .Case("cayman", GK_CAYMAN)
1573 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001574 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001575 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1576 .Case("verde", GK_SOUTHERN_ISLANDS)
1577 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001578 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001579 .Case("bonaire", GK_SEA_ISLANDS)
1580 .Case("kabini", GK_SEA_ISLANDS)
1581 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001582 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001583 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001584 .Default(GK_NONE);
1585
1586 if (GPU == GK_NONE) {
1587 return false;
1588 }
1589
1590 // Set the correct data layout
1591 switch (GPU) {
1592 case GK_NONE:
1593 case GK_R600:
1594 case GK_R700:
1595 case GK_EVERGREEN:
1596 case GK_NORTHERN_ISLANDS:
1597 DescriptionString = DescriptionStringR600;
1598 break;
1599 case GK_R600_DOUBLE_OPS:
1600 case GK_R700_DOUBLE_OPS:
1601 case GK_EVERGREEN_DOUBLE_OPS:
1602 case GK_CAYMAN:
1603 DescriptionString = DescriptionStringR600DoubleOps;
1604 break;
1605 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001606 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001607 DescriptionString = DescriptionStringSI;
1608 break;
1609 }
1610
1611 return true;
1612 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001613};
1614
Matt Arsenault56f008d2014-06-24 20:45:01 +00001615const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1616#define BUILTIN(ID, TYPE, ATTRS) \
1617 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1618#include "clang/Basic/BuiltinsR600.def"
1619};
1620
Eli Friedmand13b41e2012-10-12 23:32:00 +00001621} // end anonymous namespace
1622
1623namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001624// Namespace for x86 abstract base class
1625const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001626#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001627#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001628 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001629#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001630};
Eli Friedmanb5366062008-05-20 14:21:01 +00001631
Nuno Lopescfca1f02009-12-23 17:49:57 +00001632static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001633 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1634 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001635 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001636 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1637 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1638 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001639 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001640 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1641 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001642};
1643
Eric Christophercdd36352011-06-21 00:05:20 +00001644const TargetInfo::AddlRegName AddlRegNames[] = {
1645 { { "al", "ah", "eax", "rax" }, 0 },
1646 { { "bl", "bh", "ebx", "rbx" }, 3 },
1647 { { "cl", "ch", "ecx", "rcx" }, 2 },
1648 { { "dl", "dh", "edx", "rdx" }, 1 },
1649 { { "esi", "rsi" }, 4 },
1650 { { "edi", "rdi" }, 5 },
1651 { { "esp", "rsp" }, 7 },
1652 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001653};
1654
1655// X86 target abstract base class; x86-32 and x86-64 are very close, so
1656// most of the implementation can be shared.
1657class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001658 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001659 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001660 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001661 enum MMX3DNowEnum {
1662 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1663 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001664 enum XOPEnum {
1665 NoXOP,
1666 SSE4A,
1667 FMA4,
1668 XOP
1669 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001670
Eric Christophere1ddaf92010-04-02 23:50:19 +00001671 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001672 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001673 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001674 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001675 bool HasBMI;
1676 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001677 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001678 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001679 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001680 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001681 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001682 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001683 bool HasF16C;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001684 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW, HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001685 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001686 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001687
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001688 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1689 ///
1690 /// Each enumeration represents a particular CPU supported by Clang. These
1691 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1692 enum CPUKind {
1693 CK_Generic,
1694
1695 /// \name i386
1696 /// i386-generation processors.
1697 //@{
1698 CK_i386,
1699 //@}
1700
1701 /// \name i486
1702 /// i486-generation processors.
1703 //@{
1704 CK_i486,
1705 CK_WinChipC6,
1706 CK_WinChip2,
1707 CK_C3,
1708 //@}
1709
1710 /// \name i586
1711 /// i586-generation processors, P5 microarchitecture based.
1712 //@{
1713 CK_i586,
1714 CK_Pentium,
1715 CK_PentiumMMX,
1716 //@}
1717
1718 /// \name i686
1719 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1720 //@{
1721 CK_i686,
1722 CK_PentiumPro,
1723 CK_Pentium2,
1724 CK_Pentium3,
1725 CK_Pentium3M,
1726 CK_PentiumM,
1727 CK_C3_2,
1728
1729 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1730 /// Clang however has some logic to suport this.
1731 // FIXME: Warn, deprecate, and potentially remove this.
1732 CK_Yonah,
1733 //@}
1734
1735 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001736 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001737 //@{
1738 CK_Pentium4,
1739 CK_Pentium4M,
1740 CK_Prescott,
1741 CK_Nocona,
1742 //@}
1743
1744 /// \name Core
1745 /// Core microarchitecture based processors.
1746 //@{
1747 CK_Core2,
1748
1749 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1750 /// codename which GCC no longer accepts as an option to -march, but Clang
1751 /// has some logic for recognizing it.
1752 // FIXME: Warn, deprecate, and potentially remove this.
1753 CK_Penryn,
1754 //@}
1755
1756 /// \name Atom
1757 /// Atom processors
1758 //@{
1759 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001760 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001761 //@}
1762
1763 /// \name Nehalem
1764 /// Nehalem microarchitecture based processors.
1765 //@{
1766 CK_Corei7,
1767 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001768 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001769 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001770 //@}
1771
Craig Topper449314e2013-08-20 07:09:39 +00001772 /// \name Knights Landing
1773 /// Knights Landing processor.
1774 CK_KNL,
1775
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001776 /// \name Skylake Server
1777 /// Skylake server processor.
1778 CK_SKX,
1779
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001780 /// \name K6
1781 /// K6 architecture processors.
1782 //@{
1783 CK_K6,
1784 CK_K6_2,
1785 CK_K6_3,
1786 //@}
1787
1788 /// \name K7
1789 /// K7 architecture processors.
1790 //@{
1791 CK_Athlon,
1792 CK_AthlonThunderbird,
1793 CK_Athlon4,
1794 CK_AthlonXP,
1795 CK_AthlonMP,
1796 //@}
1797
1798 /// \name K8
1799 /// K8 architecture processors.
1800 //@{
1801 CK_Athlon64,
1802 CK_Athlon64SSE3,
1803 CK_AthlonFX,
1804 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001805 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001806 CK_Opteron,
1807 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001808 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001809 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001810
Benjamin Kramer569f2152012-01-10 11:50:18 +00001811 /// \name Bobcat
1812 /// Bobcat architecture processors.
1813 //@{
1814 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001815 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001816 //@}
1817
1818 /// \name Bulldozer
1819 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001820 //@{
1821 CK_BDVER1,
1822 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001823 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001824 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001825 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001826
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001827 /// This specification is deprecated and will be removed in the future.
1828 /// Users should prefer \see CK_K8.
1829 // FIXME: Warn on this when the CPU is set to it.
1830 CK_x86_64,
1831 //@}
1832
1833 /// \name Geode
1834 /// Geode processors.
1835 //@{
1836 CK_Geode
1837 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001838 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001839
Rafael Espindolaeb265472013-08-21 21:59:03 +00001840 enum FPMathKind {
1841 FP_Default,
1842 FP_SSE,
1843 FP_387
1844 } FPMath;
1845
Eli Friedman3fd920a2008-08-20 02:34:37 +00001846public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001847 X86TargetInfo(const llvm::Triple &Triple)
1848 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001849 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1850 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001851 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1852 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001853 HasAVX512PF(false), HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1854 HasSHA(false), HasCX16(false), CPU(CK_Generic),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001855 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001856 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001857 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001858 }
Craig Topper3164f332014-03-11 03:39:26 +00001859 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001860 // X87 evaluates with 80 bits "long double" precision.
1861 return SSELevel == NoSSE ? 2 : 0;
1862 }
Craig Topper3164f332014-03-11 03:39:26 +00001863 void getTargetBuiltins(const Builtin::Info *&Records,
1864 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001865 Records = BuiltinInfo;
1866 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001867 }
Craig Topper3164f332014-03-11 03:39:26 +00001868 void getGCCRegNames(const char * const *&Names,
1869 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001870 Names = GCCRegNames;
1871 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001872 }
Craig Topper3164f332014-03-11 03:39:26 +00001873 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1874 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001875 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001876 NumAliases = 0;
1877 }
Craig Topper3164f332014-03-11 03:39:26 +00001878 void getGCCAddlRegNames(const AddlRegName *&Names,
1879 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001880 Names = AddlRegNames;
1881 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001882 }
Craig Topper3164f332014-03-11 03:39:26 +00001883 bool validateAsmConstraint(const char *&Name,
1884 TargetInfo::ConstraintInfo &info) const override;
1885 std::string convertConstraint(const char *&Constraint) const override;
1886 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001887 return "~{dirflag},~{fpsr},~{flags}";
1888 }
Craig Topper3164f332014-03-11 03:39:26 +00001889 void getTargetDefines(const LangOptions &Opts,
1890 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001891 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1892 bool Enabled);
1893 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1894 bool Enabled);
1895 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1896 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001897 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1898 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001899 setFeatureEnabledImpl(Features, Name, Enabled);
1900 }
1901 // This exists purely to cut down on the number of virtual calls in
1902 // getDefaultFeatures which calls this repeatedly.
1903 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1904 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001905 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1906 bool hasFeature(StringRef Feature) const override;
1907 bool handleTargetFeatures(std::vector<std::string> &Features,
1908 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001909 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001910 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001911 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001912 else if (getTriple().getArch() == llvm::Triple::x86 &&
1913 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001914 return "no-mmx";
1915 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001916 }
Craig Topper3164f332014-03-11 03:39:26 +00001917 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001918 CPU = llvm::StringSwitch<CPUKind>(Name)
1919 .Case("i386", CK_i386)
1920 .Case("i486", CK_i486)
1921 .Case("winchip-c6", CK_WinChipC6)
1922 .Case("winchip2", CK_WinChip2)
1923 .Case("c3", CK_C3)
1924 .Case("i586", CK_i586)
1925 .Case("pentium", CK_Pentium)
1926 .Case("pentium-mmx", CK_PentiumMMX)
1927 .Case("i686", CK_i686)
1928 .Case("pentiumpro", CK_PentiumPro)
1929 .Case("pentium2", CK_Pentium2)
1930 .Case("pentium3", CK_Pentium3)
1931 .Case("pentium3m", CK_Pentium3M)
1932 .Case("pentium-m", CK_PentiumM)
1933 .Case("c3-2", CK_C3_2)
1934 .Case("yonah", CK_Yonah)
1935 .Case("pentium4", CK_Pentium4)
1936 .Case("pentium4m", CK_Pentium4M)
1937 .Case("prescott", CK_Prescott)
1938 .Case("nocona", CK_Nocona)
1939 .Case("core2", CK_Core2)
1940 .Case("penryn", CK_Penryn)
1941 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001942 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001943 .Case("corei7", CK_Corei7)
1944 .Case("corei7-avx", CK_Corei7AVX)
1945 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001946 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001947 .Case("knl", CK_KNL)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001948 .Case("skx", CK_SKX)
Chandler Carruth212334f2011-09-28 08:55:37 +00001949 .Case("k6", CK_K6)
1950 .Case("k6-2", CK_K6_2)
1951 .Case("k6-3", CK_K6_3)
1952 .Case("athlon", CK_Athlon)
1953 .Case("athlon-tbird", CK_AthlonThunderbird)
1954 .Case("athlon-4", CK_Athlon4)
1955 .Case("athlon-xp", CK_AthlonXP)
1956 .Case("athlon-mp", CK_AthlonMP)
1957 .Case("athlon64", CK_Athlon64)
1958 .Case("athlon64-sse3", CK_Athlon64SSE3)
1959 .Case("athlon-fx", CK_AthlonFX)
1960 .Case("k8", CK_K8)
1961 .Case("k8-sse3", CK_K8SSE3)
1962 .Case("opteron", CK_Opteron)
1963 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001964 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001965 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001966 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001967 .Case("bdver1", CK_BDVER1)
1968 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001969 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00001970 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00001971 .Case("x86-64", CK_x86_64)
1972 .Case("geode", CK_Geode)
1973 .Default(CK_Generic);
1974
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001975 // Perform any per-CPU checks necessary to determine if this CPU is
1976 // acceptable.
1977 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1978 // invalid without explaining *why*.
1979 switch (CPU) {
1980 case CK_Generic:
1981 // No processor selected!
1982 return false;
1983
1984 case CK_i386:
1985 case CK_i486:
1986 case CK_WinChipC6:
1987 case CK_WinChip2:
1988 case CK_C3:
1989 case CK_i586:
1990 case CK_Pentium:
1991 case CK_PentiumMMX:
1992 case CK_i686:
1993 case CK_PentiumPro:
1994 case CK_Pentium2:
1995 case CK_Pentium3:
1996 case CK_Pentium3M:
1997 case CK_PentiumM:
1998 case CK_Yonah:
1999 case CK_C3_2:
2000 case CK_Pentium4:
2001 case CK_Pentium4M:
2002 case CK_Prescott:
2003 case CK_K6:
2004 case CK_K6_2:
2005 case CK_K6_3:
2006 case CK_Athlon:
2007 case CK_AthlonThunderbird:
2008 case CK_Athlon4:
2009 case CK_AthlonXP:
2010 case CK_AthlonMP:
2011 case CK_Geode:
2012 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002013 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002014 return false;
2015
2016 // Fallthrough
2017 case CK_Nocona:
2018 case CK_Core2:
2019 case CK_Penryn:
2020 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002021 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002022 case CK_Corei7:
2023 case CK_Corei7AVX:
2024 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002025 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00002026 case CK_KNL:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002027 case CK_SKX:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002028 case CK_Athlon64:
2029 case CK_Athlon64SSE3:
2030 case CK_AthlonFX:
2031 case CK_K8:
2032 case CK_K8SSE3:
2033 case CK_Opteron:
2034 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002035 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002036 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002037 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002038 case CK_BDVER1:
2039 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002040 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002041 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002042 case CK_x86_64:
2043 return true;
2044 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002045 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002046 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002047
Craig Topper3164f332014-03-11 03:39:26 +00002048 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002049
Craig Topper3164f332014-03-11 03:39:26 +00002050 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002051 // We accept all non-ARM calling conventions
2052 return (CC == CC_X86ThisCall ||
2053 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00002054 CC == CC_X86StdCall ||
2055 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002056 CC == CC_X86Pascal ||
2057 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002058 }
2059
Craig Topper3164f332014-03-11 03:39:26 +00002060 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002061 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002062 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002063};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002064
Rafael Espindolaeb265472013-08-21 21:59:03 +00002065bool X86TargetInfo::setFPMath(StringRef Name) {
2066 if (Name == "387") {
2067 FPMath = FP_387;
2068 return true;
2069 }
2070 if (Name == "sse") {
2071 FPMath = FP_SSE;
2072 return true;
2073 }
2074 return false;
2075}
2076
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002077void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002078 // FIXME: This *really* should not be here.
2079
2080 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002081 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002082 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002083
Chandler Carruth212334f2011-09-28 08:55:37 +00002084 switch (CPU) {
2085 case CK_Generic:
2086 case CK_i386:
2087 case CK_i486:
2088 case CK_i586:
2089 case CK_Pentium:
2090 case CK_i686:
2091 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002092 break;
2093 case CK_PentiumMMX:
2094 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002095 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002096 break;
2097 case CK_Pentium3:
2098 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002099 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002100 break;
2101 case CK_PentiumM:
2102 case CK_Pentium4:
2103 case CK_Pentium4M:
2104 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002105 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002106 break;
2107 case CK_Yonah:
2108 case CK_Prescott:
2109 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002110 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002111 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002112 break;
2113 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002114 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002115 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002116 break;
2117 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002118 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002119 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002120 break;
2121 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002122 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002123 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002124 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002125 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002126 setFeatureEnabledImpl(Features, "sse4.2", true);
2127 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002128 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002129 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002130 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002131 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002132 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002133 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002134 break;
2135 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002136 setFeatureEnabledImpl(Features, "avx", true);
2137 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002138 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002139 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002140 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002141 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002142 setFeatureEnabledImpl(Features, "avx", true);
2143 setFeatureEnabledImpl(Features, "aes", true);
2144 setFeatureEnabledImpl(Features, "pclmul", true);
2145 setFeatureEnabledImpl(Features, "rdrnd", true);
2146 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002147 break;
Craig Topper865fff52011-12-17 19:55:21 +00002148 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002149 setFeatureEnabledImpl(Features, "avx2", true);
2150 setFeatureEnabledImpl(Features, "aes", true);
2151 setFeatureEnabledImpl(Features, "pclmul", true);
2152 setFeatureEnabledImpl(Features, "lzcnt", true);
2153 setFeatureEnabledImpl(Features, "rdrnd", true);
2154 setFeatureEnabledImpl(Features, "f16c", true);
2155 setFeatureEnabledImpl(Features, "bmi", true);
2156 setFeatureEnabledImpl(Features, "bmi2", true);
2157 setFeatureEnabledImpl(Features, "rtm", true);
2158 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002159 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002160 break;
Craig Topper449314e2013-08-20 07:09:39 +00002161 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002162 setFeatureEnabledImpl(Features, "avx512f", true);
2163 setFeatureEnabledImpl(Features, "avx512cd", true);
2164 setFeatureEnabledImpl(Features, "avx512er", true);
2165 setFeatureEnabledImpl(Features, "avx512pf", true);
2166 setFeatureEnabledImpl(Features, "aes", true);
2167 setFeatureEnabledImpl(Features, "pclmul", true);
2168 setFeatureEnabledImpl(Features, "lzcnt", true);
2169 setFeatureEnabledImpl(Features, "rdrnd", true);
2170 setFeatureEnabledImpl(Features, "f16c", true);
2171 setFeatureEnabledImpl(Features, "bmi", true);
2172 setFeatureEnabledImpl(Features, "bmi2", true);
2173 setFeatureEnabledImpl(Features, "rtm", true);
2174 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002175 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002176 case CK_SKX:
2177 setFeatureEnabledImpl(Features, "avx512f", true);
2178 setFeatureEnabledImpl(Features, "avx512cd", true);
2179 setFeatureEnabledImpl(Features, "avx512dq", true);
2180 setFeatureEnabledImpl(Features, "avx512bw", true);
2181 setFeatureEnabledImpl(Features, "avx512vl", true);
2182 setFeatureEnabledImpl(Features, "aes", true);
2183 setFeatureEnabledImpl(Features, "pclmul", true);
2184 setFeatureEnabledImpl(Features, "lzcnt", true);
2185 setFeatureEnabledImpl(Features, "rdrnd", true);
2186 setFeatureEnabledImpl(Features, "f16c", true);
2187 setFeatureEnabledImpl(Features, "bmi", true);
2188 setFeatureEnabledImpl(Features, "bmi2", true);
2189 setFeatureEnabledImpl(Features, "rtm", true);
2190 setFeatureEnabledImpl(Features, "fma", true);
2191 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002192 case CK_K6:
2193 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002194 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002195 break;
2196 case CK_K6_2:
2197 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002198 case CK_WinChip2:
2199 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002200 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002201 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002202 case CK_Athlon:
2203 case CK_AthlonThunderbird:
2204 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002205 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002206 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002207 case CK_Athlon4:
2208 case CK_AthlonXP:
2209 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002210 setFeatureEnabledImpl(Features, "sse", true);
2211 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002212 break;
2213 case CK_K8:
2214 case CK_Opteron:
2215 case CK_Athlon64:
2216 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002217 setFeatureEnabledImpl(Features, "sse2", true);
2218 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002219 break;
2220 case CK_K8SSE3:
2221 case CK_OpteronSSE3:
2222 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002223 setFeatureEnabledImpl(Features, "sse3", true);
2224 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002225 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002226 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002227 setFeatureEnabledImpl(Features, "sse3", true);
2228 setFeatureEnabledImpl(Features, "sse4a", true);
2229 setFeatureEnabledImpl(Features, "3dnowa", true);
2230 setFeatureEnabledImpl(Features, "lzcnt", true);
2231 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002232 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002233 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002234 setFeatureEnabledImpl(Features, "ssse3", true);
2235 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002236 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002237 setFeatureEnabledImpl(Features, "lzcnt", true);
2238 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002239 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002240 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002241 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002242 setFeatureEnabledImpl(Features, "avx", true);
2243 setFeatureEnabledImpl(Features, "sse4a", true);
2244 setFeatureEnabledImpl(Features, "lzcnt", true);
2245 setFeatureEnabledImpl(Features, "aes", true);
2246 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002247 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002248 setFeatureEnabledImpl(Features, "bmi", true);
2249 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002250 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002251 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002252 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002253 setFeatureEnabledImpl(Features, "xop", true);
2254 setFeatureEnabledImpl(Features, "lzcnt", true);
2255 setFeatureEnabledImpl(Features, "aes", true);
2256 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002257 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002258 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002259 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002260 case CK_BDVER4:
2261 setFeatureEnabledImpl(Features, "avx2", true);
2262 setFeatureEnabledImpl(Features, "bmi2", true);
2263 // FALLTHROUGH
Eli Friedman3e94f572012-11-17 01:43:10 +00002264 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002265 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002266 setFeatureEnabledImpl(Features, "xop", true);
2267 setFeatureEnabledImpl(Features, "lzcnt", true);
2268 setFeatureEnabledImpl(Features, "aes", true);
2269 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002270 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002271 setFeatureEnabledImpl(Features, "bmi", true);
2272 setFeatureEnabledImpl(Features, "fma", true);
2273 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002274 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002275 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002276 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002277 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002278 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002279 break;
Eli Friedman33465822011-07-08 23:31:17 +00002280 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002281}
2282
Rafael Espindolae62e2792013-08-20 13:44:29 +00002283void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002284 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002285 if (Enabled) {
2286 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002287 case AVX512F:
2288 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002289 case AVX2:
2290 Features["avx2"] = true;
2291 case AVX:
2292 Features["avx"] = true;
2293 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002294 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002295 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002296 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002297 case SSSE3:
2298 Features["ssse3"] = true;
2299 case SSE3:
2300 Features["sse3"] = true;
2301 case SSE2:
2302 Features["sse2"] = true;
2303 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002304 Features["sse"] = true;
2305 case NoSSE:
2306 break;
2307 }
2308 return;
2309 }
2310
2311 switch (Level) {
2312 case NoSSE:
2313 case SSE1:
2314 Features["sse"] = false;
2315 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002316 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2317 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002318 case SSE3:
2319 Features["sse3"] = false;
2320 setXOPLevel(Features, NoXOP, false);
2321 case SSSE3:
2322 Features["ssse3"] = false;
2323 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002324 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002325 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002326 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002327 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002328 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002329 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002330 case AVX2:
2331 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002332 case AVX512F:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002333 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = Features["avx512pf"] =
2334 Features["avx512dq"] = Features["avx512bw"] = Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002335 }
2336}
2337
2338void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002339 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002340 if (Enabled) {
2341 switch (Level) {
2342 case AMD3DNowAthlon:
2343 Features["3dnowa"] = true;
2344 case AMD3DNow:
2345 Features["3dnow"] = true;
2346 case MMX:
2347 Features["mmx"] = true;
2348 case NoMMX3DNow:
2349 break;
2350 }
2351 return;
2352 }
2353
2354 switch (Level) {
2355 case NoMMX3DNow:
2356 case MMX:
2357 Features["mmx"] = false;
2358 case AMD3DNow:
2359 Features["3dnow"] = false;
2360 case AMD3DNowAthlon:
2361 Features["3dnowa"] = false;
2362 }
2363}
2364
2365void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002366 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002367 if (Enabled) {
2368 switch (Level) {
2369 case XOP:
2370 Features["xop"] = true;
2371 case FMA4:
2372 Features["fma4"] = true;
2373 setSSELevel(Features, AVX, true);
2374 case SSE4A:
2375 Features["sse4a"] = true;
2376 setSSELevel(Features, SSE3, true);
2377 case NoXOP:
2378 break;
2379 }
2380 return;
2381 }
2382
2383 switch (Level) {
2384 case NoXOP:
2385 case SSE4A:
2386 Features["sse4a"] = false;
2387 case FMA4:
2388 Features["fma4"] = false;
2389 case XOP:
2390 Features["xop"] = false;
2391 }
2392}
2393
Craig Topper86d79ef2013-09-17 04:51:29 +00002394void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2395 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002396 // FIXME: This *really* should not be here. We need some way of translating
2397 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002398 if (Name == "sse4")
2399 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002400
Rafael Espindolae62e2792013-08-20 13:44:29 +00002401 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002402
Craig Topper29561122013-09-19 01:13:07 +00002403 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002404 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002405 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002406 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002407 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002408 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002409 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002410 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002411 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002412 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002413 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002414 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002415 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002416 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002417 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002418 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002419 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002420 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002421 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002422 if (Enabled)
2423 setSSELevel(Features, SSE2, Enabled);
2424 } else if (Name == "pclmul") {
2425 if (Enabled)
2426 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002427 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002428 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002429 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002430 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002431 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002432 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002433 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2434 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002435 if (Enabled)
2436 setSSELevel(Features, AVX512F, Enabled);
2437 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002438 if (Enabled)
2439 setSSELevel(Features, AVX, Enabled);
2440 } else if (Name == "fma4") {
2441 setXOPLevel(Features, FMA4, Enabled);
2442 } else if (Name == "xop") {
2443 setXOPLevel(Features, XOP, Enabled);
2444 } else if (Name == "sse4a") {
2445 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002446 } else if (Name == "f16c") {
2447 if (Enabled)
2448 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002449 } else if (Name == "sha") {
2450 if (Enabled)
2451 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002452 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002453}
2454
Eric Christopher3ff21b32013-10-16 21:26:26 +00002455/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002456/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002457bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002458 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002459 // Remember the maximum enabled sselevel.
2460 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2461 // Ignore disabled features.
2462 if (Features[i][0] == '-')
2463 continue;
2464
Benjamin Kramer27402c62012-03-05 15:10:44 +00002465 StringRef Feature = StringRef(Features[i]).substr(1);
2466
2467 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002468 HasAES = true;
2469 continue;
2470 }
2471
Craig Topper3f122a72012-05-31 05:18:48 +00002472 if (Feature == "pclmul") {
2473 HasPCLMUL = true;
2474 continue;
2475 }
2476
Benjamin Kramer27402c62012-03-05 15:10:44 +00002477 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002478 HasLZCNT = true;
2479 continue;
2480 }
2481
Rafael Espindola89049822013-08-23 20:21:37 +00002482 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002483 HasRDRND = true;
2484 continue;
2485 }
2486
Benjamin Kramer27402c62012-03-05 15:10:44 +00002487 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002488 HasBMI = true;
2489 continue;
2490 }
2491
Benjamin Kramer27402c62012-03-05 15:10:44 +00002492 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002493 HasBMI2 = true;
2494 continue;
2495 }
2496
Benjamin Kramer27402c62012-03-05 15:10:44 +00002497 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002498 HasPOPCNT = true;
2499 continue;
2500 }
2501
Michael Liao625a8752012-11-10 05:17:46 +00002502 if (Feature == "rtm") {
2503 HasRTM = true;
2504 continue;
2505 }
2506
Michael Liao74f4eaf2013-03-26 17:52:08 +00002507 if (Feature == "prfchw") {
2508 HasPRFCHW = true;
2509 continue;
2510 }
2511
Michael Liaoffaae352013-03-29 05:17:55 +00002512 if (Feature == "rdseed") {
2513 HasRDSEED = true;
2514 continue;
2515 }
2516
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002517 if (Feature == "tbm") {
2518 HasTBM = true;
2519 continue;
2520 }
2521
Craig Topperbba778b2012-06-03 21:46:30 +00002522 if (Feature == "fma") {
2523 HasFMA = true;
2524 continue;
2525 }
2526
Manman Rena45358c2012-10-11 00:59:55 +00002527 if (Feature == "f16c") {
2528 HasF16C = true;
2529 continue;
2530 }
2531
Craig Topper679b53a2013-08-21 05:29:10 +00002532 if (Feature == "avx512cd") {
2533 HasAVX512CD = true;
2534 continue;
2535 }
2536
2537 if (Feature == "avx512er") {
2538 HasAVX512ER = true;
2539 continue;
2540 }
2541
2542 if (Feature == "avx512pf") {
2543 HasAVX512PF = true;
2544 continue;
2545 }
2546
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002547 if (Feature == "avx512dq") {
2548 HasAVX512DQ = true;
2549 continue;
2550 }
2551
2552 if (Feature == "avx512bw") {
2553 HasAVX512BW = true;
2554 continue;
2555 }
2556
2557 if (Feature == "avx512vl") {
2558 HasAVX512VL = true;
2559 continue;
2560 }
2561
Ben Langmuir58078d02013-09-19 13:22:04 +00002562 if (Feature == "sha") {
2563 HasSHA = true;
2564 continue;
2565 }
2566
Nick Lewycky50e8f482013-10-05 20:14:27 +00002567 if (Feature == "cx16") {
2568 HasCX16 = true;
2569 continue;
2570 }
2571
Daniel Dunbar979586e2009-11-11 09:38:56 +00002572 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002573 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002574 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002575 .Case("avx2", AVX2)
2576 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002577 .Case("sse4.2", SSE42)
2578 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002579 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002580 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002581 .Case("sse2", SSE2)
2582 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002583 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002584 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002585
Eli Friedman33465822011-07-08 23:31:17 +00002586 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002587 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002588 .Case("3dnowa", AMD3DNowAthlon)
2589 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002590 .Case("mmx", MMX)
2591 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002592 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002593
2594 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2595 .Case("xop", XOP)
2596 .Case("fma4", FMA4)
2597 .Case("sse4a", SSE4A)
2598 .Default(NoXOP);
2599 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002600 }
Eli Friedman33465822011-07-08 23:31:17 +00002601
Craig Topper7481d8a2013-09-10 06:55:47 +00002602 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2603 // Can't do this earlier because we need to be able to explicitly enable
2604 // popcnt and still disable sse4.2.
2605 if (!HasPOPCNT && SSELevel >= SSE42 &&
2606 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2607 HasPOPCNT = true;
2608 Features.push_back("+popcnt");
2609 }
2610
Yunzhong Gao61089362013-10-16 19:07:02 +00002611 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2612 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2613 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2614 HasPRFCHW = true;
2615 Features.push_back("+prfchw");
2616 }
2617
Rafael Espindolaeb265472013-08-21 21:59:03 +00002618 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2619 // matches the selected sse level.
2620 if (FPMath == FP_SSE && SSELevel < SSE1) {
2621 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2622 return false;
2623 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2624 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2625 return false;
2626 }
2627
Eli Friedman33465822011-07-08 23:31:17 +00002628 // Don't tell the backend if we're turning off mmx; it will end up disabling
2629 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002630 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2631 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002632 std::vector<std::string>::iterator it;
2633 it = std::find(Features.begin(), Features.end(), "-mmx");
2634 if (it != Features.end())
2635 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002636 else if (SSELevel > NoSSE)
2637 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002638 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002639}
Chris Lattnerecd49032009-03-02 22:27:17 +00002640
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002641/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2642/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002643void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002644 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002645 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002646 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002647 Builder.defineMacro("__amd64__");
2648 Builder.defineMacro("__amd64");
2649 Builder.defineMacro("__x86_64");
2650 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002651 if (getTriple().getArchName() == "x86_64h") {
2652 Builder.defineMacro("__x86_64h");
2653 Builder.defineMacro("__x86_64h__");
2654 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002655 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002656 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002657 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002658
Chris Lattnerecd49032009-03-02 22:27:17 +00002659 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002660 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2661 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002662 switch (CPU) {
2663 case CK_Generic:
2664 break;
2665 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002666 // The rest are coming from the i386 define above.
2667 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002668 break;
2669 case CK_i486:
2670 case CK_WinChipC6:
2671 case CK_WinChip2:
2672 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002673 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002674 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002675 case CK_PentiumMMX:
2676 Builder.defineMacro("__pentium_mmx__");
2677 Builder.defineMacro("__tune_pentium_mmx__");
2678 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002679 case CK_i586:
2680 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002681 defineCPUMacros(Builder, "i586");
2682 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002683 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002684 case CK_Pentium3:
2685 case CK_Pentium3M:
2686 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002687 Builder.defineMacro("__tune_pentium3__");
2688 // Fallthrough
2689 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002690 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002691 Builder.defineMacro("__tune_pentium2__");
2692 // Fallthrough
2693 case CK_PentiumPro:
2694 Builder.defineMacro("__tune_i686__");
2695 Builder.defineMacro("__tune_pentiumpro__");
2696 // Fallthrough
2697 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002698 Builder.defineMacro("__i686");
2699 Builder.defineMacro("__i686__");
2700 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2701 Builder.defineMacro("__pentiumpro");
2702 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002703 break;
2704 case CK_Pentium4:
2705 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002706 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002707 break;
2708 case CK_Yonah:
2709 case CK_Prescott:
2710 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002711 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002712 break;
2713 case CK_Core2:
2714 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002715 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002716 break;
2717 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002718 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002719 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002720 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002721 defineCPUMacros(Builder, "slm");
2722 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002723 case CK_Corei7:
2724 case CK_Corei7AVX:
2725 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002726 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002727 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002728 break;
Craig Topper449314e2013-08-20 07:09:39 +00002729 case CK_KNL:
2730 defineCPUMacros(Builder, "knl");
2731 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002732 case CK_SKX:
2733 defineCPUMacros(Builder, "skx");
2734 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002735 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002736 Builder.defineMacro("__k6_2__");
2737 Builder.defineMacro("__tune_k6_2__");
2738 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002739 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002740 if (CPU != CK_K6_2) { // In case of fallthrough
2741 // FIXME: GCC may be enabling these in cases where some other k6
2742 // architecture is specified but -m3dnow is explicitly provided. The
2743 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002744 Builder.defineMacro("__k6_3__");
2745 Builder.defineMacro("__tune_k6_3__");
2746 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002747 // Fallthrough
2748 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002749 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002750 break;
2751 case CK_Athlon:
2752 case CK_AthlonThunderbird:
2753 case CK_Athlon4:
2754 case CK_AthlonXP:
2755 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002756 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002757 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002758 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002759 Builder.defineMacro("__tune_athlon_sse__");
2760 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002761 break;
2762 case CK_K8:
2763 case CK_K8SSE3:
2764 case CK_x86_64:
2765 case CK_Opteron:
2766 case CK_OpteronSSE3:
2767 case CK_Athlon64:
2768 case CK_Athlon64SSE3:
2769 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002770 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002771 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002772 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002773 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002774 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002775 case CK_BTVER1:
2776 defineCPUMacros(Builder, "btver1");
2777 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002778 case CK_BTVER2:
2779 defineCPUMacros(Builder, "btver2");
2780 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002781 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002782 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002783 break;
2784 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002785 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002786 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002787 case CK_BDVER3:
2788 defineCPUMacros(Builder, "bdver3");
2789 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002790 case CK_BDVER4:
2791 defineCPUMacros(Builder, "bdver4");
2792 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002793 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002794 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002795 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002796 }
Chris Lattner96e43572009-03-02 22:40:39 +00002797
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002798 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002799 Builder.defineMacro("__REGISTER_PREFIX__", "");
2800
Chris Lattner6df41af2009-04-19 17:32:33 +00002801 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2802 // functions in glibc header files that use FP Stack inline asm which the
2803 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002804 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002805
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002806 if (HasAES)
2807 Builder.defineMacro("__AES__");
2808
Craig Topper3f122a72012-05-31 05:18:48 +00002809 if (HasPCLMUL)
2810 Builder.defineMacro("__PCLMUL__");
2811
Craig Topper22967d42011-12-25 05:06:45 +00002812 if (HasLZCNT)
2813 Builder.defineMacro("__LZCNT__");
2814
Benjamin Kramer1e250392012-07-07 09:39:18 +00002815 if (HasRDRND)
2816 Builder.defineMacro("__RDRND__");
2817
Craig Topper22967d42011-12-25 05:06:45 +00002818 if (HasBMI)
2819 Builder.defineMacro("__BMI__");
2820
2821 if (HasBMI2)
2822 Builder.defineMacro("__BMI2__");
2823
Craig Topper1de83482011-12-29 16:10:46 +00002824 if (HasPOPCNT)
2825 Builder.defineMacro("__POPCNT__");
2826
Michael Liao625a8752012-11-10 05:17:46 +00002827 if (HasRTM)
2828 Builder.defineMacro("__RTM__");
2829
Michael Liao74f4eaf2013-03-26 17:52:08 +00002830 if (HasPRFCHW)
2831 Builder.defineMacro("__PRFCHW__");
2832
Michael Liaoffaae352013-03-29 05:17:55 +00002833 if (HasRDSEED)
2834 Builder.defineMacro("__RDSEED__");
2835
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002836 if (HasTBM)
2837 Builder.defineMacro("__TBM__");
2838
Rafael Espindolae62e2792013-08-20 13:44:29 +00002839 switch (XOPLevel) {
2840 case XOP:
2841 Builder.defineMacro("__XOP__");
2842 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002843 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002844 case SSE4A:
2845 Builder.defineMacro("__SSE4A__");
2846 case NoXOP:
2847 break;
2848 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002849
Craig Topperbba778b2012-06-03 21:46:30 +00002850 if (HasFMA)
2851 Builder.defineMacro("__FMA__");
2852
Manman Rena45358c2012-10-11 00:59:55 +00002853 if (HasF16C)
2854 Builder.defineMacro("__F16C__");
2855
Craig Topper679b53a2013-08-21 05:29:10 +00002856 if (HasAVX512CD)
2857 Builder.defineMacro("__AVX512CD__");
2858 if (HasAVX512ER)
2859 Builder.defineMacro("__AVX512ER__");
2860 if (HasAVX512PF)
2861 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002862 if (HasAVX512DQ)
2863 Builder.defineMacro("__AVX512DQ__");
2864 if (HasAVX512BW)
2865 Builder.defineMacro("__AVX512BW__");
2866 if (HasAVX512VL)
2867 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002868
Ben Langmuir58078d02013-09-19 13:22:04 +00002869 if (HasSHA)
2870 Builder.defineMacro("__SHA__");
2871
Nick Lewycky50e8f482013-10-05 20:14:27 +00002872 if (HasCX16)
2873 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2874
Chris Lattner96e43572009-03-02 22:40:39 +00002875 // Each case falls through to the previous one here.
2876 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002877 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002878 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002879 case AVX2:
2880 Builder.defineMacro("__AVX2__");
2881 case AVX:
2882 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002883 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002884 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002885 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002886 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002887 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002888 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002889 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002890 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002891 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002892 Builder.defineMacro("__SSE2__");
2893 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002894 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002895 Builder.defineMacro("__SSE__");
2896 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002897 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002898 break;
2899 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002900
Derek Schuffc7dd7222012-10-11 15:52:22 +00002901 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002902 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002903 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002904 case AVX2:
2905 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002906 case SSE42:
2907 case SSE41:
2908 case SSSE3:
2909 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002910 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002911 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002912 break;
2913 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002914 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002915 break;
2916 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002917 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002918 }
2919 }
2920
Anders Carlssone437c682010-01-27 03:47:49 +00002921 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002922 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002923 case AMD3DNowAthlon:
2924 Builder.defineMacro("__3dNOW_A__");
2925 case AMD3DNow:
2926 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002927 case MMX:
2928 Builder.defineMacro("__MMX__");
2929 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002930 break;
2931 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002932
2933 if (CPU >= CK_i486) {
2934 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2935 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2936 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2937 }
2938 if (CPU >= CK_i586)
2939 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002940}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002941
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002942bool X86TargetInfo::hasFeature(StringRef Feature) const {
2943 return llvm::StringSwitch<bool>(Feature)
2944 .Case("aes", HasAES)
2945 .Case("avx", SSELevel >= AVX)
2946 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002947 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002948 .Case("avx512cd", HasAVX512CD)
2949 .Case("avx512er", HasAVX512ER)
2950 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002951 .Case("avx512dq", HasAVX512DQ)
2952 .Case("avx512bw", HasAVX512BW)
2953 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002954 .Case("bmi", HasBMI)
2955 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002956 .Case("cx16", HasCX16)
2957 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002958 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002959 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002960 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002961 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002962 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002963 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2964 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2965 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002966 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002967 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002968 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002969 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002970 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002971 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002972 .Case("sse", SSELevel >= SSE1)
2973 .Case("sse2", SSELevel >= SSE2)
2974 .Case("sse3", SSELevel >= SSE3)
2975 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002976 .Case("sse4.1", SSELevel >= SSE41)
2977 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002978 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002979 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002980 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2981 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002982 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002983 .Default(false);
2984}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002985
Eli Friedman3fd920a2008-08-20 02:34:37 +00002986bool
Anders Carlsson58436352009-02-28 17:11:49 +00002987X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002988 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002989 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002990 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002991 case 'Y': // first letter of a pair:
2992 switch (*(Name+1)) {
2993 default: return false;
2994 case '0': // First SSE register.
2995 case 't': // Any SSE register, when SSE2 is enabled.
2996 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2997 case 'm': // any MMX register, when inter-unit moves enabled.
2998 break; // falls through to setAllowsRegister.
2999 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003000 case 'f': // any x87 floating point stack register.
3001 // Constraint 'f' cannot be used for output operands.
3002 if (Info.ConstraintStr[0] == '=')
3003 return false;
3004
3005 Info.setAllowsRegister();
3006 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003007 case 'a': // eax.
3008 case 'b': // ebx.
3009 case 'c': // ecx.
3010 case 'd': // edx.
3011 case 'S': // esi.
3012 case 'D': // edi.
3013 case 'A': // edx:eax.
3014 case 't': // top of floating point stack.
3015 case 'u': // second from top of floating point stack.
3016 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003017 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003018 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003019 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003020 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3021 case 'l': // "Index" registers: any general register that can be used as an
3022 // index in a base+index memory access.
3023 Info.setAllowsRegister();
3024 return true;
3025 case 'C': // SSE floating point constant.
3026 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003027 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003028 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003029 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003030 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003031 return true;
3032 }
3033}
3034
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003035
Eli Friedman3fd920a2008-08-20 02:34:37 +00003036std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003037X86TargetInfo::convertConstraint(const char *&Constraint) const {
3038 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003039 case 'a': return std::string("{ax}");
3040 case 'b': return std::string("{bx}");
3041 case 'c': return std::string("{cx}");
3042 case 'd': return std::string("{dx}");
3043 case 'S': return std::string("{si}");
3044 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003045 case 'p': // address
3046 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003047 case 't': // top of floating point stack.
3048 return std::string("{st}");
3049 case 'u': // second from top of floating point stack.
3050 return std::string("{st(1)}"); // second from top of floating point stack.
3051 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003052 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003053 }
3054}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003055} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003056
3057namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003058// X86-32 generic target
3059class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003060public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003061 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003062 DoubleAlign = LongLongAlign = 32;
3063 LongDoubleWidth = 96;
3064 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003065 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003066 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003067 SizeType = UnsignedInt;
3068 PtrDiffType = SignedInt;
3069 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003070 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003071
3072 // Use fpret for all types.
3073 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3074 (1 << TargetInfo::Double) |
3075 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003076
3077 // x86-32 has atomics up to 8 bytes
3078 // FIXME: Check that we actually have cmpxchg8b before setting
3079 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3080 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003081 }
Craig Topper3164f332014-03-11 03:39:26 +00003082 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003083 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003084 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003085
Craig Topper3164f332014-03-11 03:39:26 +00003086 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003087 if (RegNo == 0) return 0;
3088 if (RegNo == 1) return 2;
3089 return -1;
3090 }
Craig Topper3164f332014-03-11 03:39:26 +00003091 bool validateInputSize(StringRef Constraint,
3092 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003093 switch (Constraint[0]) {
3094 default: break;
3095 case 'a':
3096 case 'b':
3097 case 'c':
3098 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003099 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00003100 }
3101
3102 return true;
3103 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003104};
3105} // end anonymous namespace
3106
3107namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003108class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3109public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003110 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3111 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003112
Craig Topper3164f332014-03-11 03:39:26 +00003113 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003114 unsigned Major, Minor, Micro;
3115 getTriple().getOSVersion(Major, Minor, Micro);
3116 // New NetBSD uses the default rounding mode.
3117 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3118 return X86_32TargetInfo::getFloatEvalMethod();
3119 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003120 return 1;
3121 }
3122};
3123} // end anonymous namespace
3124
3125namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003126class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3127public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003128 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3129 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003130 SizeType = UnsignedLong;
3131 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003132 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003133 }
3134};
3135} // end anonymous namespace
3136
3137namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003138class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3139public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003140 BitrigI386TargetInfo(const llvm::Triple &Triple)
3141 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003142 SizeType = UnsignedLong;
3143 IntPtrType = SignedLong;
3144 PtrDiffType = SignedLong;
3145 }
3146};
3147} // end anonymous namespace
3148
3149namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003150class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003151public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003152 DarwinI386TargetInfo(const llvm::Triple &Triple)
3153 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003154 LongDoubleWidth = 128;
3155 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003156 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003157 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003158 SizeType = UnsignedLong;
3159 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003160 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003161 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003162 }
3163
Eli Friedman3fd920a2008-08-20 02:34:37 +00003164};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003165} // end anonymous namespace
3166
3167namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003168// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003169class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003170public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003171 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3172 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003173 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003174 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003175 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003176 }
Craig Topper3164f332014-03-11 03:39:26 +00003177 void getTargetDefines(const LangOptions &Opts,
3178 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003179 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3180 }
3181};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003182
3183// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003184class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003185public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003186 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003187 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003188 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003189 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3190 }
Craig Topper3164f332014-03-11 03:39:26 +00003191 void getTargetDefines(const LangOptions &Opts,
3192 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003193 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3194 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3195 // The value of the following reflects processor type.
3196 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3197 // We lost the original triple, so we use the default.
3198 Builder.defineMacro("_M_IX86", "600");
3199 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003200};
3201} // end anonymous namespace
3202
Reid Kleckner47606832014-04-21 20:58:00 +00003203static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3204 Builder.defineMacro("__MSVCRT__");
3205 Builder.defineMacro("__MINGW32__");
3206
3207 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3208 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3209 // macro anyway for pre-processor compatibility.
3210 if (Opts.MicrosoftExt)
3211 Builder.defineMacro("__declspec", "__declspec");
3212 else
3213 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3214
3215 if (!Opts.MicrosoftExt) {
3216 // Provide macros for all the calling convention keywords. Provide both
3217 // single and double underscore prefixed variants. These are available on
3218 // x64 as well as x86, even though they have no effect.
3219 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3220 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003221 std::string GCCSpelling = "__attribute__((__";
3222 GCCSpelling += CC;
3223 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003224 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3225 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3226 }
3227 }
3228}
3229
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003230namespace {
3231// x86-32 MinGW target
3232class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3233public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003234 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3235 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003236 void getTargetDefines(const LangOptions &Opts,
3237 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003238 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003239 DefineStd(Builder, "WIN32", Opts);
3240 DefineStd(Builder, "WINNT", Opts);
3241 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003242 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003243 }
3244};
3245} // end anonymous namespace
3246
3247namespace {
3248// x86-32 Cygwin target
3249class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3250public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003251 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3252 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003253 TLSSupported = false;
3254 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003255 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003256 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003257 }
Craig Topper3164f332014-03-11 03:39:26 +00003258 void getTargetDefines(const LangOptions &Opts,
3259 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003260 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003261 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003262 Builder.defineMacro("__CYGWIN__");
3263 Builder.defineMacro("__CYGWIN32__");
3264 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003265 if (Opts.CPlusPlus)
3266 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003267 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003268};
3269} // end anonymous namespace
3270
3271namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003272// x86-32 Haiku target
3273class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3274public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003275 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003276 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003277 IntPtrType = SignedLong;
3278 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003279 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003280 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003281 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003282 }
Craig Topper3164f332014-03-11 03:39:26 +00003283 void getTargetDefines(const LangOptions &Opts,
3284 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003285 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3286 Builder.defineMacro("__INTEL__");
3287 Builder.defineMacro("__HAIKU__");
3288 }
3289};
3290} // end anonymous namespace
3291
Douglas Gregor9fabd852011-07-01 22:41:14 +00003292// RTEMS Target
3293template<typename Target>
3294class RTEMSTargetInfo : public OSTargetInfo<Target> {
3295protected:
Craig Topper3164f332014-03-11 03:39:26 +00003296 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3297 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003298 // RTEMS defines; list based off of gcc output
3299
Douglas Gregor9fabd852011-07-01 22:41:14 +00003300 Builder.defineMacro("__rtems__");
3301 Builder.defineMacro("__ELF__");
3302 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003303
Douglas Gregor9fabd852011-07-01 22:41:14 +00003304public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003305 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3306 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003307
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003308 switch (Triple.getArch()) {
3309 default:
3310 case llvm::Triple::x86:
3311 // this->MCountName = ".mcount";
3312 break;
3313 case llvm::Triple::mips:
3314 case llvm::Triple::mipsel:
3315 case llvm::Triple::ppc:
3316 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003317 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003318 // this->MCountName = "_mcount";
3319 break;
3320 case llvm::Triple::arm:
3321 // this->MCountName = "__mcount";
3322 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003323 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003324 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003325};
3326
3327namespace {
3328// x86-32 RTEMS target
3329class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3330public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003331 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003332 SizeType = UnsignedLong;
3333 IntPtrType = SignedLong;
3334 PtrDiffType = SignedLong;
3335 this->UserLabelPrefix = "";
3336 }
Craig Topper3164f332014-03-11 03:39:26 +00003337 void getTargetDefines(const LangOptions &Opts,
3338 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003339 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3340 Builder.defineMacro("__INTEL__");
3341 Builder.defineMacro("__rtems__");
3342 }
3343};
3344} // end anonymous namespace
3345
Chris Lattnerb986aba2010-04-11 19:29:39 +00003346namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003347// x86-64 generic target
3348class X86_64TargetInfo : public X86TargetInfo {
3349public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003350 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003351 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003352 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003353 LongDoubleWidth = 128;
3354 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003355 LargeArrayMinWidth = 128;
3356 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003357 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003358 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3359 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3360 IntPtrType = IsX32 ? SignedInt : SignedLong;
3361 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003362 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003363 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003364
Zinovy Nis1db95732014-07-10 15:27:19 +00003365 DescriptionString = (IsX32)
3366 ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3367 : "e-m:e-" "i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003368
3369 // Use fpret only for long double.
3370 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003371
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003372 // Use fp2ret for _Complex long double.
3373 ComplexLongDoubleUsesFP2Ret = true;
3374
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003375 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003376 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003377 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003378 }
Craig Topper3164f332014-03-11 03:39:26 +00003379 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003380 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003381 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003382
Craig Topper3164f332014-03-11 03:39:26 +00003383 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003384 if (RegNo == 0) return 0;
3385 if (RegNo == 1) return 1;
3386 return -1;
3387 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003388
Craig Topper3164f332014-03-11 03:39:26 +00003389 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003390 return (CC == CC_C ||
3391 CC == CC_IntelOclBicc ||
3392 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003393 }
3394
Craig Topper3164f332014-03-11 03:39:26 +00003395 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003396 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003397 }
3398
Pavel Chupinfd223e12014-08-04 12:39:43 +00003399 // for x32 we need it here explicitly
3400 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003401};
3402} // end anonymous namespace
3403
3404namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003405// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003406class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003407public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003408 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3409 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003410 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003411 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003412 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003413 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003414 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003415 SizeType = UnsignedLongLong;
3416 PtrDiffType = SignedLongLong;
3417 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003418 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003419 }
Craig Topper3164f332014-03-11 03:39:26 +00003420 void getTargetDefines(const LangOptions &Opts,
3421 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003422 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003423 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003424 }
Craig Topper3164f332014-03-11 03:39:26 +00003425 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003426 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003427 }
Craig Topper3164f332014-03-11 03:39:26 +00003428 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003429 return (CC == CC_C ||
3430 CC == CC_IntelOclBicc ||
3431 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3432 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003433};
3434} // end anonymous namespace
3435
3436namespace {
3437// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003438class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003439public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003440 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003441 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003442 LongDoubleWidth = LongDoubleAlign = 64;
3443 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003444 }
Craig Topper3164f332014-03-11 03:39:26 +00003445 void getTargetDefines(const LangOptions &Opts,
3446 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003447 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3448 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003449 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003450 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003451 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003452};
3453} // end anonymous namespace
3454
3455namespace {
3456// x86-64 MinGW target
3457class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3458public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003459 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3460 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003461 void getTargetDefines(const LangOptions &Opts,
3462 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003463 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003464 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003465 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003466 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003467 }
3468};
3469} // end anonymous namespace
3470
3471namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003472class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3473public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003474 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3475 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003476 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003477 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003478 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3479 llvm::Triple T = llvm::Triple(Triple);
3480 if (T.getOS() == llvm::Triple::IOS)
3481 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003482 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003483 }
3484};
3485} // end anonymous namespace
3486
3487namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003488class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3489public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003490 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3491 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003492 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003493 Int64Type = SignedLongLong;
3494 }
3495};
3496} // end anonymous namespace
3497
3498namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003499class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3500public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003501 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3502 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3503 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003504 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003505 }
3506};
Tim Northover9bb857a2013-01-31 12:13:10 +00003507}
3508
Eli Friedman9fa28852012-08-08 23:57:20 +00003509
3510namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003511class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003512 // Possible FPU choices.
3513 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003514 VFP2FPU = (1 << 0),
3515 VFP3FPU = (1 << 1),
3516 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003517 NeonFPU = (1 << 3),
3518 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003519 };
3520
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003521 // Possible HWDiv features.
3522 enum HWDivMode {
3523 HWDivThumb = (1 << 0),
3524 HWDivARM = (1 << 1)
3525 };
3526
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003527 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003528 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003529 }
3530
3531 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3532 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003533
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003534 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003535
Rafael Espindolaeb265472013-08-21 21:59:03 +00003536 enum {
3537 FP_Default,
3538 FP_VFP,
3539 FP_Neon
3540 } FPMath;
3541
Bernard Ogdenda13af32013-10-24 18:32:51 +00003542 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003543
Logan Chien57086ce2012-10-10 06:56:20 +00003544 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003545 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003546 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003547
3548 // Initialized via features.
3549 unsigned SoftFloat : 1;
3550 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003551
Bernard Ogden18b57012013-10-29 09:47:51 +00003552 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003553 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003554
Chris Lattner5cc15e02010-03-03 19:03:45 +00003555 static const Builtin::Info BuiltinInfo[];
3556
Rafael Espindola101d5b92013-05-13 20:09:47 +00003557 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003558 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003559 if (T.getArch() == llvm::Triple::arm ||
3560 T.getArch() == llvm::Triple::armeb) {
3561 StringRef VersionStr;
3562 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003563 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003564 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003565 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003566 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003567 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003568 unsigned Version;
3569 if (VersionStr.getAsInteger(10, Version))
3570 return false;
3571 return Version >= 6;
3572 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003573 assert(T.getArch() == llvm::Triple::thumb ||
3574 T.getArch() == llvm::Triple::thumbeb);
3575 StringRef VersionStr;
3576 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003577 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003578 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003579 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003580 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003581 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003582 unsigned Version;
3583 if (VersionStr.getAsInteger(10, Version))
3584 return false;
3585 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003586 }
3587
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003588 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003589 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003590
3591 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003592 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003593
Tim Northover00853e52014-08-05 11:07:26 +00003594 // size_t is unsigned long on MachO-derived environments and NetBSD.
3595 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003596 SizeType = UnsignedLong;
3597 else
3598 SizeType = UnsignedInt;
3599
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003600 switch (T.getOS()) {
3601 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003602 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003603 break;
3604 case llvm::Triple::Win32:
3605 WCharType = UnsignedShort;
3606 break;
3607 case llvm::Triple::Linux:
3608 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003609 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3610 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003611 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003612 }
3613
3614 UseBitFieldTypeAlignment = true;
3615
3616 ZeroLengthBitfieldBoundary = 0;
3617
3618 if (IsThumb) {
3619 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3620 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003621 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003622 DescriptionString = BigEndian ?
3623 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3624 "v128:64:128-a:0:32-n32-S64" :
3625 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3626 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003627 } else if (T.isOSWindows()) {
3628 // FIXME: this is invalid for WindowsCE
3629 assert(!BigEndian && "Windows on ARM does not support big endian");
3630 DescriptionString = "e"
3631 "-m:e"
3632 "-p:32:32"
3633 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3634 "-v128:64:128"
3635 "-a:0:32"
3636 "-n32"
3637 "-S64";
3638 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003639 DescriptionString = BigEndian ?
3640 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3641 "v128:64:128-a:0:32-n32-S64" :
3642 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3643 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003644 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003645 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003646 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003647 DescriptionString = BigEndian ?
3648 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3649 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003650 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003651 DescriptionString = BigEndian ?
3652 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3653 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003654 }
3655
3656 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003657 }
3658
3659 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003660 const llvm::Triple &T = getTriple();
3661
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003662 IsAAPCS = false;
3663
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003664 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003665
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003666 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003667 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003668 SizeType = UnsignedInt;
3669 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003670 SizeType = UnsignedLong;
3671
3672 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3673 WCharType = SignedInt;
3674
3675 // Do not respect the alignment of bit-field types when laying out
3676 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3677 UseBitFieldTypeAlignment = false;
3678
3679 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3680 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3681 /// gcc.
3682 ZeroLengthBitfieldBoundary = 32;
3683
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003684 if (IsThumb) {
3685 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3686 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003687 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003688 DescriptionString = BigEndian ?
3689 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3690 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3691 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3692 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003693 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003694 DescriptionString = BigEndian ?
3695 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3696 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3697 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3698 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003699 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003700 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003701 DescriptionString = BigEndian ?
3702 "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
Rafael Espindolac418ae92014-01-03 19:22:05 +00003703 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3704 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003705 DescriptionString = BigEndian ?
3706 "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
Rafael Espindolac418ae92014-01-03 19:22:05 +00003707 "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 +00003708 }
3709
3710 // FIXME: Override "preferred align" for double and long long.
3711 }
3712
Chris Lattner17df24e2008-04-21 18:56:49 +00003713public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003714 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003715 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3716 IsAAPCS(true) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003717 BigEndian = IsBigEndian;
3718
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003719 switch (getTriple().getOS()) {
3720 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003721 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003722 break;
3723 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003724 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003725 break;
3726 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003727
Chris Lattner1a8f3942010-04-23 16:29:58 +00003728 // {} in inline assembly are neon specifiers, not assembly variant
3729 // specifiers.
3730 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003731
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003732 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003733 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003734
3735 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003736
3737 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003738 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003739
3740 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003741 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003742 if (shouldUseInlineAtomic(getTriple()))
3743 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003744
3745 // Do force alignment of members that follow zero length bitfields. If
3746 // the alignment of the zero-length bitfield is greater than the member
3747 // that follows it, `bar', `bar' will be aligned as the type of the
3748 // zero length bitfield.
3749 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003750 }
Alp Toker4925ba72014-06-07 23:30:42 +00003751 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003752 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003753 ABI = Name;
3754
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003755 // The defaults (above) are for AAPCS, check if we need to change them.
3756 //
3757 // FIXME: We need support for -meabi... we could just mangle it into the
3758 // name.
3759 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003760 setABIAPCS();
3761 return true;
3762 }
3763 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3764 setABIAAPCS();
3765 return true;
3766 }
3767 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003768 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003769
Craig Topper3164f332014-03-11 03:39:26 +00003770 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003771 if (IsAAPCS)
3772 Features["aapcs"] = true;
3773 else
3774 Features["apcs"] = true;
3775
Silviu Barangae5690462013-10-21 10:59:33 +00003776 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003777 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3778 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003779 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3780 CPU == "cortex-a9-mp") {
3781 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003782 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003783 }
3784 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003785 Features["vfp4"] = true;
3786 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003787 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3788 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3789 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003790 Features["vfp4"] = true;
3791 Features["neon"] = true;
3792 Features["hwdiv"] = true;
3793 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003794 } else if (CPU == "cyclone") {
3795 Features["v8fp"] = true;
3796 Features["neon"] = true;
3797 Features["hwdiv"] = true;
3798 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003799 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3800 Features["fp-armv8"] = true;
3801 Features["neon"] = true;
3802 Features["hwdiv"] = true;
3803 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003804 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003805 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003806 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003807 // Enable the hwdiv extension for all v8a AArch32 cores by
3808 // default.
3809 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003810 ArchName == "armebv8a" || ArchName == "armebv8" ||
3811 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3812 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003813 Features["hwdiv"] = true;
3814 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003815 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3816 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003817 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003818 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003819
Craig Topper3164f332014-03-11 03:39:26 +00003820 bool handleTargetFeatures(std::vector<std::string> &Features,
3821 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003822 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003823 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003824 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003825 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003826 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003827 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3828 if (Features[i] == "+soft-float")
3829 SoftFloat = true;
3830 else if (Features[i] == "+soft-float-abi")
3831 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003832 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003833 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003834 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003835 FPU |= VFP3FPU;
3836 else if (Features[i] == "+vfp4")
3837 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003838 else if (Features[i] == "+fp-armv8")
3839 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003840 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003841 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003842 else if (Features[i] == "+hwdiv")
3843 HWDiv |= HWDivThumb;
3844 else if (Features[i] == "+hwdiv-arm")
3845 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003846 else if (Features[i] == "+crc")
3847 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00003848 else if (Features[i] == "+crypto")
3849 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003850 }
3851
Rafael Espindolaeb265472013-08-21 21:59:03 +00003852 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3853 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3854 return false;
3855 }
3856
3857 if (FPMath == FP_Neon)
3858 Features.push_back("+neonfp");
3859 else if (FPMath == FP_VFP)
3860 Features.push_back("-neonfp");
3861
Daniel Dunbar893d4752009-12-19 04:15:38 +00003862 // Remove front-end specific options which the backend handles differently.
3863 std::vector<std::string>::iterator it;
3864 it = std::find(Features.begin(), Features.end(), "+soft-float");
3865 if (it != Features.end())
3866 Features.erase(it);
3867 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3868 if (it != Features.end())
3869 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003870 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003871 }
3872
Craig Topper3164f332014-03-11 03:39:26 +00003873 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003874 return llvm::StringSwitch<bool>(Feature)
3875 .Case("arm", true)
3876 .Case("softfloat", SoftFloat)
3877 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003878 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003879 .Case("hwdiv", HWDiv & HWDivThumb)
3880 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003881 .Default(false);
3882 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003883 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003884 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003885 return llvm::StringSwitch<const char*>(Name)
3886 .Cases("arm8", "arm810", "4")
3887 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3888 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3889 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3890 .Case("ep9312", "4T")
3891 .Cases("arm10tdmi", "arm1020t", "5T")
3892 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3893 .Case("arm926ej-s", "5TEJ")
3894 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3895 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003896 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003897 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003898 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003899 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003900 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003901 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003902 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003903 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00003904 .Case("cyclone", "8A")
Jim Grosbachbe83cb82014-06-26 17:24:16 +00003905 .Case("cortex-m3", "7M")
3906 .Case("cortex-m4", "7EM")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003907 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003908 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00003909 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003910 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003911 static const char *getCPUProfile(StringRef Name) {
3912 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003913 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003914 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003915 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003916 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003917 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003918 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003919 }
Craig Topper3164f332014-03-11 03:39:26 +00003920 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003921 if (!getCPUDefineSuffix(Name))
3922 return false;
3923
Tim Northovere8c37212014-07-09 09:24:43 +00003924 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
3925 StringRef Profile = getCPUProfile(Name);
3926 if (Profile == "M" && MaxAtomicInlineWidth) {
3927 MaxAtomicPromoteWidth = 32;
3928 MaxAtomicInlineWidth = 32;
3929 }
3930
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003931 CPU = Name;
3932 return true;
3933 }
Craig Topper3164f332014-03-11 03:39:26 +00003934 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003935 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
3936 unsigned CPUArchVer) const {
3937 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
3938 (CPUArch.find('M') != StringRef::npos);
3939 }
3940 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
3941 unsigned CPUArchVer) const {
3942 // We check both CPUArchVer and ArchName because when only triple is
3943 // specified, the default CPU is arm1136j-s.
3944 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
3945 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
3946 }
Craig Topper3164f332014-03-11 03:39:26 +00003947 void getTargetDefines(const LangOptions &Opts,
3948 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00003949 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003950 Builder.defineMacro("__arm");
3951 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003952
Chris Lattnerecd49032009-03-02 22:27:17 +00003953 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003954 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003955
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003956 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003957 unsigned int CPUArchVer;
3958 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3959 llvm_unreachable("Invalid char for architecture version number");
3960 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003961 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003962
3963 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003964 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003965 StringRef ArchName = getTriple().getArchName();
3966
3967 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
3968 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3969
3970 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
3971 // is not defined for the M-profile.
3972 // NOTE that the deffault profile is assumed to be 'A'
3973 if (CPUProfile.empty() || CPUProfile != "M")
3974 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
3975
3976 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
3977 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
3978 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
3979 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
3980 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
3981 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
3982 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
3983
3984 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
3985 // instruction set such as ARM or Thumb.
3986 Builder.defineMacro("__ARM_32BIT_STATE", "1");
3987
3988 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
3989
3990 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003991 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003992 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00003993
Yi Konga44c4d72014-06-27 21:25:42 +00003994 // ACLE predefines.
3995 Builder.defineMacro("__ARM_ACLE", "200");
3996
Mike Stump9d54bd72009-04-08 02:07:04 +00003997 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003998
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003999 // FIXME: It's more complicated than this and we don't really support
4000 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004001 // Windows on ARM does not "support" interworking
4002 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004003 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004004
David Tweed8f676532012-10-25 13:33:01 +00004005 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004006 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004007 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4008 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004009 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004010 Builder.defineMacro("__ARM_PCS", "1");
4011
David Tweed8f676532012-10-25 13:33:01 +00004012 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004013 Builder.defineMacro("__ARM_PCS_VFP", "1");
4014 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004015
Daniel Dunbar893d4752009-12-19 04:15:38 +00004016 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004017 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004018
4019 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004020 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004021
4022 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004023 Builder.defineMacro("__THUMBEL__");
4024 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004025 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004026 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004027 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004028 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4029 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004030
4031 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004032 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004033
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004034 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004035 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004036 if (FPU & VFP2FPU)
4037 Builder.defineMacro("__ARM_VFPV2__");
4038 if (FPU & VFP3FPU)
4039 Builder.defineMacro("__ARM_VFPV3__");
4040 if (FPU & VFP4FPU)
4041 Builder.defineMacro("__ARM_VFPV4__");
4042 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004043
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004044 // This only gets set when Neon instructions are actually available, unlike
4045 // the VFP define, hence the soft float and arch check. This is subtly
4046 // different from gcc, we follow the intent which was that it should be set
4047 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004048 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4049 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004050 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004051 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004052
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004053 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4054 Opts.ShortWChar ? "2" : "4");
4055
4056 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4057 Opts.ShortEnums ? "1" : "4");
4058
Bernard Ogden18b57012013-10-29 09:47:51 +00004059 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004060 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004061
Tim Northover02e38602014-02-03 17:28:04 +00004062 if (Crypto)
4063 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4064
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004065 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004066 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4067 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4068 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4069 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4070 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004071 }
Craig Topper3164f332014-03-11 03:39:26 +00004072 void getTargetBuiltins(const Builtin::Info *&Records,
4073 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004074 Records = BuiltinInfo;
4075 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004076 }
Craig Topper3164f332014-03-11 03:39:26 +00004077 bool isCLZForZeroUndef() const override { return false; }
4078 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004079 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004080 }
Craig Topper3164f332014-03-11 03:39:26 +00004081 void getGCCRegNames(const char * const *&Names,
4082 unsigned &NumNames) const override;
4083 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4084 unsigned &NumAliases) const override;
4085 bool validateAsmConstraint(const char *&Name,
4086 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004087 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004088 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004089 case 'l': // r0-r7
4090 case 'h': // r8-r15
4091 case 'w': // VFP Floating point register single precision
4092 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004093 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004094 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004095 case 'Q': // A memory address that is a single base register.
4096 Info.setAllowsMemory();
4097 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004098 case 'U': // a memory reference...
4099 switch (Name[1]) {
4100 case 'q': // ...ARMV4 ldrsb
4101 case 'v': // ...VFP load/store (reg+constant offset)
4102 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004103 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004104 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004105 case 'n': // valid address for Neon doubleword vector load/store
4106 case 'm': // valid address for Neon element and structure load/store
4107 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004108 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004109 Info.setAllowsMemory();
4110 Name++;
4111 return true;
4112 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004113 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004114 return false;
4115 }
Craig Topper3164f332014-03-11 03:39:26 +00004116 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004117 std::string R;
4118 switch (*Constraint) {
4119 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004120 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004121 Constraint++;
4122 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004123 case 'p': // 'p' should be translated to 'r' by default.
4124 R = std::string("r");
4125 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004126 default:
4127 return std::string(1, *Constraint);
4128 }
4129 return R;
4130 }
Craig Topper3164f332014-03-11 03:39:26 +00004131 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4132 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004133 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004134 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004135
Bill Wendling9d1ee112012-10-25 23:28:48 +00004136 // Strip off constraint modifiers.
4137 while (Constraint[0] == '=' ||
4138 Constraint[0] == '+' ||
4139 Constraint[0] == '&')
4140 Constraint = Constraint.substr(1);
4141
4142 switch (Constraint[0]) {
4143 default: break;
4144 case 'r': {
4145 switch (Modifier) {
4146 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004147 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004148 case 'q':
4149 // A register of size 32 cannot fit a vector type.
4150 return false;
4151 }
4152 }
4153 }
4154
4155 return true;
4156 }
Craig Topper3164f332014-03-11 03:39:26 +00004157 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004158 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004159 return "";
4160 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004161
Craig Topper3164f332014-03-11 03:39:26 +00004162 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004163 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4164 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004165
Craig Topper3164f332014-03-11 03:39:26 +00004166 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004167 if (RegNo == 0) return 0;
4168 if (RegNo == 1) return 1;
4169 return -1;
4170 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004171};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004172
Rafael Espindolaeb265472013-08-21 21:59:03 +00004173bool ARMTargetInfo::setFPMath(StringRef Name) {
4174 if (Name == "neon") {
4175 FPMath = FP_Neon;
4176 return true;
4177 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4178 Name == "vfp4") {
4179 FPMath = FP_VFP;
4180 return true;
4181 }
4182 return false;
4183}
4184
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004185const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004186 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004187 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004188 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4189
4190 // Float registers
4191 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4192 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4193 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004194 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004195
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004196 // Double registers
4197 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4198 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004199 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4200 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004201
4202 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004203 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4204 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004205};
4206
4207void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004208 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004209 Names = GCCRegNames;
4210 NumNames = llvm::array_lengthof(GCCRegNames);
4211}
4212
4213const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004214 { { "a1" }, "r0" },
4215 { { "a2" }, "r1" },
4216 { { "a3" }, "r2" },
4217 { { "a4" }, "r3" },
4218 { { "v1" }, "r4" },
4219 { { "v2" }, "r5" },
4220 { { "v3" }, "r6" },
4221 { { "v4" }, "r7" },
4222 { { "v5" }, "r8" },
4223 { { "v6", "rfp" }, "r9" },
4224 { { "sl" }, "r10" },
4225 { { "fp" }, "r11" },
4226 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004227 { { "r13" }, "sp" },
4228 { { "r14" }, "lr" },
4229 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004230 // The S, D and Q registers overlap, but aren't really aliases; we
4231 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004232};
4233
4234void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4235 unsigned &NumAliases) const {
4236 Aliases = GCCRegAliases;
4237 NumAliases = llvm::array_lengthof(GCCRegAliases);
4238}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004239
4240const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004241#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004242#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004243 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004244#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004245
4246#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004247#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004248#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4249 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004250#include "clang/Basic/BuiltinsARM.def"
4251};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004252
4253class ARMleTargetInfo : public ARMTargetInfo {
4254public:
4255 ARMleTargetInfo(const llvm::Triple &Triple)
4256 : ARMTargetInfo(Triple, false) { }
4257 virtual void getTargetDefines(const LangOptions &Opts,
4258 MacroBuilder &Builder) const {
4259 Builder.defineMacro("__ARMEL__");
4260 ARMTargetInfo::getTargetDefines(Opts, Builder);
4261 }
4262};
4263
4264class ARMbeTargetInfo : public ARMTargetInfo {
4265public:
4266 ARMbeTargetInfo(const llvm::Triple &Triple)
4267 : ARMTargetInfo(Triple, true) { }
4268 virtual void getTargetDefines(const LangOptions &Opts,
4269 MacroBuilder &Builder) const {
4270 Builder.defineMacro("__ARMEB__");
4271 Builder.defineMacro("__ARM_BIG_ENDIAN");
4272 ARMTargetInfo::getTargetDefines(Opts, Builder);
4273 }
4274};
Chris Lattner17df24e2008-04-21 18:56:49 +00004275} // end anonymous namespace.
4276
Eli Friedmanf05b7722008-08-20 07:44:10 +00004277namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004278class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4279 const llvm::Triple Triple;
4280public:
4281 WindowsARMTargetInfo(const llvm::Triple &Triple)
4282 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4283 TLSSupported = false;
4284 WCharType = UnsignedShort;
4285 SizeType = UnsignedInt;
4286 UserLabelPrefix = "";
4287 }
4288 void getVisualStudioDefines(const LangOptions &Opts,
4289 MacroBuilder &Builder) const {
4290 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4291
4292 // FIXME: this is invalid for WindowsCE
4293 Builder.defineMacro("_M_ARM_NT", "1");
4294 Builder.defineMacro("_M_ARMT", "_M_ARM");
4295 Builder.defineMacro("_M_THUMB", "_M_ARM");
4296
4297 assert((Triple.getArch() == llvm::Triple::arm ||
4298 Triple.getArch() == llvm::Triple::thumb) &&
4299 "invalid architecture for Windows ARM target info");
4300 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4301 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4302
4303 // TODO map the complete set of values
4304 // 31: VFPv3 40: VFPv4
4305 Builder.defineMacro("_M_ARM_FP", "31");
4306 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004307 BuiltinVaListKind getBuiltinVaListKind() const override {
4308 return TargetInfo::CharPtrBuiltinVaList;
4309 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004310};
4311
4312// Windows ARM + Itanium C++ ABI Target
4313class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4314public:
4315 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4316 : WindowsARMTargetInfo(Triple) {
4317 TheCXXABI.set(TargetCXXABI::GenericARM);
4318 }
4319
4320 void getTargetDefines(const LangOptions &Opts,
4321 MacroBuilder &Builder) const override {
4322 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4323
4324 if (Opts.MSVCCompat)
4325 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4326 }
4327};
4328
4329// Windows ARM, MS (C++) ABI
4330class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4331public:
4332 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4333 : WindowsARMTargetInfo(Triple) {
4334 TheCXXABI.set(TargetCXXABI::Microsoft);
4335 }
4336
4337 void getTargetDefines(const LangOptions &Opts,
4338 MacroBuilder &Builder) const override {
4339 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4340 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4341 }
4342};
4343}
4344
4345
4346namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004347class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004348 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004349protected:
Craig Topper3164f332014-03-11 03:39:26 +00004350 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4351 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004352 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004353 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004354
Torok Edwinb2b37c62009-06-30 17:10:35 +00004355public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004356 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004357 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004358 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004359 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004360 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004361 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004362
4363 // Darwin on iOS uses a variant of the ARM C++ ABI.
4364 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004365 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004366};
4367} // end anonymous namespace.
4368
Tony Linthicum76329bf2011-12-12 21:14:55 +00004369
4370namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004371class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004372 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004373 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4374 static const char *const GCCRegNames[];
4375
James Molloy75f5f9e2014-04-16 15:33:48 +00004376 enum FPUModeEnum {
4377 FPUMode,
4378 NeonMode
4379 };
4380
4381 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004382 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004383 unsigned Crypto;
4384
Tim Northovera2ee4332014-03-29 15:09:45 +00004385 static const Builtin::Info BuiltinInfo[];
4386
4387 std::string ABI;
4388
4389public:
Tim Northover573cbee2014-05-24 12:52:07 +00004390 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004391 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004392
4393 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4394 WCharType = SignedInt;
4395
4396 // NetBSD apparently prefers consistency across ARM targets to consistency
4397 // across 64-bit targets.
4398 Int64Type = SignedLongLong;
4399 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004400 } else {
4401 WCharType = UnsignedInt;
4402 Int64Type = SignedLong;
4403 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004404 }
4405
Tim Northovera2ee4332014-03-29 15:09:45 +00004406 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004407 MaxVectorAlign = 128;
4408 RegParmMax = 8;
4409 MaxAtomicInlineWidth = 128;
4410 MaxAtomicPromoteWidth = 128;
4411
4412 LongDoubleWidth = LongDoubleAlign = 128;
4413 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4414
Tim Northovera2ee4332014-03-29 15:09:45 +00004415 // {} in inline assembly are neon specifiers, not assembly variant
4416 // specifiers.
4417 NoAsmVariants = true;
4418
Tim Northover573cbee2014-05-24 12:52:07 +00004419 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004420 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4421 }
4422
Alp Toker4925ba72014-06-07 23:30:42 +00004423 StringRef getABI() const override { return ABI; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004424 virtual bool setABI(const std::string &Name) {
4425 if (Name != "aapcs" && Name != "darwinpcs")
4426 return false;
4427
4428 ABI = Name;
4429 return true;
4430 }
4431
4432 virtual bool setCPU(const std::string &Name) {
4433 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004434 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004435 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004436 .Case("cyclone", true)
4437 .Default(false);
4438 return CPUKnown;
4439 }
4440
4441 virtual void getTargetDefines(const LangOptions &Opts,
4442 MacroBuilder &Builder) const {
4443 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004444 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004445
4446 // Target properties.
4447 Builder.defineMacro("_LP64");
4448 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004449
4450 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4451 Builder.defineMacro("__ARM_ACLE", "200");
4452 Builder.defineMacro("__ARM_ARCH", "8");
4453 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4454
4455 Builder.defineMacro("__ARM_64BIT_STATE");
4456 Builder.defineMacro("__ARM_PCS_AAPCS64");
4457 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4458
4459 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4460 Builder.defineMacro("__ARM_FEATURE_CLZ");
4461 Builder.defineMacro("__ARM_FEATURE_FMA");
4462 Builder.defineMacro("__ARM_FEATURE_DIV");
4463
4464 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4465
4466 // 0xe implies support for half, single and double precision operations.
4467 Builder.defineMacro("__ARM_FP", "0xe");
4468
4469 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4470 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4471 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4472
4473 if (Opts.FastMath || Opts.FiniteMathOnly)
4474 Builder.defineMacro("__ARM_FP_FAST");
4475
4476 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4477 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4478
4479 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4480
4481 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4482 Opts.ShortEnums ? "1" : "4");
4483
James Molloy75f5f9e2014-04-16 15:33:48 +00004484 if (FPU == NeonMode) {
4485 Builder.defineMacro("__ARM_NEON");
4486 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004487 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004488 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004489
Bradley Smith418c5932014-05-02 15:17:51 +00004490 if (CRC)
4491 Builder.defineMacro("__ARM_FEATURE_CRC32");
4492
James Molloy75f5f9e2014-04-16 15:33:48 +00004493 if (Crypto)
4494 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004495 }
4496
4497 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4498 unsigned &NumRecords) const {
4499 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004500 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004501 }
4502
4503 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004504 return Feature == "aarch64" ||
4505 Feature == "arm64" ||
4506 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004507 }
4508
James Molloy5e73df52014-04-16 15:06:20 +00004509 bool handleTargetFeatures(std::vector<std::string> &Features,
4510 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004511 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004512 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004513 Crypto = 0;
4514 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4515 if (Features[i] == "+neon")
4516 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004517 if (Features[i] == "+crc")
4518 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004519 if (Features[i] == "+crypto")
4520 Crypto = 1;
4521 }
4522
James Molloy5e73df52014-04-16 15:06:20 +00004523 setDescriptionString();
4524
4525 return true;
4526 }
4527
Tim Northovera2ee4332014-03-29 15:09:45 +00004528 virtual bool isCLZForZeroUndef() const { return false; }
4529
4530 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4531 return TargetInfo::AArch64ABIBuiltinVaList;
4532 }
4533
4534 virtual void getGCCRegNames(const char *const *&Names,
4535 unsigned &NumNames) const;
4536 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4537 unsigned &NumAliases) const;
4538
4539 virtual bool validateAsmConstraint(const char *&Name,
4540 TargetInfo::ConstraintInfo &Info) const {
4541 switch (*Name) {
4542 default:
4543 return false;
4544 case 'w': // Floating point and SIMD registers (V0-V31)
4545 Info.setAllowsRegister();
4546 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004547 case 'I': // Constant that can be used with an ADD instruction
4548 case 'J': // Constant that can be used with a SUB instruction
4549 case 'K': // Constant that can be used with a 32-bit logical instruction
4550 case 'L': // Constant that can be used with a 64-bit logical instruction
4551 case 'M': // Constant that can be used as a 32-bit MOV immediate
4552 case 'N': // Constant that can be used as a 64-bit MOV immediate
4553 case 'Y': // Floating point constant zero
4554 case 'Z': // Integer constant zero
4555 return true;
4556 case 'Q': // A memory reference with base register and no offset
4557 Info.setAllowsMemory();
4558 return true;
4559 case 'S': // A symbolic address
4560 Info.setAllowsRegister();
4561 return true;
4562 case 'U':
4563 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4564 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4565 // Usa: An absolute symbolic address
4566 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4567 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004568 case 'z': // Zero register, wzr or xzr
4569 Info.setAllowsRegister();
4570 return true;
4571 case 'x': // Floating point and SIMD registers (V0-V15)
4572 Info.setAllowsRegister();
4573 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004574 }
4575 return false;
4576 }
4577
James Molloy8a157bf2014-07-25 10:19:47 +00004578 virtual bool validateConstraintModifier(StringRef Constraint,
4579 const char Modifier,
4580 unsigned Size) const {
4581 // Strip off constraint modifiers.
4582 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4583 Constraint = Constraint.substr(1);
4584
4585 switch (Constraint[0]) {
4586 default:
4587 return true;
4588 case 'z':
4589 case 'r': {
4590 switch (Modifier) {
4591 case 'x':
4592 case 'w':
4593 // For now assume that the person knows what they're
4594 // doing with the modifier.
4595 return true;
4596 default:
4597 // By default an 'r' constraint will be in the 'x'
4598 // registers.
4599 return Size == 64;
4600 }
4601 }
4602 }
4603 }
4604
Tim Northovera2ee4332014-03-29 15:09:45 +00004605 virtual const char *getClobbers() const { return ""; }
4606
4607 int getEHDataRegisterNumber(unsigned RegNo) const {
4608 if (RegNo == 0)
4609 return 0;
4610 if (RegNo == 1)
4611 return 1;
4612 return -1;
4613 }
4614};
4615
Tim Northover573cbee2014-05-24 12:52:07 +00004616const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004617 // 32-bit Integer registers
4618 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4619 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4620 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4621
4622 // 64-bit Integer registers
4623 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4624 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4625 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4626
4627 // 32-bit floating point regsisters
4628 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4629 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4630 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4631
4632 // 64-bit floating point regsisters
4633 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4634 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4635 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4636
4637 // Vector registers
4638 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4639 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4640 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4641};
4642
Tim Northover573cbee2014-05-24 12:52:07 +00004643void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004644 unsigned &NumNames) const {
4645 Names = GCCRegNames;
4646 NumNames = llvm::array_lengthof(GCCRegNames);
4647}
4648
Tim Northover573cbee2014-05-24 12:52:07 +00004649const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004650 { { "w31" }, "wsp" },
4651 { { "x29" }, "fp" },
4652 { { "x30" }, "lr" },
4653 { { "x31" }, "sp" },
4654 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4655 // don't want to substitute one of these for a different-sized one.
4656};
4657
Tim Northover573cbee2014-05-24 12:52:07 +00004658void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004659 unsigned &NumAliases) const {
4660 Aliases = GCCRegAliases;
4661 NumAliases = llvm::array_lengthof(GCCRegAliases);
4662}
4663
Tim Northover573cbee2014-05-24 12:52:07 +00004664const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004665#define BUILTIN(ID, TYPE, ATTRS) \
4666 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4667#include "clang/Basic/BuiltinsNEON.def"
4668
4669#define BUILTIN(ID, TYPE, ATTRS) \
4670 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004671#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004672};
James Molloy5e73df52014-04-16 15:06:20 +00004673
Tim Northover573cbee2014-05-24 12:52:07 +00004674class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004675 void setDescriptionString() override {
4676 if (getTriple().isOSBinFormatMachO())
4677 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4678 else
4679 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4680 }
4681
4682public:
Tim Northover573cbee2014-05-24 12:52:07 +00004683 AArch64leTargetInfo(const llvm::Triple &Triple)
4684 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004685 BigEndian = false;
4686 }
4687 void getTargetDefines(const LangOptions &Opts,
4688 MacroBuilder &Builder) const override {
4689 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004690 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004691 }
4692};
4693
Tim Northover573cbee2014-05-24 12:52:07 +00004694class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004695 void setDescriptionString() override {
4696 assert(!getTriple().isOSBinFormatMachO());
4697 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4698 }
4699
4700public:
Tim Northover573cbee2014-05-24 12:52:07 +00004701 AArch64beTargetInfo(const llvm::Triple &Triple)
4702 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004703 void getTargetDefines(const LangOptions &Opts,
4704 MacroBuilder &Builder) const override {
4705 Builder.defineMacro("__AARCH64EB__");
4706 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4707 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004708 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004709 }
4710};
Tim Northovera2ee4332014-03-29 15:09:45 +00004711} // end anonymous namespace.
4712
4713namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004714class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004715protected:
4716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4717 MacroBuilder &Builder) const override {
4718 Builder.defineMacro("__AARCH64_SIMD__");
4719 Builder.defineMacro("__ARM64_ARCH_8__");
4720 Builder.defineMacro("__ARM_NEON__");
4721 Builder.defineMacro("__LITTLE_ENDIAN__");
4722 Builder.defineMacro("__REGISTER_PREFIX__", "");
4723 Builder.defineMacro("__arm64", "1");
4724 Builder.defineMacro("__arm64__", "1");
4725
4726 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4727 }
4728
Tim Northovera2ee4332014-03-29 15:09:45 +00004729public:
Tim Northover573cbee2014-05-24 12:52:07 +00004730 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4731 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004732 Int64Type = SignedLongLong;
4733 WCharType = SignedInt;
4734 UseSignedCharForObjCBool = false;
4735
4736 LongDoubleWidth = LongDoubleAlign = 64;
4737 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4738
4739 TheCXXABI.set(TargetCXXABI::iOS64);
4740 }
4741
4742 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4743 return TargetInfo::CharPtrBuiltinVaList;
4744 }
4745};
4746} // end anonymous namespace
4747
4748namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004749// Hexagon abstract base class
4750class HexagonTargetInfo : public TargetInfo {
4751 static const Builtin::Info BuiltinInfo[];
4752 static const char * const GCCRegNames[];
4753 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4754 std::string CPU;
4755public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004756 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004757 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004758 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004759
4760 // {} in inline assembly are packet specifiers, not assembly variant
4761 // specifiers.
4762 NoAsmVariants = true;
4763 }
4764
Craig Topper3164f332014-03-11 03:39:26 +00004765 void getTargetBuiltins(const Builtin::Info *&Records,
4766 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004767 Records = BuiltinInfo;
4768 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4769 }
4770
Craig Topper3164f332014-03-11 03:39:26 +00004771 bool validateAsmConstraint(const char *&Name,
4772 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004773 return true;
4774 }
4775
Craig Topper3164f332014-03-11 03:39:26 +00004776 void getTargetDefines(const LangOptions &Opts,
4777 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004778
Craig Topper3164f332014-03-11 03:39:26 +00004779 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004780 return Feature == "hexagon";
4781 }
Craig Topper3164f332014-03-11 03:39:26 +00004782
4783 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004784 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004785 }
Craig Topper3164f332014-03-11 03:39:26 +00004786 void getGCCRegNames(const char * const *&Names,
4787 unsigned &NumNames) const override;
4788 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4789 unsigned &NumAliases) const override;
4790 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004791 return "";
4792 }
Sebastian Pop86500282012-01-13 20:37:10 +00004793
4794 static const char *getHexagonCPUSuffix(StringRef Name) {
4795 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004796 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004797 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004798 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004799 }
4800
Craig Topper3164f332014-03-11 03:39:26 +00004801 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004802 if (!getHexagonCPUSuffix(Name))
4803 return false;
4804
Tony Linthicum76329bf2011-12-12 21:14:55 +00004805 CPU = Name;
4806 return true;
4807 }
4808};
4809
4810void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4811 MacroBuilder &Builder) const {
4812 Builder.defineMacro("qdsp6");
4813 Builder.defineMacro("__qdsp6", "1");
4814 Builder.defineMacro("__qdsp6__", "1");
4815
4816 Builder.defineMacro("hexagon");
4817 Builder.defineMacro("__hexagon", "1");
4818 Builder.defineMacro("__hexagon__", "1");
4819
4820 if(CPU == "hexagonv1") {
4821 Builder.defineMacro("__HEXAGON_V1__");
4822 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4823 if(Opts.HexagonQdsp6Compat) {
4824 Builder.defineMacro("__QDSP6_V1__");
4825 Builder.defineMacro("__QDSP6_ARCH__", "1");
4826 }
4827 }
4828 else if(CPU == "hexagonv2") {
4829 Builder.defineMacro("__HEXAGON_V2__");
4830 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4831 if(Opts.HexagonQdsp6Compat) {
4832 Builder.defineMacro("__QDSP6_V2__");
4833 Builder.defineMacro("__QDSP6_ARCH__", "2");
4834 }
4835 }
4836 else if(CPU == "hexagonv3") {
4837 Builder.defineMacro("__HEXAGON_V3__");
4838 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4839 if(Opts.HexagonQdsp6Compat) {
4840 Builder.defineMacro("__QDSP6_V3__");
4841 Builder.defineMacro("__QDSP6_ARCH__", "3");
4842 }
4843 }
4844 else if(CPU == "hexagonv4") {
4845 Builder.defineMacro("__HEXAGON_V4__");
4846 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4847 if(Opts.HexagonQdsp6Compat) {
4848 Builder.defineMacro("__QDSP6_V4__");
4849 Builder.defineMacro("__QDSP6_ARCH__", "4");
4850 }
4851 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004852 else if(CPU == "hexagonv5") {
4853 Builder.defineMacro("__HEXAGON_V5__");
4854 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4855 if(Opts.HexagonQdsp6Compat) {
4856 Builder.defineMacro("__QDSP6_V5__");
4857 Builder.defineMacro("__QDSP6_ARCH__", "5");
4858 }
4859 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004860}
4861
4862const char * const HexagonTargetInfo::GCCRegNames[] = {
4863 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4864 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4865 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4866 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4867 "p0", "p1", "p2", "p3",
4868 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4869};
4870
4871void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4872 unsigned &NumNames) const {
4873 Names = GCCRegNames;
4874 NumNames = llvm::array_lengthof(GCCRegNames);
4875}
4876
4877
4878const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4879 { { "sp" }, "r29" },
4880 { { "fp" }, "r30" },
4881 { { "lr" }, "r31" },
4882 };
4883
4884void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4885 unsigned &NumAliases) const {
4886 Aliases = GCCRegAliases;
4887 NumAliases = llvm::array_lengthof(GCCRegAliases);
4888}
4889
4890
4891const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4892#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4893#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4894 ALL_LANGUAGES },
4895#include "clang/Basic/BuiltinsHexagon.def"
4896};
4897}
4898
4899
Chris Lattner5ba61f02006-10-14 07:39:34 +00004900namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004901// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4902class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004903 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4904 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004905 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004906public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004907 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004908
Craig Topper3164f332014-03-11 03:39:26 +00004909 bool handleTargetFeatures(std::vector<std::string> &Features,
4910 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004911 SoftFloat = false;
4912 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4913 if (Features[i] == "+soft-float")
4914 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004915 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004916 }
Craig Topper3164f332014-03-11 03:39:26 +00004917 void getTargetDefines(const LangOptions &Opts,
4918 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004919 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004920 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004921
4922 if (SoftFloat)
4923 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004924 }
Craig Topper3164f332014-03-11 03:39:26 +00004925
4926 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004927 return llvm::StringSwitch<bool>(Feature)
4928 .Case("softfloat", SoftFloat)
4929 .Case("sparc", true)
4930 .Default(false);
4931 }
Craig Topper3164f332014-03-11 03:39:26 +00004932
4933 void getTargetBuiltins(const Builtin::Info *&Records,
4934 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004935 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004936 }
Craig Topper3164f332014-03-11 03:39:26 +00004937 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004938 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004939 }
Craig Topper3164f332014-03-11 03:39:26 +00004940 void getGCCRegNames(const char * const *&Names,
4941 unsigned &NumNames) const override;
4942 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4943 unsigned &NumAliases) const override;
4944 bool validateAsmConstraint(const char *&Name,
4945 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004946 // FIXME: Implement!
4947 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004948 }
Craig Topper3164f332014-03-11 03:39:26 +00004949 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004950 // FIXME: Implement!
4951 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004952 }
4953};
4954
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004955const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004956 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4957 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4958 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4959 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4960};
4961
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004962void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4963 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004964 Names = GCCRegNames;
4965 NumNames = llvm::array_lengthof(GCCRegNames);
4966}
4967
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004968const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004969 { { "g0" }, "r0" },
4970 { { "g1" }, "r1" },
4971 { { "g2" }, "r2" },
4972 { { "g3" }, "r3" },
4973 { { "g4" }, "r4" },
4974 { { "g5" }, "r5" },
4975 { { "g6" }, "r6" },
4976 { { "g7" }, "r7" },
4977 { { "o0" }, "r8" },
4978 { { "o1" }, "r9" },
4979 { { "o2" }, "r10" },
4980 { { "o3" }, "r11" },
4981 { { "o4" }, "r12" },
4982 { { "o5" }, "r13" },
4983 { { "o6", "sp" }, "r14" },
4984 { { "o7" }, "r15" },
4985 { { "l0" }, "r16" },
4986 { { "l1" }, "r17" },
4987 { { "l2" }, "r18" },
4988 { { "l3" }, "r19" },
4989 { { "l4" }, "r20" },
4990 { { "l5" }, "r21" },
4991 { { "l6" }, "r22" },
4992 { { "l7" }, "r23" },
4993 { { "i0" }, "r24" },
4994 { { "i1" }, "r25" },
4995 { { "i2" }, "r26" },
4996 { { "i3" }, "r27" },
4997 { { "i4" }, "r28" },
4998 { { "i5" }, "r29" },
4999 { { "i6", "fp" }, "r30" },
5000 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005001};
5002
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005003void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5004 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005005 Aliases = GCCRegAliases;
5006 NumAliases = llvm::array_lengthof(GCCRegAliases);
5007}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005008
5009// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5010class SparcV8TargetInfo : public SparcTargetInfo {
5011public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005012 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005013 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005014 }
5015
Craig Topper3164f332014-03-11 03:39:26 +00005016 void getTargetDefines(const LangOptions &Opts,
5017 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005018 SparcTargetInfo::getTargetDefines(Opts, Builder);
5019 Builder.defineMacro("__sparcv8");
5020 }
5021};
5022
5023// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5024class SparcV9TargetInfo : public SparcTargetInfo {
5025public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005026 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005027 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005028 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005029 // This is an LP64 platform.
5030 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005031
5032 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005033 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005034 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005035 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005036 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005037 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005038
5039 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5040 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5041 LongDoubleWidth = 128;
5042 LongDoubleAlign = 128;
5043 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005044 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005045 }
5046
Craig Topper3164f332014-03-11 03:39:26 +00005047 void getTargetDefines(const LangOptions &Opts,
5048 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005049 SparcTargetInfo::getTargetDefines(Opts, Builder);
5050 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005051 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005052 // Solaris doesn't need these variants, but the BSDs do.
5053 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005054 Builder.defineMacro("__sparc64__");
5055 Builder.defineMacro("__sparc_v9__");
5056 Builder.defineMacro("__sparcv9__");
5057 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005058 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005059
Craig Topper3164f332014-03-11 03:39:26 +00005060 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005061 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5062 .Case("v9", true)
5063 .Case("ultrasparc", true)
5064 .Case("ultrasparc3", true)
5065 .Case("niagara", true)
5066 .Case("niagara2", true)
5067 .Case("niagara3", true)
5068 .Case("niagara4", true)
5069 .Default(false);
5070
5071 // No need to store the CPU yet. There aren't any CPU-specific
5072 // macros to define.
5073 return CPUKnown;
5074 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005075};
5076
Gabor Greif49991682008-02-21 16:29:08 +00005077} // end anonymous namespace.
5078
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005079namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005080class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005081public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005082 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5083 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005084 SizeType = UnsignedInt;
5085 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005086 }
5087};
5088} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005089
Chris Lattnerb781dc792008-05-08 05:58:21 +00005090namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005091class SystemZTargetInfo : public TargetInfo {
5092 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005093
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005094public:
5095 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5096 TLSSupported = true;
5097 IntWidth = IntAlign = 32;
5098 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5099 PointerWidth = PointerAlign = 64;
5100 LongDoubleWidth = 128;
5101 LongDoubleAlign = 64;
5102 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5103 MinGlobalAlign = 16;
5104 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5105 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5106 }
5107 void getTargetDefines(const LangOptions &Opts,
5108 MacroBuilder &Builder) const override {
5109 Builder.defineMacro("__s390__");
5110 Builder.defineMacro("__s390x__");
5111 Builder.defineMacro("__zarch__");
5112 Builder.defineMacro("__LONG_DOUBLE_128__");
5113 }
5114 void getTargetBuiltins(const Builtin::Info *&Records,
5115 unsigned &NumRecords) const override {
5116 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005117 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005118 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005119 }
5120
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005121 void getGCCRegNames(const char *const *&Names,
5122 unsigned &NumNames) const override;
5123 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5124 unsigned &NumAliases) const override {
5125 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005126 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005127 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005128 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005129 bool validateAsmConstraint(const char *&Name,
5130 TargetInfo::ConstraintInfo &info) const override;
5131 const char *getClobbers() const override {
5132 // FIXME: Is this really right?
5133 return "";
5134 }
5135 BuiltinVaListKind getBuiltinVaListKind() const override {
5136 return TargetInfo::SystemZBuiltinVaList;
5137 }
5138 bool setCPU(const std::string &Name) override {
5139 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5140 .Case("z10", true)
5141 .Case("z196", true)
5142 .Case("zEC12", true)
5143 .Default(false);
5144
5145 // No need to store the CPU yet. There aren't any CPU-specific
5146 // macros to define.
5147 return CPUKnown;
5148 }
5149};
5150
5151const char *const SystemZTargetInfo::GCCRegNames[] = {
5152 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5153 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5154 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5155 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5156};
5157
5158void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5159 unsigned &NumNames) const {
5160 Names = GCCRegNames;
5161 NumNames = llvm::array_lengthof(GCCRegNames);
5162}
5163
5164bool SystemZTargetInfo::
5165validateAsmConstraint(const char *&Name,
5166 TargetInfo::ConstraintInfo &Info) const {
5167 switch (*Name) {
5168 default:
5169 return false;
5170
5171 case 'a': // Address register
5172 case 'd': // Data register (equivalent to 'r')
5173 case 'f': // Floating-point register
5174 Info.setAllowsRegister();
5175 return true;
5176
5177 case 'I': // Unsigned 8-bit constant
5178 case 'J': // Unsigned 12-bit constant
5179 case 'K': // Signed 16-bit constant
5180 case 'L': // Signed 20-bit displacement (on all targets we support)
5181 case 'M': // 0x7fffffff
5182 return true;
5183
5184 case 'Q': // Memory with base and unsigned 12-bit displacement
5185 case 'R': // Likewise, plus an index
5186 case 'S': // Memory with base and signed 20-bit displacement
5187 case 'T': // Likewise, plus an index
5188 Info.setAllowsMemory();
5189 return true;
5190 }
5191}
Ulrich Weigand47445072013-05-06 16:26:41 +00005192}
5193
5194namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005195 class MSP430TargetInfo : public TargetInfo {
5196 static const char * const GCCRegNames[];
5197 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005198 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005199 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005200 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005201 IntWidth = 16; IntAlign = 16;
5202 LongWidth = 32; LongLongWidth = 64;
5203 LongAlign = LongLongAlign = 16;
5204 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005205 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005206 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005207 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005208 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005209 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005210 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005211 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005212 }
5213 void getTargetDefines(const LangOptions &Opts,
5214 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005215 Builder.defineMacro("MSP430");
5216 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005217 // FIXME: defines for different 'flavours' of MCU
5218 }
Craig Topper3164f332014-03-11 03:39:26 +00005219 void getTargetBuiltins(const Builtin::Info *&Records,
5220 unsigned &NumRecords) const override {
5221 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005222 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005223 NumRecords = 0;
5224 }
Craig Topper3164f332014-03-11 03:39:26 +00005225 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005226 return Feature == "msp430";
5227 }
Craig Topper3164f332014-03-11 03:39:26 +00005228 void getGCCRegNames(const char * const *&Names,
5229 unsigned &NumNames) const override;
5230 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5231 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005232 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005233 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005234 NumAliases = 0;
5235 }
Craig Topper3164f332014-03-11 03:39:26 +00005236 bool validateAsmConstraint(const char *&Name,
5237 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005238 // No target constraints for now.
5239 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005240 }
Craig Topper3164f332014-03-11 03:39:26 +00005241 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005242 // FIXME: Is this really right?
5243 return "";
5244 }
Craig Topper3164f332014-03-11 03:39:26 +00005245 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005246 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005247 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005248 }
5249 };
5250
5251 const char * const MSP430TargetInfo::GCCRegNames[] = {
5252 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5253 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5254 };
5255
5256 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5257 unsigned &NumNames) const {
5258 Names = GCCRegNames;
5259 NumNames = llvm::array_lengthof(GCCRegNames);
5260 }
5261}
5262
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005263namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005264
Mike Stump11289f42009-09-09 15:08:12 +00005265 // LLVM and Clang cannot be used directly to output native binaries for
5266 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005267 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005268 //
5269 // TCE uses the llvm bitcode as input and uses it for generating customized
5270 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005271 // publicly available in http://tce.cs.tut.fi
5272
Eli Friedman1f191002011-10-07 19:51:42 +00005273 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5274 3, // opencl_global
5275 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005276 5, // opencl_constant
5277 0, // cuda_device
5278 0, // cuda_constant
5279 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005280 };
5281
Eli Friedmana9c3d712009-08-19 20:47:07 +00005282 class TCETargetInfo : public TargetInfo{
5283 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005284 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005285 TLSSupported = false;
5286 IntWidth = 32;
5287 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005288 PointerWidth = 32;
5289 IntAlign = 32;
5290 LongAlign = LongLongAlign = 32;
5291 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005292 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005293 SizeType = UnsignedInt;
5294 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005295 IntPtrType = SignedInt;
5296 PtrDiffType = SignedInt;
5297 FloatWidth = 32;
5298 FloatAlign = 32;
5299 DoubleWidth = 32;
5300 DoubleAlign = 32;
5301 LongDoubleWidth = 32;
5302 LongDoubleAlign = 32;
5303 FloatFormat = &llvm::APFloat::IEEEsingle;
5304 DoubleFormat = &llvm::APFloat::IEEEsingle;
5305 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005306 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5307 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005308 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005309 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005310 }
5311
Craig Topper3164f332014-03-11 03:39:26 +00005312 void getTargetDefines(const LangOptions &Opts,
5313 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005314 DefineStd(Builder, "tce", Opts);
5315 Builder.defineMacro("__TCE__");
5316 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005317 }
Craig Topper3164f332014-03-11 03:39:26 +00005318 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005319 return Feature == "tce";
5320 }
Craig Topper3164f332014-03-11 03:39:26 +00005321
5322 void getTargetBuiltins(const Builtin::Info *&Records,
5323 unsigned &NumRecords) const override {}
5324 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005325 return "";
5326 }
Craig Topper3164f332014-03-11 03:39:26 +00005327 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005328 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005329 }
Craig Topper3164f332014-03-11 03:39:26 +00005330 void getGCCRegNames(const char * const *&Names,
5331 unsigned &NumNames) const override {}
5332 bool validateAsmConstraint(const char *&Name,
5333 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005334 return true;
5335 }
Craig Topper3164f332014-03-11 03:39:26 +00005336 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5337 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005338 };
5339}
5340
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005341namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005342class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005343 virtual void setDescriptionString() = 0;
5344
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005345 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005346 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005347 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005348 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005349 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005350 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005351 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005352 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005353 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005354 enum DspRevEnum {
5355 NoDSP, DSP1, DSP2
5356 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005357 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005358
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005359protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005360 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005361 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005362
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005363public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005364 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5365 const std::string &CPUStr)
5366 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005367 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005368 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005369
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005370 bool isNaN2008Default() const {
5371 return CPU == "mips32r6" || CPU == "mips64r6";
5372 }
5373
5374 bool isFP64Default() const {
5375 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5376 }
5377
Alp Toker4925ba72014-06-07 23:30:42 +00005378 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005379 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005380 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5381 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005382 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005383 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005384 .Case("mips1", IsMips32)
5385 .Case("mips2", IsMips32)
5386 .Case("mips3", true)
5387 .Case("mips4", true)
5388 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005389 .Case("mips32", IsMips32)
5390 .Case("mips32r2", IsMips32)
5391 .Case("mips32r6", IsMips32)
5392 .Case("mips64", true)
5393 .Case("mips64r2", true)
5394 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005395 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005396 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005397 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005398 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005399 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005400 // The backend enables certain ABI's by default according to the
5401 // architecture.
5402 // Disable both possible defaults so that we don't end up with multiple
5403 // ABI's selected and trigger an assertion.
5404 Features["o32"] = false;
5405 Features["n64"] = false;
5406
Eric Christopher0b26a612010-03-02 02:41:08 +00005407 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005408 if (CPU == "octeon")
5409 Features["mips64r2"] = Features["cnmips"] = true;
5410 else
5411 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005412 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005413
Craig Topper3164f332014-03-11 03:39:26 +00005414 void getTargetDefines(const LangOptions &Opts,
5415 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005416 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005417 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005418 if (Opts.GNUMode)
5419 Builder.defineMacro("mips");
5420
Simon Atanasyan683535b2012-08-29 19:14:58 +00005421 Builder.defineMacro("__REGISTER_PREFIX__", "");
5422
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005423 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005424 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005425 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005426 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005427 case SoftFloat:
5428 Builder.defineMacro("__mips_soft_float", Twine(1));
5429 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005430 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005431
Simon Atanasyan16071912013-04-14 14:07:30 +00005432 if (IsSingleFloat)
5433 Builder.defineMacro("__mips_single_float", Twine(1));
5434
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005435 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5436 Builder.defineMacro("_MIPS_FPSET",
5437 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5438
Simon Atanasyan72244b62012-07-05 16:06:06 +00005439 if (IsMips16)
5440 Builder.defineMacro("__mips16", Twine(1));
5441
Simon Atanasyan60777612013-04-14 14:07:51 +00005442 if (IsMicromips)
5443 Builder.defineMacro("__mips_micromips", Twine(1));
5444
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005445 if (IsNan2008)
5446 Builder.defineMacro("__mips_nan2008", Twine(1));
5447
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005448 switch (DspRev) {
5449 default:
5450 break;
5451 case DSP1:
5452 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5453 Builder.defineMacro("__mips_dsp", Twine(1));
5454 break;
5455 case DSP2:
5456 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5457 Builder.defineMacro("__mips_dspr2", Twine(1));
5458 Builder.defineMacro("__mips_dsp", Twine(1));
5459 break;
5460 }
5461
Jack Carter44ff1e52013-08-12 17:20:29 +00005462 if (HasMSA)
5463 Builder.defineMacro("__mips_msa", Twine(1));
5464
Simon Atanasyan26f19672012-04-05 19:28:31 +00005465 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5466 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5467 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005468
5469 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5470 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005471 }
5472
Craig Topper3164f332014-03-11 03:39:26 +00005473 void getTargetBuiltins(const Builtin::Info *&Records,
5474 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005475 Records = BuiltinInfo;
5476 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005477 }
Craig Topper3164f332014-03-11 03:39:26 +00005478 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005479 return llvm::StringSwitch<bool>(Feature)
5480 .Case("mips", true)
5481 .Case("fp64", HasFP64)
5482 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005483 }
Craig Topper3164f332014-03-11 03:39:26 +00005484 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005485 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005486 }
Craig Topper3164f332014-03-11 03:39:26 +00005487 void getGCCRegNames(const char * const *&Names,
5488 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005489 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005490 // CPU register names
5491 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005492 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5493 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5494 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005495 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5496 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005497 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5498 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5499 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5500 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005501 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005502 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005503 "$fcc5","$fcc6","$fcc7",
5504 // MSA register names
5505 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5506 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5507 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5508 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5509 // MSA control register names
5510 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5511 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005512 };
5513 Names = GCCRegNames;
5514 NumNames = llvm::array_lengthof(GCCRegNames);
5515 }
Craig Topper3164f332014-03-11 03:39:26 +00005516 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5517 unsigned &NumAliases) const override = 0;
5518 bool validateAsmConstraint(const char *&Name,
5519 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005520 switch (*Name) {
5521 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005522 return false;
5523
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005524 case 'r': // CPU registers.
5525 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005526 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005527 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005528 case 'c': // $25 for indirect jumps
5529 case 'l': // lo register
5530 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005531 Info.setAllowsRegister();
5532 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005533 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005534 Info.setAllowsMemory();
5535 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005536 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005537 }
5538
Craig Topper3164f332014-03-11 03:39:26 +00005539 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005540 // FIXME: Implement!
5541 return "";
5542 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005543
Craig Topper3164f332014-03-11 03:39:26 +00005544 bool handleTargetFeatures(std::vector<std::string> &Features,
5545 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005546 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005547 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005548 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005549 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005550 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005551 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005552 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005553
5554 for (std::vector<std::string>::iterator it = Features.begin(),
5555 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005556 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005557 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005558 else if (*it == "+soft-float")
5559 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005560 else if (*it == "+mips16")
5561 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005562 else if (*it == "+micromips")
5563 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005564 else if (*it == "+dsp")
5565 DspRev = std::max(DspRev, DSP1);
5566 else if (*it == "+dspr2")
5567 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005568 else if (*it == "+msa")
5569 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005570 else if (*it == "+fp64")
5571 HasFP64 = true;
5572 else if (*it == "-fp64")
5573 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005574 else if (*it == "+nan2008")
5575 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005576 else if (*it == "-nan2008")
5577 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005578 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005579
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005580 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005581 std::vector<std::string>::iterator it =
5582 std::find(Features.begin(), Features.end(), "+soft-float");
5583 if (it != Features.end())
5584 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005585
Akira Hatanaka9064e362013-10-29 18:30:33 +00005586 setDescriptionString();
5587
Rafael Espindolaeb265472013-08-21 21:59:03 +00005588 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005589 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005590
Craig Topper3164f332014-03-11 03:39:26 +00005591 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005592 if (RegNo == 0) return 4;
5593 if (RegNo == 1) return 5;
5594 return -1;
5595 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005596
5597 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005598};
5599
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005600const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5601#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5602#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5603 ALL_LANGUAGES },
5604#include "clang/Basic/BuiltinsMips.def"
5605};
5606
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005607class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005608public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005609 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005610 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005611 SizeType = UnsignedInt;
5612 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005613 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005614 }
Craig Topper3164f332014-03-11 03:39:26 +00005615 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005616 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005617 ABI = Name;
5618 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005619 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005620 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005621 }
Craig Topper3164f332014-03-11 03:39:26 +00005622 void getTargetDefines(const LangOptions &Opts,
5623 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005624 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005625
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005626 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005627 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5628
5629 const std::string& CPUStr = getCPU();
5630 if (CPUStr == "mips32")
5631 Builder.defineMacro("__mips_isa_rev", "1");
5632 else if (CPUStr == "mips32r2")
5633 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005634
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005635 if (ABI == "o32") {
5636 Builder.defineMacro("__mips_o32");
5637 Builder.defineMacro("_ABIO32", "1");
5638 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5639 }
5640 else if (ABI == "eabi")
5641 Builder.defineMacro("__mips_eabi");
5642 else
David Blaikie83d382b2011-09-23 05:06:16 +00005643 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005644 }
Craig Topper3164f332014-03-11 03:39:26 +00005645 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5646 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005647 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5648 { { "at" }, "$1" },
5649 { { "v0" }, "$2" },
5650 { { "v1" }, "$3" },
5651 { { "a0" }, "$4" },
5652 { { "a1" }, "$5" },
5653 { { "a2" }, "$6" },
5654 { { "a3" }, "$7" },
5655 { { "t0" }, "$8" },
5656 { { "t1" }, "$9" },
5657 { { "t2" }, "$10" },
5658 { { "t3" }, "$11" },
5659 { { "t4" }, "$12" },
5660 { { "t5" }, "$13" },
5661 { { "t6" }, "$14" },
5662 { { "t7" }, "$15" },
5663 { { "s0" }, "$16" },
5664 { { "s1" }, "$17" },
5665 { { "s2" }, "$18" },
5666 { { "s3" }, "$19" },
5667 { { "s4" }, "$20" },
5668 { { "s5" }, "$21" },
5669 { { "s6" }, "$22" },
5670 { { "s7" }, "$23" },
5671 { { "t8" }, "$24" },
5672 { { "t9" }, "$25" },
5673 { { "k0" }, "$26" },
5674 { { "k1" }, "$27" },
5675 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005676 { { "sp","$sp" }, "$29" },
5677 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005678 { { "ra" }, "$31" }
5679 };
5680 Aliases = GCCRegAliases;
5681 NumAliases = llvm::array_lengthof(GCCRegAliases);
5682 }
5683};
5684
5685class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005686 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005687 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005688 }
5689
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005690public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005691 Mips32EBTargetInfo(const llvm::Triple &Triple)
5692 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005693 }
Craig Topper3164f332014-03-11 03:39:26 +00005694 void getTargetDefines(const LangOptions &Opts,
5695 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005696 DefineStd(Builder, "MIPSEB", Opts);
5697 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005698 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005699 }
5700};
5701
5702class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005703 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005704 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005705 }
5706
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005707public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005708 Mips32ELTargetInfo(const llvm::Triple &Triple)
5709 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005710 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005711 }
Craig Topper3164f332014-03-11 03:39:26 +00005712 void getTargetDefines(const LangOptions &Opts,
5713 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005714 DefineStd(Builder, "MIPSEL", Opts);
5715 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005716 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005717 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005718};
Akira Hatanakabef17452011-09-20 19:21:49 +00005719
5720class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005721public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005722 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005723 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005724 LongDoubleWidth = LongDoubleAlign = 128;
5725 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005726 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5727 LongDoubleWidth = LongDoubleAlign = 64;
5728 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5729 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005730 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005731 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005732 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005733 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005734
5735 void setN64ABITypes() {
5736 LongWidth = LongAlign = 64;
5737 PointerWidth = PointerAlign = 64;
5738 SizeType = UnsignedLong;
5739 PtrDiffType = SignedLong;
5740 }
5741
5742 void setN32ABITypes() {
5743 LongWidth = LongAlign = 32;
5744 PointerWidth = PointerAlign = 32;
5745 SizeType = UnsignedInt;
5746 PtrDiffType = SignedInt;
5747 }
5748
Craig Topper3164f332014-03-11 03:39:26 +00005749 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005750 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005751 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005752 ABI = Name;
5753 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005754 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005755 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005756 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005757 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005758 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005759 }
5760 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005761 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005762
Craig Topper3164f332014-03-11 03:39:26 +00005763 void getTargetDefines(const LangOptions &Opts,
5764 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005765 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005766
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005767 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005768 Builder.defineMacro("__mips64");
5769 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005770 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5771
5772 const std::string& CPUStr = getCPU();
5773 if (CPUStr == "mips64")
5774 Builder.defineMacro("__mips_isa_rev", "1");
5775 else if (CPUStr == "mips64r2")
5776 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005777
Akira Hatanakabef17452011-09-20 19:21:49 +00005778 if (ABI == "n32") {
5779 Builder.defineMacro("__mips_n32");
5780 Builder.defineMacro("_ABIN32", "2");
5781 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5782 }
5783 else if (ABI == "n64") {
5784 Builder.defineMacro("__mips_n64");
5785 Builder.defineMacro("_ABI64", "3");
5786 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5787 }
5788 else
David Blaikie83d382b2011-09-23 05:06:16 +00005789 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005790 }
Craig Topper3164f332014-03-11 03:39:26 +00005791 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5792 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005793 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5794 { { "at" }, "$1" },
5795 { { "v0" }, "$2" },
5796 { { "v1" }, "$3" },
5797 { { "a0" }, "$4" },
5798 { { "a1" }, "$5" },
5799 { { "a2" }, "$6" },
5800 { { "a3" }, "$7" },
5801 { { "a4" }, "$8" },
5802 { { "a5" }, "$9" },
5803 { { "a6" }, "$10" },
5804 { { "a7" }, "$11" },
5805 { { "t0" }, "$12" },
5806 { { "t1" }, "$13" },
5807 { { "t2" }, "$14" },
5808 { { "t3" }, "$15" },
5809 { { "s0" }, "$16" },
5810 { { "s1" }, "$17" },
5811 { { "s2" }, "$18" },
5812 { { "s3" }, "$19" },
5813 { { "s4" }, "$20" },
5814 { { "s5" }, "$21" },
5815 { { "s6" }, "$22" },
5816 { { "s7" }, "$23" },
5817 { { "t8" }, "$24" },
5818 { { "t9" }, "$25" },
5819 { { "k0" }, "$26" },
5820 { { "k1" }, "$27" },
5821 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005822 { { "sp","$sp" }, "$29" },
5823 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005824 { { "ra" }, "$31" }
5825 };
5826 Aliases = GCCRegAliases;
5827 NumAliases = llvm::array_lengthof(GCCRegAliases);
5828 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005829
5830 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005831};
5832
5833class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005834 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005835 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005836 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 +00005837 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005838 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005839
Akira Hatanakabef17452011-09-20 19:21:49 +00005840 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005841
Akira Hatanakabef17452011-09-20 19:21:49 +00005842public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005843 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005844 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005845 void getTargetDefines(const LangOptions &Opts,
5846 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005847 DefineStd(Builder, "MIPSEB", Opts);
5848 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005849 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005850 }
5851};
5852
5853class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005854 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005855 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005856 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 +00005857 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005858 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005859 }
5860public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005861 Mips64ELTargetInfo(const llvm::Triple &Triple)
5862 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005863 // Default ABI is n64.
5864 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005865 }
Craig Topper3164f332014-03-11 03:39:26 +00005866 void getTargetDefines(const LangOptions &Opts,
5867 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005868 DefineStd(Builder, "MIPSEL", Opts);
5869 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005870 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005871 }
5872};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005873} // end anonymous namespace.
5874
Ivan Krasindd7403e2011-08-24 20:22:22 +00005875namespace {
5876class PNaClTargetInfo : public TargetInfo {
5877public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005878 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005879 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005880 this->UserLabelPrefix = "";
5881 this->LongAlign = 32;
5882 this->LongWidth = 32;
5883 this->PointerAlign = 32;
5884 this->PointerWidth = 32;
5885 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005886 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005887 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005888 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005889 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005890 this->SizeType = TargetInfo::UnsignedInt;
5891 this->PtrDiffType = TargetInfo::SignedInt;
5892 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005893 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005894 }
5895
Craig Topper3164f332014-03-11 03:39:26 +00005896 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005897 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005898 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005899 Builder.defineMacro("__le32__");
5900 Builder.defineMacro("__pnacl__");
5901 }
Craig Topper3164f332014-03-11 03:39:26 +00005902 void getTargetDefines(const LangOptions &Opts,
5903 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005904 getArchDefines(Opts, Builder);
5905 }
Craig Topper3164f332014-03-11 03:39:26 +00005906 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005907 return Feature == "pnacl";
5908 }
Craig Topper3164f332014-03-11 03:39:26 +00005909 void getTargetBuiltins(const Builtin::Info *&Records,
5910 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005911 }
Craig Topper3164f332014-03-11 03:39:26 +00005912 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005913 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005914 }
Craig Topper3164f332014-03-11 03:39:26 +00005915 void getGCCRegNames(const char * const *&Names,
5916 unsigned &NumNames) const override;
5917 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5918 unsigned &NumAliases) const override;
5919 bool validateAsmConstraint(const char *&Name,
5920 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005921 return false;
5922 }
5923
Craig Topper3164f332014-03-11 03:39:26 +00005924 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005925 return "";
5926 }
5927};
5928
5929void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5930 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005931 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005932 NumNames = 0;
5933}
5934
5935void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5936 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005937 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005938 NumAliases = 0;
5939}
5940} // end anonymous namespace.
5941
Guy Benyeib798fc92012-12-11 21:38:14 +00005942namespace {
5943 static const unsigned SPIRAddrSpaceMap[] = {
5944 1, // opencl_global
5945 3, // opencl_local
5946 2, // opencl_constant
5947 0, // cuda_device
5948 0, // cuda_constant
5949 0 // cuda_shared
5950 };
5951 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005952 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005953 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005954 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5955 "SPIR target must use unknown OS");
5956 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5957 "SPIR target must use unknown environment type");
5958 BigEndian = false;
5959 TLSSupported = false;
5960 LongWidth = LongAlign = 64;
5961 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005962 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005963 // Define available target features
5964 // These must be defined in sorted order!
5965 NoAsmVariants = true;
5966 }
Craig Topper3164f332014-03-11 03:39:26 +00005967 void getTargetDefines(const LangOptions &Opts,
5968 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005969 DefineStd(Builder, "SPIR", Opts);
5970 }
Craig Topper3164f332014-03-11 03:39:26 +00005971 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005972 return Feature == "spir";
5973 }
Craig Topper3164f332014-03-11 03:39:26 +00005974
5975 void getTargetBuiltins(const Builtin::Info *&Records,
5976 unsigned &NumRecords) const override {}
5977 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005978 return "";
5979 }
Craig Topper3164f332014-03-11 03:39:26 +00005980 void getGCCRegNames(const char * const *&Names,
5981 unsigned &NumNames) const override {}
5982 bool validateAsmConstraint(const char *&Name,
5983 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005984 return true;
5985 }
Craig Topper3164f332014-03-11 03:39:26 +00005986 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5987 unsigned &NumAliases) const override {}
5988 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005989 return TargetInfo::VoidPtrBuiltinVaList;
5990 }
5991 };
5992
5993
5994 class SPIR32TargetInfo : public SPIRTargetInfo {
5995 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005996 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005997 PointerWidth = PointerAlign = 32;
5998 SizeType = TargetInfo::UnsignedInt;
5999 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6000 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006001 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6002 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006003 }
Craig Topper3164f332014-03-11 03:39:26 +00006004 void getTargetDefines(const LangOptions &Opts,
6005 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006006 DefineStd(Builder, "SPIR32", Opts);
6007 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006008 };
6009
6010 class SPIR64TargetInfo : public SPIRTargetInfo {
6011 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006012 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006013 PointerWidth = PointerAlign = 64;
6014 SizeType = TargetInfo::UnsignedLong;
6015 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006016 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6017 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006018 }
Craig Topper3164f332014-03-11 03:39:26 +00006019 void getTargetDefines(const LangOptions &Opts,
6020 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006021 DefineStd(Builder, "SPIR64", Opts);
6022 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006023 };
6024}
6025
Robert Lytton0e076492013-08-13 09:43:10 +00006026namespace {
6027class XCoreTargetInfo : public TargetInfo {
6028 static const Builtin::Info BuiltinInfo[];
6029public:
6030 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6031 BigEndian = false;
6032 NoAsmVariants = true;
6033 LongLongAlign = 32;
6034 SuitableAlign = 32;
6035 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006036 SizeType = UnsignedInt;
6037 PtrDiffType = SignedInt;
6038 IntPtrType = SignedInt;
6039 WCharType = UnsignedChar;
6040 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006041 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006042 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 +00006043 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006044 }
Craig Topper3164f332014-03-11 03:39:26 +00006045 void getTargetDefines(const LangOptions &Opts,
6046 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006047 Builder.defineMacro("__XS1B__");
6048 }
Craig Topper3164f332014-03-11 03:39:26 +00006049 void getTargetBuiltins(const Builtin::Info *&Records,
6050 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006051 Records = BuiltinInfo;
6052 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6053 }
Craig Topper3164f332014-03-11 03:39:26 +00006054 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006055 return TargetInfo::VoidPtrBuiltinVaList;
6056 }
Craig Topper3164f332014-03-11 03:39:26 +00006057 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006058 return "";
6059 }
Craig Topper3164f332014-03-11 03:39:26 +00006060 void getGCCRegNames(const char * const *&Names,
6061 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006062 static const char * const GCCRegNames[] = {
6063 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6064 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6065 };
6066 Names = GCCRegNames;
6067 NumNames = llvm::array_lengthof(GCCRegNames);
6068 }
Craig Topper3164f332014-03-11 03:39:26 +00006069 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6070 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006071 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006072 NumAliases = 0;
6073 }
Craig Topper3164f332014-03-11 03:39:26 +00006074 bool validateAsmConstraint(const char *&Name,
6075 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006076 return false;
6077 }
Craig Topper3164f332014-03-11 03:39:26 +00006078 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006079 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6080 return (RegNo < 2)? RegNo : -1;
6081 }
Robert Lytton0e076492013-08-13 09:43:10 +00006082};
6083
6084const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6085#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6086#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6087 ALL_LANGUAGES },
6088#include "clang/Basic/BuiltinsXCore.def"
6089};
6090} // end anonymous namespace.
6091
Ivan Krasindd7403e2011-08-24 20:22:22 +00006092
Chris Lattner5ba61f02006-10-14 07:39:34 +00006093//===----------------------------------------------------------------------===//
6094// Driver code
6095//===----------------------------------------------------------------------===//
6096
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006097static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006098 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006099
Daniel Dunbar52322032009-08-18 05:47:58 +00006100 switch (Triple.getArch()) {
6101 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006102 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006103
Tim Northover2a0783d2014-05-30 14:14:07 +00006104 case llvm::Triple::xcore:
6105 return new XCoreTargetInfo(Triple);
6106
6107 case llvm::Triple::hexagon:
6108 return new HexagonTargetInfo(Triple);
6109
6110 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006111 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006112 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006113
6114 switch (os) {
6115 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006116 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006117 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006118 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006119 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006120 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006121 }
6122
Christian Pirker9b019ae2014-02-25 13:51:00 +00006123 case llvm::Triple::aarch64_be:
6124 switch (os) {
6125 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006126 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006127 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006128 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006129 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006130 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006131 }
6132
Daniel Dunbar52322032009-08-18 05:47:58 +00006133 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006134 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006135 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006136 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006137
Daniel Dunbar52322032009-08-18 05:47:58 +00006138 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006139 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006140 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006141 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006142 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006143 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006144 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006145 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006146 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006147 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006148 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006149 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006150 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006151 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006152 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006153 case llvm::Triple::Win32:
6154 switch (Triple.getEnvironment()) {
6155 default:
6156 return new ARMleTargetInfo(Triple);
6157 case llvm::Triple::Itanium:
6158 return new ItaniumWindowsARMleTargetInfo(Triple);
6159 case llvm::Triple::MSVC:
6160 return new MicrosoftARMleTargetInfo(Triple);
6161 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006162 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006163 return new ARMleTargetInfo(Triple);
6164 }
6165
6166 case llvm::Triple::armeb:
6167 case llvm::Triple::thumbeb:
6168 if (Triple.isOSDarwin())
6169 return new DarwinARMTargetInfo(Triple);
6170
6171 switch (os) {
6172 case llvm::Triple::Linux:
6173 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6174 case llvm::Triple::FreeBSD:
6175 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6176 case llvm::Triple::NetBSD:
6177 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6178 case llvm::Triple::OpenBSD:
6179 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6180 case llvm::Triple::Bitrig:
6181 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6182 case llvm::Triple::RTEMS:
6183 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6184 case llvm::Triple::NaCl:
6185 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6186 default:
6187 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006188 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006189
Daniel Dunbar52322032009-08-18 05:47:58 +00006190 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006191 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006192
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006193 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006194 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006195 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006196 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006197 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006198 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006199 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006200 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006201 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006202 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006203 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006204 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006205 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006206
6207 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006208 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006209 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006210 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006211 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006212 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006213 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006214 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006215 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006216 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006217 case llvm::Triple::NaCl:
6218 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006219 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006220 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006221 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006222
Akira Hatanakabef17452011-09-20 19:21:49 +00006223 case llvm::Triple::mips64:
6224 switch (os) {
6225 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006226 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006227 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006228 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006229 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006230 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006231 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006232 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006233 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006234 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006235 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006236 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006237 }
6238
6239 case llvm::Triple::mips64el:
6240 switch (os) {
6241 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006242 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006243 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006244 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006245 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006246 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006247 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006248 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006249 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006250 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006251 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006252 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006253 }
6254
Ivan Krasindd7403e2011-08-24 20:22:22 +00006255 case llvm::Triple::le32:
6256 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006257 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006258 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006259 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006260 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006261 }
6262
Daniel Dunbar52322032009-08-18 05:47:58 +00006263 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006264 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006265 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006266 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006267 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006268 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006269 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006270 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006271 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006272 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006273 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006274 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006275 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006276 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006277 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006278 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006279 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006280
6281 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006282 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006283 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006284 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006285 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006286 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006287 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006288 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006289 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006290 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006291 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006292 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006293 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006294 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006295 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006296
Bill Schmidt778d3872013-07-26 01:36:11 +00006297 case llvm::Triple::ppc64le:
6298 switch (os) {
6299 case llvm::Triple::Linux:
6300 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6301 default:
6302 return new PPC64TargetInfo(Triple);
6303 }
6304
Peter Collingbournec947aae2012-05-20 23:28:41 +00006305 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006306 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006307 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006308 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006309
Eli Friedmand13b41e2012-10-12 23:32:00 +00006310 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006311 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006312
Daniel Dunbar52322032009-08-18 05:47:58 +00006313 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006314 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006315 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006316 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006317 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006318 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006319 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006320 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006321 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006322 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006323 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006324 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006325 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006326 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006327 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006328
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006329 case llvm::Triple::sparcv9:
6330 switch (os) {
6331 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006332 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006333 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006334 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006335 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006336 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006337 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006338 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006339 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006340 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006341 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006342 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006343 }
6344
Ulrich Weigand47445072013-05-06 16:26:41 +00006345 case llvm::Triple::systemz:
6346 switch (os) {
6347 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006348 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006349 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006350 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006351 }
6352
Eli Friedmana9c3d712009-08-19 20:47:07 +00006353 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006354 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006355
Daniel Dunbar52322032009-08-18 05:47:58 +00006356 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006357 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006358 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006359
Daniel Dunbar52322032009-08-18 05:47:58 +00006360 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006361 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006362 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006363 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006364 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006365 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006366 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006367 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006368 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006369 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006370 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006371 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006372 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006373 case llvm::Triple::KFreeBSD:
6374 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006375 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006376 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006377 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006378 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006379 case llvm::Triple::Win32: {
6380 switch (Triple.getEnvironment()) {
6381 default:
6382 return new X86_32TargetInfo(Triple);
6383 case llvm::Triple::Cygnus:
6384 return new CygwinX86_32TargetInfo(Triple);
6385 case llvm::Triple::GNU:
6386 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006387 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006388 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006389 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006390 }
6391 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006392 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006393 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006394 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006395 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006396 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006397 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006398 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006399 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006400 }
6401
6402 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006403 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006404 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006405
Daniel Dunbar52322032009-08-18 05:47:58 +00006406 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006407 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006408 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006409 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006410 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006411 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006412 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006413 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006414 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006415 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006416 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006417 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006418 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006419 case llvm::Triple::KFreeBSD:
6420 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006421 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006422 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006423 case llvm::Triple::Win32: {
6424 switch (Triple.getEnvironment()) {
6425 default:
6426 return new X86_64TargetInfo(Triple);
6427 case llvm::Triple::GNU:
6428 return new MinGWX86_64TargetInfo(Triple);
6429 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006430 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006431 }
6432 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006433 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006434 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006435 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006436 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006437 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006438
6439 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006440 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006441 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006442 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006443 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006444 }
6445 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006446 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006447 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006448 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006449 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006450 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006451 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006452}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006453
6454/// CreateTargetInfo - Return the target info object for the specified target
6455/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006456TargetInfo *
6457TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6458 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006459 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006460
6461 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006462 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006463 if (!Target) {
6464 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006465 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006466 }
Alp Toker80758082014-07-06 05:26:44 +00006467 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006468
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006469 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006470 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6471 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006472 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006473 }
6474
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006475 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006476 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6477 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006478 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006479 }
6480
Rafael Espindolaeb265472013-08-21 21:59:03 +00006481 // Set the fp math unit.
6482 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6483 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006484 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006485 }
6486
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006487 // Compute the default target features, we need the target to handle this
6488 // because features may have dependencies on one another.
6489 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006490 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006491
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006492 // Apply the user specified deltas.
6493 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6494 I < N; ++I) {
6495 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006496 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006497 bool Enabled = Name[0] == '+';
6498 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006499 }
6500
6501 // Add the features to the compile options.
6502 //
6503 // FIXME: If we are completely confident that we have the right set, we only
6504 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006505 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006506 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6507 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006508 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006509 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006510 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006511
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006512 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006513}