blob: 45a37172926bd767631f20efe26ef733e5b4cefc [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000033using namespace clang;
34
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000036// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
38
Chris Lattner1e1c0b92009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000049 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000050
Chris Lattner1e1c0b92009-03-20 16:06:38 +000051 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056}
57
Benjamin Kramere3b442d2012-01-10 11:50:09 +000058static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
Chris Lattner09d98f52008-10-05 21:50:58 +000066//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000069
Torok Edwinb2b37c62009-06-30 17:10:35 +000070namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000071template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000073protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000074 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000075 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000077 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000078 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000082 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000083
84};
Chris Lattner859c37a2009-08-12 06:24:27 +000085} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000086
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Daniel Dunbard86666f2010-01-26 01:44:04 +000088static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000089 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000090 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000091 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000092 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000097 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000099
John McCall5d36a8c2011-06-16 00:03:19 +0000100 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000103
John McCall31168b02011-06-15 23:02:42 +0000104 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000105 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000109
John McCall31168b02011-06-15 23:02:42 +0000110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000114 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000115
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000118 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000120
121 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000122 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123
Daniel Dunbarecf13562011-04-19 21:40:34 +0000124 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000125 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000132 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000133
Sebastian Pop422377c2012-01-20 22:01:23 +0000134 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000135 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
Evan Cheng31dd9a62014-01-26 23:12:43 +0000142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000178 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000179
Tim Northover157d9112014-01-16 08:48:16 +0000180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
Daniel Dunbarecf13562011-04-19 21:40:34 +0000184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000185}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000186
Chris Lattner30ba6742009-08-10 19:03:04 +0000187namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
Craig Topper3164f332014-03-11 03:39:26 +0000191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000194 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195 }
Mike Stump11289f42009-09-09 15:08:12 +0000196
Torok Edwinb2b37c62009-06-30 17:10:35 +0000197public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000198 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
199 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
200 this->MCountName = "\01mcount";
201 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000202
Craig Topper3164f332014-03-11 03:39:26 +0000203 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000204 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000205 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000206 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000207 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000208 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000209 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000210 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000211
Craig Topper3164f332014-03-11 03:39:26 +0000212 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000213 // FIXME: We should return 0 when building kexts.
214 return "__TEXT,__StaticInit,regular,pure_instructions";
215 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000216
John McCalleed64c72012-01-29 01:20:30 +0000217 /// Darwin does not support protected visibility. Darwin's "default"
218 /// is very similar to ELF's "protected"; Darwin requires a "weak"
219 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000220 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000221 return false;
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223};
224
Chris Lattner30ba6742009-08-10 19:03:04 +0000225
Torok Edwinb2b37c62009-06-30 17:10:35 +0000226// DragonFlyBSD Target
227template<typename Target>
228class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
229protected:
Craig Topper3164f332014-03-11 03:39:26 +0000230 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
231 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000232 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000233 Builder.defineMacro("__DragonFly__");
234 Builder.defineMacro("__DragonFly_cc_version", "100001");
235 Builder.defineMacro("__ELF__");
236 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
237 Builder.defineMacro("__tune_i386__");
238 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000239 }
240public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000241 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
242 : OSTargetInfo<Target>(Triple) {
243 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000244
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000245 switch (Triple.getArch()) {
246 default:
247 case llvm::Triple::x86:
248 case llvm::Triple::x86_64:
249 this->MCountName = ".mcount";
250 break;
251 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253};
254
255// FreeBSD Target
256template<typename Target>
257class FreeBSDTargetInfo : public OSTargetInfo<Target> {
258protected:
Craig Topper3164f332014-03-11 03:39:26 +0000259 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
260 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000261 // FreeBSD defines; list based off of gcc output
262
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000263 unsigned Release = Triple.getOSMajorVersion();
264 if (Release == 0U)
265 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000267 Builder.defineMacro("__FreeBSD__", Twine(Release));
268 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000269 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
270 DefineStd(Builder, "unix", Opts);
271 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000272
273 // On FreeBSD, wchar_t contains the number of the code point as
274 // used by the character set of the locale. These character sets are
275 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000276 //
277 // FIXME: This is wrong; the macro refers to the numerical values
278 // of wchar_t *literals*, which are not locale-dependent. However,
279 // FreeBSD systems apparently depend on us getting this wrong, and
280 // setting this to 1 is conforming even if all the basic source
281 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000282 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000283 }
284public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000285 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
286 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000287
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000288 switch (Triple.getArch()) {
289 default:
290 case llvm::Triple::x86:
291 case llvm::Triple::x86_64:
292 this->MCountName = ".mcount";
293 break;
294 case llvm::Triple::mips:
295 case llvm::Triple::mipsel:
296 case llvm::Triple::ppc:
297 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000298 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000299 this->MCountName = "_mcount";
300 break;
301 case llvm::Triple::arm:
302 this->MCountName = "__mcount";
303 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000304 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000305 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306};
307
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000308// GNU/kFreeBSD Target
309template<typename Target>
310class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
311protected:
Craig Topper3164f332014-03-11 03:39:26 +0000312 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
313 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000314 // GNU/kFreeBSD defines; list based off of gcc output
315
316 DefineStd(Builder, "unix", Opts);
317 Builder.defineMacro("__FreeBSD_kernel__");
318 Builder.defineMacro("__GLIBC__");
319 Builder.defineMacro("__ELF__");
320 if (Opts.POSIXThreads)
321 Builder.defineMacro("_REENTRANT");
322 if (Opts.CPlusPlus)
323 Builder.defineMacro("_GNU_SOURCE");
324 }
325public:
Eric Christopher917e9522014-11-18 22:36:15 +0000326 KFreeBSDTargetInfo(const llvm::Triple &Triple)
327 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000328 this->UserLabelPrefix = "";
329 }
330};
331
Chris Lattner3e2ee142010-07-07 16:01:42 +0000332// Minix Target
333template<typename Target>
334class MinixTargetInfo : public OSTargetInfo<Target> {
335protected:
Craig Topper3164f332014-03-11 03:39:26 +0000336 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
337 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000338 // Minix defines
339
340 Builder.defineMacro("__minix", "3");
341 Builder.defineMacro("_EM_WSIZE", "4");
342 Builder.defineMacro("_EM_PSIZE", "4");
343 Builder.defineMacro("_EM_SSIZE", "2");
344 Builder.defineMacro("_EM_LSIZE", "4");
345 Builder.defineMacro("_EM_FSIZE", "4");
346 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000347 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000348 DefineStd(Builder, "unix", Opts);
349 }
350public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000351 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
352 this->UserLabelPrefix = "";
353 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000354};
355
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356// Linux target
357template<typename Target>
358class LinuxTargetInfo : public OSTargetInfo<Target> {
359protected:
Craig Topper3164f332014-03-11 03:39:26 +0000360 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
361 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000362 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000363 DefineStd(Builder, "unix", Opts);
364 DefineStd(Builder, "linux", Opts);
365 Builder.defineMacro("__gnu_linux__");
366 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000367 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000368 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000369 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000370 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000371 if (Opts.CPlusPlus)
372 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000373 }
374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000375 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000376 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000377 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000378
379 switch (Triple.getArch()) {
380 default:
381 break;
382 case llvm::Triple::ppc:
383 case llvm::Triple::ppc64:
384 case llvm::Triple::ppc64le:
385 this->MCountName = "_mcount";
386 break;
387 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000388 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000389
Craig Topper3164f332014-03-11 03:39:26 +0000390 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000391 return ".text.startup";
392 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000393};
394
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000395// NetBSD Target
396template<typename Target>
397class NetBSDTargetInfo : public OSTargetInfo<Target> {
398protected:
Craig Topper3164f332014-03-11 03:39:26 +0000399 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
400 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000401 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000402 Builder.defineMacro("__NetBSD__");
403 Builder.defineMacro("__unix__");
404 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000405 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000406 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000407
408 switch (Triple.getArch()) {
409 default:
410 break;
411 case llvm::Triple::arm:
412 case llvm::Triple::armeb:
413 case llvm::Triple::thumb:
414 case llvm::Triple::thumbeb:
415 Builder.defineMacro("__ARM_DWARF_EH__");
416 break;
417 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000418 }
419public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000420 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
421 this->UserLabelPrefix = "";
422 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000423};
424
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425// OpenBSD Target
426template<typename Target>
427class OpenBSDTargetInfo : public OSTargetInfo<Target> {
428protected:
Craig Topper3164f332014-03-11 03:39:26 +0000429 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
430 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431 // OpenBSD defines; list based off of gcc output
432
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000433 Builder.defineMacro("__OpenBSD__");
434 DefineStd(Builder, "unix", Opts);
435 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000436 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000437 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438 }
439public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000440 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
441 this->UserLabelPrefix = "";
442 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000443
Eli Friedman3715d1f2011-12-15 02:15:56 +0000444 switch (Triple.getArch()) {
445 default:
446 case llvm::Triple::x86:
447 case llvm::Triple::x86_64:
448 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000449 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000450 this->MCountName = "__mcount";
451 break;
452 case llvm::Triple::mips64:
453 case llvm::Triple::mips64el:
454 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000455 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000456 this->MCountName = "_mcount";
457 break;
458 }
459 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000460};
461
Eli Friedman9fa28852012-08-08 23:57:20 +0000462// Bitrig Target
463template<typename Target>
464class BitrigTargetInfo : public OSTargetInfo<Target> {
465protected:
Craig Topper3164f332014-03-11 03:39:26 +0000466 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
467 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000468 // Bitrig defines; list based off of gcc output
469
470 Builder.defineMacro("__Bitrig__");
471 DefineStd(Builder, "unix", Opts);
472 Builder.defineMacro("__ELF__");
473 if (Opts.POSIXThreads)
474 Builder.defineMacro("_REENTRANT");
475 }
476public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000477 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
478 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000479 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000480 }
481};
482
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000483// PSP Target
484template<typename Target>
485class PSPTargetInfo : public OSTargetInfo<Target> {
486protected:
Craig Topper3164f332014-03-11 03:39:26 +0000487 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
488 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000489 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000490 Builder.defineMacro("PSP");
491 Builder.defineMacro("_PSP");
492 Builder.defineMacro("__psp__");
493 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000494 }
495public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000496 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000497 this->UserLabelPrefix = "";
498 }
499};
500
John Thompsone467e192009-11-19 17:18:50 +0000501// PS3 PPU Target
502template<typename Target>
503class PS3PPUTargetInfo : public OSTargetInfo<Target> {
504protected:
Craig Topper3164f332014-03-11 03:39:26 +0000505 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
506 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000507 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000508 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__PPU__");
510 Builder.defineMacro("__CELLOS_LV2__");
511 Builder.defineMacro("__ELF__");
512 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000513 Builder.defineMacro("_ARCH_PPC64");
514 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000515 }
516public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000518 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000519 this->LongWidth = this->LongAlign = 32;
520 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000521 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000522 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000523 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000524 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000525 }
526};
527
Torok Edwinb2b37c62009-06-30 17:10:35 +0000528// Solaris target
529template<typename Target>
530class SolarisTargetInfo : public OSTargetInfo<Target> {
531protected:
Craig Topper3164f332014-03-11 03:39:26 +0000532 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
533 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000534 DefineStd(Builder, "sun", Opts);
535 DefineStd(Builder, "unix", Opts);
536 Builder.defineMacro("__ELF__");
537 Builder.defineMacro("__svr4__");
538 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000539 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
540 // newer, but to 500 for everything else. feature_test.h has a check to
541 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000542 // with a new version.
543 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000544 Builder.defineMacro("_XOPEN_SOURCE", "600");
545 else
546 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000547 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000548 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000549 Builder.defineMacro("_LARGEFILE_SOURCE");
550 Builder.defineMacro("_LARGEFILE64_SOURCE");
551 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000552 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000553 }
554public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000555 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000556 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000557 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000558 // FIXME: WIntType should be SignedLong
559 }
560};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000561
562// Windows target
563template<typename Target>
564class WindowsTargetInfo : public OSTargetInfo<Target> {
565protected:
Craig Topper3164f332014-03-11 03:39:26 +0000566 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
567 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000568 Builder.defineMacro("_WIN32");
569 }
570 void getVisualStudioDefines(const LangOptions &Opts,
571 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000572 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000573 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000574 Builder.defineMacro("_CPPRTTI");
575
576 if (Opts.Exceptions)
577 Builder.defineMacro("_CPPUNWIND");
578 }
579
580 if (!Opts.CharIsSigned)
581 Builder.defineMacro("_CHAR_UNSIGNED");
582
583 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
584 // but it works for now.
585 if (Opts.POSIXThreads)
586 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000587
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000588 if (Opts.MSCompatibilityVersion) {
589 Builder.defineMacro("_MSC_VER",
590 Twine(Opts.MSCompatibilityVersion / 100000));
591 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000592 // FIXME We cannot encode the revision information into 32-bits
593 Builder.defineMacro("_MSC_BUILD", Twine(1));
594 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000595
596 if (Opts.MicrosoftExt) {
597 Builder.defineMacro("_MSC_EXTENSIONS");
598
599 if (Opts.CPlusPlus11) {
600 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
601 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
602 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
603 }
604 }
605
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000606 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000607 }
608
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000609public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000610 WindowsTargetInfo(const llvm::Triple &Triple)
611 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000612};
613
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000614template <typename Target>
615class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000616protected:
Craig Topper3164f332014-03-11 03:39:26 +0000617 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
618 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000619 if (Opts.POSIXThreads)
620 Builder.defineMacro("_REENTRANT");
621 if (Opts.CPlusPlus)
622 Builder.defineMacro("_GNU_SOURCE");
623
624 DefineStd(Builder, "unix", Opts);
625 Builder.defineMacro("__ELF__");
626 Builder.defineMacro("__native_client__");
627 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000628
629public:
630 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000631 this->UserLabelPrefix = "";
632 this->LongAlign = 32;
633 this->LongWidth = 32;
634 this->PointerAlign = 32;
635 this->PointerWidth = 32;
636 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000637 this->Int64Type = TargetInfo::SignedLongLong;
638 this->DoubleAlign = 64;
639 this->LongDoubleWidth = 64;
640 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000641 this->LongLongWidth = 64;
642 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000643 this->SizeType = TargetInfo::UnsignedInt;
644 this->PtrDiffType = TargetInfo::SignedInt;
645 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000646 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000647 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000648 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000649 this->DescriptionString =
650 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000651 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000652 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000653 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000654 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000655 } else if (Triple.getArch() == llvm::Triple::mipsel) {
656 // Handled on mips' setDescriptionString.
657 } else {
658 assert(Triple.getArch() == llvm::Triple::le32);
659 this->DescriptionString = "e-p:32:32-i64:64";
660 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000661 }
Craig Topper3164f332014-03-11 03:39:26 +0000662 typename Target::CallingConvCheckResult checkCallingConvention(
663 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000664 return CC == CC_PnaclCall ? Target::CCCR_OK :
665 Target::checkCallingConvention(CC);
666 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000667};
Mike Stump11289f42009-09-09 15:08:12 +0000668} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000669
Chris Lattner09d98f52008-10-05 21:50:58 +0000670//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000671// Specific target implementations.
672//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000673
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000674namespace {
675// PPC abstract base class
676class PPCTargetInfo : public TargetInfo {
677 static const Builtin::Info BuiltinInfo[];
678 static const char * const GCCRegNames[];
679 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000680 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000681
682 // Target cpu features.
683 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000684 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000685
Ulrich Weigand8afad612014-07-28 13:17:52 +0000686protected:
687 std::string ABI;
688
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000689public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000690 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000691 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000692 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000693 LongDoubleWidth = LongDoubleAlign = 128;
694 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
695 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000696
Hal Finkel6b984f02012-07-03 16:51:04 +0000697 /// \brief Flags for architecture specific defines.
698 typedef enum {
699 ArchDefineNone = 0,
700 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
701 ArchDefinePpcgr = 1 << 1,
702 ArchDefinePpcsq = 1 << 2,
703 ArchDefine440 = 1 << 3,
704 ArchDefine603 = 1 << 4,
705 ArchDefine604 = 1 << 5,
706 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000707 ArchDefinePwr5 = 1 << 7,
708 ArchDefinePwr5x = 1 << 8,
709 ArchDefinePwr6 = 1 << 9,
710 ArchDefinePwr6x = 1 << 10,
711 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000712 ArchDefinePwr8 = 1 << 12,
713 ArchDefineA2 = 1 << 13,
714 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000715 } ArchDefineTypes;
716
Bill Schmidt38378a02013-02-01 20:23:10 +0000717 // Note: GCC recognizes the following additional cpus:
718 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
719 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
720 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000721 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000722 bool CPUKnown = llvm::StringSwitch<bool>(Name)
723 .Case("generic", true)
724 .Case("440", true)
725 .Case("450", true)
726 .Case("601", true)
727 .Case("602", true)
728 .Case("603", true)
729 .Case("603e", true)
730 .Case("603ev", true)
731 .Case("604", true)
732 .Case("604e", true)
733 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000734 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000735 .Case("g3", true)
736 .Case("7400", true)
737 .Case("g4", true)
738 .Case("7450", true)
739 .Case("g4+", true)
740 .Case("750", true)
741 .Case("970", true)
742 .Case("g5", true)
743 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000744 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000745 .Case("e500mc", true)
746 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000747 .Case("power3", true)
748 .Case("pwr3", true)
749 .Case("power4", true)
750 .Case("pwr4", true)
751 .Case("power5", true)
752 .Case("pwr5", true)
753 .Case("power5x", true)
754 .Case("pwr5x", true)
755 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000756 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000757 .Case("power6x", true)
758 .Case("pwr6x", true)
759 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000760 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000761 .Case("power8", true)
762 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000763 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000764 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000765 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000766 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000767 .Case("powerpc64le", true)
768 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000769 .Default(false);
770
771 if (CPUKnown)
772 CPU = Name;
773
774 return CPUKnown;
775 }
776
Ulrich Weigand8afad612014-07-28 13:17:52 +0000777
778 StringRef getABI() const override { return ABI; }
779
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getTargetBuiltins(const Builtin::Info *&Records,
781 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000782 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000783 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000784 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000785
Craig Topper3164f332014-03-11 03:39:26 +0000786 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000787
Craig Topper3164f332014-03-11 03:39:26 +0000788 void getTargetDefines(const LangOptions &Opts,
789 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000790
Craig Topper3164f332014-03-11 03:39:26 +0000791 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000792
Craig Topper3164f332014-03-11 03:39:26 +0000793 bool handleTargetFeatures(std::vector<std::string> &Features,
794 DiagnosticsEngine &Diags) override;
795 bool hasFeature(StringRef Feature) const override;
796
797 void getGCCRegNames(const char * const *&Names,
798 unsigned &NumNames) const override;
799 void getGCCRegAliases(const GCCRegAlias *&Aliases,
800 unsigned &NumAliases) const override;
801 bool validateAsmConstraint(const char *&Name,
802 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000803 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000804 default: return false;
805 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000806 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000807 case 'b': // Base register
808 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000809 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000810 break;
811 // FIXME: The following are added to allow parsing.
812 // I just took a guess at what the actions should be.
813 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000814 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000815 case 'v': // Altivec vector register
816 Info.setAllowsRegister();
817 break;
818 case 'w':
819 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000820 case 'd':// VSX vector register to hold vector double data
821 case 'f':// VSX vector register to hold vector float data
822 case 's':// VSX vector register to hold scalar float data
823 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000824 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000825 break;
826 default:
827 return false;
828 }
829 Info.setAllowsRegister();
830 Name++; // Skip over 'w'.
831 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000832 case 'h': // `MQ', `CTR', or `LINK' register
833 case 'q': // `MQ' register
834 case 'c': // `CTR' register
835 case 'l': // `LINK' register
836 case 'x': // `CR' register (condition register) number 0
837 case 'y': // `CR' register (condition register)
838 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000839 Info.setAllowsRegister();
840 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000841 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000842 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000843 // (use `L' instead for SImode constants)
844 case 'K': // Unsigned 16-bit constant
845 case 'L': // Signed 16-bit constant shifted left 16 bits
846 case 'M': // Constant larger than 31
847 case 'N': // Exact power of 2
848 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000849 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000850 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000851 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000852 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000853 break;
854 case 'm': // Memory operand. Note that on PowerPC targets, m can
855 // include addresses that update the base register. It
856 // is therefore only safe to use `m' in an asm statement
857 // if that asm statement accesses the operand exactly once.
858 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000859 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000860 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000861 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000862 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000863 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
864 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000865 // register to be updated.
866 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000867 if (Name[1] != 's')
868 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000869 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000870 // include any automodification of the base register. Unlike
871 // `m', this constraint can be used in asm statements that
872 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000873 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000874 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000875 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000876 break;
877 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000878 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000879 case 'Z': // Memory operand that is an indexed or indirect from a
880 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000881 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000882 Info.setAllowsMemory();
883 Info.setAllowsRegister();
884 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000885 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000886 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000887 // register (`p' is preferable for asm statements)
888 case 'S': // Constant suitable as a 64-bit mask operand
889 case 'T': // Constant suitable as a 32-bit mask operand
890 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000891 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000892 // instructions
893 case 'W': // Vector constant that does not require memory
894 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000895 break;
896 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000897 }
John Thompson07a61a42010-06-24 22:44:13 +0000898 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000899 }
Craig Topper3164f332014-03-11 03:39:26 +0000900 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000901 std::string R;
902 switch (*Constraint) {
903 case 'e':
904 case 'w':
905 // Two-character constraint; add "^" hint for later parsing.
906 R = std::string("^") + std::string(Constraint, 2);
907 Constraint++;
908 break;
909 default:
910 return TargetInfo::convertConstraint(Constraint);
911 }
912 return R;
913 }
Craig Topper3164f332014-03-11 03:39:26 +0000914 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000915 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000916 }
Craig Topper3164f332014-03-11 03:39:26 +0000917 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000918 if (RegNo == 0) return 3;
919 if (RegNo == 1) return 4;
920 return -1;
921 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000922};
Anders Carlssonf511f642007-11-27 04:11:28 +0000923
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000924const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000925#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000926#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000927 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000928#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000929};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000930
Eric Christopher917e9522014-11-18 22:36:15 +0000931/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000932/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000933bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000934 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000935 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
936 // Ignore disabled features.
937 if (Features[i][0] == '-')
938 continue;
939
940 StringRef Feature = StringRef(Features[i]).substr(1);
941
942 if (Feature == "vsx") {
943 HasVSX = true;
944 continue;
945 }
946
Bill Schmidt59eb7672014-10-10 15:09:43 +0000947 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000948 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000949 continue;
950 }
951
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000952 // TODO: Finish this list and add an assert that we've handled them
953 // all.
954 }
955
956 return true;
957}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000958
Chris Lattnerecd49032009-03-02 22:27:17 +0000959/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
960/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000961void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000962 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000963 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000964 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000965 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000966 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000967 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000968 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000969 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000970 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000971 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000972 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000973 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000974 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000975
Chris Lattnerecd49032009-03-02 22:27:17 +0000976 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000977 if (getTriple().getArch() == llvm::Triple::ppc64le) {
978 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000979 } else {
980 if (getTriple().getOS() != llvm::Triple::NetBSD &&
981 getTriple().getOS() != llvm::Triple::OpenBSD)
982 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000983 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000984
Ulrich Weigand8afad612014-07-28 13:17:52 +0000985 // ABI options.
986 if (ABI == "elfv1")
987 Builder.defineMacro("_CALL_ELF", "1");
988 if (ABI == "elfv2")
989 Builder.defineMacro("_CALL_ELF", "2");
990
Chris Lattnerecd49032009-03-02 22:27:17 +0000991 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000992 Builder.defineMacro("__NATURAL_ALIGNMENT__");
993 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000994
Chris Lattnerecd49032009-03-02 22:27:17 +0000995 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000996 if (LongDoubleWidth == 128)
997 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000998
John Thompsone467e192009-11-19 17:18:50 +0000999 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001000 Builder.defineMacro("__VEC__", "10206");
1001 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001002 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001003
1004 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001005 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1006 .Case("440", ArchDefineName)
1007 .Case("450", ArchDefineName | ArchDefine440)
1008 .Case("601", ArchDefineName)
1009 .Case("602", ArchDefineName | ArchDefinePpcgr)
1010 .Case("603", ArchDefineName | ArchDefinePpcgr)
1011 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1012 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1013 .Case("604", ArchDefineName | ArchDefinePpcgr)
1014 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1015 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001016 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001017 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1018 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1019 .Case("750", ArchDefineName | ArchDefinePpcgr)
1020 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1021 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001022 .Case("a2", ArchDefineA2)
1023 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001024 .Case("pwr3", ArchDefinePpcgr)
1025 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1026 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1027 | ArchDefinePpcsq)
1028 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1029 | ArchDefinePpcgr | ArchDefinePpcsq)
1030 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1031 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1032 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1033 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1034 | ArchDefinePpcsq)
1035 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1036 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001037 | ArchDefinePpcgr | ArchDefinePpcsq)
1038 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1039 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1040 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001041 .Case("power3", ArchDefinePpcgr)
1042 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1043 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1044 | ArchDefinePpcsq)
1045 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1046 | ArchDefinePpcgr | ArchDefinePpcsq)
1047 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1048 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1049 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1050 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1051 | ArchDefinePpcsq)
1052 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1053 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001054 | ArchDefinePpcgr | ArchDefinePpcsq)
1055 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1056 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1057 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001058 .Default(ArchDefineNone);
1059
1060 if (defs & ArchDefineName)
1061 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1062 if (defs & ArchDefinePpcgr)
1063 Builder.defineMacro("_ARCH_PPCGR");
1064 if (defs & ArchDefinePpcsq)
1065 Builder.defineMacro("_ARCH_PPCSQ");
1066 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001067 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001068 if (defs & ArchDefine603)
1069 Builder.defineMacro("_ARCH_603");
1070 if (defs & ArchDefine604)
1071 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001072 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001073 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001074 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001075 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001076 if (defs & ArchDefinePwr5x)
1077 Builder.defineMacro("_ARCH_PWR5X");
1078 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001079 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001080 if (defs & ArchDefinePwr6x)
1081 Builder.defineMacro("_ARCH_PWR6X");
1082 if (defs & ArchDefinePwr7)
1083 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001084 if (defs & ArchDefinePwr8)
1085 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001086 if (defs & ArchDefineA2)
1087 Builder.defineMacro("_ARCH_A2");
1088 if (defs & ArchDefineA2q) {
1089 Builder.defineMacro("_ARCH_A2Q");
1090 Builder.defineMacro("_ARCH_QP");
1091 }
1092
1093 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1094 Builder.defineMacro("__bg__");
1095 Builder.defineMacro("__THW_BLUEGENE__");
1096 Builder.defineMacro("__bgq__");
1097 Builder.defineMacro("__TOS_BGQ__");
1098 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001099
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001100 if (HasVSX)
1101 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001102 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001103 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001104
Bill Schmidt38378a02013-02-01 20:23:10 +00001105 // FIXME: The following are not yet generated here by Clang, but are
1106 // generated by GCC:
1107 //
1108 // _SOFT_FLOAT_
1109 // __RECIP_PRECISION__
1110 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001111 // __RECIP__
1112 // __RECIPF__
1113 // __RSQRTE__
1114 // __RSQRTEF__
1115 // _SOFT_DOUBLE_
1116 // __NO_LWSYNC__
1117 // __HAVE_BSWAP__
1118 // __LONGDOUBLE128
1119 // __CMODEL_MEDIUM__
1120 // __CMODEL_LARGE__
1121 // _CALL_SYSV
1122 // _CALL_DARWIN
1123 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001124}
1125
1126void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1127 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1128 .Case("7400", true)
1129 .Case("g4", true)
1130 .Case("7450", true)
1131 .Case("g4+", true)
1132 .Case("970", true)
1133 .Case("g5", true)
1134 .Case("pwr6", true)
1135 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001136 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001137 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001138 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001139 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001140
1141 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001142
1143 if (!ABI.empty())
1144 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001145}
1146
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001147bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001148 return llvm::StringSwitch<bool>(Feature)
1149 .Case("powerpc", true)
1150 .Case("vsx", HasVSX)
1151 .Case("power8-vector", HasP8Vector)
1152 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001153}
Chris Lattner17df24e2008-04-21 18:56:49 +00001154
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001155const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001156 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1157 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1158 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1159 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1160 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1161 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1162 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1163 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001164 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001165 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001166 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001167 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1168 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1169 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1170 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001171 "vrsave", "vscr",
1172 "spe_acc", "spefscr",
1173 "sfp"
1174};
Chris Lattner10a5b382007-01-29 05:24:35 +00001175
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001176void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001177 unsigned &NumNames) const {
1178 Names = GCCRegNames;
1179 NumNames = llvm::array_lengthof(GCCRegNames);
1180}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001181
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001182const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1183 // While some of these aliases do map to different registers
1184 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001185 { { "0" }, "r0" },
1186 { { "1"}, "r1" },
1187 { { "2" }, "r2" },
1188 { { "3" }, "r3" },
1189 { { "4" }, "r4" },
1190 { { "5" }, "r5" },
1191 { { "6" }, "r6" },
1192 { { "7" }, "r7" },
1193 { { "8" }, "r8" },
1194 { { "9" }, "r9" },
1195 { { "10" }, "r10" },
1196 { { "11" }, "r11" },
1197 { { "12" }, "r12" },
1198 { { "13" }, "r13" },
1199 { { "14" }, "r14" },
1200 { { "15" }, "r15" },
1201 { { "16" }, "r16" },
1202 { { "17" }, "r17" },
1203 { { "18" }, "r18" },
1204 { { "19" }, "r19" },
1205 { { "20" }, "r20" },
1206 { { "21" }, "r21" },
1207 { { "22" }, "r22" },
1208 { { "23" }, "r23" },
1209 { { "24" }, "r24" },
1210 { { "25" }, "r25" },
1211 { { "26" }, "r26" },
1212 { { "27" }, "r27" },
1213 { { "28" }, "r28" },
1214 { { "29" }, "r29" },
1215 { { "30" }, "r30" },
1216 { { "31" }, "r31" },
1217 { { "fr0" }, "f0" },
1218 { { "fr1" }, "f1" },
1219 { { "fr2" }, "f2" },
1220 { { "fr3" }, "f3" },
1221 { { "fr4" }, "f4" },
1222 { { "fr5" }, "f5" },
1223 { { "fr6" }, "f6" },
1224 { { "fr7" }, "f7" },
1225 { { "fr8" }, "f8" },
1226 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001227 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001228 { { "fr11" }, "f11" },
1229 { { "fr12" }, "f12" },
1230 { { "fr13" }, "f13" },
1231 { { "fr14" }, "f14" },
1232 { { "fr15" }, "f15" },
1233 { { "fr16" }, "f16" },
1234 { { "fr17" }, "f17" },
1235 { { "fr18" }, "f18" },
1236 { { "fr19" }, "f19" },
1237 { { "fr20" }, "f20" },
1238 { { "fr21" }, "f21" },
1239 { { "fr22" }, "f22" },
1240 { { "fr23" }, "f23" },
1241 { { "fr24" }, "f24" },
1242 { { "fr25" }, "f25" },
1243 { { "fr26" }, "f26" },
1244 { { "fr27" }, "f27" },
1245 { { "fr28" }, "f28" },
1246 { { "fr29" }, "f29" },
1247 { { "fr30" }, "f30" },
1248 { { "fr31" }, "f31" },
1249 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001250};
1251
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001252void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001253 unsigned &NumAliases) const {
1254 Aliases = GCCRegAliases;
1255 NumAliases = llvm::array_lengthof(GCCRegAliases);
1256}
1257} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001258
Chris Lattner5ba61f02006-10-14 07:39:34 +00001259namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001260class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001262 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001263 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001264
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001265 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001266 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001267 case llvm::Triple::FreeBSD:
1268 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001269 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001270 PtrDiffType = SignedInt;
1271 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001272 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001273 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001274 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001275 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001276
Roman Divacky3ffe7462012-03-13 19:20:17 +00001277 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1278 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001279 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001280 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001281
1282 // PPC32 supports atomics up to 4 bytes.
1283 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001284 }
1285
Craig Topper3164f332014-03-11 03:39:26 +00001286 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001287 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001288 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001289 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001290};
1291} // end anonymous namespace.
1292
Bill Schmidt778d3872013-07-26 01:36:11 +00001293// Note: ABI differences may eventually require us to have a separate
1294// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001295namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001296class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001297public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001298 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001299 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001300 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001301 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001302
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001303 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1304 DescriptionString = "e-m:e-i64:64-n32:64";
1305 ABI = "elfv2";
1306 } else {
1307 DescriptionString = "E-m:e-i64:64-n32:64";
1308 ABI = "elfv1";
1309 }
1310
1311 switch (getTriple().getOS()) {
1312 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001313 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001314 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001315 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001316 case llvm::Triple::NetBSD:
1317 IntMaxType = SignedLongLong;
1318 Int64Type = SignedLongLong;
1319 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001320 default:
1321 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001322 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001323
1324 // PPC64 supports atomics up to 8 bytes.
1325 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001326 }
Craig Topper3164f332014-03-11 03:39:26 +00001327 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001328 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001329 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001330 // PPC64 Linux-specifc ABI options.
1331 bool setABI(const std::string &Name) override {
1332 if (Name == "elfv1" || Name == "elfv2") {
1333 ABI = Name;
1334 return true;
1335 }
1336 return false;
1337 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001338};
1339} // end anonymous namespace.
1340
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001341
1342namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001343class DarwinPPC32TargetInfo :
1344 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001345public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001346 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1347 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001348 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001349 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001350 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001351 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001352 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001353 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001354 }
Craig Topper3164f332014-03-11 03:39:26 +00001355 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001356 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001357 }
1358};
1359
1360class DarwinPPC64TargetInfo :
1361 public DarwinTargetInfo<PPC64TargetInfo> {
1362public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001363 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1364 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001365 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001366 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001367 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001368 }
1369};
1370} // end anonymous namespace.
1371
Chris Lattner5ba61f02006-10-14 07:39:34 +00001372namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001373 static const unsigned NVPTXAddrSpaceMap[] = {
1374 1, // opencl_global
1375 3, // opencl_local
1376 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001377 // FIXME: generic has to be added to the target
1378 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001379 1, // cuda_device
1380 4, // cuda_constant
1381 3, // cuda_shared
1382 };
1383 class NVPTXTargetInfo : public TargetInfo {
1384 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001385 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001386
1387 // The GPU profiles supported by the NVPTX backend
1388 enum GPUKind {
1389 GK_NONE,
1390 GK_SM20,
1391 GK_SM21,
1392 GK_SM30,
1393 GK_SM35,
1394 } GPU;
1395
Peter Collingbournec947aae2012-05-20 23:28:41 +00001396 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001397 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001398 BigEndian = false;
1399 TLSSupported = false;
1400 LongWidth = LongAlign = 64;
1401 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001402 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001403 // Define available target features
1404 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001405 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001406 // Set the default GPU to sm20
1407 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001408 }
Craig Topper3164f332014-03-11 03:39:26 +00001409 void getTargetDefines(const LangOptions &Opts,
1410 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001411 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001412 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001413 if (Opts.CUDAIsDevice) {
1414 // Set __CUDA_ARCH__ for the GPU specified.
1415 std::string CUDAArchCode;
1416 switch (GPU) {
1417 case GK_SM20:
1418 CUDAArchCode = "200";
1419 break;
1420 case GK_SM21:
1421 CUDAArchCode = "210";
1422 break;
1423 case GK_SM30:
1424 CUDAArchCode = "300";
1425 break;
1426 case GK_SM35:
1427 CUDAArchCode = "350";
1428 break;
1429 default:
1430 llvm_unreachable("Unhandled target CPU");
1431 }
1432 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1433 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001434 }
Craig Topper3164f332014-03-11 03:39:26 +00001435 void getTargetBuiltins(const Builtin::Info *&Records,
1436 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001437 Records = BuiltinInfo;
1438 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001439 }
Craig Topper3164f332014-03-11 03:39:26 +00001440 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001441 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001442 }
Craig Topper3164f332014-03-11 03:39:26 +00001443
1444 void getGCCRegNames(const char * const *&Names,
1445 unsigned &NumNames) const override;
1446 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1447 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001448 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001449 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001450 NumAliases = 0;
1451 }
Eric Christopher917e9522014-11-18 22:36:15 +00001452 bool
1453 validateAsmConstraint(const char *&Name,
1454 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001455 switch (*Name) {
1456 default: return false;
1457 case 'c':
1458 case 'h':
1459 case 'r':
1460 case 'l':
1461 case 'f':
1462 case 'd':
1463 Info.setAllowsRegister();
1464 return true;
1465 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001466 }
Craig Topper3164f332014-03-11 03:39:26 +00001467 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001468 // FIXME: Is this really right?
1469 return "";
1470 }
Craig Topper3164f332014-03-11 03:39:26 +00001471 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001472 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001473 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001474 }
Craig Topper3164f332014-03-11 03:39:26 +00001475 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001476 GPU = llvm::StringSwitch<GPUKind>(Name)
1477 .Case("sm_20", GK_SM20)
1478 .Case("sm_21", GK_SM21)
1479 .Case("sm_30", GK_SM30)
1480 .Case("sm_35", GK_SM35)
1481 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001482
Reid Klecknerbbc01782014-12-03 21:53:36 +00001483 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001484 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001485 };
1486
1487 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1488#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1489#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1490 ALL_LANGUAGES },
1491#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001492 };
1493
1494 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1495 "r0"
1496 };
1497
1498 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1499 unsigned &NumNames) const {
1500 Names = GCCRegNames;
1501 NumNames = llvm::array_lengthof(GCCRegNames);
1502 }
1503
1504 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1505 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001506 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001507 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001508 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1509 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001510 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001511 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001512 };
1513
1514 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1515 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001516 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001517 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001518 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1519 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001520 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001521 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001522 };
1523}
1524
1525namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001526
1527static const unsigned R600AddrSpaceMap[] = {
1528 1, // opencl_global
1529 3, // opencl_local
1530 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001531 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001532 1, // cuda_device
1533 2, // cuda_constant
1534 3 // cuda_shared
1535};
1536
Tom Stellarda96344b2014-08-21 13:58:40 +00001537// If you edit the description strings, make sure you update
1538// getPointerWidthV().
1539
Tom Stellardc74b1e02013-03-04 17:40:53 +00001540static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001541 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1542 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001543
1544static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001545 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1546 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001547
1548static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001549 "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 +00001550 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1551 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001552
Eli Friedmand13b41e2012-10-12 23:32:00 +00001553class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001554 static const Builtin::Info BuiltinInfo[];
1555
Tom Stellardc74b1e02013-03-04 17:40:53 +00001556 /// \brief The GPU profiles supported by the R600 target.
1557 enum GPUKind {
1558 GK_NONE,
1559 GK_R600,
1560 GK_R600_DOUBLE_OPS,
1561 GK_R700,
1562 GK_R700_DOUBLE_OPS,
1563 GK_EVERGREEN,
1564 GK_EVERGREEN_DOUBLE_OPS,
1565 GK_NORTHERN_ISLANDS,
1566 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001567 GK_SOUTHERN_ISLANDS,
1568 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001569 } GPU;
1570
Eli Friedmand13b41e2012-10-12 23:32:00 +00001571public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001572 R600TargetInfo(const llvm::Triple &Triple)
1573 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001574 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001575 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001576 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001577 }
1578
Tom Stellarda96344b2014-08-21 13:58:40 +00001579 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1580 if (GPU <= GK_CAYMAN)
1581 return 32;
1582
1583 switch(AddrSpace) {
1584 default:
1585 return 64;
1586 case 0:
1587 case 3:
1588 case 5:
1589 return 32;
1590 }
1591 }
1592
Craig Topper3164f332014-03-11 03:39:26 +00001593 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001594 return "";
1595 }
1596
Craig Topper3164f332014-03-11 03:39:26 +00001597 void getGCCRegNames(const char * const *&Names,
1598 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001599 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001600 numNames = 0;
1601 }
1602
Craig Topper3164f332014-03-11 03:39:26 +00001603 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1604 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001605 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001606 NumAliases = 0;
1607 }
1608
Craig Topper3164f332014-03-11 03:39:26 +00001609 bool validateAsmConstraint(const char *&Name,
1610 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001611 return true;
1612 }
1613
Craig Topper3164f332014-03-11 03:39:26 +00001614 void getTargetBuiltins(const Builtin::Info *&Records,
1615 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001616 Records = BuiltinInfo;
1617 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001618 }
1619
Craig Topper3164f332014-03-11 03:39:26 +00001620 void getTargetDefines(const LangOptions &Opts,
1621 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001622 Builder.defineMacro("__R600__");
1623 }
1624
Craig Topper3164f332014-03-11 03:39:26 +00001625 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001626 return TargetInfo::CharPtrBuiltinVaList;
1627 }
1628
Craig Topper3164f332014-03-11 03:39:26 +00001629 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001630 GPU = llvm::StringSwitch<GPUKind>(Name)
1631 .Case("r600" , GK_R600)
1632 .Case("rv610", GK_R600)
1633 .Case("rv620", GK_R600)
1634 .Case("rv630", GK_R600)
1635 .Case("rv635", GK_R600)
1636 .Case("rs780", GK_R600)
1637 .Case("rs880", GK_R600)
1638 .Case("rv670", GK_R600_DOUBLE_OPS)
1639 .Case("rv710", GK_R700)
1640 .Case("rv730", GK_R700)
1641 .Case("rv740", GK_R700_DOUBLE_OPS)
1642 .Case("rv770", GK_R700_DOUBLE_OPS)
1643 .Case("palm", GK_EVERGREEN)
1644 .Case("cedar", GK_EVERGREEN)
1645 .Case("sumo", GK_EVERGREEN)
1646 .Case("sumo2", GK_EVERGREEN)
1647 .Case("redwood", GK_EVERGREEN)
1648 .Case("juniper", GK_EVERGREEN)
1649 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1650 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1651 .Case("barts", GK_NORTHERN_ISLANDS)
1652 .Case("turks", GK_NORTHERN_ISLANDS)
1653 .Case("caicos", GK_NORTHERN_ISLANDS)
1654 .Case("cayman", GK_CAYMAN)
1655 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001656 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001657 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1658 .Case("verde", GK_SOUTHERN_ISLANDS)
1659 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001660 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001661 .Case("bonaire", GK_SEA_ISLANDS)
1662 .Case("kabini", GK_SEA_ISLANDS)
1663 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001664 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001665 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001666 .Default(GK_NONE);
1667
1668 if (GPU == GK_NONE) {
1669 return false;
1670 }
1671
1672 // Set the correct data layout
1673 switch (GPU) {
1674 case GK_NONE:
1675 case GK_R600:
1676 case GK_R700:
1677 case GK_EVERGREEN:
1678 case GK_NORTHERN_ISLANDS:
1679 DescriptionString = DescriptionStringR600;
1680 break;
1681 case GK_R600_DOUBLE_OPS:
1682 case GK_R700_DOUBLE_OPS:
1683 case GK_EVERGREEN_DOUBLE_OPS:
1684 case GK_CAYMAN:
1685 DescriptionString = DescriptionStringR600DoubleOps;
1686 break;
1687 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001688 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001689 DescriptionString = DescriptionStringSI;
1690 break;
1691 }
1692
1693 return true;
1694 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001695};
1696
Matt Arsenault56f008d2014-06-24 20:45:01 +00001697const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1698#define BUILTIN(ID, TYPE, ATTRS) \
1699 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1700#include "clang/Basic/BuiltinsR600.def"
1701};
1702
Eli Friedmand13b41e2012-10-12 23:32:00 +00001703} // end anonymous namespace
1704
1705namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001706// Namespace for x86 abstract base class
1707const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001708#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001709#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001710 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001711#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001712};
Eli Friedmanb5366062008-05-20 14:21:01 +00001713
Nuno Lopescfca1f02009-12-23 17:49:57 +00001714static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001715 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1716 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001717 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001718 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1719 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1720 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001721 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001722 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1723 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001724};
1725
Eric Christophercdd36352011-06-21 00:05:20 +00001726const TargetInfo::AddlRegName AddlRegNames[] = {
1727 { { "al", "ah", "eax", "rax" }, 0 },
1728 { { "bl", "bh", "ebx", "rbx" }, 3 },
1729 { { "cl", "ch", "ecx", "rcx" }, 2 },
1730 { { "dl", "dh", "edx", "rdx" }, 1 },
1731 { { "esi", "rsi" }, 4 },
1732 { { "edi", "rdi" }, 5 },
1733 { { "esp", "rsp" }, 7 },
1734 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001735};
1736
1737// X86 target abstract base class; x86-32 and x86-64 are very close, so
1738// most of the implementation can be shared.
1739class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001740 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001741 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001742 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001743 enum MMX3DNowEnum {
1744 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1745 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001746 enum XOPEnum {
1747 NoXOP,
1748 SSE4A,
1749 FMA4,
1750 XOP
1751 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001752
Eric Christophere1ddaf92010-04-02 23:50:19 +00001753 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001754 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001755 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001756 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001757 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001758 bool HasBMI;
1759 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001760 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001761 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001762 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001763 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001764 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001765 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001766 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001767 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001768 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1769 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001770 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001771 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001772
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001773 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1774 ///
1775 /// Each enumeration represents a particular CPU supported by Clang. These
1776 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1777 enum CPUKind {
1778 CK_Generic,
1779
1780 /// \name i386
1781 /// i386-generation processors.
1782 //@{
1783 CK_i386,
1784 //@}
1785
1786 /// \name i486
1787 /// i486-generation processors.
1788 //@{
1789 CK_i486,
1790 CK_WinChipC6,
1791 CK_WinChip2,
1792 CK_C3,
1793 //@}
1794
1795 /// \name i586
1796 /// i586-generation processors, P5 microarchitecture based.
1797 //@{
1798 CK_i586,
1799 CK_Pentium,
1800 CK_PentiumMMX,
1801 //@}
1802
1803 /// \name i686
1804 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1805 //@{
1806 CK_i686,
1807 CK_PentiumPro,
1808 CK_Pentium2,
1809 CK_Pentium3,
1810 CK_Pentium3M,
1811 CK_PentiumM,
1812 CK_C3_2,
1813
1814 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1815 /// Clang however has some logic to suport this.
1816 // FIXME: Warn, deprecate, and potentially remove this.
1817 CK_Yonah,
1818 //@}
1819
1820 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001821 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001822 //@{
1823 CK_Pentium4,
1824 CK_Pentium4M,
1825 CK_Prescott,
1826 CK_Nocona,
1827 //@}
1828
1829 /// \name Core
1830 /// Core microarchitecture based processors.
1831 //@{
1832 CK_Core2,
1833
1834 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1835 /// codename which GCC no longer accepts as an option to -march, but Clang
1836 /// has some logic for recognizing it.
1837 // FIXME: Warn, deprecate, and potentially remove this.
1838 CK_Penryn,
1839 //@}
1840
1841 /// \name Atom
1842 /// Atom processors
1843 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001844 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001845 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001846 //@}
1847
1848 /// \name Nehalem
1849 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001850 CK_Nehalem,
1851
1852 /// \name Westmere
1853 /// Westmere microarchitecture based processors.
1854 CK_Westmere,
1855
1856 /// \name Sandy Bridge
1857 /// Sandy Bridge microarchitecture based processors.
1858 CK_SandyBridge,
1859
1860 /// \name Ivy Bridge
1861 /// Ivy Bridge microarchitecture based processors.
1862 CK_IvyBridge,
1863
1864 /// \name Haswell
1865 /// Haswell microarchitecture based processors.
1866 CK_Haswell,
1867
1868 /// \name Broadwell
1869 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001870 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001871
1872 /// \name Skylake
1873 /// Skylake microarchitecture based processors.
1874 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001875
Craig Topper449314e2013-08-20 07:09:39 +00001876 /// \name Knights Landing
1877 /// Knights Landing processor.
1878 CK_KNL,
1879
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001880 /// \name K6
1881 /// K6 architecture processors.
1882 //@{
1883 CK_K6,
1884 CK_K6_2,
1885 CK_K6_3,
1886 //@}
1887
1888 /// \name K7
1889 /// K7 architecture processors.
1890 //@{
1891 CK_Athlon,
1892 CK_AthlonThunderbird,
1893 CK_Athlon4,
1894 CK_AthlonXP,
1895 CK_AthlonMP,
1896 //@}
1897
1898 /// \name K8
1899 /// K8 architecture processors.
1900 //@{
1901 CK_Athlon64,
1902 CK_Athlon64SSE3,
1903 CK_AthlonFX,
1904 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001905 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001906 CK_Opteron,
1907 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001908 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001909 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001910
Benjamin Kramer569f2152012-01-10 11:50:18 +00001911 /// \name Bobcat
1912 /// Bobcat architecture processors.
1913 //@{
1914 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001915 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001916 //@}
1917
1918 /// \name Bulldozer
1919 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001920 //@{
1921 CK_BDVER1,
1922 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001923 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001924 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001925 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001926
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001927 /// This specification is deprecated and will be removed in the future.
1928 /// Users should prefer \see CK_K8.
1929 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001930 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001931 CK_x86_64,
1932 //@}
1933
1934 /// \name Geode
1935 /// Geode processors.
1936 //@{
1937 CK_Geode
1938 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001939 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001940
Rafael Espindolaeb265472013-08-21 21:59:03 +00001941 enum FPMathKind {
1942 FP_Default,
1943 FP_SSE,
1944 FP_387
1945 } FPMath;
1946
Eli Friedman3fd920a2008-08-20 02:34:37 +00001947public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001948 X86TargetInfo(const llvm::Triple &Triple)
1949 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001950 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001951 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1952 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1953 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1954 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1955 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1956 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001957 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001958 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001959 }
Craig Topper3164f332014-03-11 03:39:26 +00001960 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001961 // X87 evaluates with 80 bits "long double" precision.
1962 return SSELevel == NoSSE ? 2 : 0;
1963 }
Craig Topper3164f332014-03-11 03:39:26 +00001964 void getTargetBuiltins(const Builtin::Info *&Records,
1965 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001966 Records = BuiltinInfo;
1967 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001968 }
Craig Topper3164f332014-03-11 03:39:26 +00001969 void getGCCRegNames(const char * const *&Names,
1970 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001971 Names = GCCRegNames;
1972 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001973 }
Craig Topper3164f332014-03-11 03:39:26 +00001974 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1975 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001976 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001977 NumAliases = 0;
1978 }
Craig Topper3164f332014-03-11 03:39:26 +00001979 void getGCCAddlRegNames(const AddlRegName *&Names,
1980 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001981 Names = AddlRegNames;
1982 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001983 }
Craig Topper3164f332014-03-11 03:39:26 +00001984 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00001985 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001986
Akira Hatanaka974131e2014-09-18 18:17:18 +00001987 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1988
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001989 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1990
Akira Hatanaka974131e2014-09-18 18:17:18 +00001991 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1992
Craig Topper3164f332014-03-11 03:39:26 +00001993 std::string convertConstraint(const char *&Constraint) const override;
1994 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001995 return "~{dirflag},~{fpsr},~{flags}";
1996 }
Craig Topper3164f332014-03-11 03:39:26 +00001997 void getTargetDefines(const LangOptions &Opts,
1998 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001999 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2000 bool Enabled);
2001 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2002 bool Enabled);
2003 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2004 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002005 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2006 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002007 setFeatureEnabledImpl(Features, Name, Enabled);
2008 }
2009 // This exists purely to cut down on the number of virtual calls in
2010 // getDefaultFeatures which calls this repeatedly.
2011 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2012 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002013 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2014 bool hasFeature(StringRef Feature) const override;
2015 bool handleTargetFeatures(std::vector<std::string> &Features,
2016 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002017 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002018 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002019 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002020 else if (getTriple().getArch() == llvm::Triple::x86 &&
2021 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002022 return "no-mmx";
2023 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002024 }
Craig Topper3164f332014-03-11 03:39:26 +00002025 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002026 CPU = llvm::StringSwitch<CPUKind>(Name)
2027 .Case("i386", CK_i386)
2028 .Case("i486", CK_i486)
2029 .Case("winchip-c6", CK_WinChipC6)
2030 .Case("winchip2", CK_WinChip2)
2031 .Case("c3", CK_C3)
2032 .Case("i586", CK_i586)
2033 .Case("pentium", CK_Pentium)
2034 .Case("pentium-mmx", CK_PentiumMMX)
2035 .Case("i686", CK_i686)
2036 .Case("pentiumpro", CK_PentiumPro)
2037 .Case("pentium2", CK_Pentium2)
2038 .Case("pentium3", CK_Pentium3)
2039 .Case("pentium3m", CK_Pentium3M)
2040 .Case("pentium-m", CK_PentiumM)
2041 .Case("c3-2", CK_C3_2)
2042 .Case("yonah", CK_Yonah)
2043 .Case("pentium4", CK_Pentium4)
2044 .Case("pentium4m", CK_Pentium4M)
2045 .Case("prescott", CK_Prescott)
2046 .Case("nocona", CK_Nocona)
2047 .Case("core2", CK_Core2)
2048 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002049 .Case("bonnell", CK_Bonnell)
2050 .Case("atom", CK_Bonnell) // Legacy name.
2051 .Case("silvermont", CK_Silvermont)
2052 .Case("slm", CK_Silvermont) // Legacy name.
2053 .Case("nehalem", CK_Nehalem)
2054 .Case("corei7", CK_Nehalem) // Legacy name.
2055 .Case("westmere", CK_Westmere)
2056 .Case("sandybridge", CK_SandyBridge)
2057 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2058 .Case("ivybridge", CK_IvyBridge)
2059 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2060 .Case("haswell", CK_Haswell)
2061 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002062 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002063 .Case("skylake", CK_Skylake)
2064 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002065 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002066 .Case("k6", CK_K6)
2067 .Case("k6-2", CK_K6_2)
2068 .Case("k6-3", CK_K6_3)
2069 .Case("athlon", CK_Athlon)
2070 .Case("athlon-tbird", CK_AthlonThunderbird)
2071 .Case("athlon-4", CK_Athlon4)
2072 .Case("athlon-xp", CK_AthlonXP)
2073 .Case("athlon-mp", CK_AthlonMP)
2074 .Case("athlon64", CK_Athlon64)
2075 .Case("athlon64-sse3", CK_Athlon64SSE3)
2076 .Case("athlon-fx", CK_AthlonFX)
2077 .Case("k8", CK_K8)
2078 .Case("k8-sse3", CK_K8SSE3)
2079 .Case("opteron", CK_Opteron)
2080 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002081 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002082 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002083 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002084 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002085 .Case("bdver1", CK_BDVER1)
2086 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002087 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002088 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002089 .Case("x86-64", CK_x86_64)
2090 .Case("geode", CK_Geode)
2091 .Default(CK_Generic);
2092
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002093 // Perform any per-CPU checks necessary to determine if this CPU is
2094 // acceptable.
2095 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2096 // invalid without explaining *why*.
2097 switch (CPU) {
2098 case CK_Generic:
2099 // No processor selected!
2100 return false;
2101
2102 case CK_i386:
2103 case CK_i486:
2104 case CK_WinChipC6:
2105 case CK_WinChip2:
2106 case CK_C3:
2107 case CK_i586:
2108 case CK_Pentium:
2109 case CK_PentiumMMX:
2110 case CK_i686:
2111 case CK_PentiumPro:
2112 case CK_Pentium2:
2113 case CK_Pentium3:
2114 case CK_Pentium3M:
2115 case CK_PentiumM:
2116 case CK_Yonah:
2117 case CK_C3_2:
2118 case CK_Pentium4:
2119 case CK_Pentium4M:
2120 case CK_Prescott:
2121 case CK_K6:
2122 case CK_K6_2:
2123 case CK_K6_3:
2124 case CK_Athlon:
2125 case CK_AthlonThunderbird:
2126 case CK_Athlon4:
2127 case CK_AthlonXP:
2128 case CK_AthlonMP:
2129 case CK_Geode:
2130 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002131 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002132 return false;
2133
2134 // Fallthrough
2135 case CK_Nocona:
2136 case CK_Core2:
2137 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002138 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002139 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002140 case CK_Nehalem:
2141 case CK_Westmere:
2142 case CK_SandyBridge:
2143 case CK_IvyBridge:
2144 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002145 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002146 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002147 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002148 case CK_Athlon64:
2149 case CK_Athlon64SSE3:
2150 case CK_AthlonFX:
2151 case CK_K8:
2152 case CK_K8SSE3:
2153 case CK_Opteron:
2154 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002155 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002156 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002157 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002158 case CK_BDVER1:
2159 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002160 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002161 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002162 case CK_x86_64:
2163 return true;
2164 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002165 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002166 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002167
Craig Topper3164f332014-03-11 03:39:26 +00002168 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002169
Craig Topper3164f332014-03-11 03:39:26 +00002170 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002171 // We accept all non-ARM calling conventions
2172 return (CC == CC_X86ThisCall ||
2173 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002174 CC == CC_X86StdCall ||
2175 CC == CC_X86VectorCall ||
2176 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002177 CC == CC_X86Pascal ||
2178 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002179 }
2180
Craig Topper3164f332014-03-11 03:39:26 +00002181 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002182 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002183 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002184};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002185
Rafael Espindolaeb265472013-08-21 21:59:03 +00002186bool X86TargetInfo::setFPMath(StringRef Name) {
2187 if (Name == "387") {
2188 FPMath = FP_387;
2189 return true;
2190 }
2191 if (Name == "sse") {
2192 FPMath = FP_SSE;
2193 return true;
2194 }
2195 return false;
2196}
2197
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002198void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002199 // FIXME: This *really* should not be here.
2200
2201 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002202 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002203 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002204
Chandler Carruth212334f2011-09-28 08:55:37 +00002205 switch (CPU) {
2206 case CK_Generic:
2207 case CK_i386:
2208 case CK_i486:
2209 case CK_i586:
2210 case CK_Pentium:
2211 case CK_i686:
2212 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002213 break;
2214 case CK_PentiumMMX:
2215 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002216 case CK_K6:
2217 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002218 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002219 break;
2220 case CK_Pentium3:
2221 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002222 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002223 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002224 break;
2225 case CK_PentiumM:
2226 case CK_Pentium4:
2227 case CK_Pentium4M:
2228 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002229 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002230 break;
2231 case CK_Yonah:
2232 case CK_Prescott:
2233 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002234 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002235 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002236 break;
2237 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002238 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002239 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002240 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002241 break;
2242 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002243 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002244 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002245 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002246 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002247 setFeatureEnabledImpl(Features, "avx512f", true);
2248 setFeatureEnabledImpl(Features, "avx512cd", true);
2249 setFeatureEnabledImpl(Features, "avx512dq", true);
2250 setFeatureEnabledImpl(Features, "avx512bw", true);
2251 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002252 // FALLTHROUGH
2253 case CK_Broadwell:
2254 setFeatureEnabledImpl(Features, "rdseed", true);
2255 setFeatureEnabledImpl(Features, "adx", true);
2256 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002257 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002258 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002259 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002260 setFeatureEnabledImpl(Features, "bmi", true);
2261 setFeatureEnabledImpl(Features, "bmi2", true);
2262 setFeatureEnabledImpl(Features, "rtm", true);
2263 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002264 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002265 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002266 setFeatureEnabledImpl(Features, "rdrnd", true);
2267 setFeatureEnabledImpl(Features, "f16c", true);
2268 setFeatureEnabledImpl(Features, "fsgsbase", true);
2269 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002270 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002271 setFeatureEnabledImpl(Features, "avx", true);
2272 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002273 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002274 case CK_Silvermont:
2275 setFeatureEnabledImpl(Features, "aes", true);
2276 setFeatureEnabledImpl(Features, "pclmul", true);
2277 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002278 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002279 setFeatureEnabledImpl(Features, "sse4.2", true);
2280 setFeatureEnabledImpl(Features, "cx16", true);
2281 break;
2282 case CK_KNL:
2283 setFeatureEnabledImpl(Features, "avx512f", true);
2284 setFeatureEnabledImpl(Features, "avx512cd", true);
2285 setFeatureEnabledImpl(Features, "avx512er", true);
2286 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002287 setFeatureEnabledImpl(Features, "rdseed", true);
2288 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002289 setFeatureEnabledImpl(Features, "lzcnt", true);
2290 setFeatureEnabledImpl(Features, "bmi", true);
2291 setFeatureEnabledImpl(Features, "bmi2", true);
2292 setFeatureEnabledImpl(Features, "rtm", true);
2293 setFeatureEnabledImpl(Features, "fma", true);
2294 setFeatureEnabledImpl(Features, "rdrnd", true);
2295 setFeatureEnabledImpl(Features, "f16c", true);
2296 setFeatureEnabledImpl(Features, "fsgsbase", true);
2297 setFeatureEnabledImpl(Features, "aes", true);
2298 setFeatureEnabledImpl(Features, "pclmul", true);
2299 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002300 break;
2301 case CK_K6_2:
2302 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002303 case CK_WinChip2:
2304 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002305 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002306 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002307 case CK_Athlon:
2308 case CK_AthlonThunderbird:
2309 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002310 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002311 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002312 case CK_Athlon4:
2313 case CK_AthlonXP:
2314 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002315 setFeatureEnabledImpl(Features, "sse", true);
2316 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002317 break;
2318 case CK_K8:
2319 case CK_Opteron:
2320 case CK_Athlon64:
2321 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002322 setFeatureEnabledImpl(Features, "sse2", true);
2323 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002324 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002325 case CK_AMDFAM10:
2326 setFeatureEnabledImpl(Features, "sse4a", true);
2327 setFeatureEnabledImpl(Features, "lzcnt", true);
2328 setFeatureEnabledImpl(Features, "popcnt", true);
2329 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002330 case CK_K8SSE3:
2331 case CK_OpteronSSE3:
2332 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002333 setFeatureEnabledImpl(Features, "sse3", true);
2334 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002335 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002336 case CK_BTVER2:
2337 setFeatureEnabledImpl(Features, "avx", true);
2338 setFeatureEnabledImpl(Features, "aes", true);
2339 setFeatureEnabledImpl(Features, "pclmul", true);
2340 setFeatureEnabledImpl(Features, "bmi", true);
2341 setFeatureEnabledImpl(Features, "f16c", true);
2342 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002343 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002344 setFeatureEnabledImpl(Features, "ssse3", true);
2345 setFeatureEnabledImpl(Features, "sse4a", true);
2346 setFeatureEnabledImpl(Features, "lzcnt", true);
2347 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002348 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002349 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002350 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002351 case CK_BDVER4:
2352 setFeatureEnabledImpl(Features, "avx2", true);
2353 setFeatureEnabledImpl(Features, "bmi2", true);
2354 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002355 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002356 setFeatureEnabledImpl(Features, "fsgsbase", true);
2357 // FALLTHROUGH
2358 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002359 setFeatureEnabledImpl(Features, "bmi", true);
2360 setFeatureEnabledImpl(Features, "fma", true);
2361 setFeatureEnabledImpl(Features, "f16c", true);
2362 setFeatureEnabledImpl(Features, "tbm", true);
2363 // FALLTHROUGH
2364 case CK_BDVER1:
2365 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002366 setFeatureEnabledImpl(Features, "xop", true);
2367 setFeatureEnabledImpl(Features, "lzcnt", true);
2368 setFeatureEnabledImpl(Features, "aes", true);
2369 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002370 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002371 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002372 break;
Eli Friedman33465822011-07-08 23:31:17 +00002373 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002374}
2375
Rafael Espindolae62e2792013-08-20 13:44:29 +00002376void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002377 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002378 if (Enabled) {
2379 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002380 case AVX512F:
2381 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002382 case AVX2:
2383 Features["avx2"] = true;
2384 case AVX:
2385 Features["avx"] = true;
2386 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002387 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002388 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002389 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002390 case SSSE3:
2391 Features["ssse3"] = true;
2392 case SSE3:
2393 Features["sse3"] = true;
2394 case SSE2:
2395 Features["sse2"] = true;
2396 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002397 Features["sse"] = true;
2398 case NoSSE:
2399 break;
2400 }
2401 return;
2402 }
2403
2404 switch (Level) {
2405 case NoSSE:
2406 case SSE1:
2407 Features["sse"] = false;
2408 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002409 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2410 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002411 case SSE3:
2412 Features["sse3"] = false;
2413 setXOPLevel(Features, NoXOP, false);
2414 case SSSE3:
2415 Features["ssse3"] = false;
2416 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002417 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002418 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002419 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002420 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002421 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002422 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002423 case AVX2:
2424 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002425 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002426 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002427 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2428 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002429 }
2430}
2431
2432void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002433 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002434 if (Enabled) {
2435 switch (Level) {
2436 case AMD3DNowAthlon:
2437 Features["3dnowa"] = true;
2438 case AMD3DNow:
2439 Features["3dnow"] = true;
2440 case MMX:
2441 Features["mmx"] = true;
2442 case NoMMX3DNow:
2443 break;
2444 }
2445 return;
2446 }
2447
2448 switch (Level) {
2449 case NoMMX3DNow:
2450 case MMX:
2451 Features["mmx"] = false;
2452 case AMD3DNow:
2453 Features["3dnow"] = false;
2454 case AMD3DNowAthlon:
2455 Features["3dnowa"] = false;
2456 }
2457}
2458
2459void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002460 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002461 if (Enabled) {
2462 switch (Level) {
2463 case XOP:
2464 Features["xop"] = true;
2465 case FMA4:
2466 Features["fma4"] = true;
2467 setSSELevel(Features, AVX, true);
2468 case SSE4A:
2469 Features["sse4a"] = true;
2470 setSSELevel(Features, SSE3, true);
2471 case NoXOP:
2472 break;
2473 }
2474 return;
2475 }
2476
2477 switch (Level) {
2478 case NoXOP:
2479 case SSE4A:
2480 Features["sse4a"] = false;
2481 case FMA4:
2482 Features["fma4"] = false;
2483 case XOP:
2484 Features["xop"] = false;
2485 }
2486}
2487
Craig Topper86d79ef2013-09-17 04:51:29 +00002488void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2489 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002490 // FIXME: This *really* should not be here. We need some way of translating
2491 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002492 if (Name == "sse4")
2493 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002494
Rafael Espindolae62e2792013-08-20 13:44:29 +00002495 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002496
Craig Topper29561122013-09-19 01:13:07 +00002497 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002498 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002499 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002500 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002501 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002502 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002503 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002504 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002505 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002506 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002507 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002508 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002509 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002510 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002511 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002512 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002513 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002514 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002515 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002516 if (Enabled)
2517 setSSELevel(Features, SSE2, Enabled);
2518 } else if (Name == "pclmul") {
2519 if (Enabled)
2520 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002521 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002522 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002523 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002524 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002525 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002526 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002527 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2528 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002529 if (Enabled)
2530 setSSELevel(Features, AVX512F, Enabled);
2531 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002532 if (Enabled)
2533 setSSELevel(Features, AVX, Enabled);
2534 } else if (Name == "fma4") {
2535 setXOPLevel(Features, FMA4, Enabled);
2536 } else if (Name == "xop") {
2537 setXOPLevel(Features, XOP, Enabled);
2538 } else if (Name == "sse4a") {
2539 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002540 } else if (Name == "f16c") {
2541 if (Enabled)
2542 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002543 } else if (Name == "sha") {
2544 if (Enabled)
2545 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002546 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002547}
2548
Eric Christopher3ff21b32013-10-16 21:26:26 +00002549/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002550/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002551bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002552 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002553 // Remember the maximum enabled sselevel.
2554 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2555 // Ignore disabled features.
2556 if (Features[i][0] == '-')
2557 continue;
2558
Benjamin Kramer27402c62012-03-05 15:10:44 +00002559 StringRef Feature = StringRef(Features[i]).substr(1);
2560
2561 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002562 HasAES = true;
2563 continue;
2564 }
2565
Craig Topper3f122a72012-05-31 05:18:48 +00002566 if (Feature == "pclmul") {
2567 HasPCLMUL = true;
2568 continue;
2569 }
2570
Benjamin Kramer27402c62012-03-05 15:10:44 +00002571 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002572 HasLZCNT = true;
2573 continue;
2574 }
2575
Rafael Espindola89049822013-08-23 20:21:37 +00002576 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002577 HasRDRND = true;
2578 continue;
2579 }
2580
Craig Topper8c7f2512014-11-03 06:51:41 +00002581 if (Feature == "fsgsbase") {
2582 HasFSGSBASE = true;
2583 continue;
2584 }
2585
Benjamin Kramer27402c62012-03-05 15:10:44 +00002586 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002587 HasBMI = true;
2588 continue;
2589 }
2590
Benjamin Kramer27402c62012-03-05 15:10:44 +00002591 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002592 HasBMI2 = true;
2593 continue;
2594 }
2595
Benjamin Kramer27402c62012-03-05 15:10:44 +00002596 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002597 HasPOPCNT = true;
2598 continue;
2599 }
2600
Michael Liao625a8752012-11-10 05:17:46 +00002601 if (Feature == "rtm") {
2602 HasRTM = true;
2603 continue;
2604 }
2605
Michael Liao74f4eaf2013-03-26 17:52:08 +00002606 if (Feature == "prfchw") {
2607 HasPRFCHW = true;
2608 continue;
2609 }
2610
Michael Liaoffaae352013-03-29 05:17:55 +00002611 if (Feature == "rdseed") {
2612 HasRDSEED = true;
2613 continue;
2614 }
2615
Robert Khasanov50e6f582014-09-19 09:53:48 +00002616 if (Feature == "adx") {
2617 HasADX = true;
2618 continue;
2619 }
2620
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002621 if (Feature == "tbm") {
2622 HasTBM = true;
2623 continue;
2624 }
2625
Craig Topperbba778b2012-06-03 21:46:30 +00002626 if (Feature == "fma") {
2627 HasFMA = true;
2628 continue;
2629 }
2630
Manman Rena45358c2012-10-11 00:59:55 +00002631 if (Feature == "f16c") {
2632 HasF16C = true;
2633 continue;
2634 }
2635
Craig Topper679b53a2013-08-21 05:29:10 +00002636 if (Feature == "avx512cd") {
2637 HasAVX512CD = true;
2638 continue;
2639 }
2640
2641 if (Feature == "avx512er") {
2642 HasAVX512ER = true;
2643 continue;
2644 }
2645
2646 if (Feature == "avx512pf") {
2647 HasAVX512PF = true;
2648 continue;
2649 }
2650
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002651 if (Feature == "avx512dq") {
2652 HasAVX512DQ = true;
2653 continue;
2654 }
2655
2656 if (Feature == "avx512bw") {
2657 HasAVX512BW = true;
2658 continue;
2659 }
2660
2661 if (Feature == "avx512vl") {
2662 HasAVX512VL = true;
2663 continue;
2664 }
2665
Ben Langmuir58078d02013-09-19 13:22:04 +00002666 if (Feature == "sha") {
2667 HasSHA = true;
2668 continue;
2669 }
2670
Nick Lewycky50e8f482013-10-05 20:14:27 +00002671 if (Feature == "cx16") {
2672 HasCX16 = true;
2673 continue;
2674 }
2675
Daniel Dunbar979586e2009-11-11 09:38:56 +00002676 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002677 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002678 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002679 .Case("avx2", AVX2)
2680 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002681 .Case("sse4.2", SSE42)
2682 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002683 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002684 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002685 .Case("sse2", SSE2)
2686 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002687 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002688 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002689
Eli Friedman33465822011-07-08 23:31:17 +00002690 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002691 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002692 .Case("3dnowa", AMD3DNowAthlon)
2693 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002694 .Case("mmx", MMX)
2695 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002696 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002697
2698 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2699 .Case("xop", XOP)
2700 .Case("fma4", FMA4)
2701 .Case("sse4a", SSE4A)
2702 .Default(NoXOP);
2703 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002704 }
Eli Friedman33465822011-07-08 23:31:17 +00002705
Craig Topper7481d8a2013-09-10 06:55:47 +00002706 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2707 // Can't do this earlier because we need to be able to explicitly enable
2708 // popcnt and still disable sse4.2.
2709 if (!HasPOPCNT && SSELevel >= SSE42 &&
2710 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2711 HasPOPCNT = true;
2712 Features.push_back("+popcnt");
2713 }
2714
Yunzhong Gao61089362013-10-16 19:07:02 +00002715 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2716 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2717 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2718 HasPRFCHW = true;
2719 Features.push_back("+prfchw");
2720 }
2721
Rafael Espindolaeb265472013-08-21 21:59:03 +00002722 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2723 // matches the selected sse level.
2724 if (FPMath == FP_SSE && SSELevel < SSE1) {
2725 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2726 return false;
2727 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2728 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2729 return false;
2730 }
2731
Eli Friedman33465822011-07-08 23:31:17 +00002732 // Don't tell the backend if we're turning off mmx; it will end up disabling
2733 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002734 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2735 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002736 std::vector<std::string>::iterator it;
2737 it = std::find(Features.begin(), Features.end(), "-mmx");
2738 if (it != Features.end())
2739 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002740 else if (SSELevel > NoSSE)
2741 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002742 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002743}
Chris Lattnerecd49032009-03-02 22:27:17 +00002744
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002745/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2746/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002747void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002748 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002749 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002750 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002751 Builder.defineMacro("__amd64__");
2752 Builder.defineMacro("__amd64");
2753 Builder.defineMacro("__x86_64");
2754 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002755 if (getTriple().getArchName() == "x86_64h") {
2756 Builder.defineMacro("__x86_64h");
2757 Builder.defineMacro("__x86_64h__");
2758 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002759 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002760 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002761 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002762
Chris Lattnerecd49032009-03-02 22:27:17 +00002763 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002764 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2765 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002766 switch (CPU) {
2767 case CK_Generic:
2768 break;
2769 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002770 // The rest are coming from the i386 define above.
2771 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002772 break;
2773 case CK_i486:
2774 case CK_WinChipC6:
2775 case CK_WinChip2:
2776 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002777 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002778 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002779 case CK_PentiumMMX:
2780 Builder.defineMacro("__pentium_mmx__");
2781 Builder.defineMacro("__tune_pentium_mmx__");
2782 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002783 case CK_i586:
2784 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002785 defineCPUMacros(Builder, "i586");
2786 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002787 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002788 case CK_Pentium3:
2789 case CK_Pentium3M:
2790 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002791 Builder.defineMacro("__tune_pentium3__");
2792 // Fallthrough
2793 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002794 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002795 Builder.defineMacro("__tune_pentium2__");
2796 // Fallthrough
2797 case CK_PentiumPro:
2798 Builder.defineMacro("__tune_i686__");
2799 Builder.defineMacro("__tune_pentiumpro__");
2800 // Fallthrough
2801 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002802 Builder.defineMacro("__i686");
2803 Builder.defineMacro("__i686__");
2804 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2805 Builder.defineMacro("__pentiumpro");
2806 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002807 break;
2808 case CK_Pentium4:
2809 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002810 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002811 break;
2812 case CK_Yonah:
2813 case CK_Prescott:
2814 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002815 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002816 break;
2817 case CK_Core2:
2818 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002819 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002820 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002821 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002822 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002823 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002824 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002825 defineCPUMacros(Builder, "slm");
2826 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002827 case CK_Nehalem:
2828 case CK_Westmere:
2829 case CK_SandyBridge:
2830 case CK_IvyBridge:
2831 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002832 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002833 // FIXME: Historically, we defined this legacy name, it would be nice to
2834 // remove it at some point. We've never exposed fine-grained names for
2835 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002836 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002837 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002838 case CK_Skylake:
2839 // FIXME: Historically, we defined this legacy name, it would be nice to
2840 // remove it at some point. This is the only fine-grained CPU macro in the
2841 // main intel CPU line, and it would be better to not have these and force
2842 // people to use ISA macros.
2843 defineCPUMacros(Builder, "skx");
2844 break;
Craig Topper449314e2013-08-20 07:09:39 +00002845 case CK_KNL:
2846 defineCPUMacros(Builder, "knl");
2847 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002848 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002849 Builder.defineMacro("__k6_2__");
2850 Builder.defineMacro("__tune_k6_2__");
2851 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002852 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002853 if (CPU != CK_K6_2) { // In case of fallthrough
2854 // FIXME: GCC may be enabling these in cases where some other k6
2855 // architecture is specified but -m3dnow is explicitly provided. The
2856 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002857 Builder.defineMacro("__k6_3__");
2858 Builder.defineMacro("__tune_k6_3__");
2859 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002860 // Fallthrough
2861 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002862 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002863 break;
2864 case CK_Athlon:
2865 case CK_AthlonThunderbird:
2866 case CK_Athlon4:
2867 case CK_AthlonXP:
2868 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002869 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002870 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002871 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002872 Builder.defineMacro("__tune_athlon_sse__");
2873 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002874 break;
2875 case CK_K8:
2876 case CK_K8SSE3:
2877 case CK_x86_64:
2878 case CK_Opteron:
2879 case CK_OpteronSSE3:
2880 case CK_Athlon64:
2881 case CK_Athlon64SSE3:
2882 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002883 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002884 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002885 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002886 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002887 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002888 case CK_BTVER1:
2889 defineCPUMacros(Builder, "btver1");
2890 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002891 case CK_BTVER2:
2892 defineCPUMacros(Builder, "btver2");
2893 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002894 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002895 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002896 break;
2897 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002898 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002899 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002900 case CK_BDVER3:
2901 defineCPUMacros(Builder, "bdver3");
2902 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002903 case CK_BDVER4:
2904 defineCPUMacros(Builder, "bdver4");
2905 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002906 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002907 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002908 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002909 }
Chris Lattner96e43572009-03-02 22:40:39 +00002910
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002911 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002912 Builder.defineMacro("__REGISTER_PREFIX__", "");
2913
Chris Lattner6df41af2009-04-19 17:32:33 +00002914 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2915 // functions in glibc header files that use FP Stack inline asm which the
2916 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002917 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002918
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002919 if (HasAES)
2920 Builder.defineMacro("__AES__");
2921
Craig Topper3f122a72012-05-31 05:18:48 +00002922 if (HasPCLMUL)
2923 Builder.defineMacro("__PCLMUL__");
2924
Craig Topper22967d42011-12-25 05:06:45 +00002925 if (HasLZCNT)
2926 Builder.defineMacro("__LZCNT__");
2927
Benjamin Kramer1e250392012-07-07 09:39:18 +00002928 if (HasRDRND)
2929 Builder.defineMacro("__RDRND__");
2930
Craig Topper8c7f2512014-11-03 06:51:41 +00002931 if (HasFSGSBASE)
2932 Builder.defineMacro("__FSGSBASE__");
2933
Craig Topper22967d42011-12-25 05:06:45 +00002934 if (HasBMI)
2935 Builder.defineMacro("__BMI__");
2936
2937 if (HasBMI2)
2938 Builder.defineMacro("__BMI2__");
2939
Craig Topper1de83482011-12-29 16:10:46 +00002940 if (HasPOPCNT)
2941 Builder.defineMacro("__POPCNT__");
2942
Michael Liao625a8752012-11-10 05:17:46 +00002943 if (HasRTM)
2944 Builder.defineMacro("__RTM__");
2945
Michael Liao74f4eaf2013-03-26 17:52:08 +00002946 if (HasPRFCHW)
2947 Builder.defineMacro("__PRFCHW__");
2948
Michael Liaoffaae352013-03-29 05:17:55 +00002949 if (HasRDSEED)
2950 Builder.defineMacro("__RDSEED__");
2951
Robert Khasanov50e6f582014-09-19 09:53:48 +00002952 if (HasADX)
2953 Builder.defineMacro("__ADX__");
2954
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002955 if (HasTBM)
2956 Builder.defineMacro("__TBM__");
2957
Rafael Espindolae62e2792013-08-20 13:44:29 +00002958 switch (XOPLevel) {
2959 case XOP:
2960 Builder.defineMacro("__XOP__");
2961 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002962 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002963 case SSE4A:
2964 Builder.defineMacro("__SSE4A__");
2965 case NoXOP:
2966 break;
2967 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002968
Craig Topperbba778b2012-06-03 21:46:30 +00002969 if (HasFMA)
2970 Builder.defineMacro("__FMA__");
2971
Manman Rena45358c2012-10-11 00:59:55 +00002972 if (HasF16C)
2973 Builder.defineMacro("__F16C__");
2974
Craig Topper679b53a2013-08-21 05:29:10 +00002975 if (HasAVX512CD)
2976 Builder.defineMacro("__AVX512CD__");
2977 if (HasAVX512ER)
2978 Builder.defineMacro("__AVX512ER__");
2979 if (HasAVX512PF)
2980 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002981 if (HasAVX512DQ)
2982 Builder.defineMacro("__AVX512DQ__");
2983 if (HasAVX512BW)
2984 Builder.defineMacro("__AVX512BW__");
2985 if (HasAVX512VL)
2986 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002987
Ben Langmuir58078d02013-09-19 13:22:04 +00002988 if (HasSHA)
2989 Builder.defineMacro("__SHA__");
2990
Nick Lewycky50e8f482013-10-05 20:14:27 +00002991 if (HasCX16)
2992 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2993
Chris Lattner96e43572009-03-02 22:40:39 +00002994 // Each case falls through to the previous one here.
2995 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002996 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002997 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002998 case AVX2:
2999 Builder.defineMacro("__AVX2__");
3000 case AVX:
3001 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003002 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003003 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003004 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003005 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003006 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003007 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003008 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003009 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003010 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003011 Builder.defineMacro("__SSE2__");
3012 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003013 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003014 Builder.defineMacro("__SSE__");
3015 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003016 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003017 break;
3018 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003019
Derek Schuffc7dd7222012-10-11 15:52:22 +00003020 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003021 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003022 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003023 case AVX2:
3024 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003025 case SSE42:
3026 case SSE41:
3027 case SSSE3:
3028 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003029 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003030 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003031 break;
3032 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003033 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003034 break;
3035 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003036 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003037 }
3038 }
3039
Anders Carlssone437c682010-01-27 03:47:49 +00003040 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003041 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003042 case AMD3DNowAthlon:
3043 Builder.defineMacro("__3dNOW_A__");
3044 case AMD3DNow:
3045 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003046 case MMX:
3047 Builder.defineMacro("__MMX__");
3048 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003049 break;
3050 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003051
3052 if (CPU >= CK_i486) {
3053 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3054 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3055 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3056 }
3057 if (CPU >= CK_i586)
3058 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003059}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003060
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003061bool X86TargetInfo::hasFeature(StringRef Feature) const {
3062 return llvm::StringSwitch<bool>(Feature)
3063 .Case("aes", HasAES)
3064 .Case("avx", SSELevel >= AVX)
3065 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003066 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003067 .Case("avx512cd", HasAVX512CD)
3068 .Case("avx512er", HasAVX512ER)
3069 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003070 .Case("avx512dq", HasAVX512DQ)
3071 .Case("avx512bw", HasAVX512BW)
3072 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003073 .Case("bmi", HasBMI)
3074 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003075 .Case("cx16", HasCX16)
3076 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003077 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003078 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003079 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003080 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003081 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3082 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3083 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003084 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003085 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003086 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003087 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003088 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003089 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003090 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003091 .Case("sse", SSELevel >= SSE1)
3092 .Case("sse2", SSELevel >= SSE2)
3093 .Case("sse3", SSELevel >= SSE3)
3094 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003095 .Case("sse4.1", SSELevel >= SSE41)
3096 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003097 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003098 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003099 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003100 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3101 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003102 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003103 .Default(false);
3104}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003105
Eli Friedman3fd920a2008-08-20 02:34:37 +00003106bool
Anders Carlsson58436352009-02-28 17:11:49 +00003107X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003108 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003109 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003110 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003111 case 'I':
3112 Info.setRequiresImmediate(0, 31);
3113 return true;
3114 case 'J':
3115 Info.setRequiresImmediate(0, 63);
3116 return true;
3117 case 'K':
3118 Info.setRequiresImmediate(-128, 127);
3119 return true;
3120 case 'L':
3121 // FIXME: properly analyze this constraint:
3122 // must be one of 0xff, 0xffff, or 0xffffffff
3123 return true;
3124 case 'M':
3125 Info.setRequiresImmediate(0, 3);
3126 return true;
3127 case 'N':
3128 Info.setRequiresImmediate(0, 255);
3129 return true;
3130 case 'O':
3131 Info.setRequiresImmediate(0, 127);
3132 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003133 case 'Y': // first letter of a pair:
3134 switch (*(Name+1)) {
3135 default: return false;
3136 case '0': // First SSE register.
3137 case 't': // Any SSE register, when SSE2 is enabled.
3138 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3139 case 'm': // any MMX register, when inter-unit moves enabled.
3140 break; // falls through to setAllowsRegister.
3141 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003142 case 'f': // any x87 floating point stack register.
3143 // Constraint 'f' cannot be used for output operands.
3144 if (Info.ConstraintStr[0] == '=')
3145 return false;
3146
3147 Info.setAllowsRegister();
3148 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003149 case 'a': // eax.
3150 case 'b': // ebx.
3151 case 'c': // ecx.
3152 case 'd': // edx.
3153 case 'S': // esi.
3154 case 'D': // edi.
3155 case 'A': // edx:eax.
3156 case 't': // top of floating point stack.
3157 case 'u': // second from top of floating point stack.
3158 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003159 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003160 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003161 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003162 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3163 case 'l': // "Index" registers: any general register that can be used as an
3164 // index in a base+index memory access.
3165 Info.setAllowsRegister();
3166 return true;
3167 case 'C': // SSE floating point constant.
3168 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003169 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003170 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003171 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003172 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003173 return true;
3174 }
3175}
3176
Akira Hatanaka974131e2014-09-18 18:17:18 +00003177bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3178 unsigned Size) const {
3179 // Strip off constraint modifiers.
3180 while (Constraint[0] == '=' ||
3181 Constraint[0] == '+' ||
3182 Constraint[0] == '&')
3183 Constraint = Constraint.substr(1);
3184
3185 return validateOperandSize(Constraint, Size);
3186}
3187
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003188bool X86TargetInfo::validateInputSize(StringRef Constraint,
3189 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003190 return validateOperandSize(Constraint, Size);
3191}
3192
3193bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3194 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003195 switch (Constraint[0]) {
3196 default: break;
3197 case 'y':
3198 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003199 case 'f':
3200 case 't':
3201 case 'u':
3202 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003203 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003204 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003205 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003206 }
3207
3208 return true;
3209}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003210
Eli Friedman3fd920a2008-08-20 02:34:37 +00003211std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003212X86TargetInfo::convertConstraint(const char *&Constraint) const {
3213 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003214 case 'a': return std::string("{ax}");
3215 case 'b': return std::string("{bx}");
3216 case 'c': return std::string("{cx}");
3217 case 'd': return std::string("{dx}");
3218 case 'S': return std::string("{si}");
3219 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003220 case 'p': // address
3221 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003222 case 't': // top of floating point stack.
3223 return std::string("{st}");
3224 case 'u': // second from top of floating point stack.
3225 return std::string("{st(1)}"); // second from top of floating point stack.
3226 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003227 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003228 }
3229}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003230} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003231
3232namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003233// X86-32 generic target
3234class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003235public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003236 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003237 DoubleAlign = LongLongAlign = 32;
3238 LongDoubleWidth = 96;
3239 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003240 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003241 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003242 SizeType = UnsignedInt;
3243 PtrDiffType = SignedInt;
3244 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003245 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003246
3247 // Use fpret for all types.
3248 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3249 (1 << TargetInfo::Double) |
3250 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003251
3252 // x86-32 has atomics up to 8 bytes
3253 // FIXME: Check that we actually have cmpxchg8b before setting
3254 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3255 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003256 }
Craig Topper3164f332014-03-11 03:39:26 +00003257 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003258 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003259 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003260
Craig Topper3164f332014-03-11 03:39:26 +00003261 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003262 if (RegNo == 0) return 0;
3263 if (RegNo == 1) return 2;
3264 return -1;
3265 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003266 bool validateOperandSize(StringRef Constraint,
3267 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003268 switch (Constraint[0]) {
3269 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003270 case 'R':
3271 case 'q':
3272 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003273 case 'a':
3274 case 'b':
3275 case 'c':
3276 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003277 case 'S':
3278 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003279 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003280 case 'A':
3281 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003282 }
3283
Akira Hatanaka974131e2014-09-18 18:17:18 +00003284 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003285 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003286};
3287} // end anonymous namespace
3288
3289namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003290class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3291public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003292 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3293 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003294
Craig Topper3164f332014-03-11 03:39:26 +00003295 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003296 unsigned Major, Minor, Micro;
3297 getTriple().getOSVersion(Major, Minor, Micro);
3298 // New NetBSD uses the default rounding mode.
3299 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3300 return X86_32TargetInfo::getFloatEvalMethod();
3301 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003302 return 1;
3303 }
3304};
3305} // end anonymous namespace
3306
3307namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003308class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3309public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003310 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3311 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003312 SizeType = UnsignedLong;
3313 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003314 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003315 }
3316};
3317} // end anonymous namespace
3318
3319namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003320class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3321public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003322 BitrigI386TargetInfo(const llvm::Triple &Triple)
3323 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003324 SizeType = UnsignedLong;
3325 IntPtrType = SignedLong;
3326 PtrDiffType = SignedLong;
3327 }
3328};
3329} // end anonymous namespace
3330
3331namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003332class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003333public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003334 DarwinI386TargetInfo(const llvm::Triple &Triple)
3335 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003336 LongDoubleWidth = 128;
3337 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003338 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003339 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003340 SizeType = UnsignedLong;
3341 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003342 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003343 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003344 }
3345
Eli Friedman3fd920a2008-08-20 02:34:37 +00003346};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003347} // end anonymous namespace
3348
3349namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003350// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003351class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003352public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003353 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3354 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003355 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003356 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003357 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003358 }
Craig Topper3164f332014-03-11 03:39:26 +00003359 void getTargetDefines(const LangOptions &Opts,
3360 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003361 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3362 }
3363};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003364
3365// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003366class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003367public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003368 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003369 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003370 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003371 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3372 }
Craig Topper3164f332014-03-11 03:39:26 +00003373 void getTargetDefines(const LangOptions &Opts,
3374 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003375 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3376 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3377 // The value of the following reflects processor type.
3378 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3379 // We lost the original triple, so we use the default.
3380 Builder.defineMacro("_M_IX86", "600");
3381 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003382};
3383} // end anonymous namespace
3384
Reid Kleckner47606832014-04-21 20:58:00 +00003385static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3386 Builder.defineMacro("__MSVCRT__");
3387 Builder.defineMacro("__MINGW32__");
3388
3389 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3390 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3391 // macro anyway for pre-processor compatibility.
3392 if (Opts.MicrosoftExt)
3393 Builder.defineMacro("__declspec", "__declspec");
3394 else
3395 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3396
3397 if (!Opts.MicrosoftExt) {
3398 // Provide macros for all the calling convention keywords. Provide both
3399 // single and double underscore prefixed variants. These are available on
3400 // x64 as well as x86, even though they have no effect.
3401 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3402 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003403 std::string GCCSpelling = "__attribute__((__";
3404 GCCSpelling += CC;
3405 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003406 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3407 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3408 }
3409 }
3410}
3411
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003412namespace {
3413// x86-32 MinGW target
3414class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3415public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003416 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3417 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003418 void getTargetDefines(const LangOptions &Opts,
3419 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003420 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003421 DefineStd(Builder, "WIN32", Opts);
3422 DefineStd(Builder, "WINNT", Opts);
3423 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003424 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003425 }
3426};
3427} // end anonymous namespace
3428
3429namespace {
3430// x86-32 Cygwin target
3431class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3432public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003433 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3434 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003435 TLSSupported = false;
3436 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003437 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003438 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003439 }
Craig Topper3164f332014-03-11 03:39:26 +00003440 void getTargetDefines(const LangOptions &Opts,
3441 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003442 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003443 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003444 Builder.defineMacro("__CYGWIN__");
3445 Builder.defineMacro("__CYGWIN32__");
3446 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003447 if (Opts.CPlusPlus)
3448 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003449 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003450};
3451} // end anonymous namespace
3452
3453namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003454// x86-32 Haiku target
3455class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3456public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003457 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003458 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003459 IntPtrType = SignedLong;
3460 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003461 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003462 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003463 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003464 }
Craig Topper3164f332014-03-11 03:39:26 +00003465 void getTargetDefines(const LangOptions &Opts,
3466 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003467 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3468 Builder.defineMacro("__INTEL__");
3469 Builder.defineMacro("__HAIKU__");
3470 }
3471};
3472} // end anonymous namespace
3473
Douglas Gregor9fabd852011-07-01 22:41:14 +00003474// RTEMS Target
3475template<typename Target>
3476class RTEMSTargetInfo : public OSTargetInfo<Target> {
3477protected:
Craig Topper3164f332014-03-11 03:39:26 +00003478 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3479 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003480 // RTEMS defines; list based off of gcc output
3481
Douglas Gregor9fabd852011-07-01 22:41:14 +00003482 Builder.defineMacro("__rtems__");
3483 Builder.defineMacro("__ELF__");
3484 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003485
Douglas Gregor9fabd852011-07-01 22:41:14 +00003486public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003487 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3488 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003489
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003490 switch (Triple.getArch()) {
3491 default:
3492 case llvm::Triple::x86:
3493 // this->MCountName = ".mcount";
3494 break;
3495 case llvm::Triple::mips:
3496 case llvm::Triple::mipsel:
3497 case llvm::Triple::ppc:
3498 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003499 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003500 // this->MCountName = "_mcount";
3501 break;
3502 case llvm::Triple::arm:
3503 // this->MCountName = "__mcount";
3504 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003505 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003506 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003507};
3508
3509namespace {
3510// x86-32 RTEMS target
3511class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3512public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003513 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003514 SizeType = UnsignedLong;
3515 IntPtrType = SignedLong;
3516 PtrDiffType = SignedLong;
3517 this->UserLabelPrefix = "";
3518 }
Craig Topper3164f332014-03-11 03:39:26 +00003519 void getTargetDefines(const LangOptions &Opts,
3520 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003521 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3522 Builder.defineMacro("__INTEL__");
3523 Builder.defineMacro("__rtems__");
3524 }
3525};
3526} // end anonymous namespace
3527
Chris Lattnerb986aba2010-04-11 19:29:39 +00003528namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003529// x86-64 generic target
3530class X86_64TargetInfo : public X86TargetInfo {
3531public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003532 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003533 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003534 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003535 LongDoubleWidth = 128;
3536 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003537 LargeArrayMinWidth = 128;
3538 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003539 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003540 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3541 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3542 IntPtrType = IsX32 ? SignedInt : SignedLong;
3543 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003544 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003545 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003546
Eric Christopher917e9522014-11-18 22:36:15 +00003547 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003548 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003549 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3550 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003551
3552 // Use fpret only for long double.
3553 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003554
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003555 // Use fp2ret for _Complex long double.
3556 ComplexLongDoubleUsesFP2Ret = true;
3557
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003558 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003559 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003560 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003561 }
Craig Topper3164f332014-03-11 03:39:26 +00003562 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003563 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003564 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003565
Craig Topper3164f332014-03-11 03:39:26 +00003566 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003567 if (RegNo == 0) return 0;
3568 if (RegNo == 1) return 1;
3569 return -1;
3570 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003571
Craig Topper3164f332014-03-11 03:39:26 +00003572 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003573 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003574 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003575 CC == CC_IntelOclBicc ||
3576 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003577 }
3578
Craig Topper3164f332014-03-11 03:39:26 +00003579 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003580 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003581 }
3582
Pavel Chupinfd223e12014-08-04 12:39:43 +00003583 // for x32 we need it here explicitly
3584 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003585};
3586} // end anonymous namespace
3587
3588namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003589// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003590class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003591public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003592 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3593 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003594 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003595 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003596 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003597 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003598 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003599 SizeType = UnsignedLongLong;
3600 PtrDiffType = SignedLongLong;
3601 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003602 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003603 }
Craig Topper3164f332014-03-11 03:39:26 +00003604 void getTargetDefines(const LangOptions &Opts,
3605 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003606 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003607 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003608 }
Craig Topper3164f332014-03-11 03:39:26 +00003609 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003610 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003611 }
Craig Topper3164f332014-03-11 03:39:26 +00003612 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003613 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003614 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003615 CC == CC_IntelOclBicc ||
3616 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3617 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003618};
3619} // end anonymous namespace
3620
3621namespace {
3622// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003623class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003624public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003625 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003626 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003627 LongDoubleWidth = LongDoubleAlign = 64;
3628 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003629 }
Craig Topper3164f332014-03-11 03:39:26 +00003630 void getTargetDefines(const LangOptions &Opts,
3631 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003632 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3633 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003634 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003635 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003636 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003637};
3638} // end anonymous namespace
3639
3640namespace {
3641// x86-64 MinGW target
3642class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3643public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003644 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3645 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003646 void getTargetDefines(const LangOptions &Opts,
3647 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003648 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003649 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003650 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003651 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003652
3653 // GCC defines this macro when it is using __gxx_personality_seh0.
3654 if (!Opts.SjLjExceptions)
3655 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003656 }
3657};
3658} // end anonymous namespace
3659
3660namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003661class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3662public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003663 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3664 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003665 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003666 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003667 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3668 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003669 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003670 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003671 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003672 }
3673};
3674} // end anonymous namespace
3675
3676namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003677class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3678public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003679 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3680 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003681 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003682 Int64Type = SignedLongLong;
3683 }
3684};
3685} // end anonymous namespace
3686
3687namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003688class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3689public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003690 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3691 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3692 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003693 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003694 }
3695};
Tim Northover9bb857a2013-01-31 12:13:10 +00003696}
3697
Eli Friedman9fa28852012-08-08 23:57:20 +00003698
3699namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003700class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003701 // Possible FPU choices.
3702 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003703 VFP2FPU = (1 << 0),
3704 VFP3FPU = (1 << 1),
3705 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003706 NeonFPU = (1 << 3),
3707 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003708 };
3709
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003710 // Possible HWDiv features.
3711 enum HWDivMode {
3712 HWDivThumb = (1 << 0),
3713 HWDivARM = (1 << 1)
3714 };
3715
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003716 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003717 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003718 }
3719
3720 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3721 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003722
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003723 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003724
Rafael Espindolaeb265472013-08-21 21:59:03 +00003725 enum {
3726 FP_Default,
3727 FP_VFP,
3728 FP_Neon
3729 } FPMath;
3730
Bernard Ogdenda13af32013-10-24 18:32:51 +00003731 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003732
Logan Chien57086ce2012-10-10 06:56:20 +00003733 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003734 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003735 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003736
3737 // Initialized via features.
3738 unsigned SoftFloat : 1;
3739 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003740
Bernard Ogden18b57012013-10-29 09:47:51 +00003741 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003742 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003743
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003744 // ACLE 6.5.1 Hardware floating point
3745 enum {
3746 HW_FP_HP = (1 << 1), /// half (16-bit)
3747 HW_FP_SP = (1 << 2), /// single (32-bit)
3748 HW_FP_DP = (1 << 3), /// double (64-bit)
3749 };
3750 uint32_t HW_FP;
3751
Chris Lattner5cc15e02010-03-03 19:03:45 +00003752 static const Builtin::Info BuiltinInfo[];
3753
Rafael Espindola101d5b92013-05-13 20:09:47 +00003754 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003755 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003756 if (T.getArch() == llvm::Triple::arm ||
3757 T.getArch() == llvm::Triple::armeb) {
3758 StringRef VersionStr;
3759 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003760 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003761 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003762 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003763 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003764 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003765 unsigned Version;
3766 if (VersionStr.getAsInteger(10, Version))
3767 return false;
3768 return Version >= 6;
3769 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003770 assert(T.getArch() == llvm::Triple::thumb ||
3771 T.getArch() == llvm::Triple::thumbeb);
3772 StringRef VersionStr;
3773 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003774 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003775 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003776 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003777 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003778 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003779 unsigned Version;
3780 if (VersionStr.getAsInteger(10, Version))
3781 return false;
3782 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003783 }
3784
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003785 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003786 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003787
3788 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003789 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003790
Tim Northover00853e52014-08-05 11:07:26 +00003791 // size_t is unsigned long on MachO-derived environments and NetBSD.
3792 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003793 SizeType = UnsignedLong;
3794 else
3795 SizeType = UnsignedInt;
3796
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003797 switch (T.getOS()) {
3798 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003799 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003800 break;
3801 case llvm::Triple::Win32:
3802 WCharType = UnsignedShort;
3803 break;
3804 case llvm::Triple::Linux:
3805 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003806 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3807 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003808 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003809 }
3810
3811 UseBitFieldTypeAlignment = true;
3812
3813 ZeroLengthBitfieldBoundary = 0;
3814
Tim Northover147cd2f2014-10-14 22:12:21 +00003815 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3816 // so set preferred for small types to 32.
3817 if (T.isOSBinFormatMachO()) {
3818 DescriptionString =
3819 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3820 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3821 } else if (T.isOSWindows()) {
3822 // FIXME: this is invalid for WindowsCE
3823 assert(!BigEndian && "Windows on ARM does not support big endian");
3824 DescriptionString = "e"
3825 "-m:e"
3826 "-p:32:32"
3827 "-i64:64"
3828 "-v128:64:128"
3829 "-a:0:32"
3830 "-n32"
3831 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003832 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003833 DescriptionString =
3834 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3835 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003836 }
3837
3838 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003839 }
3840
3841 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003842 const llvm::Triple &T = getTriple();
3843
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003844 IsAAPCS = false;
3845
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003846 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003847
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003848 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003849 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003850 SizeType = UnsignedInt;
3851 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003852 SizeType = UnsignedLong;
3853
3854 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3855 WCharType = SignedInt;
3856
3857 // Do not respect the alignment of bit-field types when laying out
3858 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3859 UseBitFieldTypeAlignment = false;
3860
3861 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3862 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3863 /// gcc.
3864 ZeroLengthBitfieldBoundary = 32;
3865
Tim Northover147cd2f2014-10-14 22:12:21 +00003866 if (T.isOSBinFormatMachO())
3867 DescriptionString =
3868 BigEndian
3869 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3870 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3871 else
3872 DescriptionString =
3873 BigEndian
3874 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3875 : "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 +00003876
3877 // FIXME: Override "preferred align" for double and long long.
3878 }
3879
Chris Lattner17df24e2008-04-21 18:56:49 +00003880public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003881 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003882 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003883 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003884 BigEndian = IsBigEndian;
3885
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003886 switch (getTriple().getOS()) {
3887 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003888 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003889 break;
3890 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003891 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003892 break;
3893 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003894
Chris Lattner1a8f3942010-04-23 16:29:58 +00003895 // {} in inline assembly are neon specifiers, not assembly variant
3896 // specifiers.
3897 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003898
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003899 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003900 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003901
Eric Christopher0e261882014-12-05 01:06:59 +00003902 // FIXME: This duplicates code from the driver that sets the -target-abi
3903 // option - this code is used if -target-abi isn't passed and should
3904 // be unified in some way.
3905 if (Triple.isOSBinFormatMachO()) {
3906 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3907 // the frontend matches that.
3908 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3909 Triple.getOS() == llvm::Triple::UnknownOS ||
3910 StringRef(CPU).startswith("cortex-m")) {
3911 setABI("aapcs");
3912 } else {
3913 setABI("apcs-gnu");
3914 }
3915 } else if (Triple.isOSWindows()) {
3916 // FIXME: this is invalid for WindowsCE
3917 setABI("aapcs");
3918 } else {
3919 // Select the default based on the platform.
3920 switch (Triple.getEnvironment()) {
3921 case llvm::Triple::Android:
3922 case llvm::Triple::GNUEABI:
3923 case llvm::Triple::GNUEABIHF:
3924 setABI("aapcs-linux");
3925 break;
3926 case llvm::Triple::EABIHF:
3927 case llvm::Triple::EABI:
3928 setABI("aapcs");
3929 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00003930 case llvm::Triple::GNU:
3931 setABI("apcs-gnu");
3932 break;
Eric Christopher0e261882014-12-05 01:06:59 +00003933 default:
3934 if (Triple.getOS() == llvm::Triple::NetBSD)
3935 setABI("apcs-gnu");
3936 else
3937 setABI("aapcs");
3938 break;
3939 }
3940 }
John McCall86353412010-08-21 22:46:04 +00003941
3942 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003943 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003944
3945 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003946 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003947 if (shouldUseInlineAtomic(getTriple()))
3948 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003949
3950 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00003951 // the alignment of the zero-length bitfield is greater than the member
3952 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00003953 // zero length bitfield.
3954 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003955 }
Alp Toker4925ba72014-06-07 23:30:42 +00003956 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003957 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003958 ABI = Name;
3959
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003960 // The defaults (above) are for AAPCS, check if we need to change them.
3961 //
3962 // FIXME: We need support for -meabi... we could just mangle it into the
3963 // name.
3964 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003965 setABIAPCS();
3966 return true;
3967 }
3968 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3969 setABIAAPCS();
3970 return true;
3971 }
3972 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003973 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003974
Craig Topper3164f332014-03-11 03:39:26 +00003975 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00003976 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003977 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3978 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00003979 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00003980 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003981 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003982 }
3983 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003984 Features["vfp4"] = true;
3985 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003986 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3987 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00003988 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003989 Features["vfp4"] = true;
3990 Features["neon"] = true;
3991 Features["hwdiv"] = true;
3992 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003993 } else if (CPU == "cyclone") {
3994 Features["v8fp"] = true;
3995 Features["neon"] = true;
3996 Features["hwdiv"] = true;
3997 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003998 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3999 Features["fp-armv8"] = true;
4000 Features["neon"] = true;
4001 Features["hwdiv"] = true;
4002 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004003 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004004 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004005 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004006 // Enable the hwdiv extension for all v8a AArch32 cores by
4007 // default.
4008 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004009 ArchName == "armebv8a" || ArchName == "armebv8" ||
4010 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4011 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004012 Features["hwdiv"] = true;
4013 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00004014 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004015 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004016 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004017 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004018
Craig Topper3164f332014-03-11 03:39:26 +00004019 bool handleTargetFeatures(std::vector<std::string> &Features,
4020 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004021 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004022 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004023 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004024 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004025 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004026
4027 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004028 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004029 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004030 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004031 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004032 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004033 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004034 HW_FP = HW_FP_SP | HW_FP_DP;
4035 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004036 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004037 HW_FP = HW_FP_SP | HW_FP_DP;
4038 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004039 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004040 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4041 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004042 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004043 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4044 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004045 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004046 HW_FP = HW_FP_SP | HW_FP_DP;
4047 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004048 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004049 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004050 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004051 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004052 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004053 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004054 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004055 } else if (Feature == "+fp-only-sp") {
4056 HW_FP &= ~HW_FP_DP;
4057 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004058 }
4059
Rafael Espindolaeb265472013-08-21 21:59:03 +00004060 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4061 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4062 return false;
4063 }
4064
4065 if (FPMath == FP_Neon)
4066 Features.push_back("+neonfp");
4067 else if (FPMath == FP_VFP)
4068 Features.push_back("-neonfp");
4069
Daniel Dunbar893d4752009-12-19 04:15:38 +00004070 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004071 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4072 for (const auto &FEFeature : FrontEndFeatures) {
4073 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4074 if (Feature != Features.end())
4075 Features.erase(Feature);
4076 }
4077
Rafael Espindolaeb265472013-08-21 21:59:03 +00004078 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004079 }
4080
Craig Topper3164f332014-03-11 03:39:26 +00004081 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004082 return llvm::StringSwitch<bool>(Feature)
4083 .Case("arm", true)
4084 .Case("softfloat", SoftFloat)
4085 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004086 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004087 .Case("hwdiv", HWDiv & HWDivThumb)
4088 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004089 .Default(false);
4090 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004091 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004092 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004093 return llvm::StringSwitch<const char *>(Name)
4094 .Cases("arm8", "arm810", "4")
4095 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4096 "4")
4097 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4098 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4099 .Case("ep9312", "4T")
4100 .Cases("arm10tdmi", "arm1020t", "5T")
4101 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4102 .Case("arm926ej-s", "5TEJ")
4103 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4104 .Cases("xscale", "iwmmxt", "5TE")
4105 .Case("arm1136j-s", "6J")
4106 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4107 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4108 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4109 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4110 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4111 "7A")
4112 .Cases("cortex-r4", "cortex-r5", "7R")
4113 .Case("swift", "7S")
4114 .Case("cyclone", "8A")
4115 .Case("cortex-m3", "7M")
4116 .Cases("cortex-m4", "cortex-m7", "7EM")
4117 .Case("cortex-m0", "6M")
4118 .Cases("cortex-a53", "cortex-a57", "8A")
4119 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004120 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004121 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004122 return llvm::StringSwitch<const char *>(Name)
4123 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4124 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4125 "A")
4126 .Cases("cortex-a53", "cortex-a57", "A")
4127 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
4128 .Cases("cortex-r4", "cortex-r5", "R")
4129 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004130 }
Craig Topper3164f332014-03-11 03:39:26 +00004131 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004132 if (!getCPUDefineSuffix(Name))
4133 return false;
4134
Tim Northovere8c37212014-07-09 09:24:43 +00004135 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4136 StringRef Profile = getCPUProfile(Name);
4137 if (Profile == "M" && MaxAtomicInlineWidth) {
4138 MaxAtomicPromoteWidth = 32;
4139 MaxAtomicInlineWidth = 32;
4140 }
4141
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004142 CPU = Name;
4143 return true;
4144 }
Craig Topper3164f332014-03-11 03:39:26 +00004145 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004146 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4147 unsigned CPUArchVer) const {
4148 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4149 (CPUArch.find('M') != StringRef::npos);
4150 }
4151 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4152 unsigned CPUArchVer) const {
4153 // We check both CPUArchVer and ArchName because when only triple is
4154 // specified, the default CPU is arm1136j-s.
4155 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4156 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4157 }
Craig Topper3164f332014-03-11 03:39:26 +00004158 void getTargetDefines(const LangOptions &Opts,
4159 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004160 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004161 Builder.defineMacro("__arm");
4162 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004163
Chris Lattnerecd49032009-03-02 22:27:17 +00004164 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004165 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004166
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004167 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004168 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004169 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004170 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004171 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004172
4173 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004174 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004175 StringRef ArchName = getTriple().getArchName();
4176
4177 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4178 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004179 if (CPUArch[0] >= '8') {
4180 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4181 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004182 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004183
4184 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4185 // is not defined for the M-profile.
4186 // NOTE that the deffault profile is assumed to be 'A'
4187 if (CPUProfile.empty() || CPUProfile != "M")
4188 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4189
4190 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4191 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4192 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4193 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4194 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4195 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4196 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4197
4198 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4199 // instruction set such as ARM or Thumb.
4200 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4201
4202 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4203
4204 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004205 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004206 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004207
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004208 // ACLE 6.5.1 Hardware Floating Point
4209 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004210 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004211
Yi Konga44c4d72014-06-27 21:25:42 +00004212 // ACLE predefines.
4213 Builder.defineMacro("__ARM_ACLE", "200");
4214
Mike Stump9d54bd72009-04-08 02:07:04 +00004215 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004216
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004217 // FIXME: It's more complicated than this and we don't really support
4218 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004219 // Windows on ARM does not "support" interworking
4220 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004221 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004222
David Tweed8f676532012-10-25 13:33:01 +00004223 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004224 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004225 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4226 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004227 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004228 Builder.defineMacro("__ARM_PCS", "1");
4229
David Tweed8f676532012-10-25 13:33:01 +00004230 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004231 Builder.defineMacro("__ARM_PCS_VFP", "1");
4232 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004233
Daniel Dunbar893d4752009-12-19 04:15:38 +00004234 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004235 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004236
4237 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004238 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004239
4240 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004241 Builder.defineMacro("__THUMBEL__");
4242 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004243 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004244 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004245 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004246 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4247 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004248
4249 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004250 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004251
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004252 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004253 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004254 if (FPU & VFP2FPU)
4255 Builder.defineMacro("__ARM_VFPV2__");
4256 if (FPU & VFP3FPU)
4257 Builder.defineMacro("__ARM_VFPV3__");
4258 if (FPU & VFP4FPU)
4259 Builder.defineMacro("__ARM_VFPV4__");
4260 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004261
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004262 // This only gets set when Neon instructions are actually available, unlike
4263 // the VFP define, hence the soft float and arch check. This is subtly
4264 // different from gcc, we follow the intent which was that it should be set
4265 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004266 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4267 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004268 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004269 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004270
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004271 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4272 Opts.ShortWChar ? "2" : "4");
4273
4274 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4275 Opts.ShortEnums ? "1" : "4");
4276
Bernard Ogden18b57012013-10-29 09:47:51 +00004277 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004278 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004279
Tim Northover02e38602014-02-03 17:28:04 +00004280 if (Crypto)
4281 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4282
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004283 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004284 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4285 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4286 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4287 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4288 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004289
4290 bool is5EOrAbove = (CPUArchVer >= 6 ||
4291 (CPUArchVer == 5 &&
4292 CPUArch.find('E') != StringRef::npos));
4293 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4294 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4295 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004296 }
Craig Topper3164f332014-03-11 03:39:26 +00004297 void getTargetBuiltins(const Builtin::Info *&Records,
4298 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004299 Records = BuiltinInfo;
4300 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004301 }
Craig Topper3164f332014-03-11 03:39:26 +00004302 bool isCLZForZeroUndef() const override { return false; }
4303 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004304 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004305 }
Craig Topper3164f332014-03-11 03:39:26 +00004306 void getGCCRegNames(const char * const *&Names,
4307 unsigned &NumNames) const override;
4308 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4309 unsigned &NumAliases) const override;
4310 bool validateAsmConstraint(const char *&Name,
4311 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004312 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004313 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004314 case 'l': // r0-r7
4315 case 'h': // r8-r15
4316 case 'w': // VFP Floating point register single precision
4317 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004318 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004319 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004320 case 'I':
4321 case 'J':
4322 case 'K':
4323 case 'L':
4324 case 'M':
4325 // FIXME
4326 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004327 case 'Q': // A memory address that is a single base register.
4328 Info.setAllowsMemory();
4329 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004330 case 'U': // a memory reference...
4331 switch (Name[1]) {
4332 case 'q': // ...ARMV4 ldrsb
4333 case 'v': // ...VFP load/store (reg+constant offset)
4334 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004335 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004336 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004337 case 'n': // valid address for Neon doubleword vector load/store
4338 case 'm': // valid address for Neon element and structure load/store
4339 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004340 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004341 Info.setAllowsMemory();
4342 Name++;
4343 return true;
4344 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004345 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004346 return false;
4347 }
Craig Topper3164f332014-03-11 03:39:26 +00004348 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004349 std::string R;
4350 switch (*Constraint) {
4351 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004352 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004353 Constraint++;
4354 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004355 case 'p': // 'p' should be translated to 'r' by default.
4356 R = std::string("r");
4357 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004358 default:
4359 return std::string(1, *Constraint);
4360 }
4361 return R;
4362 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004363 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004364 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004365 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004366 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004367 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004368
Bill Wendling9d1ee112012-10-25 23:28:48 +00004369 // Strip off constraint modifiers.
4370 while (Constraint[0] == '=' ||
4371 Constraint[0] == '+' ||
4372 Constraint[0] == '&')
4373 Constraint = Constraint.substr(1);
4374
4375 switch (Constraint[0]) {
4376 default: break;
4377 case 'r': {
4378 switch (Modifier) {
4379 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004380 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004381 case 'q':
4382 // A register of size 32 cannot fit a vector type.
4383 return false;
4384 }
4385 }
4386 }
4387
4388 return true;
4389 }
Craig Topper3164f332014-03-11 03:39:26 +00004390 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004391 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004392 return "";
4393 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004394
Craig Topper3164f332014-03-11 03:39:26 +00004395 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004396 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4397 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004398
Craig Topper3164f332014-03-11 03:39:26 +00004399 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004400 if (RegNo == 0) return 0;
4401 if (RegNo == 1) return 1;
4402 return -1;
4403 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004404};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004405
Rafael Espindolaeb265472013-08-21 21:59:03 +00004406bool ARMTargetInfo::setFPMath(StringRef Name) {
4407 if (Name == "neon") {
4408 FPMath = FP_Neon;
4409 return true;
4410 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4411 Name == "vfp4") {
4412 FPMath = FP_VFP;
4413 return true;
4414 }
4415 return false;
4416}
4417
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004418const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004419 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004420 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004421 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4422
4423 // Float registers
4424 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4425 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4426 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004427 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004428
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004429 // Double registers
4430 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4431 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004432 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4433 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004434
4435 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004436 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4437 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004438};
4439
4440void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004441 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004442 Names = GCCRegNames;
4443 NumNames = llvm::array_lengthof(GCCRegNames);
4444}
4445
4446const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004447 { { "a1" }, "r0" },
4448 { { "a2" }, "r1" },
4449 { { "a3" }, "r2" },
4450 { { "a4" }, "r3" },
4451 { { "v1" }, "r4" },
4452 { { "v2" }, "r5" },
4453 { { "v3" }, "r6" },
4454 { { "v4" }, "r7" },
4455 { { "v5" }, "r8" },
4456 { { "v6", "rfp" }, "r9" },
4457 { { "sl" }, "r10" },
4458 { { "fp" }, "r11" },
4459 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004460 { { "r13" }, "sp" },
4461 { { "r14" }, "lr" },
4462 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004463 // The S, D and Q registers overlap, but aren't really aliases; we
4464 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004465};
4466
4467void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4468 unsigned &NumAliases) const {
4469 Aliases = GCCRegAliases;
4470 NumAliases = llvm::array_lengthof(GCCRegAliases);
4471}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004472
4473const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004474#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004475#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004476 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004477#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004478
4479#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004480#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004481#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4482 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004483#include "clang/Basic/BuiltinsARM.def"
4484};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004485
4486class ARMleTargetInfo : public ARMTargetInfo {
4487public:
4488 ARMleTargetInfo(const llvm::Triple &Triple)
4489 : ARMTargetInfo(Triple, false) { }
4490 virtual void getTargetDefines(const LangOptions &Opts,
4491 MacroBuilder &Builder) const {
4492 Builder.defineMacro("__ARMEL__");
4493 ARMTargetInfo::getTargetDefines(Opts, Builder);
4494 }
4495};
4496
4497class ARMbeTargetInfo : public ARMTargetInfo {
4498public:
4499 ARMbeTargetInfo(const llvm::Triple &Triple)
4500 : ARMTargetInfo(Triple, true) { }
4501 virtual void getTargetDefines(const LangOptions &Opts,
4502 MacroBuilder &Builder) const {
4503 Builder.defineMacro("__ARMEB__");
4504 Builder.defineMacro("__ARM_BIG_ENDIAN");
4505 ARMTargetInfo::getTargetDefines(Opts, Builder);
4506 }
4507};
Chris Lattner17df24e2008-04-21 18:56:49 +00004508} // end anonymous namespace.
4509
Eli Friedmanf05b7722008-08-20 07:44:10 +00004510namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004511class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4512 const llvm::Triple Triple;
4513public:
4514 WindowsARMTargetInfo(const llvm::Triple &Triple)
4515 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4516 TLSSupported = false;
4517 WCharType = UnsignedShort;
4518 SizeType = UnsignedInt;
4519 UserLabelPrefix = "";
4520 }
4521 void getVisualStudioDefines(const LangOptions &Opts,
4522 MacroBuilder &Builder) const {
4523 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4524
4525 // FIXME: this is invalid for WindowsCE
4526 Builder.defineMacro("_M_ARM_NT", "1");
4527 Builder.defineMacro("_M_ARMT", "_M_ARM");
4528 Builder.defineMacro("_M_THUMB", "_M_ARM");
4529
4530 assert((Triple.getArch() == llvm::Triple::arm ||
4531 Triple.getArch() == llvm::Triple::thumb) &&
4532 "invalid architecture for Windows ARM target info");
4533 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4534 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4535
4536 // TODO map the complete set of values
4537 // 31: VFPv3 40: VFPv4
4538 Builder.defineMacro("_M_ARM_FP", "31");
4539 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004540 BuiltinVaListKind getBuiltinVaListKind() const override {
4541 return TargetInfo::CharPtrBuiltinVaList;
4542 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004543};
4544
4545// Windows ARM + Itanium C++ ABI Target
4546class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4547public:
4548 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4549 : WindowsARMTargetInfo(Triple) {
4550 TheCXXABI.set(TargetCXXABI::GenericARM);
4551 }
4552
4553 void getTargetDefines(const LangOptions &Opts,
4554 MacroBuilder &Builder) const override {
4555 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4556
4557 if (Opts.MSVCCompat)
4558 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4559 }
4560};
4561
4562// Windows ARM, MS (C++) ABI
4563class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4564public:
4565 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4566 : WindowsARMTargetInfo(Triple) {
4567 TheCXXABI.set(TargetCXXABI::Microsoft);
4568 }
4569
4570 void getTargetDefines(const LangOptions &Opts,
4571 MacroBuilder &Builder) const override {
4572 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4573 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4574 }
4575};
4576}
4577
4578
4579namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004580class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004581 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004582protected:
Craig Topper3164f332014-03-11 03:39:26 +00004583 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4584 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004585 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004586 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004587
Torok Edwinb2b37c62009-06-30 17:10:35 +00004588public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004589 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004590 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004591 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004592 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004593 // FIXME: This should be based off of the target features in
4594 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004595 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004596
4597 // Darwin on iOS uses a variant of the ARM C++ ABI.
4598 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004599 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004600};
4601} // end anonymous namespace.
4602
Tony Linthicum76329bf2011-12-12 21:14:55 +00004603
4604namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004605class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004606 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004607 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4608 static const char *const GCCRegNames[];
4609
James Molloy75f5f9e2014-04-16 15:33:48 +00004610 enum FPUModeEnum {
4611 FPUMode,
4612 NeonMode
4613 };
4614
4615 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004616 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004617 unsigned Crypto;
4618
Tim Northovera2ee4332014-03-29 15:09:45 +00004619 static const Builtin::Info BuiltinInfo[];
4620
4621 std::string ABI;
4622
4623public:
Tim Northover573cbee2014-05-24 12:52:07 +00004624 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004625 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004626
4627 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4628 WCharType = SignedInt;
4629
4630 // NetBSD apparently prefers consistency across ARM targets to consistency
4631 // across 64-bit targets.
4632 Int64Type = SignedLongLong;
4633 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004634 } else {
4635 WCharType = UnsignedInt;
4636 Int64Type = SignedLong;
4637 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004638 }
4639
Tim Northovera2ee4332014-03-29 15:09:45 +00004640 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004641 MaxVectorAlign = 128;
4642 RegParmMax = 8;
4643 MaxAtomicInlineWidth = 128;
4644 MaxAtomicPromoteWidth = 128;
4645
4646 LongDoubleWidth = LongDoubleAlign = 128;
4647 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4648
Tim Northovera2ee4332014-03-29 15:09:45 +00004649 // {} in inline assembly are neon specifiers, not assembly variant
4650 // specifiers.
4651 NoAsmVariants = true;
4652
Tim Northover573cbee2014-05-24 12:52:07 +00004653 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004654 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4655 }
4656
Alp Toker4925ba72014-06-07 23:30:42 +00004657 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004658 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004659 if (Name != "aapcs" && Name != "darwinpcs")
4660 return false;
4661
4662 ABI = Name;
4663 return true;
4664 }
4665
David Blaikie1cbb9712014-11-14 19:09:44 +00004666 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004667 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004668 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004669 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004670 .Case("cyclone", true)
4671 .Default(false);
4672 return CPUKnown;
4673 }
4674
4675 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004676 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004677 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004678 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004679
4680 // Target properties.
4681 Builder.defineMacro("_LP64");
4682 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004683
4684 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4685 Builder.defineMacro("__ARM_ACLE", "200");
4686 Builder.defineMacro("__ARM_ARCH", "8");
4687 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4688
4689 Builder.defineMacro("__ARM_64BIT_STATE");
4690 Builder.defineMacro("__ARM_PCS_AAPCS64");
4691 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4692
4693 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4694 Builder.defineMacro("__ARM_FEATURE_CLZ");
4695 Builder.defineMacro("__ARM_FEATURE_FMA");
4696 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004697 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4698 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4699 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4700 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004701
4702 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4703
4704 // 0xe implies support for half, single and double precision operations.
4705 Builder.defineMacro("__ARM_FP", "0xe");
4706
4707 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4708 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4709 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4710
4711 if (Opts.FastMath || Opts.FiniteMathOnly)
4712 Builder.defineMacro("__ARM_FP_FAST");
4713
Richard Smithab506ad2014-10-20 23:26:58 +00004714 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004715 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4716
4717 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4718
4719 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4720 Opts.ShortEnums ? "1" : "4");
4721
James Molloy75f5f9e2014-04-16 15:33:48 +00004722 if (FPU == NeonMode) {
4723 Builder.defineMacro("__ARM_NEON");
4724 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004725 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004726 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004727
Bradley Smith418c5932014-05-02 15:17:51 +00004728 if (CRC)
4729 Builder.defineMacro("__ARM_FEATURE_CRC32");
4730
James Molloy75f5f9e2014-04-16 15:33:48 +00004731 if (Crypto)
4732 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004733 }
4734
4735 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004736 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004737 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004738 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004739 }
4740
David Blaikie1cbb9712014-11-14 19:09:44 +00004741 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004742 return Feature == "aarch64" ||
4743 Feature == "arm64" ||
4744 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004745 }
4746
James Molloy5e73df52014-04-16 15:06:20 +00004747 bool handleTargetFeatures(std::vector<std::string> &Features,
4748 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004749 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004750 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004751 Crypto = 0;
4752 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4753 if (Features[i] == "+neon")
4754 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004755 if (Features[i] == "+crc")
4756 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004757 if (Features[i] == "+crypto")
4758 Crypto = 1;
4759 }
4760
James Molloy5e73df52014-04-16 15:06:20 +00004761 setDescriptionString();
4762
4763 return true;
4764 }
4765
David Blaikie1cbb9712014-11-14 19:09:44 +00004766 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004767
David Blaikie1cbb9712014-11-14 19:09:44 +00004768 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004769 return TargetInfo::AArch64ABIBuiltinVaList;
4770 }
4771
4772 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004773 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004774 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004775 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004776
Eric Christopher917e9522014-11-18 22:36:15 +00004777 virtual bool
4778 validateAsmConstraint(const char *&Name,
4779 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004780 switch (*Name) {
4781 default:
4782 return false;
4783 case 'w': // Floating point and SIMD registers (V0-V31)
4784 Info.setAllowsRegister();
4785 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004786 case 'I': // Constant that can be used with an ADD instruction
4787 case 'J': // Constant that can be used with a SUB instruction
4788 case 'K': // Constant that can be used with a 32-bit logical instruction
4789 case 'L': // Constant that can be used with a 64-bit logical instruction
4790 case 'M': // Constant that can be used as a 32-bit MOV immediate
4791 case 'N': // Constant that can be used as a 64-bit MOV immediate
4792 case 'Y': // Floating point constant zero
4793 case 'Z': // Integer constant zero
4794 return true;
4795 case 'Q': // A memory reference with base register and no offset
4796 Info.setAllowsMemory();
4797 return true;
4798 case 'S': // A symbolic address
4799 Info.setAllowsRegister();
4800 return true;
4801 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004802 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4803 // Utf: A memory address suitable for ldp/stp in TF mode.
4804 // Usa: An absolute symbolic address.
4805 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4806 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004807 case 'z': // Zero register, wzr or xzr
4808 Info.setAllowsRegister();
4809 return true;
4810 case 'x': // Floating point and SIMD registers (V0-V15)
4811 Info.setAllowsRegister();
4812 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004813 }
4814 return false;
4815 }
4816
Akira Hatanaka987f1862014-08-22 06:05:21 +00004817 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004818 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004819 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004820 // Strip off constraint modifiers.
4821 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4822 Constraint = Constraint.substr(1);
4823
4824 switch (Constraint[0]) {
4825 default:
4826 return true;
4827 case 'z':
4828 case 'r': {
4829 switch (Modifier) {
4830 case 'x':
4831 case 'w':
4832 // For now assume that the person knows what they're
4833 // doing with the modifier.
4834 return true;
4835 default:
4836 // By default an 'r' constraint will be in the 'x'
4837 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004838 if (Size == 64)
4839 return true;
4840
4841 SuggestedModifier = "w";
4842 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004843 }
4844 }
4845 }
4846 }
4847
David Blaikie1cbb9712014-11-14 19:09:44 +00004848 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004849
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004850 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004851 if (RegNo == 0)
4852 return 0;
4853 if (RegNo == 1)
4854 return 1;
4855 return -1;
4856 }
4857};
4858
Tim Northover573cbee2014-05-24 12:52:07 +00004859const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004860 // 32-bit Integer registers
4861 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4862 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4863 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4864
4865 // 64-bit Integer registers
4866 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4867 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4868 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4869
4870 // 32-bit floating point regsisters
4871 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4872 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4873 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4874
4875 // 64-bit floating point regsisters
4876 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4877 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4878 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4879
4880 // Vector registers
4881 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4882 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4883 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4884};
4885
Tim Northover573cbee2014-05-24 12:52:07 +00004886void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004887 unsigned &NumNames) const {
4888 Names = GCCRegNames;
4889 NumNames = llvm::array_lengthof(GCCRegNames);
4890}
4891
Tim Northover573cbee2014-05-24 12:52:07 +00004892const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004893 { { "w31" }, "wsp" },
4894 { { "x29" }, "fp" },
4895 { { "x30" }, "lr" },
4896 { { "x31" }, "sp" },
4897 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4898 // don't want to substitute one of these for a different-sized one.
4899};
4900
Tim Northover573cbee2014-05-24 12:52:07 +00004901void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004902 unsigned &NumAliases) const {
4903 Aliases = GCCRegAliases;
4904 NumAliases = llvm::array_lengthof(GCCRegAliases);
4905}
4906
Tim Northover573cbee2014-05-24 12:52:07 +00004907const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004908#define BUILTIN(ID, TYPE, ATTRS) \
4909 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4910#include "clang/Basic/BuiltinsNEON.def"
4911
4912#define BUILTIN(ID, TYPE, ATTRS) \
4913 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004914#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004915};
James Molloy5e73df52014-04-16 15:06:20 +00004916
Tim Northover573cbee2014-05-24 12:52:07 +00004917class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004918 void setDescriptionString() override {
4919 if (getTriple().isOSBinFormatMachO())
4920 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4921 else
4922 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4923 }
4924
4925public:
Tim Northover573cbee2014-05-24 12:52:07 +00004926 AArch64leTargetInfo(const llvm::Triple &Triple)
4927 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004928 BigEndian = false;
4929 }
4930 void getTargetDefines(const LangOptions &Opts,
4931 MacroBuilder &Builder) const override {
4932 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004933 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004934 }
4935};
4936
Tim Northover573cbee2014-05-24 12:52:07 +00004937class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004938 void setDescriptionString() override {
4939 assert(!getTriple().isOSBinFormatMachO());
4940 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4941 }
4942
4943public:
Tim Northover573cbee2014-05-24 12:52:07 +00004944 AArch64beTargetInfo(const llvm::Triple &Triple)
4945 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004946 void getTargetDefines(const LangOptions &Opts,
4947 MacroBuilder &Builder) const override {
4948 Builder.defineMacro("__AARCH64EB__");
4949 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4950 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004951 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004952 }
4953};
Tim Northovera2ee4332014-03-29 15:09:45 +00004954} // end anonymous namespace.
4955
4956namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004957class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004958protected:
4959 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4960 MacroBuilder &Builder) const override {
4961 Builder.defineMacro("__AARCH64_SIMD__");
4962 Builder.defineMacro("__ARM64_ARCH_8__");
4963 Builder.defineMacro("__ARM_NEON__");
4964 Builder.defineMacro("__LITTLE_ENDIAN__");
4965 Builder.defineMacro("__REGISTER_PREFIX__", "");
4966 Builder.defineMacro("__arm64", "1");
4967 Builder.defineMacro("__arm64__", "1");
4968
4969 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4970 }
4971
Tim Northovera2ee4332014-03-29 15:09:45 +00004972public:
Tim Northover573cbee2014-05-24 12:52:07 +00004973 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4974 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004975 Int64Type = SignedLongLong;
4976 WCharType = SignedInt;
4977 UseSignedCharForObjCBool = false;
4978
4979 LongDoubleWidth = LongDoubleAlign = 64;
4980 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4981
4982 TheCXXABI.set(TargetCXXABI::iOS64);
4983 }
4984
David Blaikie1cbb9712014-11-14 19:09:44 +00004985 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004986 return TargetInfo::CharPtrBuiltinVaList;
4987 }
4988};
4989} // end anonymous namespace
4990
4991namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004992// Hexagon abstract base class
4993class HexagonTargetInfo : public TargetInfo {
4994 static const Builtin::Info BuiltinInfo[];
4995 static const char * const GCCRegNames[];
4996 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4997 std::string CPU;
4998public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004999 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005000 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005001 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005002
5003 // {} in inline assembly are packet specifiers, not assembly variant
5004 // specifiers.
5005 NoAsmVariants = true;
5006 }
5007
Craig Topper3164f332014-03-11 03:39:26 +00005008 void getTargetBuiltins(const Builtin::Info *&Records,
5009 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005010 Records = BuiltinInfo;
5011 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5012 }
5013
Craig Topper3164f332014-03-11 03:39:26 +00005014 bool validateAsmConstraint(const char *&Name,
5015 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005016 return true;
5017 }
5018
Craig Topper3164f332014-03-11 03:39:26 +00005019 void getTargetDefines(const LangOptions &Opts,
5020 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005021
Craig Topper3164f332014-03-11 03:39:26 +00005022 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005023 return Feature == "hexagon";
5024 }
Craig Topper3164f332014-03-11 03:39:26 +00005025
5026 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005027 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005028 }
Craig Topper3164f332014-03-11 03:39:26 +00005029 void getGCCRegNames(const char * const *&Names,
5030 unsigned &NumNames) const override;
5031 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5032 unsigned &NumAliases) const override;
5033 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005034 return "";
5035 }
Sebastian Pop86500282012-01-13 20:37:10 +00005036
5037 static const char *getHexagonCPUSuffix(StringRef Name) {
5038 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005039 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005040 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005041 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005042 }
5043
Craig Topper3164f332014-03-11 03:39:26 +00005044 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005045 if (!getHexagonCPUSuffix(Name))
5046 return false;
5047
Tony Linthicum76329bf2011-12-12 21:14:55 +00005048 CPU = Name;
5049 return true;
5050 }
5051};
5052
5053void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5054 MacroBuilder &Builder) const {
5055 Builder.defineMacro("qdsp6");
5056 Builder.defineMacro("__qdsp6", "1");
5057 Builder.defineMacro("__qdsp6__", "1");
5058
5059 Builder.defineMacro("hexagon");
5060 Builder.defineMacro("__hexagon", "1");
5061 Builder.defineMacro("__hexagon__", "1");
5062
5063 if(CPU == "hexagonv1") {
5064 Builder.defineMacro("__HEXAGON_V1__");
5065 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5066 if(Opts.HexagonQdsp6Compat) {
5067 Builder.defineMacro("__QDSP6_V1__");
5068 Builder.defineMacro("__QDSP6_ARCH__", "1");
5069 }
5070 }
5071 else if(CPU == "hexagonv2") {
5072 Builder.defineMacro("__HEXAGON_V2__");
5073 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5074 if(Opts.HexagonQdsp6Compat) {
5075 Builder.defineMacro("__QDSP6_V2__");
5076 Builder.defineMacro("__QDSP6_ARCH__", "2");
5077 }
5078 }
5079 else if(CPU == "hexagonv3") {
5080 Builder.defineMacro("__HEXAGON_V3__");
5081 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5082 if(Opts.HexagonQdsp6Compat) {
5083 Builder.defineMacro("__QDSP6_V3__");
5084 Builder.defineMacro("__QDSP6_ARCH__", "3");
5085 }
5086 }
5087 else if(CPU == "hexagonv4") {
5088 Builder.defineMacro("__HEXAGON_V4__");
5089 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5090 if(Opts.HexagonQdsp6Compat) {
5091 Builder.defineMacro("__QDSP6_V4__");
5092 Builder.defineMacro("__QDSP6_ARCH__", "4");
5093 }
5094 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005095 else if(CPU == "hexagonv5") {
5096 Builder.defineMacro("__HEXAGON_V5__");
5097 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5098 if(Opts.HexagonQdsp6Compat) {
5099 Builder.defineMacro("__QDSP6_V5__");
5100 Builder.defineMacro("__QDSP6_ARCH__", "5");
5101 }
5102 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005103}
5104
5105const char * const HexagonTargetInfo::GCCRegNames[] = {
5106 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5107 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5108 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5109 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5110 "p0", "p1", "p2", "p3",
5111 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5112};
5113
5114void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5115 unsigned &NumNames) const {
5116 Names = GCCRegNames;
5117 NumNames = llvm::array_lengthof(GCCRegNames);
5118}
5119
5120
5121const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5122 { { "sp" }, "r29" },
5123 { { "fp" }, "r30" },
5124 { { "lr" }, "r31" },
5125 };
5126
5127void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5128 unsigned &NumAliases) const {
5129 Aliases = GCCRegAliases;
5130 NumAliases = llvm::array_lengthof(GCCRegAliases);
5131}
5132
5133
5134const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5135#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5136#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5137 ALL_LANGUAGES },
5138#include "clang/Basic/BuiltinsHexagon.def"
5139};
5140}
5141
5142
Chris Lattner5ba61f02006-10-14 07:39:34 +00005143namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005144// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5145class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005146 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5147 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005148 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005149public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005150 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005151
Craig Topper3164f332014-03-11 03:39:26 +00005152 bool handleTargetFeatures(std::vector<std::string> &Features,
5153 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005154 SoftFloat = false;
5155 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5156 if (Features[i] == "+soft-float")
5157 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005158 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005159 }
Craig Topper3164f332014-03-11 03:39:26 +00005160 void getTargetDefines(const LangOptions &Opts,
5161 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005162 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005163 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005164
5165 if (SoftFloat)
5166 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005167 }
Craig Topper3164f332014-03-11 03:39:26 +00005168
5169 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005170 return llvm::StringSwitch<bool>(Feature)
5171 .Case("softfloat", SoftFloat)
5172 .Case("sparc", true)
5173 .Default(false);
5174 }
Craig Topper3164f332014-03-11 03:39:26 +00005175
5176 void getTargetBuiltins(const Builtin::Info *&Records,
5177 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005178 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005179 }
Craig Topper3164f332014-03-11 03:39:26 +00005180 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005181 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005182 }
Craig Topper3164f332014-03-11 03:39:26 +00005183 void getGCCRegNames(const char * const *&Names,
5184 unsigned &NumNames) const override;
5185 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5186 unsigned &NumAliases) const override;
5187 bool validateAsmConstraint(const char *&Name,
5188 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005189 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005190 switch (*Name) {
5191 case 'I': // Signed 13-bit constant
5192 case 'J': // Zero
5193 case 'K': // 32-bit constant with the low 12 bits clear
5194 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5195 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5196 case 'N': // Same as 'K' but zext (required for SIMode)
5197 case 'O': // The constant 4096
5198 return true;
5199 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005200 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005201 }
Craig Topper3164f332014-03-11 03:39:26 +00005202 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005203 // FIXME: Implement!
5204 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005205 }
5206};
5207
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005208const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005209 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5210 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5211 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5212 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5213};
5214
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005215void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5216 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005217 Names = GCCRegNames;
5218 NumNames = llvm::array_lengthof(GCCRegNames);
5219}
5220
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005221const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005222 { { "g0" }, "r0" },
5223 { { "g1" }, "r1" },
5224 { { "g2" }, "r2" },
5225 { { "g3" }, "r3" },
5226 { { "g4" }, "r4" },
5227 { { "g5" }, "r5" },
5228 { { "g6" }, "r6" },
5229 { { "g7" }, "r7" },
5230 { { "o0" }, "r8" },
5231 { { "o1" }, "r9" },
5232 { { "o2" }, "r10" },
5233 { { "o3" }, "r11" },
5234 { { "o4" }, "r12" },
5235 { { "o5" }, "r13" },
5236 { { "o6", "sp" }, "r14" },
5237 { { "o7" }, "r15" },
5238 { { "l0" }, "r16" },
5239 { { "l1" }, "r17" },
5240 { { "l2" }, "r18" },
5241 { { "l3" }, "r19" },
5242 { { "l4" }, "r20" },
5243 { { "l5" }, "r21" },
5244 { { "l6" }, "r22" },
5245 { { "l7" }, "r23" },
5246 { { "i0" }, "r24" },
5247 { { "i1" }, "r25" },
5248 { { "i2" }, "r26" },
5249 { { "i3" }, "r27" },
5250 { { "i4" }, "r28" },
5251 { { "i5" }, "r29" },
5252 { { "i6", "fp" }, "r30" },
5253 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005254};
5255
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005256void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5257 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005258 Aliases = GCCRegAliases;
5259 NumAliases = llvm::array_lengthof(GCCRegAliases);
5260}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005261
5262// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5263class SparcV8TargetInfo : public SparcTargetInfo {
5264public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005265 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005266 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005267 }
5268
Craig Topper3164f332014-03-11 03:39:26 +00005269 void getTargetDefines(const LangOptions &Opts,
5270 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005271 SparcTargetInfo::getTargetDefines(Opts, Builder);
5272 Builder.defineMacro("__sparcv8");
5273 }
5274};
5275
5276// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5277class SparcV9TargetInfo : public SparcTargetInfo {
5278public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005279 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005280 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005281 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005282 // This is an LP64 platform.
5283 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005284
5285 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005286 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005287 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005288 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005289 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005290 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005291
5292 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5293 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5294 LongDoubleWidth = 128;
5295 LongDoubleAlign = 128;
5296 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005297 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005298 }
5299
Craig Topper3164f332014-03-11 03:39:26 +00005300 void getTargetDefines(const LangOptions &Opts,
5301 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005302 SparcTargetInfo::getTargetDefines(Opts, Builder);
5303 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005304 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005305 // Solaris doesn't need these variants, but the BSDs do.
5306 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005307 Builder.defineMacro("__sparc64__");
5308 Builder.defineMacro("__sparc_v9__");
5309 Builder.defineMacro("__sparcv9__");
5310 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005311 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005312
Craig Topper3164f332014-03-11 03:39:26 +00005313 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005314 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5315 .Case("v9", true)
5316 .Case("ultrasparc", true)
5317 .Case("ultrasparc3", true)
5318 .Case("niagara", true)
5319 .Case("niagara2", true)
5320 .Case("niagara3", true)
5321 .Case("niagara4", true)
5322 .Default(false);
5323
5324 // No need to store the CPU yet. There aren't any CPU-specific
5325 // macros to define.
5326 return CPUKnown;
5327 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005328};
5329
Gabor Greif49991682008-02-21 16:29:08 +00005330} // end anonymous namespace.
5331
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005332namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005333class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005334public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005335 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5336 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005337 SizeType = UnsignedInt;
5338 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005339 }
5340};
5341} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005342
Chris Lattnerb781dc792008-05-08 05:58:21 +00005343namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005344class SystemZTargetInfo : public TargetInfo {
5345 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005346
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005347public:
5348 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5349 TLSSupported = true;
5350 IntWidth = IntAlign = 32;
5351 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5352 PointerWidth = PointerAlign = 64;
5353 LongDoubleWidth = 128;
5354 LongDoubleAlign = 64;
5355 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5356 MinGlobalAlign = 16;
5357 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5358 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5359 }
5360 void getTargetDefines(const LangOptions &Opts,
5361 MacroBuilder &Builder) const override {
5362 Builder.defineMacro("__s390__");
5363 Builder.defineMacro("__s390x__");
5364 Builder.defineMacro("__zarch__");
5365 Builder.defineMacro("__LONG_DOUBLE_128__");
5366 }
5367 void getTargetBuiltins(const Builtin::Info *&Records,
5368 unsigned &NumRecords) const override {
5369 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005370 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005371 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005372 }
5373
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005374 void getGCCRegNames(const char *const *&Names,
5375 unsigned &NumNames) const override;
5376 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5377 unsigned &NumAliases) const override {
5378 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005379 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005380 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005381 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005382 bool validateAsmConstraint(const char *&Name,
5383 TargetInfo::ConstraintInfo &info) const override;
5384 const char *getClobbers() const override {
5385 // FIXME: Is this really right?
5386 return "";
5387 }
5388 BuiltinVaListKind getBuiltinVaListKind() const override {
5389 return TargetInfo::SystemZBuiltinVaList;
5390 }
5391 bool setCPU(const std::string &Name) override {
5392 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5393 .Case("z10", true)
5394 .Case("z196", true)
5395 .Case("zEC12", true)
5396 .Default(false);
5397
5398 // No need to store the CPU yet. There aren't any CPU-specific
5399 // macros to define.
5400 return CPUKnown;
5401 }
5402};
5403
5404const char *const SystemZTargetInfo::GCCRegNames[] = {
5405 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5406 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5407 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5408 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5409};
5410
5411void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5412 unsigned &NumNames) const {
5413 Names = GCCRegNames;
5414 NumNames = llvm::array_lengthof(GCCRegNames);
5415}
5416
5417bool SystemZTargetInfo::
5418validateAsmConstraint(const char *&Name,
5419 TargetInfo::ConstraintInfo &Info) const {
5420 switch (*Name) {
5421 default:
5422 return false;
5423
5424 case 'a': // Address register
5425 case 'd': // Data register (equivalent to 'r')
5426 case 'f': // Floating-point register
5427 Info.setAllowsRegister();
5428 return true;
5429
5430 case 'I': // Unsigned 8-bit constant
5431 case 'J': // Unsigned 12-bit constant
5432 case 'K': // Signed 16-bit constant
5433 case 'L': // Signed 20-bit displacement (on all targets we support)
5434 case 'M': // 0x7fffffff
5435 return true;
5436
5437 case 'Q': // Memory with base and unsigned 12-bit displacement
5438 case 'R': // Likewise, plus an index
5439 case 'S': // Memory with base and signed 20-bit displacement
5440 case 'T': // Likewise, plus an index
5441 Info.setAllowsMemory();
5442 return true;
5443 }
5444}
Ulrich Weigand47445072013-05-06 16:26:41 +00005445}
5446
5447namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005448 class MSP430TargetInfo : public TargetInfo {
5449 static const char * const GCCRegNames[];
5450 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005451 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005452 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005453 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005454 IntWidth = 16; IntAlign = 16;
5455 LongWidth = 32; LongLongWidth = 64;
5456 LongAlign = LongLongAlign = 16;
5457 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005458 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005459 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005460 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005461 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005462 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005463 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005464 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005465 }
5466 void getTargetDefines(const LangOptions &Opts,
5467 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005468 Builder.defineMacro("MSP430");
5469 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005470 // FIXME: defines for different 'flavours' of MCU
5471 }
Craig Topper3164f332014-03-11 03:39:26 +00005472 void getTargetBuiltins(const Builtin::Info *&Records,
5473 unsigned &NumRecords) const override {
5474 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005475 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005476 NumRecords = 0;
5477 }
Craig Topper3164f332014-03-11 03:39:26 +00005478 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005479 return Feature == "msp430";
5480 }
Craig Topper3164f332014-03-11 03:39:26 +00005481 void getGCCRegNames(const char * const *&Names,
5482 unsigned &NumNames) const override;
5483 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5484 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005485 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005486 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005487 NumAliases = 0;
5488 }
Eric Christopher917e9522014-11-18 22:36:15 +00005489 bool
5490 validateAsmConstraint(const char *&Name,
5491 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005492 // FIXME: implement
5493 switch (*Name) {
5494 case 'K': // the constant 1
5495 case 'L': // constant -1^20 .. 1^19
5496 case 'M': // constant 1-4:
5497 return true;
5498 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005499 // No target constraints for now.
5500 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005501 }
Craig Topper3164f332014-03-11 03:39:26 +00005502 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005503 // FIXME: Is this really right?
5504 return "";
5505 }
Craig Topper3164f332014-03-11 03:39:26 +00005506 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005507 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005508 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005509 }
5510 };
5511
5512 const char * const MSP430TargetInfo::GCCRegNames[] = {
5513 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5514 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5515 };
5516
5517 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5518 unsigned &NumNames) const {
5519 Names = GCCRegNames;
5520 NumNames = llvm::array_lengthof(GCCRegNames);
5521 }
5522}
5523
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005524namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005525
Mike Stump11289f42009-09-09 15:08:12 +00005526 // LLVM and Clang cannot be used directly to output native binaries for
5527 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005528 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005529 //
5530 // TCE uses the llvm bitcode as input and uses it for generating customized
5531 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005532 // publicly available in http://tce.cs.tut.fi
5533
Eli Friedman1f191002011-10-07 19:51:42 +00005534 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5535 3, // opencl_global
5536 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005537 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005538 // FIXME: generic has to be added to the target
5539 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005540 0, // cuda_device
5541 0, // cuda_constant
5542 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005543 };
5544
Eli Friedmana9c3d712009-08-19 20:47:07 +00005545 class TCETargetInfo : public TargetInfo{
5546 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005547 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005548 TLSSupported = false;
5549 IntWidth = 32;
5550 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005551 PointerWidth = 32;
5552 IntAlign = 32;
5553 LongAlign = LongLongAlign = 32;
5554 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005555 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005556 SizeType = UnsignedInt;
5557 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005558 IntPtrType = SignedInt;
5559 PtrDiffType = SignedInt;
5560 FloatWidth = 32;
5561 FloatAlign = 32;
5562 DoubleWidth = 32;
5563 DoubleAlign = 32;
5564 LongDoubleWidth = 32;
5565 LongDoubleAlign = 32;
5566 FloatFormat = &llvm::APFloat::IEEEsingle;
5567 DoubleFormat = &llvm::APFloat::IEEEsingle;
5568 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005569 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5570 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005571 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005572 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005573 }
5574
Craig Topper3164f332014-03-11 03:39:26 +00005575 void getTargetDefines(const LangOptions &Opts,
5576 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005577 DefineStd(Builder, "tce", Opts);
5578 Builder.defineMacro("__TCE__");
5579 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005580 }
Craig Topper3164f332014-03-11 03:39:26 +00005581 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005582 return Feature == "tce";
5583 }
Craig Topper3164f332014-03-11 03:39:26 +00005584
5585 void getTargetBuiltins(const Builtin::Info *&Records,
5586 unsigned &NumRecords) const override {}
5587 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005588 return "";
5589 }
Craig Topper3164f332014-03-11 03:39:26 +00005590 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005591 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005592 }
Craig Topper3164f332014-03-11 03:39:26 +00005593 void getGCCRegNames(const char * const *&Names,
5594 unsigned &NumNames) const override {}
5595 bool validateAsmConstraint(const char *&Name,
5596 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005597 return true;
5598 }
Craig Topper3164f332014-03-11 03:39:26 +00005599 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5600 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005601 };
5602}
5603
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005604namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005605class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005606 virtual void setDescriptionString() = 0;
5607
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005608 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005609 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005610 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005611 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005612 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005613 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005614 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005615 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005616 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005617 enum DspRevEnum {
5618 NoDSP, DSP1, DSP2
5619 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005620 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005621
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005622protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005623 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005624 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005625
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005626public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005627 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5628 const std::string &CPUStr)
5629 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005630 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005631 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005632
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005633 bool isNaN2008Default() const {
5634 return CPU == "mips32r6" || CPU == "mips64r6";
5635 }
5636
5637 bool isFP64Default() const {
5638 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5639 }
5640
Alp Toker4925ba72014-06-07 23:30:42 +00005641 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005642 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005643 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5644 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005645 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005646 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005647 .Case("mips1", IsMips32)
5648 .Case("mips2", IsMips32)
5649 .Case("mips3", true)
5650 .Case("mips4", true)
5651 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005652 .Case("mips32", IsMips32)
5653 .Case("mips32r2", IsMips32)
5654 .Case("mips32r6", IsMips32)
5655 .Case("mips64", true)
5656 .Case("mips64r2", true)
5657 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005658 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005659 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005660 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005661 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005662 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005663 // The backend enables certain ABI's by default according to the
5664 // architecture.
5665 // Disable both possible defaults so that we don't end up with multiple
5666 // ABI's selected and trigger an assertion.
5667 Features["o32"] = false;
5668 Features["n64"] = false;
5669
Eric Christopher0b26a612010-03-02 02:41:08 +00005670 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005671 if (CPU == "octeon")
5672 Features["mips64r2"] = Features["cnmips"] = true;
5673 else
5674 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005675 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005676
Craig Topper3164f332014-03-11 03:39:26 +00005677 void getTargetDefines(const LangOptions &Opts,
5678 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005679 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005680 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005681 if (Opts.GNUMode)
5682 Builder.defineMacro("mips");
5683
Simon Atanasyan683535b2012-08-29 19:14:58 +00005684 Builder.defineMacro("__REGISTER_PREFIX__", "");
5685
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005686 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005687 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005688 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005689 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005690 case SoftFloat:
5691 Builder.defineMacro("__mips_soft_float", Twine(1));
5692 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005693 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005694
Simon Atanasyan16071912013-04-14 14:07:30 +00005695 if (IsSingleFloat)
5696 Builder.defineMacro("__mips_single_float", Twine(1));
5697
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005698 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5699 Builder.defineMacro("_MIPS_FPSET",
5700 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5701
Simon Atanasyan72244b62012-07-05 16:06:06 +00005702 if (IsMips16)
5703 Builder.defineMacro("__mips16", Twine(1));
5704
Simon Atanasyan60777612013-04-14 14:07:51 +00005705 if (IsMicromips)
5706 Builder.defineMacro("__mips_micromips", Twine(1));
5707
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005708 if (IsNan2008)
5709 Builder.defineMacro("__mips_nan2008", Twine(1));
5710
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005711 switch (DspRev) {
5712 default:
5713 break;
5714 case DSP1:
5715 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5716 Builder.defineMacro("__mips_dsp", Twine(1));
5717 break;
5718 case DSP2:
5719 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5720 Builder.defineMacro("__mips_dspr2", Twine(1));
5721 Builder.defineMacro("__mips_dsp", Twine(1));
5722 break;
5723 }
5724
Jack Carter44ff1e52013-08-12 17:20:29 +00005725 if (HasMSA)
5726 Builder.defineMacro("__mips_msa", Twine(1));
5727
Simon Atanasyan26f19672012-04-05 19:28:31 +00005728 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5729 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5730 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005731
5732 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5733 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005734 }
5735
Craig Topper3164f332014-03-11 03:39:26 +00005736 void getTargetBuiltins(const Builtin::Info *&Records,
5737 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005738 Records = BuiltinInfo;
5739 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005740 }
Craig Topper3164f332014-03-11 03:39:26 +00005741 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005742 return llvm::StringSwitch<bool>(Feature)
5743 .Case("mips", true)
5744 .Case("fp64", HasFP64)
5745 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005746 }
Craig Topper3164f332014-03-11 03:39:26 +00005747 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005748 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005749 }
Craig Topper3164f332014-03-11 03:39:26 +00005750 void getGCCRegNames(const char * const *&Names,
5751 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005752 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005753 // CPU register names
5754 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005755 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5756 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5757 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005758 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5759 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005760 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5761 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5762 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5763 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005764 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005765 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005766 "$fcc5","$fcc6","$fcc7",
5767 // MSA register names
5768 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5769 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5770 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5771 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5772 // MSA control register names
5773 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5774 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005775 };
5776 Names = GCCRegNames;
5777 NumNames = llvm::array_lengthof(GCCRegNames);
5778 }
Craig Topper3164f332014-03-11 03:39:26 +00005779 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5780 unsigned &NumAliases) const override = 0;
5781 bool validateAsmConstraint(const char *&Name,
5782 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005783 switch (*Name) {
5784 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005785 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005786 case 'r': // CPU registers.
5787 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005788 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005789 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005790 case 'c': // $25 for indirect jumps
5791 case 'l': // lo register
5792 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005793 Info.setAllowsRegister();
5794 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005795 case 'I': // Signed 16-bit constant
5796 case 'J': // Integer 0
5797 case 'K': // Unsigned 16-bit constant
5798 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5799 case 'M': // Constants not loadable via lui, addiu, or ori
5800 case 'N': // Constant -1 to -65535
5801 case 'O': // A signed 15-bit constant
5802 case 'P': // A constant between 1 go 65535
5803 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005804 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005805 Info.setAllowsMemory();
5806 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005807 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005808 }
5809
Craig Topper3164f332014-03-11 03:39:26 +00005810 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005811 // In GCC, $1 is not widely used in generated code (it's used only in a few
5812 // specific situations), so there is no real need for users to add it to
5813 // the clobbers list if they want to use it in their inline assembly code.
5814 //
5815 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5816 // code generation, so using it in inline assembly without adding it to the
5817 // clobbers list can cause conflicts between the inline assembly code and
5818 // the surrounding generated code.
5819 //
5820 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5821 // operands, which will conflict with the ".set at" assembler option (which
5822 // we use only for inline assembly, in order to maintain compatibility with
5823 // GCC) and will also conflict with the user's usage of $1.
5824 //
5825 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5826 // register for generated code is to automatically clobber $1 for all inline
5827 // assembly code.
5828 //
5829 // FIXME: We should automatically clobber $1 only for inline assembly code
5830 // which actually uses it. This would allow LLVM to use $1 for inline
5831 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005832 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005833 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005834
Craig Topper3164f332014-03-11 03:39:26 +00005835 bool handleTargetFeatures(std::vector<std::string> &Features,
5836 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005837 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005838 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005839 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005840 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005841 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005842 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005843 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005844
5845 for (std::vector<std::string>::iterator it = Features.begin(),
5846 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005847 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005848 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005849 else if (*it == "+soft-float")
5850 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005851 else if (*it == "+mips16")
5852 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005853 else if (*it == "+micromips")
5854 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005855 else if (*it == "+dsp")
5856 DspRev = std::max(DspRev, DSP1);
5857 else if (*it == "+dspr2")
5858 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005859 else if (*it == "+msa")
5860 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005861 else if (*it == "+fp64")
5862 HasFP64 = true;
5863 else if (*it == "-fp64")
5864 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005865 else if (*it == "+nan2008")
5866 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005867 else if (*it == "-nan2008")
5868 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005869 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005870
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005871 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005872 std::vector<std::string>::iterator it =
5873 std::find(Features.begin(), Features.end(), "+soft-float");
5874 if (it != Features.end())
5875 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005876
Akira Hatanaka9064e362013-10-29 18:30:33 +00005877 setDescriptionString();
5878
Rafael Espindolaeb265472013-08-21 21:59:03 +00005879 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005880 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005881
Craig Topper3164f332014-03-11 03:39:26 +00005882 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005883 if (RegNo == 0) return 4;
5884 if (RegNo == 1) return 5;
5885 return -1;
5886 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005887
5888 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005889};
5890
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005891const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5892#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5893#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5894 ALL_LANGUAGES },
5895#include "clang/Basic/BuiltinsMips.def"
5896};
5897
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005898class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005899public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005900 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005901 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005902 SizeType = UnsignedInt;
5903 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005904 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005905 }
Craig Topper3164f332014-03-11 03:39:26 +00005906 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005907 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005908 ABI = Name;
5909 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005910 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005911 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005912 }
Craig Topper3164f332014-03-11 03:39:26 +00005913 void getTargetDefines(const LangOptions &Opts,
5914 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005915 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005916
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005917 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005918 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5919
5920 const std::string& CPUStr = getCPU();
5921 if (CPUStr == "mips32")
5922 Builder.defineMacro("__mips_isa_rev", "1");
5923 else if (CPUStr == "mips32r2")
5924 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00005925 else if (CPUStr == "mips32r6")
5926 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005927
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005928 if (ABI == "o32") {
5929 Builder.defineMacro("__mips_o32");
5930 Builder.defineMacro("_ABIO32", "1");
5931 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5932 }
5933 else if (ABI == "eabi")
5934 Builder.defineMacro("__mips_eabi");
5935 else
David Blaikie83d382b2011-09-23 05:06:16 +00005936 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005937 }
Craig Topper3164f332014-03-11 03:39:26 +00005938 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5939 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005940 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5941 { { "at" }, "$1" },
5942 { { "v0" }, "$2" },
5943 { { "v1" }, "$3" },
5944 { { "a0" }, "$4" },
5945 { { "a1" }, "$5" },
5946 { { "a2" }, "$6" },
5947 { { "a3" }, "$7" },
5948 { { "t0" }, "$8" },
5949 { { "t1" }, "$9" },
5950 { { "t2" }, "$10" },
5951 { { "t3" }, "$11" },
5952 { { "t4" }, "$12" },
5953 { { "t5" }, "$13" },
5954 { { "t6" }, "$14" },
5955 { { "t7" }, "$15" },
5956 { { "s0" }, "$16" },
5957 { { "s1" }, "$17" },
5958 { { "s2" }, "$18" },
5959 { { "s3" }, "$19" },
5960 { { "s4" }, "$20" },
5961 { { "s5" }, "$21" },
5962 { { "s6" }, "$22" },
5963 { { "s7" }, "$23" },
5964 { { "t8" }, "$24" },
5965 { { "t9" }, "$25" },
5966 { { "k0" }, "$26" },
5967 { { "k1" }, "$27" },
5968 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005969 { { "sp","$sp" }, "$29" },
5970 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005971 { { "ra" }, "$31" }
5972 };
5973 Aliases = GCCRegAliases;
5974 NumAliases = llvm::array_lengthof(GCCRegAliases);
5975 }
5976};
5977
5978class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005979 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005980 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005981 }
5982
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005983public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005984 Mips32EBTargetInfo(const llvm::Triple &Triple)
5985 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005986 }
Craig Topper3164f332014-03-11 03:39:26 +00005987 void getTargetDefines(const LangOptions &Opts,
5988 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005989 DefineStd(Builder, "MIPSEB", Opts);
5990 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005991 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005992 }
5993};
5994
5995class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005996 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005997 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005998 }
5999
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006000public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006001 Mips32ELTargetInfo(const llvm::Triple &Triple)
6002 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006003 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006004 }
Craig Topper3164f332014-03-11 03:39:26 +00006005 void getTargetDefines(const LangOptions &Opts,
6006 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006007 DefineStd(Builder, "MIPSEL", Opts);
6008 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006009 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006010 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006011};
Akira Hatanakabef17452011-09-20 19:21:49 +00006012
6013class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006014public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006015 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006016 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006017 LongDoubleWidth = LongDoubleAlign = 128;
6018 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006019 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6020 LongDoubleWidth = LongDoubleAlign = 64;
6021 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6022 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006023 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006024 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006025 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006026 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006027
6028 void setN64ABITypes() {
6029 LongWidth = LongAlign = 64;
6030 PointerWidth = PointerAlign = 64;
6031 SizeType = UnsignedLong;
6032 PtrDiffType = SignedLong;
6033 }
6034
6035 void setN32ABITypes() {
6036 LongWidth = LongAlign = 32;
6037 PointerWidth = PointerAlign = 32;
6038 SizeType = UnsignedInt;
6039 PtrDiffType = SignedInt;
6040 }
6041
Craig Topper3164f332014-03-11 03:39:26 +00006042 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006043 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006044 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006045 ABI = Name;
6046 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006047 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006048 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006049 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006050 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006051 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006052 }
6053 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006054 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006055
Craig Topper3164f332014-03-11 03:39:26 +00006056 void getTargetDefines(const LangOptions &Opts,
6057 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006058 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006059
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006060 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006061 Builder.defineMacro("__mips64");
6062 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006063 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6064
6065 const std::string& CPUStr = getCPU();
6066 if (CPUStr == "mips64")
6067 Builder.defineMacro("__mips_isa_rev", "1");
6068 else if (CPUStr == "mips64r2")
6069 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006070 else if (CPUStr == "mips64r6")
6071 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006072
Akira Hatanakabef17452011-09-20 19:21:49 +00006073 if (ABI == "n32") {
6074 Builder.defineMacro("__mips_n32");
6075 Builder.defineMacro("_ABIN32", "2");
6076 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6077 }
6078 else if (ABI == "n64") {
6079 Builder.defineMacro("__mips_n64");
6080 Builder.defineMacro("_ABI64", "3");
6081 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6082 }
6083 else
David Blaikie83d382b2011-09-23 05:06:16 +00006084 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006085 }
Craig Topper3164f332014-03-11 03:39:26 +00006086 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6087 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006088 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6089 { { "at" }, "$1" },
6090 { { "v0" }, "$2" },
6091 { { "v1" }, "$3" },
6092 { { "a0" }, "$4" },
6093 { { "a1" }, "$5" },
6094 { { "a2" }, "$6" },
6095 { { "a3" }, "$7" },
6096 { { "a4" }, "$8" },
6097 { { "a5" }, "$9" },
6098 { { "a6" }, "$10" },
6099 { { "a7" }, "$11" },
6100 { { "t0" }, "$12" },
6101 { { "t1" }, "$13" },
6102 { { "t2" }, "$14" },
6103 { { "t3" }, "$15" },
6104 { { "s0" }, "$16" },
6105 { { "s1" }, "$17" },
6106 { { "s2" }, "$18" },
6107 { { "s3" }, "$19" },
6108 { { "s4" }, "$20" },
6109 { { "s5" }, "$21" },
6110 { { "s6" }, "$22" },
6111 { { "s7" }, "$23" },
6112 { { "t8" }, "$24" },
6113 { { "t9" }, "$25" },
6114 { { "k0" }, "$26" },
6115 { { "k1" }, "$27" },
6116 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006117 { { "sp","$sp" }, "$29" },
6118 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006119 { { "ra" }, "$31" }
6120 };
6121 Aliases = GCCRegAliases;
6122 NumAliases = llvm::array_lengthof(GCCRegAliases);
6123 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006124
6125 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006126};
6127
6128class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006129 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006130 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006131 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 +00006132 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006133 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006134
Akira Hatanakabef17452011-09-20 19:21:49 +00006135 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006136
Akira Hatanakabef17452011-09-20 19:21:49 +00006137public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006138 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006139 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006140 void getTargetDefines(const LangOptions &Opts,
6141 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006142 DefineStd(Builder, "MIPSEB", Opts);
6143 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006144 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006145 }
6146};
6147
6148class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006149 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006150 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006151 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 +00006152 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006153 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006154 }
6155public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006156 Mips64ELTargetInfo(const llvm::Triple &Triple)
6157 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006158 // Default ABI is n64.
6159 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006160 }
Craig Topper3164f332014-03-11 03:39:26 +00006161 void getTargetDefines(const LangOptions &Opts,
6162 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006163 DefineStd(Builder, "MIPSEL", Opts);
6164 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006165 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006166 }
6167};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006168} // end anonymous namespace.
6169
Ivan Krasindd7403e2011-08-24 20:22:22 +00006170namespace {
6171class PNaClTargetInfo : public TargetInfo {
6172public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006173 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006174 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006175 this->UserLabelPrefix = "";
6176 this->LongAlign = 32;
6177 this->LongWidth = 32;
6178 this->PointerAlign = 32;
6179 this->PointerWidth = 32;
6180 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006181 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006182 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006183 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006184 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006185 this->SizeType = TargetInfo::UnsignedInt;
6186 this->PtrDiffType = TargetInfo::SignedInt;
6187 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006188 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006189 }
6190
Craig Topper3164f332014-03-11 03:39:26 +00006191 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006192 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006193 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006194 Builder.defineMacro("__le32__");
6195 Builder.defineMacro("__pnacl__");
6196 }
Craig Topper3164f332014-03-11 03:39:26 +00006197 void getTargetDefines(const LangOptions &Opts,
6198 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006199 getArchDefines(Opts, Builder);
6200 }
Craig Topper3164f332014-03-11 03:39:26 +00006201 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006202 return Feature == "pnacl";
6203 }
Craig Topper3164f332014-03-11 03:39:26 +00006204 void getTargetBuiltins(const Builtin::Info *&Records,
6205 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006206 }
Craig Topper3164f332014-03-11 03:39:26 +00006207 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006208 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006209 }
Craig Topper3164f332014-03-11 03:39:26 +00006210 void getGCCRegNames(const char * const *&Names,
6211 unsigned &NumNames) const override;
6212 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6213 unsigned &NumAliases) const override;
6214 bool validateAsmConstraint(const char *&Name,
6215 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006216 return false;
6217 }
6218
Craig Topper3164f332014-03-11 03:39:26 +00006219 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006220 return "";
6221 }
6222};
6223
6224void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6225 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006226 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006227 NumNames = 0;
6228}
6229
6230void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6231 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006232 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006233 NumAliases = 0;
6234}
6235} // end anonymous namespace.
6236
Guy Benyeib798fc92012-12-11 21:38:14 +00006237namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006238class Le64TargetInfo : public TargetInfo {
6239 static const Builtin::Info BuiltinInfo[];
6240
6241public:
6242 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6243 BigEndian = false;
6244 NoAsmVariants = true;
6245 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6246 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6247 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006248 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006249 }
6250
6251 void getTargetDefines(const LangOptions &Opts,
6252 MacroBuilder &Builder) const override {
6253 DefineStd(Builder, "unix", Opts);
6254 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6255 Builder.defineMacro("__ELF__");
6256 }
6257 void getTargetBuiltins(const Builtin::Info *&Records,
6258 unsigned &NumRecords) const override {
6259 Records = BuiltinInfo;
6260 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6261 }
6262 BuiltinVaListKind getBuiltinVaListKind() const override {
6263 return TargetInfo::PNaClABIBuiltinVaList;
6264 }
6265 const char *getClobbers() const override { return ""; }
6266 void getGCCRegNames(const char *const *&Names,
6267 unsigned &NumNames) const override {
6268 Names = nullptr;
6269 NumNames = 0;
6270 }
6271 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6272 unsigned &NumAliases) const override {
6273 Aliases = nullptr;
6274 NumAliases = 0;
6275 }
6276 bool validateAsmConstraint(const char *&Name,
6277 TargetInfo::ConstraintInfo &Info) const override {
6278 return false;
6279 }
6280
6281 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006282};
6283} // end anonymous namespace.
6284
6285const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6286#define BUILTIN(ID, TYPE, ATTRS) \
6287 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6288#include "clang/Basic/BuiltinsLe64.def"
6289};
6290
6291namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006292 static const unsigned SPIRAddrSpaceMap[] = {
6293 1, // opencl_global
6294 3, // opencl_local
6295 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006296 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006297 0, // cuda_device
6298 0, // cuda_constant
6299 0 // cuda_shared
6300 };
6301 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006302 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006303 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006304 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6305 "SPIR target must use unknown OS");
6306 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6307 "SPIR target must use unknown environment type");
6308 BigEndian = false;
6309 TLSSupported = false;
6310 LongWidth = LongAlign = 64;
6311 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006312 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006313 // Define available target features
6314 // These must be defined in sorted order!
6315 NoAsmVariants = true;
6316 }
Craig Topper3164f332014-03-11 03:39:26 +00006317 void getTargetDefines(const LangOptions &Opts,
6318 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006319 DefineStd(Builder, "SPIR", Opts);
6320 }
Craig Topper3164f332014-03-11 03:39:26 +00006321 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006322 return Feature == "spir";
6323 }
Craig Topper3164f332014-03-11 03:39:26 +00006324
6325 void getTargetBuiltins(const Builtin::Info *&Records,
6326 unsigned &NumRecords) const override {}
6327 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006328 return "";
6329 }
Craig Topper3164f332014-03-11 03:39:26 +00006330 void getGCCRegNames(const char * const *&Names,
6331 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006332 bool
6333 validateAsmConstraint(const char *&Name,
6334 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006335 return true;
6336 }
Craig Topper3164f332014-03-11 03:39:26 +00006337 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6338 unsigned &NumAliases) const override {}
6339 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006340 return TargetInfo::VoidPtrBuiltinVaList;
6341 }
6342 };
6343
6344
6345 class SPIR32TargetInfo : public SPIRTargetInfo {
6346 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006347 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006348 PointerWidth = PointerAlign = 32;
6349 SizeType = TargetInfo::UnsignedInt;
6350 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6351 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006352 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6353 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006354 }
Craig Topper3164f332014-03-11 03:39:26 +00006355 void getTargetDefines(const LangOptions &Opts,
6356 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006357 DefineStd(Builder, "SPIR32", Opts);
6358 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006359 };
6360
6361 class SPIR64TargetInfo : public SPIRTargetInfo {
6362 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006363 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006364 PointerWidth = PointerAlign = 64;
6365 SizeType = TargetInfo::UnsignedLong;
6366 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006367 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6368 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006369 }
Craig Topper3164f332014-03-11 03:39:26 +00006370 void getTargetDefines(const LangOptions &Opts,
6371 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006372 DefineStd(Builder, "SPIR64", Opts);
6373 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006374 };
6375}
6376
Robert Lytton0e076492013-08-13 09:43:10 +00006377namespace {
6378class XCoreTargetInfo : public TargetInfo {
6379 static const Builtin::Info BuiltinInfo[];
6380public:
6381 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6382 BigEndian = false;
6383 NoAsmVariants = true;
6384 LongLongAlign = 32;
6385 SuitableAlign = 32;
6386 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006387 SizeType = UnsignedInt;
6388 PtrDiffType = SignedInt;
6389 IntPtrType = SignedInt;
6390 WCharType = UnsignedChar;
6391 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006392 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006393 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 +00006394 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006395 }
Craig Topper3164f332014-03-11 03:39:26 +00006396 void getTargetDefines(const LangOptions &Opts,
6397 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006398 Builder.defineMacro("__XS1B__");
6399 }
Craig Topper3164f332014-03-11 03:39:26 +00006400 void getTargetBuiltins(const Builtin::Info *&Records,
6401 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006402 Records = BuiltinInfo;
6403 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6404 }
Craig Topper3164f332014-03-11 03:39:26 +00006405 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006406 return TargetInfo::VoidPtrBuiltinVaList;
6407 }
Craig Topper3164f332014-03-11 03:39:26 +00006408 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006409 return "";
6410 }
Craig Topper3164f332014-03-11 03:39:26 +00006411 void getGCCRegNames(const char * const *&Names,
6412 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006413 static const char * const GCCRegNames[] = {
6414 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6415 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6416 };
6417 Names = GCCRegNames;
6418 NumNames = llvm::array_lengthof(GCCRegNames);
6419 }
Craig Topper3164f332014-03-11 03:39:26 +00006420 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6421 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006422 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006423 NumAliases = 0;
6424 }
Craig Topper3164f332014-03-11 03:39:26 +00006425 bool validateAsmConstraint(const char *&Name,
6426 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006427 return false;
6428 }
Craig Topper3164f332014-03-11 03:39:26 +00006429 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006430 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6431 return (RegNo < 2)? RegNo : -1;
6432 }
Robert Lytton0e076492013-08-13 09:43:10 +00006433};
6434
6435const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6436#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6437#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6438 ALL_LANGUAGES },
6439#include "clang/Basic/BuiltinsXCore.def"
6440};
6441} // end anonymous namespace.
6442
Ivan Krasindd7403e2011-08-24 20:22:22 +00006443
Chris Lattner5ba61f02006-10-14 07:39:34 +00006444//===----------------------------------------------------------------------===//
6445// Driver code
6446//===----------------------------------------------------------------------===//
6447
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006448static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006449 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006450
Daniel Dunbar52322032009-08-18 05:47:58 +00006451 switch (Triple.getArch()) {
6452 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006453 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006454
Tim Northover2a0783d2014-05-30 14:14:07 +00006455 case llvm::Triple::xcore:
6456 return new XCoreTargetInfo(Triple);
6457
6458 case llvm::Triple::hexagon:
6459 return new HexagonTargetInfo(Triple);
6460
6461 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006462 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006463 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006464
6465 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006466 case llvm::Triple::FreeBSD:
6467 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006468 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006469 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006470 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006471 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006472 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006473 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006474 }
6475
Christian Pirker9b019ae2014-02-25 13:51:00 +00006476 case llvm::Triple::aarch64_be:
6477 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006478 case llvm::Triple::FreeBSD:
6479 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006480 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006481 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006482 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006483 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006484 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006485 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006486 }
6487
Daniel Dunbar52322032009-08-18 05:47:58 +00006488 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006489 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006490 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006491 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006492
Daniel Dunbar52322032009-08-18 05:47:58 +00006493 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006494 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006495 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006496 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006497 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006498 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006499 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006500 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006501 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006502 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006503 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006504 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006505 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006506 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006507 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006508 case llvm::Triple::Win32:
6509 switch (Triple.getEnvironment()) {
6510 default:
6511 return new ARMleTargetInfo(Triple);
6512 case llvm::Triple::Itanium:
6513 return new ItaniumWindowsARMleTargetInfo(Triple);
6514 case llvm::Triple::MSVC:
6515 return new MicrosoftARMleTargetInfo(Triple);
6516 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006517 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006518 return new ARMleTargetInfo(Triple);
6519 }
6520
6521 case llvm::Triple::armeb:
6522 case llvm::Triple::thumbeb:
6523 if (Triple.isOSDarwin())
6524 return new DarwinARMTargetInfo(Triple);
6525
6526 switch (os) {
6527 case llvm::Triple::Linux:
6528 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6529 case llvm::Triple::FreeBSD:
6530 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6531 case llvm::Triple::NetBSD:
6532 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6533 case llvm::Triple::OpenBSD:
6534 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6535 case llvm::Triple::Bitrig:
6536 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6537 case llvm::Triple::RTEMS:
6538 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6539 case llvm::Triple::NaCl:
6540 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6541 default:
6542 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006543 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006544
Daniel Dunbar52322032009-08-18 05:47:58 +00006545 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006546 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006547
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006548 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006549 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006550 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006551 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006552 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006553 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006554 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006555 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006556 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006557 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006558 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006559 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006560 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006561
6562 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006563 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006564 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006565 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006566 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006567 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006568 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006569 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006570 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006571 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006572 case llvm::Triple::NaCl:
6573 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006574 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006575 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006576 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006577
Akira Hatanakabef17452011-09-20 19:21:49 +00006578 case llvm::Triple::mips64:
6579 switch (os) {
6580 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006581 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006582 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006583 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006584 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006585 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006586 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006587 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006588 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006589 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006590 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006591 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006592 }
6593
6594 case llvm::Triple::mips64el:
6595 switch (os) {
6596 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006597 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006598 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006599 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006600 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006601 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006602 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006603 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006604 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006605 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006606 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006607 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006608 }
6609
Ivan Krasindd7403e2011-08-24 20:22:22 +00006610 case llvm::Triple::le32:
6611 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006612 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006613 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006614 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006615 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006616 }
6617
JF Bastien643817d2014-09-12 17:52:47 +00006618 case llvm::Triple::le64:
6619 return new Le64TargetInfo(Triple);
6620
Daniel Dunbar52322032009-08-18 05:47:58 +00006621 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006622 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006623 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006624 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006625 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006626 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006627 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006628 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006629 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006630 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006631 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006632 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006633 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006634 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006635 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006636 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006637 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006638
6639 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006640 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006641 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006642 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006643 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006644 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006645 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006646 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006647 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006648 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006649 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006650 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006651 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006652 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006653 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006654
Bill Schmidt778d3872013-07-26 01:36:11 +00006655 case llvm::Triple::ppc64le:
6656 switch (os) {
6657 case llvm::Triple::Linux:
6658 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6659 default:
6660 return new PPC64TargetInfo(Triple);
6661 }
6662
Peter Collingbournec947aae2012-05-20 23:28:41 +00006663 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006664 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006665 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006666 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006667
Tom Stellardd8e38a32015-01-06 20:34:47 +00006668 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006669 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006670 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006671
Daniel Dunbar52322032009-08-18 05:47:58 +00006672 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006673 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006674 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006675 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006676 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006677 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006678 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006679 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006680 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006681 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006682 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006683 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006684 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006685 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006686 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006687
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006688 case llvm::Triple::sparcv9:
6689 switch (os) {
6690 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006691 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006692 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006693 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006694 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006695 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006696 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006697 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006698 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006699 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006700 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006701 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006702 }
6703
Ulrich Weigand47445072013-05-06 16:26:41 +00006704 case llvm::Triple::systemz:
6705 switch (os) {
6706 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006707 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006708 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006709 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006710 }
6711
Eli Friedmana9c3d712009-08-19 20:47:07 +00006712 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006713 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006714
Daniel Dunbar52322032009-08-18 05:47:58 +00006715 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006716 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006717 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006718
Daniel Dunbar52322032009-08-18 05:47:58 +00006719 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006720 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006721 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006722 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006723 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006724 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006725 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006726 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006727 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006728 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006729 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006730 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006731 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006732 case llvm::Triple::KFreeBSD:
6733 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006734 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006735 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006736 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006737 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006738 case llvm::Triple::Win32: {
6739 switch (Triple.getEnvironment()) {
6740 default:
6741 return new X86_32TargetInfo(Triple);
6742 case llvm::Triple::Cygnus:
6743 return new CygwinX86_32TargetInfo(Triple);
6744 case llvm::Triple::GNU:
6745 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006746 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006747 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006748 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006749 }
6750 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006751 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006752 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006753 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006754 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006755 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006756 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006757 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006758 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006759 }
6760
6761 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006762 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006763 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006764
Daniel Dunbar52322032009-08-18 05:47:58 +00006765 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006766 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006767 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006768 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006769 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006770 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006771 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006772 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006773 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006774 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006775 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006776 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006777 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006778 case llvm::Triple::KFreeBSD:
6779 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006780 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006781 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006782 case llvm::Triple::Win32: {
6783 switch (Triple.getEnvironment()) {
6784 default:
6785 return new X86_64TargetInfo(Triple);
6786 case llvm::Triple::GNU:
6787 return new MinGWX86_64TargetInfo(Triple);
6788 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006789 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006790 }
6791 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006792 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006793 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006794 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006795 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006796 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006797
6798 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006799 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006800 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006801 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006802 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006803 }
6804 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006805 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006806 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006807 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006808 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006809 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006810 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006811}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006812
6813/// CreateTargetInfo - Return the target info object for the specified target
6814/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006815TargetInfo *
6816TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6817 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006818 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006819
6820 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006821 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006822 if (!Target) {
6823 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006824 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006825 }
Alp Toker80758082014-07-06 05:26:44 +00006826 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006827
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006828 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006829 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6830 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006831 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006832 }
6833
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006834 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006835 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6836 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006837 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006838 }
6839
Rafael Espindolaeb265472013-08-21 21:59:03 +00006840 // Set the fp math unit.
6841 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6842 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006843 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006844 }
6845
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006846 // Compute the default target features, we need the target to handle this
6847 // because features may have dependencies on one another.
6848 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006849 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006850
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006851 // Apply the user specified deltas.
6852 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6853 I < N; ++I) {
6854 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006855 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006856 bool Enabled = Name[0] == '+';
6857 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006858 }
6859
6860 // Add the features to the compile options.
6861 //
6862 // FIXME: If we are completely confident that we have the right set, we only
6863 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006864 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006865 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6866 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006867 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006868 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006869 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006870
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006871 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006872}