blob: 3443ec944ad9b48b6794188866b8c0c2ef3d0dee [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
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000528template <typename Target>
529class PS4OSTargetInfo : public OSTargetInfo<Target> {
530protected:
531 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
532 MacroBuilder &Builder) const override {
533 Builder.defineMacro("__FreeBSD__", "9");
534 Builder.defineMacro("__FreeBSD_cc_version", "900001");
535 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
536 DefineStd(Builder, "unix", Opts);
537 Builder.defineMacro("__ELF__");
538 Builder.defineMacro("__PS4__");
539 }
540public:
541 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
542 this->WCharType = this->UnsignedShort;
543
544 this->UserLabelPrefix = "";
545
546 switch (Triple.getArch()) {
547 default:
548 case llvm::Triple::x86_64:
549 this->MCountName = ".mcount";
550 break;
551 }
552 }
553};
554
Torok Edwinb2b37c62009-06-30 17:10:35 +0000555// Solaris target
556template<typename Target>
557class SolarisTargetInfo : public OSTargetInfo<Target> {
558protected:
Craig Topper3164f332014-03-11 03:39:26 +0000559 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
560 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000561 DefineStd(Builder, "sun", Opts);
562 DefineStd(Builder, "unix", Opts);
563 Builder.defineMacro("__ELF__");
564 Builder.defineMacro("__svr4__");
565 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000566 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
567 // newer, but to 500 for everything else. feature_test.h has a check to
568 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000569 // with a new version.
570 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000571 Builder.defineMacro("_XOPEN_SOURCE", "600");
572 else
573 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000574 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000575 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000576 Builder.defineMacro("_LARGEFILE_SOURCE");
577 Builder.defineMacro("_LARGEFILE64_SOURCE");
578 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000579 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000580 }
581public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000582 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000583 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000584 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000585 // FIXME: WIntType should be SignedLong
586 }
587};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000588
589// Windows target
590template<typename Target>
591class WindowsTargetInfo : public OSTargetInfo<Target> {
592protected:
Craig Topper3164f332014-03-11 03:39:26 +0000593 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
594 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000595 Builder.defineMacro("_WIN32");
596 }
597 void getVisualStudioDefines(const LangOptions &Opts,
598 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000599 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000600 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000601 Builder.defineMacro("_CPPRTTI");
602
603 if (Opts.Exceptions)
604 Builder.defineMacro("_CPPUNWIND");
605 }
606
607 if (!Opts.CharIsSigned)
608 Builder.defineMacro("_CHAR_UNSIGNED");
609
610 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
611 // but it works for now.
612 if (Opts.POSIXThreads)
613 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000614
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000615 if (Opts.MSCompatibilityVersion) {
616 Builder.defineMacro("_MSC_VER",
617 Twine(Opts.MSCompatibilityVersion / 100000));
618 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000619 // FIXME We cannot encode the revision information into 32-bits
620 Builder.defineMacro("_MSC_BUILD", Twine(1));
621 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000622
623 if (Opts.MicrosoftExt) {
624 Builder.defineMacro("_MSC_EXTENSIONS");
625
626 if (Opts.CPlusPlus11) {
627 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
628 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
629 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
630 }
631 }
632
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000633 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000634 }
635
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000636public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000637 WindowsTargetInfo(const llvm::Triple &Triple)
638 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639};
640
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000641template <typename Target>
642class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000643protected:
Craig Topper3164f332014-03-11 03:39:26 +0000644 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
645 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000646 if (Opts.POSIXThreads)
647 Builder.defineMacro("_REENTRANT");
648 if (Opts.CPlusPlus)
649 Builder.defineMacro("_GNU_SOURCE");
650
651 DefineStd(Builder, "unix", Opts);
652 Builder.defineMacro("__ELF__");
653 Builder.defineMacro("__native_client__");
654 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000655
656public:
657 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000658 this->UserLabelPrefix = "";
659 this->LongAlign = 32;
660 this->LongWidth = 32;
661 this->PointerAlign = 32;
662 this->PointerWidth = 32;
663 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000664 this->Int64Type = TargetInfo::SignedLongLong;
665 this->DoubleAlign = 64;
666 this->LongDoubleWidth = 64;
667 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000668 this->LongLongWidth = 64;
669 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000670 this->SizeType = TargetInfo::UnsignedInt;
671 this->PtrDiffType = TargetInfo::SignedInt;
672 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000673 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000674 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000675 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000676 this->DescriptionString =
677 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000678 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000679 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000680 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000681 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000682 } else if (Triple.getArch() == llvm::Triple::mipsel) {
683 // Handled on mips' setDescriptionString.
684 } else {
685 assert(Triple.getArch() == llvm::Triple::le32);
686 this->DescriptionString = "e-p:32:32-i64:64";
687 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000688 }
Craig Topper3164f332014-03-11 03:39:26 +0000689 typename Target::CallingConvCheckResult checkCallingConvention(
690 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000691 return CC == CC_PnaclCall ? Target::CCCR_OK :
692 Target::checkCallingConvention(CC);
693 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000694};
Mike Stump11289f42009-09-09 15:08:12 +0000695} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000696
Chris Lattner09d98f52008-10-05 21:50:58 +0000697//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000698// Specific target implementations.
699//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000700
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000701namespace {
702// PPC abstract base class
703class PPCTargetInfo : public TargetInfo {
704 static const Builtin::Info BuiltinInfo[];
705 static const char * const GCCRegNames[];
706 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000707 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000708
709 // Target cpu features.
710 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000711 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000712
Ulrich Weigand8afad612014-07-28 13:17:52 +0000713protected:
714 std::string ABI;
715
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000716public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000717 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000718 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000719 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000720 LongDoubleWidth = LongDoubleAlign = 128;
721 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
722 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000723
Hal Finkel6b984f02012-07-03 16:51:04 +0000724 /// \brief Flags for architecture specific defines.
725 typedef enum {
726 ArchDefineNone = 0,
727 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
728 ArchDefinePpcgr = 1 << 1,
729 ArchDefinePpcsq = 1 << 2,
730 ArchDefine440 = 1 << 3,
731 ArchDefine603 = 1 << 4,
732 ArchDefine604 = 1 << 5,
733 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000734 ArchDefinePwr5 = 1 << 7,
735 ArchDefinePwr5x = 1 << 8,
736 ArchDefinePwr6 = 1 << 9,
737 ArchDefinePwr6x = 1 << 10,
738 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000739 ArchDefinePwr8 = 1 << 12,
740 ArchDefineA2 = 1 << 13,
741 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000742 } ArchDefineTypes;
743
Bill Schmidt38378a02013-02-01 20:23:10 +0000744 // Note: GCC recognizes the following additional cpus:
745 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
746 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
747 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000748 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000749 bool CPUKnown = llvm::StringSwitch<bool>(Name)
750 .Case("generic", true)
751 .Case("440", true)
752 .Case("450", true)
753 .Case("601", true)
754 .Case("602", true)
755 .Case("603", true)
756 .Case("603e", true)
757 .Case("603ev", true)
758 .Case("604", true)
759 .Case("604e", true)
760 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000761 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000762 .Case("g3", true)
763 .Case("7400", true)
764 .Case("g4", true)
765 .Case("7450", true)
766 .Case("g4+", true)
767 .Case("750", true)
768 .Case("970", true)
769 .Case("g5", true)
770 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000771 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000772 .Case("e500mc", true)
773 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000774 .Case("power3", true)
775 .Case("pwr3", true)
776 .Case("power4", true)
777 .Case("pwr4", true)
778 .Case("power5", true)
779 .Case("pwr5", true)
780 .Case("power5x", true)
781 .Case("pwr5x", true)
782 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000783 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000784 .Case("power6x", true)
785 .Case("pwr6x", true)
786 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000787 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000788 .Case("power8", true)
789 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000790 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000791 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000792 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000793 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000794 .Case("powerpc64le", true)
795 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000796 .Default(false);
797
798 if (CPUKnown)
799 CPU = Name;
800
801 return CPUKnown;
802 }
803
Ulrich Weigand8afad612014-07-28 13:17:52 +0000804
805 StringRef getABI() const override { return ABI; }
806
Craig Topper3164f332014-03-11 03:39:26 +0000807 void getTargetBuiltins(const Builtin::Info *&Records,
808 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000809 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000810 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000811 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000812
Craig Topper3164f332014-03-11 03:39:26 +0000813 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000814
Craig Topper3164f332014-03-11 03:39:26 +0000815 void getTargetDefines(const LangOptions &Opts,
816 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000817
Craig Topper3164f332014-03-11 03:39:26 +0000818 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000819
Craig Topper3164f332014-03-11 03:39:26 +0000820 bool handleTargetFeatures(std::vector<std::string> &Features,
821 DiagnosticsEngine &Diags) override;
822 bool hasFeature(StringRef Feature) const override;
823
824 void getGCCRegNames(const char * const *&Names,
825 unsigned &NumNames) const override;
826 void getGCCRegAliases(const GCCRegAlias *&Aliases,
827 unsigned &NumAliases) const override;
828 bool validateAsmConstraint(const char *&Name,
829 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000830 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000831 default: return false;
832 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000833 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000834 case 'b': // Base register
835 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000836 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000837 break;
838 // FIXME: The following are added to allow parsing.
839 // I just took a guess at what the actions should be.
840 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000841 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000842 case 'v': // Altivec vector register
843 Info.setAllowsRegister();
844 break;
845 case 'w':
846 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000847 case 'd':// VSX vector register to hold vector double data
848 case 'f':// VSX vector register to hold vector float data
849 case 's':// VSX vector register to hold scalar float data
850 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000851 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000852 break;
853 default:
854 return false;
855 }
856 Info.setAllowsRegister();
857 Name++; // Skip over 'w'.
858 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 case 'h': // `MQ', `CTR', or `LINK' register
860 case 'q': // `MQ' register
861 case 'c': // `CTR' register
862 case 'l': // `LINK' register
863 case 'x': // `CR' register (condition register) number 0
864 case 'y': // `CR' register (condition register)
865 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000866 Info.setAllowsRegister();
867 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000868 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000869 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000870 // (use `L' instead for SImode constants)
871 case 'K': // Unsigned 16-bit constant
872 case 'L': // Signed 16-bit constant shifted left 16 bits
873 case 'M': // Constant larger than 31
874 case 'N': // Exact power of 2
875 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000876 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000877 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000878 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000879 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000880 break;
881 case 'm': // Memory operand. Note that on PowerPC targets, m can
882 // include addresses that update the base register. It
883 // is therefore only safe to use `m' in an asm statement
884 // if that asm statement accesses the operand exactly once.
885 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000886 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000887 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000888 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000889 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000890 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
891 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000892 // register to be updated.
893 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000894 if (Name[1] != 's')
895 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000896 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000897 // include any automodification of the base register. Unlike
898 // `m', this constraint can be used in asm statements that
899 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000900 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000901 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000902 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000903 break;
904 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000905 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000906 case 'Z': // Memory operand that is an indexed or indirect from a
907 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000908 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000909 Info.setAllowsMemory();
910 Info.setAllowsRegister();
911 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000912 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000913 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000914 // register (`p' is preferable for asm statements)
915 case 'S': // Constant suitable as a 64-bit mask operand
916 case 'T': // Constant suitable as a 32-bit mask operand
917 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000918 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000919 // instructions
920 case 'W': // Vector constant that does not require memory
921 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000922 break;
923 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000924 }
John Thompson07a61a42010-06-24 22:44:13 +0000925 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000926 }
Craig Topper3164f332014-03-11 03:39:26 +0000927 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000928 std::string R;
929 switch (*Constraint) {
930 case 'e':
931 case 'w':
932 // Two-character constraint; add "^" hint for later parsing.
933 R = std::string("^") + std::string(Constraint, 2);
934 Constraint++;
935 break;
936 default:
937 return TargetInfo::convertConstraint(Constraint);
938 }
939 return R;
940 }
Craig Topper3164f332014-03-11 03:39:26 +0000941 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000942 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000943 }
Craig Topper3164f332014-03-11 03:39:26 +0000944 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000945 if (RegNo == 0) return 3;
946 if (RegNo == 1) return 4;
947 return -1;
948 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000949};
Anders Carlssonf511f642007-11-27 04:11:28 +0000950
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000951const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000952#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000953#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000954 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000955#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000956};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000957
Eric Christopher917e9522014-11-18 22:36:15 +0000958/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000959/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000960bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000961 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000962 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
963 // Ignore disabled features.
964 if (Features[i][0] == '-')
965 continue;
966
967 StringRef Feature = StringRef(Features[i]).substr(1);
968
969 if (Feature == "vsx") {
970 HasVSX = true;
971 continue;
972 }
973
Bill Schmidt59eb7672014-10-10 15:09:43 +0000974 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000975 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000976 continue;
977 }
978
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000979 // TODO: Finish this list and add an assert that we've handled them
980 // all.
981 }
982
983 return true;
984}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000985
Chris Lattnerecd49032009-03-02 22:27:17 +0000986/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
987/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000988void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000989 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000990 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000991 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000992 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000993 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000994 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000995 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000996 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000997 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000998 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000999 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001000 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001001 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001002
Chris Lattnerecd49032009-03-02 22:27:17 +00001003 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001004 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1005 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001006 } else {
1007 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1008 getTriple().getOS() != llvm::Triple::OpenBSD)
1009 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001010 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001011
Ulrich Weigand8afad612014-07-28 13:17:52 +00001012 // ABI options.
1013 if (ABI == "elfv1")
1014 Builder.defineMacro("_CALL_ELF", "1");
1015 if (ABI == "elfv2")
1016 Builder.defineMacro("_CALL_ELF", "2");
1017
Chris Lattnerecd49032009-03-02 22:27:17 +00001018 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001019 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1020 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001021
Chris Lattnerecd49032009-03-02 22:27:17 +00001022 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001023 if (LongDoubleWidth == 128)
1024 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001025
John Thompsone467e192009-11-19 17:18:50 +00001026 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001027 Builder.defineMacro("__VEC__", "10206");
1028 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001029 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001030
1031 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001032 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1033 .Case("440", ArchDefineName)
1034 .Case("450", ArchDefineName | ArchDefine440)
1035 .Case("601", ArchDefineName)
1036 .Case("602", ArchDefineName | ArchDefinePpcgr)
1037 .Case("603", ArchDefineName | ArchDefinePpcgr)
1038 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1039 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1040 .Case("604", ArchDefineName | ArchDefinePpcgr)
1041 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1042 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001043 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001044 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1045 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1046 .Case("750", ArchDefineName | ArchDefinePpcgr)
1047 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1048 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001049 .Case("a2", ArchDefineA2)
1050 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001051 .Case("pwr3", ArchDefinePpcgr)
1052 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1053 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1054 | ArchDefinePpcsq)
1055 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1056 | ArchDefinePpcgr | ArchDefinePpcsq)
1057 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1058 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1059 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1060 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1061 | ArchDefinePpcsq)
1062 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1063 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001064 | ArchDefinePpcgr | ArchDefinePpcsq)
1065 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1066 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1067 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 .Case("power3", ArchDefinePpcgr)
1069 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1070 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1071 | ArchDefinePpcsq)
1072 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1073 | ArchDefinePpcgr | ArchDefinePpcsq)
1074 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1075 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1076 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1077 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1078 | ArchDefinePpcsq)
1079 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1080 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001081 | ArchDefinePpcgr | ArchDefinePpcsq)
1082 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1083 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1084 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001085 .Default(ArchDefineNone);
1086
1087 if (defs & ArchDefineName)
1088 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1089 if (defs & ArchDefinePpcgr)
1090 Builder.defineMacro("_ARCH_PPCGR");
1091 if (defs & ArchDefinePpcsq)
1092 Builder.defineMacro("_ARCH_PPCSQ");
1093 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001094 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001095 if (defs & ArchDefine603)
1096 Builder.defineMacro("_ARCH_603");
1097 if (defs & ArchDefine604)
1098 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001099 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001100 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001101 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001102 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001103 if (defs & ArchDefinePwr5x)
1104 Builder.defineMacro("_ARCH_PWR5X");
1105 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001106 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001107 if (defs & ArchDefinePwr6x)
1108 Builder.defineMacro("_ARCH_PWR6X");
1109 if (defs & ArchDefinePwr7)
1110 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001111 if (defs & ArchDefinePwr8)
1112 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001113 if (defs & ArchDefineA2)
1114 Builder.defineMacro("_ARCH_A2");
1115 if (defs & ArchDefineA2q) {
1116 Builder.defineMacro("_ARCH_A2Q");
1117 Builder.defineMacro("_ARCH_QP");
1118 }
1119
1120 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1121 Builder.defineMacro("__bg__");
1122 Builder.defineMacro("__THW_BLUEGENE__");
1123 Builder.defineMacro("__bgq__");
1124 Builder.defineMacro("__TOS_BGQ__");
1125 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001126
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001127 if (HasVSX)
1128 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001129 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001130 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001131
Bill Schmidt38378a02013-02-01 20:23:10 +00001132 // FIXME: The following are not yet generated here by Clang, but are
1133 // generated by GCC:
1134 //
1135 // _SOFT_FLOAT_
1136 // __RECIP_PRECISION__
1137 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001138 // __RECIP__
1139 // __RECIPF__
1140 // __RSQRTE__
1141 // __RSQRTEF__
1142 // _SOFT_DOUBLE_
1143 // __NO_LWSYNC__
1144 // __HAVE_BSWAP__
1145 // __LONGDOUBLE128
1146 // __CMODEL_MEDIUM__
1147 // __CMODEL_LARGE__
1148 // _CALL_SYSV
1149 // _CALL_DARWIN
1150 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001151}
1152
1153void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1154 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1155 .Case("7400", true)
1156 .Case("g4", true)
1157 .Case("7450", true)
1158 .Case("g4+", true)
1159 .Case("970", true)
1160 .Case("g5", true)
1161 .Case("pwr6", true)
1162 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001163 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001164 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001165 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001166 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001167
1168 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001169
1170 if (!ABI.empty())
1171 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001172}
1173
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001174bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001175 return llvm::StringSwitch<bool>(Feature)
1176 .Case("powerpc", true)
1177 .Case("vsx", HasVSX)
1178 .Case("power8-vector", HasP8Vector)
1179 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001180}
Chris Lattner17df24e2008-04-21 18:56:49 +00001181
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001182const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001183 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1184 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1185 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1186 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1187 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1188 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1189 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1190 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001191 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001192 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001193 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001194 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1195 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1196 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1197 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001198 "vrsave", "vscr",
1199 "spe_acc", "spefscr",
1200 "sfp"
1201};
Chris Lattner10a5b382007-01-29 05:24:35 +00001202
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001203void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001204 unsigned &NumNames) const {
1205 Names = GCCRegNames;
1206 NumNames = llvm::array_lengthof(GCCRegNames);
1207}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001208
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001209const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1210 // While some of these aliases do map to different registers
1211 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001212 { { "0" }, "r0" },
1213 { { "1"}, "r1" },
1214 { { "2" }, "r2" },
1215 { { "3" }, "r3" },
1216 { { "4" }, "r4" },
1217 { { "5" }, "r5" },
1218 { { "6" }, "r6" },
1219 { { "7" }, "r7" },
1220 { { "8" }, "r8" },
1221 { { "9" }, "r9" },
1222 { { "10" }, "r10" },
1223 { { "11" }, "r11" },
1224 { { "12" }, "r12" },
1225 { { "13" }, "r13" },
1226 { { "14" }, "r14" },
1227 { { "15" }, "r15" },
1228 { { "16" }, "r16" },
1229 { { "17" }, "r17" },
1230 { { "18" }, "r18" },
1231 { { "19" }, "r19" },
1232 { { "20" }, "r20" },
1233 { { "21" }, "r21" },
1234 { { "22" }, "r22" },
1235 { { "23" }, "r23" },
1236 { { "24" }, "r24" },
1237 { { "25" }, "r25" },
1238 { { "26" }, "r26" },
1239 { { "27" }, "r27" },
1240 { { "28" }, "r28" },
1241 { { "29" }, "r29" },
1242 { { "30" }, "r30" },
1243 { { "31" }, "r31" },
1244 { { "fr0" }, "f0" },
1245 { { "fr1" }, "f1" },
1246 { { "fr2" }, "f2" },
1247 { { "fr3" }, "f3" },
1248 { { "fr4" }, "f4" },
1249 { { "fr5" }, "f5" },
1250 { { "fr6" }, "f6" },
1251 { { "fr7" }, "f7" },
1252 { { "fr8" }, "f8" },
1253 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001254 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001255 { { "fr11" }, "f11" },
1256 { { "fr12" }, "f12" },
1257 { { "fr13" }, "f13" },
1258 { { "fr14" }, "f14" },
1259 { { "fr15" }, "f15" },
1260 { { "fr16" }, "f16" },
1261 { { "fr17" }, "f17" },
1262 { { "fr18" }, "f18" },
1263 { { "fr19" }, "f19" },
1264 { { "fr20" }, "f20" },
1265 { { "fr21" }, "f21" },
1266 { { "fr22" }, "f22" },
1267 { { "fr23" }, "f23" },
1268 { { "fr24" }, "f24" },
1269 { { "fr25" }, "f25" },
1270 { { "fr26" }, "f26" },
1271 { { "fr27" }, "f27" },
1272 { { "fr28" }, "f28" },
1273 { { "fr29" }, "f29" },
1274 { { "fr30" }, "f30" },
1275 { { "fr31" }, "f31" },
1276 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001277};
1278
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001279void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001280 unsigned &NumAliases) const {
1281 Aliases = GCCRegAliases;
1282 NumAliases = llvm::array_lengthof(GCCRegAliases);
1283}
1284} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001285
Chris Lattner5ba61f02006-10-14 07:39:34 +00001286namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001287class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001288public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001289 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001290 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001291
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001292 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001293 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001294 case llvm::Triple::FreeBSD:
1295 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001296 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001297 PtrDiffType = SignedInt;
1298 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001299 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001300 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001301 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001302 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001303
Roman Divacky3ffe7462012-03-13 19:20:17 +00001304 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1305 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001306 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001307 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001308
1309 // PPC32 supports atomics up to 4 bytes.
1310 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001311 }
1312
Craig Topper3164f332014-03-11 03:39:26 +00001313 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001314 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001315 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001316 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001317};
1318} // end anonymous namespace.
1319
Bill Schmidt778d3872013-07-26 01:36:11 +00001320// Note: ABI differences may eventually require us to have a separate
1321// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001322namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001323class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001324public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001325 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001326 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001327 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001328 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001329
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001330 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1331 DescriptionString = "e-m:e-i64:64-n32:64";
1332 ABI = "elfv2";
1333 } else {
1334 DescriptionString = "E-m:e-i64:64-n32:64";
1335 ABI = "elfv1";
1336 }
1337
1338 switch (getTriple().getOS()) {
1339 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001340 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001341 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001342 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001343 case llvm::Triple::NetBSD:
1344 IntMaxType = SignedLongLong;
1345 Int64Type = SignedLongLong;
1346 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001347 default:
1348 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001349 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001350
1351 // PPC64 supports atomics up to 8 bytes.
1352 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001353 }
Craig Topper3164f332014-03-11 03:39:26 +00001354 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001355 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001356 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001357 // PPC64 Linux-specifc ABI options.
1358 bool setABI(const std::string &Name) override {
1359 if (Name == "elfv1" || Name == "elfv2") {
1360 ABI = Name;
1361 return true;
1362 }
1363 return false;
1364 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001365};
1366} // end anonymous namespace.
1367
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001368
1369namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001370class DarwinPPC32TargetInfo :
1371 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001372public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001373 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1374 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001375 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001376 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001377 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001378 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001379 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001380 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001381 }
Craig Topper3164f332014-03-11 03:39:26 +00001382 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001383 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001384 }
1385};
1386
1387class DarwinPPC64TargetInfo :
1388 public DarwinTargetInfo<PPC64TargetInfo> {
1389public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001390 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1391 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001392 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001393 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001394 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001395 }
1396};
1397} // end anonymous namespace.
1398
Chris Lattner5ba61f02006-10-14 07:39:34 +00001399namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001400 static const unsigned NVPTXAddrSpaceMap[] = {
1401 1, // opencl_global
1402 3, // opencl_local
1403 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001404 // FIXME: generic has to be added to the target
1405 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001406 1, // cuda_device
1407 4, // cuda_constant
1408 3, // cuda_shared
1409 };
1410 class NVPTXTargetInfo : public TargetInfo {
1411 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001412 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001413
1414 // The GPU profiles supported by the NVPTX backend
1415 enum GPUKind {
1416 GK_NONE,
1417 GK_SM20,
1418 GK_SM21,
1419 GK_SM30,
1420 GK_SM35,
1421 } GPU;
1422
Peter Collingbournec947aae2012-05-20 23:28:41 +00001423 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001424 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001425 BigEndian = false;
1426 TLSSupported = false;
1427 LongWidth = LongAlign = 64;
1428 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001429 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001430 // Define available target features
1431 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001432 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001433 // Set the default GPU to sm20
1434 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001435 }
Craig Topper3164f332014-03-11 03:39:26 +00001436 void getTargetDefines(const LangOptions &Opts,
1437 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001438 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001439 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001440 if (Opts.CUDAIsDevice) {
1441 // Set __CUDA_ARCH__ for the GPU specified.
1442 std::string CUDAArchCode;
1443 switch (GPU) {
1444 case GK_SM20:
1445 CUDAArchCode = "200";
1446 break;
1447 case GK_SM21:
1448 CUDAArchCode = "210";
1449 break;
1450 case GK_SM30:
1451 CUDAArchCode = "300";
1452 break;
1453 case GK_SM35:
1454 CUDAArchCode = "350";
1455 break;
1456 default:
1457 llvm_unreachable("Unhandled target CPU");
1458 }
1459 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1460 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001461 }
Craig Topper3164f332014-03-11 03:39:26 +00001462 void getTargetBuiltins(const Builtin::Info *&Records,
1463 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001464 Records = BuiltinInfo;
1465 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001466 }
Craig Topper3164f332014-03-11 03:39:26 +00001467 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001468 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001469 }
Craig Topper3164f332014-03-11 03:39:26 +00001470
1471 void getGCCRegNames(const char * const *&Names,
1472 unsigned &NumNames) const override;
1473 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1474 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001475 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001476 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001477 NumAliases = 0;
1478 }
Eric Christopher917e9522014-11-18 22:36:15 +00001479 bool
1480 validateAsmConstraint(const char *&Name,
1481 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001482 switch (*Name) {
1483 default: return false;
1484 case 'c':
1485 case 'h':
1486 case 'r':
1487 case 'l':
1488 case 'f':
1489 case 'd':
1490 Info.setAllowsRegister();
1491 return true;
1492 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001493 }
Craig Topper3164f332014-03-11 03:39:26 +00001494 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001495 // FIXME: Is this really right?
1496 return "";
1497 }
Craig Topper3164f332014-03-11 03:39:26 +00001498 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001499 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001500 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001501 }
Craig Topper3164f332014-03-11 03:39:26 +00001502 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001503 GPU = llvm::StringSwitch<GPUKind>(Name)
1504 .Case("sm_20", GK_SM20)
1505 .Case("sm_21", GK_SM21)
1506 .Case("sm_30", GK_SM30)
1507 .Case("sm_35", GK_SM35)
1508 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001509
Reid Klecknerbbc01782014-12-03 21:53:36 +00001510 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001511 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001512 };
1513
1514 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1515#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1516#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1517 ALL_LANGUAGES },
1518#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001519 };
1520
1521 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1522 "r0"
1523 };
1524
1525 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1526 unsigned &NumNames) const {
1527 Names = GCCRegNames;
1528 NumNames = llvm::array_lengthof(GCCRegNames);
1529 }
1530
1531 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1532 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001533 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001534 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001535 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1536 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001537 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001538 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001539 };
1540
1541 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1542 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001543 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001544 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001545 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1546 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001547 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001548 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001549 };
1550}
1551
1552namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001553
1554static const unsigned R600AddrSpaceMap[] = {
1555 1, // opencl_global
1556 3, // opencl_local
1557 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001558 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001559 1, // cuda_device
1560 2, // cuda_constant
1561 3 // cuda_shared
1562};
1563
Tom Stellarda96344b2014-08-21 13:58:40 +00001564// If you edit the description strings, make sure you update
1565// getPointerWidthV().
1566
Tom Stellardc74b1e02013-03-04 17:40:53 +00001567static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001568 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1569 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001570
1571static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001572 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1573 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001574
1575static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001576 "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 +00001577 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1578 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001579
Eli Friedmand13b41e2012-10-12 23:32:00 +00001580class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001581 static const Builtin::Info BuiltinInfo[];
1582
Tom Stellardc74b1e02013-03-04 17:40:53 +00001583 /// \brief The GPU profiles supported by the R600 target.
1584 enum GPUKind {
1585 GK_NONE,
1586 GK_R600,
1587 GK_R600_DOUBLE_OPS,
1588 GK_R700,
1589 GK_R700_DOUBLE_OPS,
1590 GK_EVERGREEN,
1591 GK_EVERGREEN_DOUBLE_OPS,
1592 GK_NORTHERN_ISLANDS,
1593 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001594 GK_SOUTHERN_ISLANDS,
1595 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001596 } GPU;
1597
Eli Friedmand13b41e2012-10-12 23:32:00 +00001598public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001599 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001600 : TargetInfo(Triple) {
1601
1602 if (Triple.getArch() == llvm::Triple::amdgcn) {
1603 DescriptionString = DescriptionStringSI;
1604 GPU = GK_SOUTHERN_ISLANDS;
1605 } else {
1606 DescriptionString = DescriptionStringR600;
1607 GPU = GK_R600;
1608 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001609 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001610 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001611 }
1612
Tom Stellarda96344b2014-08-21 13:58:40 +00001613 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1614 if (GPU <= GK_CAYMAN)
1615 return 32;
1616
1617 switch(AddrSpace) {
1618 default:
1619 return 64;
1620 case 0:
1621 case 3:
1622 case 5:
1623 return 32;
1624 }
1625 }
1626
Craig Topper3164f332014-03-11 03:39:26 +00001627 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001628 return "";
1629 }
1630
Craig Topper3164f332014-03-11 03:39:26 +00001631 void getGCCRegNames(const char * const *&Names,
1632 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001633 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001634 numNames = 0;
1635 }
1636
Craig Topper3164f332014-03-11 03:39:26 +00001637 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1638 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001639 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001640 NumAliases = 0;
1641 }
1642
Craig Topper3164f332014-03-11 03:39:26 +00001643 bool validateAsmConstraint(const char *&Name,
1644 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001645 return true;
1646 }
1647
Craig Topper3164f332014-03-11 03:39:26 +00001648 void getTargetBuiltins(const Builtin::Info *&Records,
1649 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001650 Records = BuiltinInfo;
1651 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001652 }
1653
Craig Topper3164f332014-03-11 03:39:26 +00001654 void getTargetDefines(const LangOptions &Opts,
1655 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001656 Builder.defineMacro("__R600__");
1657 }
1658
Craig Topper3164f332014-03-11 03:39:26 +00001659 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001660 return TargetInfo::CharPtrBuiltinVaList;
1661 }
1662
Craig Topper3164f332014-03-11 03:39:26 +00001663 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001664 GPU = llvm::StringSwitch<GPUKind>(Name)
1665 .Case("r600" , GK_R600)
1666 .Case("rv610", GK_R600)
1667 .Case("rv620", GK_R600)
1668 .Case("rv630", GK_R600)
1669 .Case("rv635", GK_R600)
1670 .Case("rs780", GK_R600)
1671 .Case("rs880", GK_R600)
1672 .Case("rv670", GK_R600_DOUBLE_OPS)
1673 .Case("rv710", GK_R700)
1674 .Case("rv730", GK_R700)
1675 .Case("rv740", GK_R700_DOUBLE_OPS)
1676 .Case("rv770", GK_R700_DOUBLE_OPS)
1677 .Case("palm", GK_EVERGREEN)
1678 .Case("cedar", GK_EVERGREEN)
1679 .Case("sumo", GK_EVERGREEN)
1680 .Case("sumo2", GK_EVERGREEN)
1681 .Case("redwood", GK_EVERGREEN)
1682 .Case("juniper", GK_EVERGREEN)
1683 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1684 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1685 .Case("barts", GK_NORTHERN_ISLANDS)
1686 .Case("turks", GK_NORTHERN_ISLANDS)
1687 .Case("caicos", GK_NORTHERN_ISLANDS)
1688 .Case("cayman", GK_CAYMAN)
1689 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001690 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001691 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1692 .Case("verde", GK_SOUTHERN_ISLANDS)
1693 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001694 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001695 .Case("bonaire", GK_SEA_ISLANDS)
1696 .Case("kabini", GK_SEA_ISLANDS)
1697 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001698 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001699 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001700 .Default(GK_NONE);
1701
1702 if (GPU == GK_NONE) {
1703 return false;
1704 }
1705
1706 // Set the correct data layout
1707 switch (GPU) {
1708 case GK_NONE:
1709 case GK_R600:
1710 case GK_R700:
1711 case GK_EVERGREEN:
1712 case GK_NORTHERN_ISLANDS:
1713 DescriptionString = DescriptionStringR600;
1714 break;
1715 case GK_R600_DOUBLE_OPS:
1716 case GK_R700_DOUBLE_OPS:
1717 case GK_EVERGREEN_DOUBLE_OPS:
1718 case GK_CAYMAN:
1719 DescriptionString = DescriptionStringR600DoubleOps;
1720 break;
1721 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001722 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001723 DescriptionString = DescriptionStringSI;
1724 break;
1725 }
1726
1727 return true;
1728 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001729};
1730
Matt Arsenault56f008d2014-06-24 20:45:01 +00001731const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1732#define BUILTIN(ID, TYPE, ATTRS) \
1733 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1734#include "clang/Basic/BuiltinsR600.def"
1735};
1736
Eli Friedmand13b41e2012-10-12 23:32:00 +00001737} // end anonymous namespace
1738
1739namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001740// Namespace for x86 abstract base class
1741const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001742#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001743#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001744 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001745#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001746};
Eli Friedmanb5366062008-05-20 14:21:01 +00001747
Nuno Lopescfca1f02009-12-23 17:49:57 +00001748static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001749 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1750 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001751 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001752 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1753 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1754 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001755 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001756 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1757 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001758};
1759
Eric Christophercdd36352011-06-21 00:05:20 +00001760const TargetInfo::AddlRegName AddlRegNames[] = {
1761 { { "al", "ah", "eax", "rax" }, 0 },
1762 { { "bl", "bh", "ebx", "rbx" }, 3 },
1763 { { "cl", "ch", "ecx", "rcx" }, 2 },
1764 { { "dl", "dh", "edx", "rdx" }, 1 },
1765 { { "esi", "rsi" }, 4 },
1766 { { "edi", "rdi" }, 5 },
1767 { { "esp", "rsp" }, 7 },
1768 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001769};
1770
1771// X86 target abstract base class; x86-32 and x86-64 are very close, so
1772// most of the implementation can be shared.
1773class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001774 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001775 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001776 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001777 enum MMX3DNowEnum {
1778 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1779 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001780 enum XOPEnum {
1781 NoXOP,
1782 SSE4A,
1783 FMA4,
1784 XOP
1785 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001786
Eric Christophere1ddaf92010-04-02 23:50:19 +00001787 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001788 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001789 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001790 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001791 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001792 bool HasBMI;
1793 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001794 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001795 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001796 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001797 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001798 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001799 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001800 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001801 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001802 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1803 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001804 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001805 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001806
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001807 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1808 ///
1809 /// Each enumeration represents a particular CPU supported by Clang. These
1810 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1811 enum CPUKind {
1812 CK_Generic,
1813
1814 /// \name i386
1815 /// i386-generation processors.
1816 //@{
1817 CK_i386,
1818 //@}
1819
1820 /// \name i486
1821 /// i486-generation processors.
1822 //@{
1823 CK_i486,
1824 CK_WinChipC6,
1825 CK_WinChip2,
1826 CK_C3,
1827 //@}
1828
1829 /// \name i586
1830 /// i586-generation processors, P5 microarchitecture based.
1831 //@{
1832 CK_i586,
1833 CK_Pentium,
1834 CK_PentiumMMX,
1835 //@}
1836
1837 /// \name i686
1838 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1839 //@{
1840 CK_i686,
1841 CK_PentiumPro,
1842 CK_Pentium2,
1843 CK_Pentium3,
1844 CK_Pentium3M,
1845 CK_PentiumM,
1846 CK_C3_2,
1847
1848 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1849 /// Clang however has some logic to suport this.
1850 // FIXME: Warn, deprecate, and potentially remove this.
1851 CK_Yonah,
1852 //@}
1853
1854 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001855 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001856 //@{
1857 CK_Pentium4,
1858 CK_Pentium4M,
1859 CK_Prescott,
1860 CK_Nocona,
1861 //@}
1862
1863 /// \name Core
1864 /// Core microarchitecture based processors.
1865 //@{
1866 CK_Core2,
1867
1868 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1869 /// codename which GCC no longer accepts as an option to -march, but Clang
1870 /// has some logic for recognizing it.
1871 // FIXME: Warn, deprecate, and potentially remove this.
1872 CK_Penryn,
1873 //@}
1874
1875 /// \name Atom
1876 /// Atom processors
1877 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001878 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001879 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001880 //@}
1881
1882 /// \name Nehalem
1883 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001884 CK_Nehalem,
1885
1886 /// \name Westmere
1887 /// Westmere microarchitecture based processors.
1888 CK_Westmere,
1889
1890 /// \name Sandy Bridge
1891 /// Sandy Bridge microarchitecture based processors.
1892 CK_SandyBridge,
1893
1894 /// \name Ivy Bridge
1895 /// Ivy Bridge microarchitecture based processors.
1896 CK_IvyBridge,
1897
1898 /// \name Haswell
1899 /// Haswell microarchitecture based processors.
1900 CK_Haswell,
1901
1902 /// \name Broadwell
1903 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001904 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001905
1906 /// \name Skylake
1907 /// Skylake microarchitecture based processors.
1908 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001909
Craig Topper449314e2013-08-20 07:09:39 +00001910 /// \name Knights Landing
1911 /// Knights Landing processor.
1912 CK_KNL,
1913
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001914 /// \name K6
1915 /// K6 architecture processors.
1916 //@{
1917 CK_K6,
1918 CK_K6_2,
1919 CK_K6_3,
1920 //@}
1921
1922 /// \name K7
1923 /// K7 architecture processors.
1924 //@{
1925 CK_Athlon,
1926 CK_AthlonThunderbird,
1927 CK_Athlon4,
1928 CK_AthlonXP,
1929 CK_AthlonMP,
1930 //@}
1931
1932 /// \name K8
1933 /// K8 architecture processors.
1934 //@{
1935 CK_Athlon64,
1936 CK_Athlon64SSE3,
1937 CK_AthlonFX,
1938 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001939 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001940 CK_Opteron,
1941 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001942 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001943 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001944
Benjamin Kramer569f2152012-01-10 11:50:18 +00001945 /// \name Bobcat
1946 /// Bobcat architecture processors.
1947 //@{
1948 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001949 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001950 //@}
1951
1952 /// \name Bulldozer
1953 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001954 //@{
1955 CK_BDVER1,
1956 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001957 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001958 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001959 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001960
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001961 /// This specification is deprecated and will be removed in the future.
1962 /// Users should prefer \see CK_K8.
1963 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001964 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001965 CK_x86_64,
1966 //@}
1967
1968 /// \name Geode
1969 /// Geode processors.
1970 //@{
1971 CK_Geode
1972 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001973 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001974
Rafael Espindolaeb265472013-08-21 21:59:03 +00001975 enum FPMathKind {
1976 FP_Default,
1977 FP_SSE,
1978 FP_387
1979 } FPMath;
1980
Eli Friedman3fd920a2008-08-20 02:34:37 +00001981public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001982 X86TargetInfo(const llvm::Triple &Triple)
1983 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001984 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001985 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1986 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1987 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1988 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1989 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1990 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001991 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001992 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001993 }
Craig Topper3164f332014-03-11 03:39:26 +00001994 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001995 // X87 evaluates with 80 bits "long double" precision.
1996 return SSELevel == NoSSE ? 2 : 0;
1997 }
Craig Topper3164f332014-03-11 03:39:26 +00001998 void getTargetBuiltins(const Builtin::Info *&Records,
1999 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002000 Records = BuiltinInfo;
2001 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002002 }
Craig Topper3164f332014-03-11 03:39:26 +00002003 void getGCCRegNames(const char * const *&Names,
2004 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002005 Names = GCCRegNames;
2006 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002007 }
Craig Topper3164f332014-03-11 03:39:26 +00002008 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2009 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002010 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002011 NumAliases = 0;
2012 }
Craig Topper3164f332014-03-11 03:39:26 +00002013 void getGCCAddlRegNames(const AddlRegName *&Names,
2014 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002015 Names = AddlRegNames;
2016 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002017 }
Craig Topper3164f332014-03-11 03:39:26 +00002018 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002019 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002020
Akira Hatanaka974131e2014-09-18 18:17:18 +00002021 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2022
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002023 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2024
Akira Hatanaka974131e2014-09-18 18:17:18 +00002025 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2026
Craig Topper3164f332014-03-11 03:39:26 +00002027 std::string convertConstraint(const char *&Constraint) const override;
2028 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002029 return "~{dirflag},~{fpsr},~{flags}";
2030 }
Craig Topper3164f332014-03-11 03:39:26 +00002031 void getTargetDefines(const LangOptions &Opts,
2032 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002033 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2034 bool Enabled);
2035 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2036 bool Enabled);
2037 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2038 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002039 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2040 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002041 setFeatureEnabledImpl(Features, Name, Enabled);
2042 }
2043 // This exists purely to cut down on the number of virtual calls in
2044 // getDefaultFeatures which calls this repeatedly.
2045 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2046 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002047 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2048 bool hasFeature(StringRef Feature) const override;
2049 bool handleTargetFeatures(std::vector<std::string> &Features,
2050 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002051 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002052 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002053 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002054 else if (getTriple().getArch() == llvm::Triple::x86 &&
2055 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002056 return "no-mmx";
2057 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002058 }
Craig Topper3164f332014-03-11 03:39:26 +00002059 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002060 CPU = llvm::StringSwitch<CPUKind>(Name)
2061 .Case("i386", CK_i386)
2062 .Case("i486", CK_i486)
2063 .Case("winchip-c6", CK_WinChipC6)
2064 .Case("winchip2", CK_WinChip2)
2065 .Case("c3", CK_C3)
2066 .Case("i586", CK_i586)
2067 .Case("pentium", CK_Pentium)
2068 .Case("pentium-mmx", CK_PentiumMMX)
2069 .Case("i686", CK_i686)
2070 .Case("pentiumpro", CK_PentiumPro)
2071 .Case("pentium2", CK_Pentium2)
2072 .Case("pentium3", CK_Pentium3)
2073 .Case("pentium3m", CK_Pentium3M)
2074 .Case("pentium-m", CK_PentiumM)
2075 .Case("c3-2", CK_C3_2)
2076 .Case("yonah", CK_Yonah)
2077 .Case("pentium4", CK_Pentium4)
2078 .Case("pentium4m", CK_Pentium4M)
2079 .Case("prescott", CK_Prescott)
2080 .Case("nocona", CK_Nocona)
2081 .Case("core2", CK_Core2)
2082 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002083 .Case("bonnell", CK_Bonnell)
2084 .Case("atom", CK_Bonnell) // Legacy name.
2085 .Case("silvermont", CK_Silvermont)
2086 .Case("slm", CK_Silvermont) // Legacy name.
2087 .Case("nehalem", CK_Nehalem)
2088 .Case("corei7", CK_Nehalem) // Legacy name.
2089 .Case("westmere", CK_Westmere)
2090 .Case("sandybridge", CK_SandyBridge)
2091 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2092 .Case("ivybridge", CK_IvyBridge)
2093 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2094 .Case("haswell", CK_Haswell)
2095 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002096 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002097 .Case("skylake", CK_Skylake)
2098 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002099 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002100 .Case("k6", CK_K6)
2101 .Case("k6-2", CK_K6_2)
2102 .Case("k6-3", CK_K6_3)
2103 .Case("athlon", CK_Athlon)
2104 .Case("athlon-tbird", CK_AthlonThunderbird)
2105 .Case("athlon-4", CK_Athlon4)
2106 .Case("athlon-xp", CK_AthlonXP)
2107 .Case("athlon-mp", CK_AthlonMP)
2108 .Case("athlon64", CK_Athlon64)
2109 .Case("athlon64-sse3", CK_Athlon64SSE3)
2110 .Case("athlon-fx", CK_AthlonFX)
2111 .Case("k8", CK_K8)
2112 .Case("k8-sse3", CK_K8SSE3)
2113 .Case("opteron", CK_Opteron)
2114 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002115 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002116 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002117 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002118 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002119 .Case("bdver1", CK_BDVER1)
2120 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002121 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002122 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002123 .Case("x86-64", CK_x86_64)
2124 .Case("geode", CK_Geode)
2125 .Default(CK_Generic);
2126
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002127 // Perform any per-CPU checks necessary to determine if this CPU is
2128 // acceptable.
2129 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2130 // invalid without explaining *why*.
2131 switch (CPU) {
2132 case CK_Generic:
2133 // No processor selected!
2134 return false;
2135
2136 case CK_i386:
2137 case CK_i486:
2138 case CK_WinChipC6:
2139 case CK_WinChip2:
2140 case CK_C3:
2141 case CK_i586:
2142 case CK_Pentium:
2143 case CK_PentiumMMX:
2144 case CK_i686:
2145 case CK_PentiumPro:
2146 case CK_Pentium2:
2147 case CK_Pentium3:
2148 case CK_Pentium3M:
2149 case CK_PentiumM:
2150 case CK_Yonah:
2151 case CK_C3_2:
2152 case CK_Pentium4:
2153 case CK_Pentium4M:
2154 case CK_Prescott:
2155 case CK_K6:
2156 case CK_K6_2:
2157 case CK_K6_3:
2158 case CK_Athlon:
2159 case CK_AthlonThunderbird:
2160 case CK_Athlon4:
2161 case CK_AthlonXP:
2162 case CK_AthlonMP:
2163 case CK_Geode:
2164 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002165 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002166 return false;
2167
2168 // Fallthrough
2169 case CK_Nocona:
2170 case CK_Core2:
2171 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002172 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002173 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002174 case CK_Nehalem:
2175 case CK_Westmere:
2176 case CK_SandyBridge:
2177 case CK_IvyBridge:
2178 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002179 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002180 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002181 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002182 case CK_Athlon64:
2183 case CK_Athlon64SSE3:
2184 case CK_AthlonFX:
2185 case CK_K8:
2186 case CK_K8SSE3:
2187 case CK_Opteron:
2188 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002189 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002190 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002191 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002192 case CK_BDVER1:
2193 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002194 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002195 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002196 case CK_x86_64:
2197 return true;
2198 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002199 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002200 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002201
Craig Topper3164f332014-03-11 03:39:26 +00002202 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002203
Craig Topper3164f332014-03-11 03:39:26 +00002204 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002205 // We accept all non-ARM calling conventions
2206 return (CC == CC_X86ThisCall ||
2207 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002208 CC == CC_X86StdCall ||
2209 CC == CC_X86VectorCall ||
2210 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002211 CC == CC_X86Pascal ||
2212 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002213 }
2214
Craig Topper3164f332014-03-11 03:39:26 +00002215 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002216 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002217 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002218};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002219
Rafael Espindolaeb265472013-08-21 21:59:03 +00002220bool X86TargetInfo::setFPMath(StringRef Name) {
2221 if (Name == "387") {
2222 FPMath = FP_387;
2223 return true;
2224 }
2225 if (Name == "sse") {
2226 FPMath = FP_SSE;
2227 return true;
2228 }
2229 return false;
2230}
2231
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002232void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002233 // FIXME: This *really* should not be here.
2234
2235 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002236 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002237 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002238
Chandler Carruth212334f2011-09-28 08:55:37 +00002239 switch (CPU) {
2240 case CK_Generic:
2241 case CK_i386:
2242 case CK_i486:
2243 case CK_i586:
2244 case CK_Pentium:
2245 case CK_i686:
2246 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002247 break;
2248 case CK_PentiumMMX:
2249 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002250 case CK_K6:
2251 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002252 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002253 break;
2254 case CK_Pentium3:
2255 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002256 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002257 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002258 break;
2259 case CK_PentiumM:
2260 case CK_Pentium4:
2261 case CK_Pentium4M:
2262 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002263 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002264 break;
2265 case CK_Yonah:
2266 case CK_Prescott:
2267 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002268 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002269 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002270 break;
2271 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002272 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002273 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002274 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002275 break;
2276 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002277 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002278 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002279 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002280 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002281 setFeatureEnabledImpl(Features, "avx512f", true);
2282 setFeatureEnabledImpl(Features, "avx512cd", true);
2283 setFeatureEnabledImpl(Features, "avx512dq", true);
2284 setFeatureEnabledImpl(Features, "avx512bw", true);
2285 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002286 // FALLTHROUGH
2287 case CK_Broadwell:
2288 setFeatureEnabledImpl(Features, "rdseed", true);
2289 setFeatureEnabledImpl(Features, "adx", true);
2290 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002291 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002292 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002293 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002294 setFeatureEnabledImpl(Features, "bmi", true);
2295 setFeatureEnabledImpl(Features, "bmi2", true);
2296 setFeatureEnabledImpl(Features, "rtm", true);
2297 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002298 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002299 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002300 setFeatureEnabledImpl(Features, "rdrnd", true);
2301 setFeatureEnabledImpl(Features, "f16c", true);
2302 setFeatureEnabledImpl(Features, "fsgsbase", true);
2303 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002304 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002305 setFeatureEnabledImpl(Features, "avx", true);
2306 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002307 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002308 case CK_Silvermont:
2309 setFeatureEnabledImpl(Features, "aes", true);
2310 setFeatureEnabledImpl(Features, "pclmul", true);
2311 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002312 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002313 setFeatureEnabledImpl(Features, "sse4.2", true);
2314 setFeatureEnabledImpl(Features, "cx16", true);
2315 break;
2316 case CK_KNL:
2317 setFeatureEnabledImpl(Features, "avx512f", true);
2318 setFeatureEnabledImpl(Features, "avx512cd", true);
2319 setFeatureEnabledImpl(Features, "avx512er", true);
2320 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002321 setFeatureEnabledImpl(Features, "rdseed", true);
2322 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002323 setFeatureEnabledImpl(Features, "lzcnt", true);
2324 setFeatureEnabledImpl(Features, "bmi", true);
2325 setFeatureEnabledImpl(Features, "bmi2", true);
2326 setFeatureEnabledImpl(Features, "rtm", true);
2327 setFeatureEnabledImpl(Features, "fma", true);
2328 setFeatureEnabledImpl(Features, "rdrnd", true);
2329 setFeatureEnabledImpl(Features, "f16c", true);
2330 setFeatureEnabledImpl(Features, "fsgsbase", true);
2331 setFeatureEnabledImpl(Features, "aes", true);
2332 setFeatureEnabledImpl(Features, "pclmul", true);
2333 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002334 break;
2335 case CK_K6_2:
2336 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002337 case CK_WinChip2:
2338 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002339 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002340 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002341 case CK_Athlon:
2342 case CK_AthlonThunderbird:
2343 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002344 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002345 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002346 case CK_Athlon4:
2347 case CK_AthlonXP:
2348 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002349 setFeatureEnabledImpl(Features, "sse", true);
2350 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002351 break;
2352 case CK_K8:
2353 case CK_Opteron:
2354 case CK_Athlon64:
2355 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002356 setFeatureEnabledImpl(Features, "sse2", true);
2357 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002358 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002359 case CK_AMDFAM10:
2360 setFeatureEnabledImpl(Features, "sse4a", true);
2361 setFeatureEnabledImpl(Features, "lzcnt", true);
2362 setFeatureEnabledImpl(Features, "popcnt", true);
2363 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002364 case CK_K8SSE3:
2365 case CK_OpteronSSE3:
2366 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002367 setFeatureEnabledImpl(Features, "sse3", true);
2368 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002369 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002370 case CK_BTVER2:
2371 setFeatureEnabledImpl(Features, "avx", true);
2372 setFeatureEnabledImpl(Features, "aes", true);
2373 setFeatureEnabledImpl(Features, "pclmul", true);
2374 setFeatureEnabledImpl(Features, "bmi", true);
2375 setFeatureEnabledImpl(Features, "f16c", true);
2376 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002377 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002378 setFeatureEnabledImpl(Features, "ssse3", true);
2379 setFeatureEnabledImpl(Features, "sse4a", true);
2380 setFeatureEnabledImpl(Features, "lzcnt", true);
2381 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002382 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002383 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002384 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002385 case CK_BDVER4:
2386 setFeatureEnabledImpl(Features, "avx2", true);
2387 setFeatureEnabledImpl(Features, "bmi2", true);
2388 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002389 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002390 setFeatureEnabledImpl(Features, "fsgsbase", true);
2391 // FALLTHROUGH
2392 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002393 setFeatureEnabledImpl(Features, "bmi", true);
2394 setFeatureEnabledImpl(Features, "fma", true);
2395 setFeatureEnabledImpl(Features, "f16c", true);
2396 setFeatureEnabledImpl(Features, "tbm", true);
2397 // FALLTHROUGH
2398 case CK_BDVER1:
2399 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002400 setFeatureEnabledImpl(Features, "xop", true);
2401 setFeatureEnabledImpl(Features, "lzcnt", true);
2402 setFeatureEnabledImpl(Features, "aes", true);
2403 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002404 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002405 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002406 break;
Eli Friedman33465822011-07-08 23:31:17 +00002407 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002408}
2409
Rafael Espindolae62e2792013-08-20 13:44:29 +00002410void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002411 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002412 if (Enabled) {
2413 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002414 case AVX512F:
2415 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002416 case AVX2:
2417 Features["avx2"] = true;
2418 case AVX:
2419 Features["avx"] = true;
2420 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002421 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002422 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002423 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002424 case SSSE3:
2425 Features["ssse3"] = true;
2426 case SSE3:
2427 Features["sse3"] = true;
2428 case SSE2:
2429 Features["sse2"] = true;
2430 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002431 Features["sse"] = true;
2432 case NoSSE:
2433 break;
2434 }
2435 return;
2436 }
2437
2438 switch (Level) {
2439 case NoSSE:
2440 case SSE1:
2441 Features["sse"] = false;
2442 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002443 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2444 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002445 case SSE3:
2446 Features["sse3"] = false;
2447 setXOPLevel(Features, NoXOP, false);
2448 case SSSE3:
2449 Features["ssse3"] = false;
2450 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002451 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002452 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002453 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002454 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002455 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002456 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002457 case AVX2:
2458 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002459 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002460 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002461 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2462 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002463 }
2464}
2465
2466void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002467 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002468 if (Enabled) {
2469 switch (Level) {
2470 case AMD3DNowAthlon:
2471 Features["3dnowa"] = true;
2472 case AMD3DNow:
2473 Features["3dnow"] = true;
2474 case MMX:
2475 Features["mmx"] = true;
2476 case NoMMX3DNow:
2477 break;
2478 }
2479 return;
2480 }
2481
2482 switch (Level) {
2483 case NoMMX3DNow:
2484 case MMX:
2485 Features["mmx"] = false;
2486 case AMD3DNow:
2487 Features["3dnow"] = false;
2488 case AMD3DNowAthlon:
2489 Features["3dnowa"] = false;
2490 }
2491}
2492
2493void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002494 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002495 if (Enabled) {
2496 switch (Level) {
2497 case XOP:
2498 Features["xop"] = true;
2499 case FMA4:
2500 Features["fma4"] = true;
2501 setSSELevel(Features, AVX, true);
2502 case SSE4A:
2503 Features["sse4a"] = true;
2504 setSSELevel(Features, SSE3, true);
2505 case NoXOP:
2506 break;
2507 }
2508 return;
2509 }
2510
2511 switch (Level) {
2512 case NoXOP:
2513 case SSE4A:
2514 Features["sse4a"] = false;
2515 case FMA4:
2516 Features["fma4"] = false;
2517 case XOP:
2518 Features["xop"] = false;
2519 }
2520}
2521
Craig Topper86d79ef2013-09-17 04:51:29 +00002522void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2523 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002524 // FIXME: This *really* should not be here. We need some way of translating
2525 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002526 if (Name == "sse4")
2527 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002528
Rafael Espindolae62e2792013-08-20 13:44:29 +00002529 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002530
Craig Topper29561122013-09-19 01:13:07 +00002531 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002532 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002533 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002534 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002535 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002536 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002537 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002538 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002539 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002540 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002541 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002542 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002543 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002544 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002545 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002546 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002547 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002548 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002549 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002550 if (Enabled)
2551 setSSELevel(Features, SSE2, Enabled);
2552 } else if (Name == "pclmul") {
2553 if (Enabled)
2554 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002555 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002556 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002557 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002558 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002559 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002560 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002561 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2562 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002563 if (Enabled)
2564 setSSELevel(Features, AVX512F, Enabled);
2565 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002566 if (Enabled)
2567 setSSELevel(Features, AVX, Enabled);
2568 } else if (Name == "fma4") {
2569 setXOPLevel(Features, FMA4, Enabled);
2570 } else if (Name == "xop") {
2571 setXOPLevel(Features, XOP, Enabled);
2572 } else if (Name == "sse4a") {
2573 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002574 } else if (Name == "f16c") {
2575 if (Enabled)
2576 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002577 } else if (Name == "sha") {
2578 if (Enabled)
2579 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002580 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002581}
2582
Eric Christopher3ff21b32013-10-16 21:26:26 +00002583/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002584/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002585bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002586 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002587 // Remember the maximum enabled sselevel.
2588 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2589 // Ignore disabled features.
2590 if (Features[i][0] == '-')
2591 continue;
2592
Benjamin Kramer27402c62012-03-05 15:10:44 +00002593 StringRef Feature = StringRef(Features[i]).substr(1);
2594
2595 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002596 HasAES = true;
2597 continue;
2598 }
2599
Craig Topper3f122a72012-05-31 05:18:48 +00002600 if (Feature == "pclmul") {
2601 HasPCLMUL = true;
2602 continue;
2603 }
2604
Benjamin Kramer27402c62012-03-05 15:10:44 +00002605 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002606 HasLZCNT = true;
2607 continue;
2608 }
2609
Rafael Espindola89049822013-08-23 20:21:37 +00002610 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002611 HasRDRND = true;
2612 continue;
2613 }
2614
Craig Topper8c7f2512014-11-03 06:51:41 +00002615 if (Feature == "fsgsbase") {
2616 HasFSGSBASE = true;
2617 continue;
2618 }
2619
Benjamin Kramer27402c62012-03-05 15:10:44 +00002620 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002621 HasBMI = true;
2622 continue;
2623 }
2624
Benjamin Kramer27402c62012-03-05 15:10:44 +00002625 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002626 HasBMI2 = true;
2627 continue;
2628 }
2629
Benjamin Kramer27402c62012-03-05 15:10:44 +00002630 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002631 HasPOPCNT = true;
2632 continue;
2633 }
2634
Michael Liao625a8752012-11-10 05:17:46 +00002635 if (Feature == "rtm") {
2636 HasRTM = true;
2637 continue;
2638 }
2639
Michael Liao74f4eaf2013-03-26 17:52:08 +00002640 if (Feature == "prfchw") {
2641 HasPRFCHW = true;
2642 continue;
2643 }
2644
Michael Liaoffaae352013-03-29 05:17:55 +00002645 if (Feature == "rdseed") {
2646 HasRDSEED = true;
2647 continue;
2648 }
2649
Robert Khasanov50e6f582014-09-19 09:53:48 +00002650 if (Feature == "adx") {
2651 HasADX = true;
2652 continue;
2653 }
2654
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002655 if (Feature == "tbm") {
2656 HasTBM = true;
2657 continue;
2658 }
2659
Craig Topperbba778b2012-06-03 21:46:30 +00002660 if (Feature == "fma") {
2661 HasFMA = true;
2662 continue;
2663 }
2664
Manman Rena45358c2012-10-11 00:59:55 +00002665 if (Feature == "f16c") {
2666 HasF16C = true;
2667 continue;
2668 }
2669
Craig Topper679b53a2013-08-21 05:29:10 +00002670 if (Feature == "avx512cd") {
2671 HasAVX512CD = true;
2672 continue;
2673 }
2674
2675 if (Feature == "avx512er") {
2676 HasAVX512ER = true;
2677 continue;
2678 }
2679
2680 if (Feature == "avx512pf") {
2681 HasAVX512PF = true;
2682 continue;
2683 }
2684
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002685 if (Feature == "avx512dq") {
2686 HasAVX512DQ = true;
2687 continue;
2688 }
2689
2690 if (Feature == "avx512bw") {
2691 HasAVX512BW = true;
2692 continue;
2693 }
2694
2695 if (Feature == "avx512vl") {
2696 HasAVX512VL = true;
2697 continue;
2698 }
2699
Ben Langmuir58078d02013-09-19 13:22:04 +00002700 if (Feature == "sha") {
2701 HasSHA = true;
2702 continue;
2703 }
2704
Nick Lewycky50e8f482013-10-05 20:14:27 +00002705 if (Feature == "cx16") {
2706 HasCX16 = true;
2707 continue;
2708 }
2709
Daniel Dunbar979586e2009-11-11 09:38:56 +00002710 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002711 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002712 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002713 .Case("avx2", AVX2)
2714 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002715 .Case("sse4.2", SSE42)
2716 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002717 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002718 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002719 .Case("sse2", SSE2)
2720 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002721 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002722 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002723
Eli Friedman33465822011-07-08 23:31:17 +00002724 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002725 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002726 .Case("3dnowa", AMD3DNowAthlon)
2727 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002728 .Case("mmx", MMX)
2729 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002730 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002731
2732 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2733 .Case("xop", XOP)
2734 .Case("fma4", FMA4)
2735 .Case("sse4a", SSE4A)
2736 .Default(NoXOP);
2737 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002738 }
Eli Friedman33465822011-07-08 23:31:17 +00002739
Craig Topper7481d8a2013-09-10 06:55:47 +00002740 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2741 // Can't do this earlier because we need to be able to explicitly enable
2742 // popcnt and still disable sse4.2.
2743 if (!HasPOPCNT && SSELevel >= SSE42 &&
2744 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2745 HasPOPCNT = true;
2746 Features.push_back("+popcnt");
2747 }
2748
Yunzhong Gao61089362013-10-16 19:07:02 +00002749 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2750 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2751 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2752 HasPRFCHW = true;
2753 Features.push_back("+prfchw");
2754 }
2755
Rafael Espindolaeb265472013-08-21 21:59:03 +00002756 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2757 // matches the selected sse level.
2758 if (FPMath == FP_SSE && SSELevel < SSE1) {
2759 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2760 return false;
2761 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2762 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2763 return false;
2764 }
2765
Eli Friedman33465822011-07-08 23:31:17 +00002766 // Don't tell the backend if we're turning off mmx; it will end up disabling
2767 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002768 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2769 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002770 std::vector<std::string>::iterator it;
2771 it = std::find(Features.begin(), Features.end(), "-mmx");
2772 if (it != Features.end())
2773 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002774 else if (SSELevel > NoSSE)
2775 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002776 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002777}
Chris Lattnerecd49032009-03-02 22:27:17 +00002778
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002779/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2780/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002781void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002782 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002783 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002784 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002785 Builder.defineMacro("__amd64__");
2786 Builder.defineMacro("__amd64");
2787 Builder.defineMacro("__x86_64");
2788 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002789 if (getTriple().getArchName() == "x86_64h") {
2790 Builder.defineMacro("__x86_64h");
2791 Builder.defineMacro("__x86_64h__");
2792 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002793 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002794 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002795 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002796
Chris Lattnerecd49032009-03-02 22:27:17 +00002797 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002798 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2799 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002800 switch (CPU) {
2801 case CK_Generic:
2802 break;
2803 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002804 // The rest are coming from the i386 define above.
2805 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002806 break;
2807 case CK_i486:
2808 case CK_WinChipC6:
2809 case CK_WinChip2:
2810 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002811 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002812 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002813 case CK_PentiumMMX:
2814 Builder.defineMacro("__pentium_mmx__");
2815 Builder.defineMacro("__tune_pentium_mmx__");
2816 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002817 case CK_i586:
2818 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002819 defineCPUMacros(Builder, "i586");
2820 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002821 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002822 case CK_Pentium3:
2823 case CK_Pentium3M:
2824 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002825 Builder.defineMacro("__tune_pentium3__");
2826 // Fallthrough
2827 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002828 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002829 Builder.defineMacro("__tune_pentium2__");
2830 // Fallthrough
2831 case CK_PentiumPro:
2832 Builder.defineMacro("__tune_i686__");
2833 Builder.defineMacro("__tune_pentiumpro__");
2834 // Fallthrough
2835 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002836 Builder.defineMacro("__i686");
2837 Builder.defineMacro("__i686__");
2838 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2839 Builder.defineMacro("__pentiumpro");
2840 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002841 break;
2842 case CK_Pentium4:
2843 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002844 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002845 break;
2846 case CK_Yonah:
2847 case CK_Prescott:
2848 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002849 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002850 break;
2851 case CK_Core2:
2852 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002853 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002854 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002855 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002856 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002857 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002858 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002859 defineCPUMacros(Builder, "slm");
2860 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002861 case CK_Nehalem:
2862 case CK_Westmere:
2863 case CK_SandyBridge:
2864 case CK_IvyBridge:
2865 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002866 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002867 // FIXME: Historically, we defined this legacy name, it would be nice to
2868 // remove it at some point. We've never exposed fine-grained names for
2869 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002870 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002871 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002872 case CK_Skylake:
2873 // FIXME: Historically, we defined this legacy name, it would be nice to
2874 // remove it at some point. This is the only fine-grained CPU macro in the
2875 // main intel CPU line, and it would be better to not have these and force
2876 // people to use ISA macros.
2877 defineCPUMacros(Builder, "skx");
2878 break;
Craig Topper449314e2013-08-20 07:09:39 +00002879 case CK_KNL:
2880 defineCPUMacros(Builder, "knl");
2881 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002882 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002883 Builder.defineMacro("__k6_2__");
2884 Builder.defineMacro("__tune_k6_2__");
2885 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002886 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002887 if (CPU != CK_K6_2) { // In case of fallthrough
2888 // FIXME: GCC may be enabling these in cases where some other k6
2889 // architecture is specified but -m3dnow is explicitly provided. The
2890 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002891 Builder.defineMacro("__k6_3__");
2892 Builder.defineMacro("__tune_k6_3__");
2893 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002894 // Fallthrough
2895 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002896 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002897 break;
2898 case CK_Athlon:
2899 case CK_AthlonThunderbird:
2900 case CK_Athlon4:
2901 case CK_AthlonXP:
2902 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002903 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002904 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002905 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002906 Builder.defineMacro("__tune_athlon_sse__");
2907 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002908 break;
2909 case CK_K8:
2910 case CK_K8SSE3:
2911 case CK_x86_64:
2912 case CK_Opteron:
2913 case CK_OpteronSSE3:
2914 case CK_Athlon64:
2915 case CK_Athlon64SSE3:
2916 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002917 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002918 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002919 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002920 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002921 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002922 case CK_BTVER1:
2923 defineCPUMacros(Builder, "btver1");
2924 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002925 case CK_BTVER2:
2926 defineCPUMacros(Builder, "btver2");
2927 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002928 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002929 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002930 break;
2931 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002932 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002933 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002934 case CK_BDVER3:
2935 defineCPUMacros(Builder, "bdver3");
2936 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002937 case CK_BDVER4:
2938 defineCPUMacros(Builder, "bdver4");
2939 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002940 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002941 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002942 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002943 }
Chris Lattner96e43572009-03-02 22:40:39 +00002944
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002945 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002946 Builder.defineMacro("__REGISTER_PREFIX__", "");
2947
Chris Lattner6df41af2009-04-19 17:32:33 +00002948 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2949 // functions in glibc header files that use FP Stack inline asm which the
2950 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002951 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002952
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002953 if (HasAES)
2954 Builder.defineMacro("__AES__");
2955
Craig Topper3f122a72012-05-31 05:18:48 +00002956 if (HasPCLMUL)
2957 Builder.defineMacro("__PCLMUL__");
2958
Craig Topper22967d42011-12-25 05:06:45 +00002959 if (HasLZCNT)
2960 Builder.defineMacro("__LZCNT__");
2961
Benjamin Kramer1e250392012-07-07 09:39:18 +00002962 if (HasRDRND)
2963 Builder.defineMacro("__RDRND__");
2964
Craig Topper8c7f2512014-11-03 06:51:41 +00002965 if (HasFSGSBASE)
2966 Builder.defineMacro("__FSGSBASE__");
2967
Craig Topper22967d42011-12-25 05:06:45 +00002968 if (HasBMI)
2969 Builder.defineMacro("__BMI__");
2970
2971 if (HasBMI2)
2972 Builder.defineMacro("__BMI2__");
2973
Craig Topper1de83482011-12-29 16:10:46 +00002974 if (HasPOPCNT)
2975 Builder.defineMacro("__POPCNT__");
2976
Michael Liao625a8752012-11-10 05:17:46 +00002977 if (HasRTM)
2978 Builder.defineMacro("__RTM__");
2979
Michael Liao74f4eaf2013-03-26 17:52:08 +00002980 if (HasPRFCHW)
2981 Builder.defineMacro("__PRFCHW__");
2982
Michael Liaoffaae352013-03-29 05:17:55 +00002983 if (HasRDSEED)
2984 Builder.defineMacro("__RDSEED__");
2985
Robert Khasanov50e6f582014-09-19 09:53:48 +00002986 if (HasADX)
2987 Builder.defineMacro("__ADX__");
2988
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002989 if (HasTBM)
2990 Builder.defineMacro("__TBM__");
2991
Rafael Espindolae62e2792013-08-20 13:44:29 +00002992 switch (XOPLevel) {
2993 case XOP:
2994 Builder.defineMacro("__XOP__");
2995 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002996 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002997 case SSE4A:
2998 Builder.defineMacro("__SSE4A__");
2999 case NoXOP:
3000 break;
3001 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003002
Craig Topperbba778b2012-06-03 21:46:30 +00003003 if (HasFMA)
3004 Builder.defineMacro("__FMA__");
3005
Manman Rena45358c2012-10-11 00:59:55 +00003006 if (HasF16C)
3007 Builder.defineMacro("__F16C__");
3008
Craig Topper679b53a2013-08-21 05:29:10 +00003009 if (HasAVX512CD)
3010 Builder.defineMacro("__AVX512CD__");
3011 if (HasAVX512ER)
3012 Builder.defineMacro("__AVX512ER__");
3013 if (HasAVX512PF)
3014 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003015 if (HasAVX512DQ)
3016 Builder.defineMacro("__AVX512DQ__");
3017 if (HasAVX512BW)
3018 Builder.defineMacro("__AVX512BW__");
3019 if (HasAVX512VL)
3020 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003021
Ben Langmuir58078d02013-09-19 13:22:04 +00003022 if (HasSHA)
3023 Builder.defineMacro("__SHA__");
3024
Nick Lewycky50e8f482013-10-05 20:14:27 +00003025 if (HasCX16)
3026 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3027
Chris Lattner96e43572009-03-02 22:40:39 +00003028 // Each case falls through to the previous one here.
3029 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003030 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003031 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003032 case AVX2:
3033 Builder.defineMacro("__AVX2__");
3034 case AVX:
3035 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003036 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003037 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003038 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003039 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003040 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003041 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003042 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003043 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003044 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003045 Builder.defineMacro("__SSE2__");
3046 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003047 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003048 Builder.defineMacro("__SSE__");
3049 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003050 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003051 break;
3052 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003053
Derek Schuffc7dd7222012-10-11 15:52:22 +00003054 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003055 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003056 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003057 case AVX2:
3058 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003059 case SSE42:
3060 case SSE41:
3061 case SSSE3:
3062 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003063 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003064 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003065 break;
3066 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003067 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003068 break;
3069 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003070 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003071 }
3072 }
3073
Anders Carlssone437c682010-01-27 03:47:49 +00003074 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003075 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003076 case AMD3DNowAthlon:
3077 Builder.defineMacro("__3dNOW_A__");
3078 case AMD3DNow:
3079 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003080 case MMX:
3081 Builder.defineMacro("__MMX__");
3082 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003083 break;
3084 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003085
3086 if (CPU >= CK_i486) {
3087 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3088 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3089 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3090 }
3091 if (CPU >= CK_i586)
3092 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003093}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003094
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003095bool X86TargetInfo::hasFeature(StringRef Feature) const {
3096 return llvm::StringSwitch<bool>(Feature)
3097 .Case("aes", HasAES)
3098 .Case("avx", SSELevel >= AVX)
3099 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003100 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003101 .Case("avx512cd", HasAVX512CD)
3102 .Case("avx512er", HasAVX512ER)
3103 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003104 .Case("avx512dq", HasAVX512DQ)
3105 .Case("avx512bw", HasAVX512BW)
3106 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003107 .Case("bmi", HasBMI)
3108 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003109 .Case("cx16", HasCX16)
3110 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003111 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003112 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003113 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003114 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003115 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3116 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3117 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003118 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003119 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003120 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003121 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003122 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003123 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003124 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003125 .Case("sse", SSELevel >= SSE1)
3126 .Case("sse2", SSELevel >= SSE2)
3127 .Case("sse3", SSELevel >= SSE3)
3128 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003129 .Case("sse4.1", SSELevel >= SSE41)
3130 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003131 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003132 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003133 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003134 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3135 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003136 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003137 .Default(false);
3138}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003139
Eli Friedman3fd920a2008-08-20 02:34:37 +00003140bool
Anders Carlsson58436352009-02-28 17:11:49 +00003141X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003142 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003143 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003144 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003145 case 'I':
3146 Info.setRequiresImmediate(0, 31);
3147 return true;
3148 case 'J':
3149 Info.setRequiresImmediate(0, 63);
3150 return true;
3151 case 'K':
3152 Info.setRequiresImmediate(-128, 127);
3153 return true;
3154 case 'L':
3155 // FIXME: properly analyze this constraint:
3156 // must be one of 0xff, 0xffff, or 0xffffffff
3157 return true;
3158 case 'M':
3159 Info.setRequiresImmediate(0, 3);
3160 return true;
3161 case 'N':
3162 Info.setRequiresImmediate(0, 255);
3163 return true;
3164 case 'O':
3165 Info.setRequiresImmediate(0, 127);
3166 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003167 case 'Y': // first letter of a pair:
3168 switch (*(Name+1)) {
3169 default: return false;
3170 case '0': // First SSE register.
3171 case 't': // Any SSE register, when SSE2 is enabled.
3172 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3173 case 'm': // any MMX register, when inter-unit moves enabled.
3174 break; // falls through to setAllowsRegister.
3175 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003176 case 'f': // any x87 floating point stack register.
3177 // Constraint 'f' cannot be used for output operands.
3178 if (Info.ConstraintStr[0] == '=')
3179 return false;
3180
3181 Info.setAllowsRegister();
3182 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003183 case 'a': // eax.
3184 case 'b': // ebx.
3185 case 'c': // ecx.
3186 case 'd': // edx.
3187 case 'S': // esi.
3188 case 'D': // edi.
3189 case 'A': // edx:eax.
3190 case 't': // top of floating point stack.
3191 case 'u': // second from top of floating point stack.
3192 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003193 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003194 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003195 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003196 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3197 case 'l': // "Index" registers: any general register that can be used as an
3198 // index in a base+index memory access.
3199 Info.setAllowsRegister();
3200 return true;
3201 case 'C': // SSE floating point constant.
3202 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003203 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003204 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003205 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003206 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003207 return true;
3208 }
3209}
3210
Akira Hatanaka974131e2014-09-18 18:17:18 +00003211bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3212 unsigned Size) const {
3213 // Strip off constraint modifiers.
3214 while (Constraint[0] == '=' ||
3215 Constraint[0] == '+' ||
3216 Constraint[0] == '&')
3217 Constraint = Constraint.substr(1);
3218
3219 return validateOperandSize(Constraint, Size);
3220}
3221
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003222bool X86TargetInfo::validateInputSize(StringRef Constraint,
3223 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003224 return validateOperandSize(Constraint, Size);
3225}
3226
3227bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3228 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003229 switch (Constraint[0]) {
3230 default: break;
3231 case 'y':
3232 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003233 case 'f':
3234 case 't':
3235 case 'u':
3236 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003237 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003238 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003239 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003240 }
3241
3242 return true;
3243}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003244
Eli Friedman3fd920a2008-08-20 02:34:37 +00003245std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003246X86TargetInfo::convertConstraint(const char *&Constraint) const {
3247 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003248 case 'a': return std::string("{ax}");
3249 case 'b': return std::string("{bx}");
3250 case 'c': return std::string("{cx}");
3251 case 'd': return std::string("{dx}");
3252 case 'S': return std::string("{si}");
3253 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003254 case 'p': // address
3255 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003256 case 't': // top of floating point stack.
3257 return std::string("{st}");
3258 case 'u': // second from top of floating point stack.
3259 return std::string("{st(1)}"); // second from top of floating point stack.
3260 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003261 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003262 }
3263}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003264} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003265
3266namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003267// X86-32 generic target
3268class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003269public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003270 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003271 DoubleAlign = LongLongAlign = 32;
3272 LongDoubleWidth = 96;
3273 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003274 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003275 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003276 SizeType = UnsignedInt;
3277 PtrDiffType = SignedInt;
3278 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003279 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003280
3281 // Use fpret for all types.
3282 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3283 (1 << TargetInfo::Double) |
3284 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003285
3286 // x86-32 has atomics up to 8 bytes
3287 // FIXME: Check that we actually have cmpxchg8b before setting
3288 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3289 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003290 }
Craig Topper3164f332014-03-11 03:39:26 +00003291 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003292 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003293 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003294
Craig Topper3164f332014-03-11 03:39:26 +00003295 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003296 if (RegNo == 0) return 0;
3297 if (RegNo == 1) return 2;
3298 return -1;
3299 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003300 bool validateOperandSize(StringRef Constraint,
3301 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003302 switch (Constraint[0]) {
3303 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003304 case 'R':
3305 case 'q':
3306 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003307 case 'a':
3308 case 'b':
3309 case 'c':
3310 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003311 case 'S':
3312 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003313 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003314 case 'A':
3315 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003316 }
3317
Akira Hatanaka974131e2014-09-18 18:17:18 +00003318 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003319 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003320};
3321} // end anonymous namespace
3322
3323namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003324class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3325public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003326 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3327 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003328
Craig Topper3164f332014-03-11 03:39:26 +00003329 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003330 unsigned Major, Minor, Micro;
3331 getTriple().getOSVersion(Major, Minor, Micro);
3332 // New NetBSD uses the default rounding mode.
3333 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3334 return X86_32TargetInfo::getFloatEvalMethod();
3335 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003336 return 1;
3337 }
3338};
3339} // end anonymous namespace
3340
3341namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003342class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3343public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003344 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3345 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003346 SizeType = UnsignedLong;
3347 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003348 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003349 }
3350};
3351} // end anonymous namespace
3352
3353namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003354class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3355public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003356 BitrigI386TargetInfo(const llvm::Triple &Triple)
3357 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003358 SizeType = UnsignedLong;
3359 IntPtrType = SignedLong;
3360 PtrDiffType = SignedLong;
3361 }
3362};
3363} // end anonymous namespace
3364
3365namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003366class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003367public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003368 DarwinI386TargetInfo(const llvm::Triple &Triple)
3369 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003370 LongDoubleWidth = 128;
3371 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003372 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003373 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003374 SizeType = UnsignedLong;
3375 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003376 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003377 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003378 }
3379
Eli Friedman3fd920a2008-08-20 02:34:37 +00003380};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003381} // end anonymous namespace
3382
3383namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003384// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003385class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003386public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003387 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3388 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003389 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003390 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003391 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003392 }
Craig Topper3164f332014-03-11 03:39:26 +00003393 void getTargetDefines(const LangOptions &Opts,
3394 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003395 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3396 }
3397};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003398
3399// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003400class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003401public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003402 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003403 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003404 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003405 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3406 }
Craig Topper3164f332014-03-11 03:39:26 +00003407 void getTargetDefines(const LangOptions &Opts,
3408 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003409 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3410 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3411 // The value of the following reflects processor type.
3412 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3413 // We lost the original triple, so we use the default.
3414 Builder.defineMacro("_M_IX86", "600");
3415 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003416};
3417} // end anonymous namespace
3418
Reid Kleckner47606832014-04-21 20:58:00 +00003419static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3420 Builder.defineMacro("__MSVCRT__");
3421 Builder.defineMacro("__MINGW32__");
3422
3423 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3424 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3425 // macro anyway for pre-processor compatibility.
3426 if (Opts.MicrosoftExt)
3427 Builder.defineMacro("__declspec", "__declspec");
3428 else
3429 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3430
3431 if (!Opts.MicrosoftExt) {
3432 // Provide macros for all the calling convention keywords. Provide both
3433 // single and double underscore prefixed variants. These are available on
3434 // x64 as well as x86, even though they have no effect.
3435 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3436 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003437 std::string GCCSpelling = "__attribute__((__";
3438 GCCSpelling += CC;
3439 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003440 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3441 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3442 }
3443 }
3444}
3445
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003446namespace {
3447// x86-32 MinGW target
3448class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3449public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003450 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3451 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003452 void getTargetDefines(const LangOptions &Opts,
3453 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003454 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003455 DefineStd(Builder, "WIN32", Opts);
3456 DefineStd(Builder, "WINNT", Opts);
3457 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003458 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003459 }
3460};
3461} // end anonymous namespace
3462
3463namespace {
3464// x86-32 Cygwin target
3465class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3466public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003467 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3468 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003469 TLSSupported = false;
3470 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003471 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003472 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003473 }
Craig Topper3164f332014-03-11 03:39:26 +00003474 void getTargetDefines(const LangOptions &Opts,
3475 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003476 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003477 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003478 Builder.defineMacro("__CYGWIN__");
3479 Builder.defineMacro("__CYGWIN32__");
3480 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003481 if (Opts.CPlusPlus)
3482 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003483 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003484};
3485} // end anonymous namespace
3486
3487namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003488// x86-32 Haiku target
3489class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3490public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003491 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003492 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003493 IntPtrType = SignedLong;
3494 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003495 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003496 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003497 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003498 }
Craig Topper3164f332014-03-11 03:39:26 +00003499 void getTargetDefines(const LangOptions &Opts,
3500 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003501 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3502 Builder.defineMacro("__INTEL__");
3503 Builder.defineMacro("__HAIKU__");
3504 }
3505};
3506} // end anonymous namespace
3507
Douglas Gregor9fabd852011-07-01 22:41:14 +00003508// RTEMS Target
3509template<typename Target>
3510class RTEMSTargetInfo : public OSTargetInfo<Target> {
3511protected:
Craig Topper3164f332014-03-11 03:39:26 +00003512 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3513 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003514 // RTEMS defines; list based off of gcc output
3515
Douglas Gregor9fabd852011-07-01 22:41:14 +00003516 Builder.defineMacro("__rtems__");
3517 Builder.defineMacro("__ELF__");
3518 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003519
Douglas Gregor9fabd852011-07-01 22:41:14 +00003520public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003521 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3522 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003523
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003524 switch (Triple.getArch()) {
3525 default:
3526 case llvm::Triple::x86:
3527 // this->MCountName = ".mcount";
3528 break;
3529 case llvm::Triple::mips:
3530 case llvm::Triple::mipsel:
3531 case llvm::Triple::ppc:
3532 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003533 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003534 // this->MCountName = "_mcount";
3535 break;
3536 case llvm::Triple::arm:
3537 // this->MCountName = "__mcount";
3538 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003539 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003540 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003541};
3542
3543namespace {
3544// x86-32 RTEMS target
3545class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3546public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003547 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003548 SizeType = UnsignedLong;
3549 IntPtrType = SignedLong;
3550 PtrDiffType = SignedLong;
3551 this->UserLabelPrefix = "";
3552 }
Craig Topper3164f332014-03-11 03:39:26 +00003553 void getTargetDefines(const LangOptions &Opts,
3554 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003555 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3556 Builder.defineMacro("__INTEL__");
3557 Builder.defineMacro("__rtems__");
3558 }
3559};
3560} // end anonymous namespace
3561
Chris Lattnerb986aba2010-04-11 19:29:39 +00003562namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003563// x86-64 generic target
3564class X86_64TargetInfo : public X86TargetInfo {
3565public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003566 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003567 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003568 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003569 LongDoubleWidth = 128;
3570 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003571 LargeArrayMinWidth = 128;
3572 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003573 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003574 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3575 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3576 IntPtrType = IsX32 ? SignedInt : SignedLong;
3577 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003578 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003579 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003580
Eric Christopher917e9522014-11-18 22:36:15 +00003581 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003582 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003583 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3584 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003585
3586 // Use fpret only for long double.
3587 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003588
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003589 // Use fp2ret for _Complex long double.
3590 ComplexLongDoubleUsesFP2Ret = true;
3591
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003592 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003593 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003594 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003595 }
Craig Topper3164f332014-03-11 03:39:26 +00003596 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003597 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003598 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003599
Craig Topper3164f332014-03-11 03:39:26 +00003600 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003601 if (RegNo == 0) return 0;
3602 if (RegNo == 1) return 1;
3603 return -1;
3604 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003605
Craig Topper3164f332014-03-11 03:39:26 +00003606 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003607 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003608 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003609 CC == CC_IntelOclBicc ||
3610 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003611 }
3612
Craig Topper3164f332014-03-11 03:39:26 +00003613 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003614 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003615 }
3616
Pavel Chupinfd223e12014-08-04 12:39:43 +00003617 // for x32 we need it here explicitly
3618 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003619};
3620} // end anonymous namespace
3621
3622namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003623// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003624class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003625public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003626 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3627 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003628 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003629 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003630 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003631 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003632 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003633 SizeType = UnsignedLongLong;
3634 PtrDiffType = SignedLongLong;
3635 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003636 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003637 }
Craig Topper3164f332014-03-11 03:39:26 +00003638 void getTargetDefines(const LangOptions &Opts,
3639 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003640 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003641 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003642 }
Craig Topper3164f332014-03-11 03:39:26 +00003643 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003644 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003645 }
Craig Topper3164f332014-03-11 03:39:26 +00003646 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003647 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003648 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003649 CC == CC_IntelOclBicc ||
3650 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3651 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003652};
3653} // end anonymous namespace
3654
3655namespace {
3656// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003657class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003658public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003659 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003660 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003661 LongDoubleWidth = LongDoubleAlign = 64;
3662 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003663 }
Craig Topper3164f332014-03-11 03:39:26 +00003664 void getTargetDefines(const LangOptions &Opts,
3665 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003666 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3667 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003668 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003669 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003670 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003671};
3672} // end anonymous namespace
3673
3674namespace {
3675// x86-64 MinGW target
3676class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3677public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003678 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3679 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003680 void getTargetDefines(const LangOptions &Opts,
3681 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003682 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003683 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003684 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003685 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003686
3687 // GCC defines this macro when it is using __gxx_personality_seh0.
3688 if (!Opts.SjLjExceptions)
3689 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003690 }
3691};
3692} // end anonymous namespace
3693
3694namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003695class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3696public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003697 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3698 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003699 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003700 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003701 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3702 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003703 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003704 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003705 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003706 }
3707};
3708} // end anonymous namespace
3709
3710namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003711class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3712public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003713 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3714 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003715 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003716 Int64Type = SignedLongLong;
3717 }
3718};
3719} // end anonymous namespace
3720
3721namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003722class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3723public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003724 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3725 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3726 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003727 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003728 }
3729};
Tim Northover9bb857a2013-01-31 12:13:10 +00003730}
3731
Eli Friedman9fa28852012-08-08 23:57:20 +00003732
3733namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003734class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003735 // Possible FPU choices.
3736 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003737 VFP2FPU = (1 << 0),
3738 VFP3FPU = (1 << 1),
3739 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003740 NeonFPU = (1 << 3),
3741 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003742 };
3743
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003744 // Possible HWDiv features.
3745 enum HWDivMode {
3746 HWDivThumb = (1 << 0),
3747 HWDivARM = (1 << 1)
3748 };
3749
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003750 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003751 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003752 }
3753
3754 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3755 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003756
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003757 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003758
Rafael Espindolaeb265472013-08-21 21:59:03 +00003759 enum {
3760 FP_Default,
3761 FP_VFP,
3762 FP_Neon
3763 } FPMath;
3764
Bernard Ogdenda13af32013-10-24 18:32:51 +00003765 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003766
Logan Chien57086ce2012-10-10 06:56:20 +00003767 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003768 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003769 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003770
3771 // Initialized via features.
3772 unsigned SoftFloat : 1;
3773 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003774
Bernard Ogden18b57012013-10-29 09:47:51 +00003775 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003776 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003777
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003778 // ACLE 6.5.1 Hardware floating point
3779 enum {
3780 HW_FP_HP = (1 << 1), /// half (16-bit)
3781 HW_FP_SP = (1 << 2), /// single (32-bit)
3782 HW_FP_DP = (1 << 3), /// double (64-bit)
3783 };
3784 uint32_t HW_FP;
3785
Chris Lattner5cc15e02010-03-03 19:03:45 +00003786 static const Builtin::Info BuiltinInfo[];
3787
Rafael Espindola101d5b92013-05-13 20:09:47 +00003788 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003789 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003790 if (T.getArch() == llvm::Triple::arm ||
3791 T.getArch() == llvm::Triple::armeb) {
3792 StringRef VersionStr;
3793 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003794 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003795 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003796 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003797 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003798 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003799 unsigned Version;
3800 if (VersionStr.getAsInteger(10, Version))
3801 return false;
3802 return Version >= 6;
3803 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003804 assert(T.getArch() == llvm::Triple::thumb ||
3805 T.getArch() == llvm::Triple::thumbeb);
3806 StringRef VersionStr;
3807 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003808 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003809 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003810 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003811 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003812 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003813 unsigned Version;
3814 if (VersionStr.getAsInteger(10, Version))
3815 return false;
3816 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003817 }
3818
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003819 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003820 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003821
3822 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003823 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003824
Tim Northover00853e52014-08-05 11:07:26 +00003825 // size_t is unsigned long on MachO-derived environments and NetBSD.
3826 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003827 SizeType = UnsignedLong;
3828 else
3829 SizeType = UnsignedInt;
3830
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003831 switch (T.getOS()) {
3832 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003833 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003834 break;
3835 case llvm::Triple::Win32:
3836 WCharType = UnsignedShort;
3837 break;
3838 case llvm::Triple::Linux:
3839 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003840 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3841 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003842 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003843 }
3844
3845 UseBitFieldTypeAlignment = true;
3846
3847 ZeroLengthBitfieldBoundary = 0;
3848
Tim Northover147cd2f2014-10-14 22:12:21 +00003849 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3850 // so set preferred for small types to 32.
3851 if (T.isOSBinFormatMachO()) {
3852 DescriptionString =
3853 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3854 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3855 } else if (T.isOSWindows()) {
3856 // FIXME: this is invalid for WindowsCE
3857 assert(!BigEndian && "Windows on ARM does not support big endian");
3858 DescriptionString = "e"
3859 "-m:e"
3860 "-p:32:32"
3861 "-i64:64"
3862 "-v128:64:128"
3863 "-a:0:32"
3864 "-n32"
3865 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003866 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003867 DescriptionString =
3868 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3869 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003870 }
3871
3872 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003873 }
3874
3875 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003876 const llvm::Triple &T = getTriple();
3877
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003878 IsAAPCS = false;
3879
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003880 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003881
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003882 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003883 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003884 SizeType = UnsignedInt;
3885 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003886 SizeType = UnsignedLong;
3887
3888 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3889 WCharType = SignedInt;
3890
3891 // Do not respect the alignment of bit-field types when laying out
3892 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3893 UseBitFieldTypeAlignment = false;
3894
3895 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3896 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3897 /// gcc.
3898 ZeroLengthBitfieldBoundary = 32;
3899
Tim Northover147cd2f2014-10-14 22:12:21 +00003900 if (T.isOSBinFormatMachO())
3901 DescriptionString =
3902 BigEndian
3903 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3904 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3905 else
3906 DescriptionString =
3907 BigEndian
3908 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3909 : "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 +00003910
3911 // FIXME: Override "preferred align" for double and long long.
3912 }
3913
Chris Lattner17df24e2008-04-21 18:56:49 +00003914public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003915 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003916 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003917 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003918 BigEndian = IsBigEndian;
3919
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003920 switch (getTriple().getOS()) {
3921 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003922 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003923 break;
3924 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003925 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003926 break;
3927 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003928
Chris Lattner1a8f3942010-04-23 16:29:58 +00003929 // {} in inline assembly are neon specifiers, not assembly variant
3930 // specifiers.
3931 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003932
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003933 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003934 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003935
Eric Christopher0e261882014-12-05 01:06:59 +00003936 // FIXME: This duplicates code from the driver that sets the -target-abi
3937 // option - this code is used if -target-abi isn't passed and should
3938 // be unified in some way.
3939 if (Triple.isOSBinFormatMachO()) {
3940 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3941 // the frontend matches that.
3942 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3943 Triple.getOS() == llvm::Triple::UnknownOS ||
3944 StringRef(CPU).startswith("cortex-m")) {
3945 setABI("aapcs");
3946 } else {
3947 setABI("apcs-gnu");
3948 }
3949 } else if (Triple.isOSWindows()) {
3950 // FIXME: this is invalid for WindowsCE
3951 setABI("aapcs");
3952 } else {
3953 // Select the default based on the platform.
3954 switch (Triple.getEnvironment()) {
3955 case llvm::Triple::Android:
3956 case llvm::Triple::GNUEABI:
3957 case llvm::Triple::GNUEABIHF:
3958 setABI("aapcs-linux");
3959 break;
3960 case llvm::Triple::EABIHF:
3961 case llvm::Triple::EABI:
3962 setABI("aapcs");
3963 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00003964 case llvm::Triple::GNU:
3965 setABI("apcs-gnu");
3966 break;
Eric Christopher0e261882014-12-05 01:06:59 +00003967 default:
3968 if (Triple.getOS() == llvm::Triple::NetBSD)
3969 setABI("apcs-gnu");
3970 else
3971 setABI("aapcs");
3972 break;
3973 }
3974 }
John McCall86353412010-08-21 22:46:04 +00003975
3976 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003977 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003978
3979 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003980 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003981 if (shouldUseInlineAtomic(getTriple()))
3982 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003983
3984 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00003985 // the alignment of the zero-length bitfield is greater than the member
3986 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00003987 // zero length bitfield.
3988 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003989 }
Alp Toker4925ba72014-06-07 23:30:42 +00003990 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003991 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003992 ABI = Name;
3993
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003994 // The defaults (above) are for AAPCS, check if we need to change them.
3995 //
3996 // FIXME: We need support for -meabi... we could just mangle it into the
3997 // name.
3998 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003999 setABIAPCS();
4000 return true;
4001 }
4002 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4003 setABIAAPCS();
4004 return true;
4005 }
4006 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004007 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004008
Craig Topper3164f332014-03-11 03:39:26 +00004009 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004010 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004011 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4012 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004013 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004014 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004015 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004016 }
4017 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004018 Features["vfp4"] = true;
4019 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004020 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4021 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004022 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004023 Features["vfp4"] = true;
4024 Features["neon"] = true;
4025 Features["hwdiv"] = true;
4026 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004027 } else if (CPU == "cyclone") {
4028 Features["v8fp"] = true;
4029 Features["neon"] = true;
4030 Features["hwdiv"] = true;
4031 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00004032 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
4033 Features["fp-armv8"] = true;
4034 Features["neon"] = true;
4035 Features["hwdiv"] = true;
4036 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004037 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004038 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004039 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004040 // Enable the hwdiv extension for all v8a AArch32 cores by
4041 // default.
4042 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004043 ArchName == "armebv8a" || ArchName == "armebv8" ||
4044 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4045 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004046 Features["hwdiv"] = true;
4047 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00004048 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004049 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004050 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004051 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004052
Craig Topper3164f332014-03-11 03:39:26 +00004053 bool handleTargetFeatures(std::vector<std::string> &Features,
4054 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004055 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004056 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004057 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004058 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004059 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004060
4061 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004062 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004063 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004064 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004065 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004066 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004067 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004068 HW_FP = HW_FP_SP | HW_FP_DP;
4069 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004070 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004071 HW_FP = HW_FP_SP | HW_FP_DP;
4072 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004073 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004074 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4075 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004076 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004077 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4078 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004079 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004080 HW_FP = HW_FP_SP | HW_FP_DP;
4081 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004082 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004083 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004084 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004085 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004086 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004087 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004088 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004089 } else if (Feature == "+fp-only-sp") {
4090 HW_FP &= ~HW_FP_DP;
4091 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004092 }
4093
Rafael Espindolaeb265472013-08-21 21:59:03 +00004094 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4095 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4096 return false;
4097 }
4098
4099 if (FPMath == FP_Neon)
4100 Features.push_back("+neonfp");
4101 else if (FPMath == FP_VFP)
4102 Features.push_back("-neonfp");
4103
Daniel Dunbar893d4752009-12-19 04:15:38 +00004104 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004105 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4106 for (const auto &FEFeature : FrontEndFeatures) {
4107 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4108 if (Feature != Features.end())
4109 Features.erase(Feature);
4110 }
4111
Rafael Espindolaeb265472013-08-21 21:59:03 +00004112 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004113 }
4114
Craig Topper3164f332014-03-11 03:39:26 +00004115 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004116 return llvm::StringSwitch<bool>(Feature)
4117 .Case("arm", true)
4118 .Case("softfloat", SoftFloat)
4119 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004120 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004121 .Case("hwdiv", HWDiv & HWDivThumb)
4122 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004123 .Default(false);
4124 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004125 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004126 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004127 return llvm::StringSwitch<const char *>(Name)
4128 .Cases("arm8", "arm810", "4")
4129 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4130 "4")
4131 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4132 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4133 .Case("ep9312", "4T")
4134 .Cases("arm10tdmi", "arm1020t", "5T")
4135 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4136 .Case("arm926ej-s", "5TEJ")
4137 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4138 .Cases("xscale", "iwmmxt", "5TE")
4139 .Case("arm1136j-s", "6J")
4140 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4141 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4142 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4143 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4144 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4145 "7A")
4146 .Cases("cortex-r4", "cortex-r5", "7R")
4147 .Case("swift", "7S")
4148 .Case("cyclone", "8A")
4149 .Case("cortex-m3", "7M")
4150 .Cases("cortex-m4", "cortex-m7", "7EM")
4151 .Case("cortex-m0", "6M")
4152 .Cases("cortex-a53", "cortex-a57", "8A")
4153 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004154 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004155 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004156 return llvm::StringSwitch<const char *>(Name)
4157 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4158 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4159 "A")
4160 .Cases("cortex-a53", "cortex-a57", "A")
4161 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
4162 .Cases("cortex-r4", "cortex-r5", "R")
4163 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004164 }
Craig Topper3164f332014-03-11 03:39:26 +00004165 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004166 if (!getCPUDefineSuffix(Name))
4167 return false;
4168
Tim Northovere8c37212014-07-09 09:24:43 +00004169 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4170 StringRef Profile = getCPUProfile(Name);
4171 if (Profile == "M" && MaxAtomicInlineWidth) {
4172 MaxAtomicPromoteWidth = 32;
4173 MaxAtomicInlineWidth = 32;
4174 }
4175
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004176 CPU = Name;
4177 return true;
4178 }
Craig Topper3164f332014-03-11 03:39:26 +00004179 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004180 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4181 unsigned CPUArchVer) const {
4182 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4183 (CPUArch.find('M') != StringRef::npos);
4184 }
4185 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4186 unsigned CPUArchVer) const {
4187 // We check both CPUArchVer and ArchName because when only triple is
4188 // specified, the default CPU is arm1136j-s.
4189 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4190 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4191 }
Craig Topper3164f332014-03-11 03:39:26 +00004192 void getTargetDefines(const LangOptions &Opts,
4193 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004194 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004195 Builder.defineMacro("__arm");
4196 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004197
Chris Lattnerecd49032009-03-02 22:27:17 +00004198 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004199 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004200
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004201 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004202 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004203 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004204 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004205 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004206
4207 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004208 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004209 StringRef ArchName = getTriple().getArchName();
4210
4211 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4212 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004213 if (CPUArch[0] >= '8') {
4214 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4215 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004216 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004217
4218 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4219 // is not defined for the M-profile.
4220 // NOTE that the deffault profile is assumed to be 'A'
4221 if (CPUProfile.empty() || CPUProfile != "M")
4222 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4223
4224 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4225 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4226 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4227 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4228 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4229 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4230 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4231
4232 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4233 // instruction set such as ARM or Thumb.
4234 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4235
4236 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4237
4238 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004239 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004240 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004241
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004242 // ACLE 6.5.1 Hardware Floating Point
4243 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004244 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004245
Yi Konga44c4d72014-06-27 21:25:42 +00004246 // ACLE predefines.
4247 Builder.defineMacro("__ARM_ACLE", "200");
4248
Mike Stump9d54bd72009-04-08 02:07:04 +00004249 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004250
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004251 // FIXME: It's more complicated than this and we don't really support
4252 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004253 // Windows on ARM does not "support" interworking
4254 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004255 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004256
David Tweed8f676532012-10-25 13:33:01 +00004257 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004258 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004259 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4260 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004261 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004262 Builder.defineMacro("__ARM_PCS", "1");
4263
David Tweed8f676532012-10-25 13:33:01 +00004264 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004265 Builder.defineMacro("__ARM_PCS_VFP", "1");
4266 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004267
Daniel Dunbar893d4752009-12-19 04:15:38 +00004268 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004269 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004270
4271 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004272 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004273
4274 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004275 Builder.defineMacro("__THUMBEL__");
4276 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004277 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004278 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004279 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004280 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4281 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004282
4283 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004284 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004285
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004286 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004287 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004288 if (FPU & VFP2FPU)
4289 Builder.defineMacro("__ARM_VFPV2__");
4290 if (FPU & VFP3FPU)
4291 Builder.defineMacro("__ARM_VFPV3__");
4292 if (FPU & VFP4FPU)
4293 Builder.defineMacro("__ARM_VFPV4__");
4294 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004295
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004296 // This only gets set when Neon instructions are actually available, unlike
4297 // the VFP define, hence the soft float and arch check. This is subtly
4298 // different from gcc, we follow the intent which was that it should be set
4299 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004300 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4301 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004302 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004303 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004304
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004305 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4306 Opts.ShortWChar ? "2" : "4");
4307
4308 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4309 Opts.ShortEnums ? "1" : "4");
4310
Bernard Ogden18b57012013-10-29 09:47:51 +00004311 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004312 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004313
Tim Northover02e38602014-02-03 17:28:04 +00004314 if (Crypto)
4315 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4316
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004317 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004318 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4319 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4320 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4321 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4322 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004323
4324 bool is5EOrAbove = (CPUArchVer >= 6 ||
4325 (CPUArchVer == 5 &&
4326 CPUArch.find('E') != StringRef::npos));
4327 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4328 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4329 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004330 }
Craig Topper3164f332014-03-11 03:39:26 +00004331 void getTargetBuiltins(const Builtin::Info *&Records,
4332 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004333 Records = BuiltinInfo;
4334 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004335 }
Craig Topper3164f332014-03-11 03:39:26 +00004336 bool isCLZForZeroUndef() const override { return false; }
4337 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004338 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004339 }
Craig Topper3164f332014-03-11 03:39:26 +00004340 void getGCCRegNames(const char * const *&Names,
4341 unsigned &NumNames) const override;
4342 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4343 unsigned &NumAliases) const override;
4344 bool validateAsmConstraint(const char *&Name,
4345 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004346 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004347 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004348 case 'l': // r0-r7
4349 case 'h': // r8-r15
4350 case 'w': // VFP Floating point register single precision
4351 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004352 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004353 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004354 case 'I':
4355 case 'J':
4356 case 'K':
4357 case 'L':
4358 case 'M':
4359 // FIXME
4360 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004361 case 'Q': // A memory address that is a single base register.
4362 Info.setAllowsMemory();
4363 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004364 case 'U': // a memory reference...
4365 switch (Name[1]) {
4366 case 'q': // ...ARMV4 ldrsb
4367 case 'v': // ...VFP load/store (reg+constant offset)
4368 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004369 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004370 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004371 case 'n': // valid address for Neon doubleword vector load/store
4372 case 'm': // valid address for Neon element and structure load/store
4373 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004374 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004375 Info.setAllowsMemory();
4376 Name++;
4377 return true;
4378 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004379 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004380 return false;
4381 }
Craig Topper3164f332014-03-11 03:39:26 +00004382 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004383 std::string R;
4384 switch (*Constraint) {
4385 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004386 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004387 Constraint++;
4388 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004389 case 'p': // 'p' should be translated to 'r' by default.
4390 R = std::string("r");
4391 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004392 default:
4393 return std::string(1, *Constraint);
4394 }
4395 return R;
4396 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004397 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004398 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004399 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004400 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004401 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004402
Bill Wendling9d1ee112012-10-25 23:28:48 +00004403 // Strip off constraint modifiers.
4404 while (Constraint[0] == '=' ||
4405 Constraint[0] == '+' ||
4406 Constraint[0] == '&')
4407 Constraint = Constraint.substr(1);
4408
4409 switch (Constraint[0]) {
4410 default: break;
4411 case 'r': {
4412 switch (Modifier) {
4413 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004414 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004415 case 'q':
4416 // A register of size 32 cannot fit a vector type.
4417 return false;
4418 }
4419 }
4420 }
4421
4422 return true;
4423 }
Craig Topper3164f332014-03-11 03:39:26 +00004424 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004425 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004426 return "";
4427 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004428
Craig Topper3164f332014-03-11 03:39:26 +00004429 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004430 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4431 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004432
Craig Topper3164f332014-03-11 03:39:26 +00004433 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004434 if (RegNo == 0) return 0;
4435 if (RegNo == 1) return 1;
4436 return -1;
4437 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004438};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004439
Rafael Espindolaeb265472013-08-21 21:59:03 +00004440bool ARMTargetInfo::setFPMath(StringRef Name) {
4441 if (Name == "neon") {
4442 FPMath = FP_Neon;
4443 return true;
4444 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4445 Name == "vfp4") {
4446 FPMath = FP_VFP;
4447 return true;
4448 }
4449 return false;
4450}
4451
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004452const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004453 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004454 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004455 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4456
4457 // Float registers
4458 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4459 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4460 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004461 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004462
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004463 // Double registers
4464 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4465 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004466 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4467 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004468
4469 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004470 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4471 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004472};
4473
4474void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004475 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004476 Names = GCCRegNames;
4477 NumNames = llvm::array_lengthof(GCCRegNames);
4478}
4479
4480const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004481 { { "a1" }, "r0" },
4482 { { "a2" }, "r1" },
4483 { { "a3" }, "r2" },
4484 { { "a4" }, "r3" },
4485 { { "v1" }, "r4" },
4486 { { "v2" }, "r5" },
4487 { { "v3" }, "r6" },
4488 { { "v4" }, "r7" },
4489 { { "v5" }, "r8" },
4490 { { "v6", "rfp" }, "r9" },
4491 { { "sl" }, "r10" },
4492 { { "fp" }, "r11" },
4493 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004494 { { "r13" }, "sp" },
4495 { { "r14" }, "lr" },
4496 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004497 // The S, D and Q registers overlap, but aren't really aliases; we
4498 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004499};
4500
4501void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4502 unsigned &NumAliases) const {
4503 Aliases = GCCRegAliases;
4504 NumAliases = llvm::array_lengthof(GCCRegAliases);
4505}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004506
4507const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004508#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004509#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004510 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004511#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004512
4513#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004514#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004515#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4516 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004517#include "clang/Basic/BuiltinsARM.def"
4518};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004519
4520class ARMleTargetInfo : public ARMTargetInfo {
4521public:
4522 ARMleTargetInfo(const llvm::Triple &Triple)
4523 : ARMTargetInfo(Triple, false) { }
4524 virtual void getTargetDefines(const LangOptions &Opts,
4525 MacroBuilder &Builder) const {
4526 Builder.defineMacro("__ARMEL__");
4527 ARMTargetInfo::getTargetDefines(Opts, Builder);
4528 }
4529};
4530
4531class ARMbeTargetInfo : public ARMTargetInfo {
4532public:
4533 ARMbeTargetInfo(const llvm::Triple &Triple)
4534 : ARMTargetInfo(Triple, true) { }
4535 virtual void getTargetDefines(const LangOptions &Opts,
4536 MacroBuilder &Builder) const {
4537 Builder.defineMacro("__ARMEB__");
4538 Builder.defineMacro("__ARM_BIG_ENDIAN");
4539 ARMTargetInfo::getTargetDefines(Opts, Builder);
4540 }
4541};
Chris Lattner17df24e2008-04-21 18:56:49 +00004542} // end anonymous namespace.
4543
Eli Friedmanf05b7722008-08-20 07:44:10 +00004544namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004545class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4546 const llvm::Triple Triple;
4547public:
4548 WindowsARMTargetInfo(const llvm::Triple &Triple)
4549 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4550 TLSSupported = false;
4551 WCharType = UnsignedShort;
4552 SizeType = UnsignedInt;
4553 UserLabelPrefix = "";
4554 }
4555 void getVisualStudioDefines(const LangOptions &Opts,
4556 MacroBuilder &Builder) const {
4557 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4558
4559 // FIXME: this is invalid for WindowsCE
4560 Builder.defineMacro("_M_ARM_NT", "1");
4561 Builder.defineMacro("_M_ARMT", "_M_ARM");
4562 Builder.defineMacro("_M_THUMB", "_M_ARM");
4563
4564 assert((Triple.getArch() == llvm::Triple::arm ||
4565 Triple.getArch() == llvm::Triple::thumb) &&
4566 "invalid architecture for Windows ARM target info");
4567 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4568 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4569
4570 // TODO map the complete set of values
4571 // 31: VFPv3 40: VFPv4
4572 Builder.defineMacro("_M_ARM_FP", "31");
4573 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004574 BuiltinVaListKind getBuiltinVaListKind() const override {
4575 return TargetInfo::CharPtrBuiltinVaList;
4576 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004577};
4578
4579// Windows ARM + Itanium C++ ABI Target
4580class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4581public:
4582 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4583 : WindowsARMTargetInfo(Triple) {
4584 TheCXXABI.set(TargetCXXABI::GenericARM);
4585 }
4586
4587 void getTargetDefines(const LangOptions &Opts,
4588 MacroBuilder &Builder) const override {
4589 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4590
4591 if (Opts.MSVCCompat)
4592 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4593 }
4594};
4595
4596// Windows ARM, MS (C++) ABI
4597class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4598public:
4599 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4600 : WindowsARMTargetInfo(Triple) {
4601 TheCXXABI.set(TargetCXXABI::Microsoft);
4602 }
4603
4604 void getTargetDefines(const LangOptions &Opts,
4605 MacroBuilder &Builder) const override {
4606 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4607 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4608 }
4609};
4610}
4611
4612
4613namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004614class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004615 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004616protected:
Craig Topper3164f332014-03-11 03:39:26 +00004617 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4618 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004619 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004620 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004621
Torok Edwinb2b37c62009-06-30 17:10:35 +00004622public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004623 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004624 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004625 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004626 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004627 // FIXME: This should be based off of the target features in
4628 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004629 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004630
4631 // Darwin on iOS uses a variant of the ARM C++ ABI.
4632 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004633 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004634};
4635} // end anonymous namespace.
4636
Tony Linthicum76329bf2011-12-12 21:14:55 +00004637
4638namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004639class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004640 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004641 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4642 static const char *const GCCRegNames[];
4643
James Molloy75f5f9e2014-04-16 15:33:48 +00004644 enum FPUModeEnum {
4645 FPUMode,
4646 NeonMode
4647 };
4648
4649 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004650 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004651 unsigned Crypto;
4652
Tim Northovera2ee4332014-03-29 15:09:45 +00004653 static const Builtin::Info BuiltinInfo[];
4654
4655 std::string ABI;
4656
4657public:
Tim Northover573cbee2014-05-24 12:52:07 +00004658 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004659 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004660
4661 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4662 WCharType = SignedInt;
4663
4664 // NetBSD apparently prefers consistency across ARM targets to consistency
4665 // across 64-bit targets.
4666 Int64Type = SignedLongLong;
4667 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004668 } else {
4669 WCharType = UnsignedInt;
4670 Int64Type = SignedLong;
4671 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004672 }
4673
Tim Northovera2ee4332014-03-29 15:09:45 +00004674 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004675 MaxVectorAlign = 128;
4676 RegParmMax = 8;
4677 MaxAtomicInlineWidth = 128;
4678 MaxAtomicPromoteWidth = 128;
4679
4680 LongDoubleWidth = LongDoubleAlign = 128;
4681 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4682
Tim Northovera2ee4332014-03-29 15:09:45 +00004683 // {} in inline assembly are neon specifiers, not assembly variant
4684 // specifiers.
4685 NoAsmVariants = true;
4686
Tim Northover7ad87af2015-01-16 18:44:04 +00004687 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4688 // contributes to the alignment of the containing aggregate in the same way
4689 // a plain (non bit-field) member of that type would, without exception for
4690 // zero-sized or anonymous bit-fields."
4691 UseBitFieldTypeAlignment = true;
4692 UseZeroLengthBitfieldAlignment = true;
4693
Tim Northover573cbee2014-05-24 12:52:07 +00004694 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004695 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4696 }
4697
Alp Toker4925ba72014-06-07 23:30:42 +00004698 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004699 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004700 if (Name != "aapcs" && Name != "darwinpcs")
4701 return false;
4702
4703 ABI = Name;
4704 return true;
4705 }
4706
David Blaikie1cbb9712014-11-14 19:09:44 +00004707 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004708 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004709 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004710 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004711 .Case("cyclone", true)
4712 .Default(false);
4713 return CPUKnown;
4714 }
4715
4716 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004717 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004718 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004719 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004720
4721 // Target properties.
4722 Builder.defineMacro("_LP64");
4723 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004724
4725 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4726 Builder.defineMacro("__ARM_ACLE", "200");
4727 Builder.defineMacro("__ARM_ARCH", "8");
4728 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4729
4730 Builder.defineMacro("__ARM_64BIT_STATE");
4731 Builder.defineMacro("__ARM_PCS_AAPCS64");
4732 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4733
4734 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4735 Builder.defineMacro("__ARM_FEATURE_CLZ");
4736 Builder.defineMacro("__ARM_FEATURE_FMA");
4737 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004738 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4739 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4740 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4741 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004742
4743 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4744
4745 // 0xe implies support for half, single and double precision operations.
4746 Builder.defineMacro("__ARM_FP", "0xe");
4747
4748 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4749 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4750 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4751
4752 if (Opts.FastMath || Opts.FiniteMathOnly)
4753 Builder.defineMacro("__ARM_FP_FAST");
4754
Richard Smithab506ad2014-10-20 23:26:58 +00004755 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004756 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4757
4758 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4759
4760 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4761 Opts.ShortEnums ? "1" : "4");
4762
James Molloy75f5f9e2014-04-16 15:33:48 +00004763 if (FPU == NeonMode) {
4764 Builder.defineMacro("__ARM_NEON");
4765 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004766 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004767 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004768
Bradley Smith418c5932014-05-02 15:17:51 +00004769 if (CRC)
4770 Builder.defineMacro("__ARM_FEATURE_CRC32");
4771
James Molloy75f5f9e2014-04-16 15:33:48 +00004772 if (Crypto)
4773 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004774 }
4775
4776 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004777 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004778 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004779 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004780 }
4781
David Blaikie1cbb9712014-11-14 19:09:44 +00004782 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004783 return Feature == "aarch64" ||
4784 Feature == "arm64" ||
4785 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004786 }
4787
James Molloy5e73df52014-04-16 15:06:20 +00004788 bool handleTargetFeatures(std::vector<std::string> &Features,
4789 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004790 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004791 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004792 Crypto = 0;
4793 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4794 if (Features[i] == "+neon")
4795 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004796 if (Features[i] == "+crc")
4797 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004798 if (Features[i] == "+crypto")
4799 Crypto = 1;
4800 }
4801
James Molloy5e73df52014-04-16 15:06:20 +00004802 setDescriptionString();
4803
4804 return true;
4805 }
4806
David Blaikie1cbb9712014-11-14 19:09:44 +00004807 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004808
David Blaikie1cbb9712014-11-14 19:09:44 +00004809 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004810 return TargetInfo::AArch64ABIBuiltinVaList;
4811 }
4812
4813 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004814 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004815 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004816 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004817
Eric Christopher917e9522014-11-18 22:36:15 +00004818 virtual bool
4819 validateAsmConstraint(const char *&Name,
4820 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004821 switch (*Name) {
4822 default:
4823 return false;
4824 case 'w': // Floating point and SIMD registers (V0-V31)
4825 Info.setAllowsRegister();
4826 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004827 case 'I': // Constant that can be used with an ADD instruction
4828 case 'J': // Constant that can be used with a SUB instruction
4829 case 'K': // Constant that can be used with a 32-bit logical instruction
4830 case 'L': // Constant that can be used with a 64-bit logical instruction
4831 case 'M': // Constant that can be used as a 32-bit MOV immediate
4832 case 'N': // Constant that can be used as a 64-bit MOV immediate
4833 case 'Y': // Floating point constant zero
4834 case 'Z': // Integer constant zero
4835 return true;
4836 case 'Q': // A memory reference with base register and no offset
4837 Info.setAllowsMemory();
4838 return true;
4839 case 'S': // A symbolic address
4840 Info.setAllowsRegister();
4841 return true;
4842 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004843 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4844 // Utf: A memory address suitable for ldp/stp in TF mode.
4845 // Usa: An absolute symbolic address.
4846 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4847 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004848 case 'z': // Zero register, wzr or xzr
4849 Info.setAllowsRegister();
4850 return true;
4851 case 'x': // Floating point and SIMD registers (V0-V15)
4852 Info.setAllowsRegister();
4853 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004854 }
4855 return false;
4856 }
4857
Akira Hatanaka987f1862014-08-22 06:05:21 +00004858 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004859 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004860 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004861 // Strip off constraint modifiers.
4862 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4863 Constraint = Constraint.substr(1);
4864
4865 switch (Constraint[0]) {
4866 default:
4867 return true;
4868 case 'z':
4869 case 'r': {
4870 switch (Modifier) {
4871 case 'x':
4872 case 'w':
4873 // For now assume that the person knows what they're
4874 // doing with the modifier.
4875 return true;
4876 default:
4877 // By default an 'r' constraint will be in the 'x'
4878 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004879 if (Size == 64)
4880 return true;
4881
4882 SuggestedModifier = "w";
4883 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004884 }
4885 }
4886 }
4887 }
4888
David Blaikie1cbb9712014-11-14 19:09:44 +00004889 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004890
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004891 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004892 if (RegNo == 0)
4893 return 0;
4894 if (RegNo == 1)
4895 return 1;
4896 return -1;
4897 }
4898};
4899
Tim Northover573cbee2014-05-24 12:52:07 +00004900const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004901 // 32-bit Integer registers
4902 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4903 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4904 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4905
4906 // 64-bit Integer registers
4907 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4908 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4909 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4910
4911 // 32-bit floating point regsisters
4912 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4913 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4914 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4915
4916 // 64-bit floating point regsisters
4917 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4918 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4919 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4920
4921 // Vector registers
4922 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4923 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4924 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4925};
4926
Tim Northover573cbee2014-05-24 12:52:07 +00004927void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004928 unsigned &NumNames) const {
4929 Names = GCCRegNames;
4930 NumNames = llvm::array_lengthof(GCCRegNames);
4931}
4932
Tim Northover573cbee2014-05-24 12:52:07 +00004933const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004934 { { "w31" }, "wsp" },
4935 { { "x29" }, "fp" },
4936 { { "x30" }, "lr" },
4937 { { "x31" }, "sp" },
4938 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4939 // don't want to substitute one of these for a different-sized one.
4940};
4941
Tim Northover573cbee2014-05-24 12:52:07 +00004942void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004943 unsigned &NumAliases) const {
4944 Aliases = GCCRegAliases;
4945 NumAliases = llvm::array_lengthof(GCCRegAliases);
4946}
4947
Tim Northover573cbee2014-05-24 12:52:07 +00004948const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004949#define BUILTIN(ID, TYPE, ATTRS) \
4950 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4951#include "clang/Basic/BuiltinsNEON.def"
4952
4953#define BUILTIN(ID, TYPE, ATTRS) \
4954 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004955#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004956};
James Molloy5e73df52014-04-16 15:06:20 +00004957
Tim Northover573cbee2014-05-24 12:52:07 +00004958class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004959 void setDescriptionString() override {
4960 if (getTriple().isOSBinFormatMachO())
4961 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4962 else
4963 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4964 }
4965
4966public:
Tim Northover573cbee2014-05-24 12:52:07 +00004967 AArch64leTargetInfo(const llvm::Triple &Triple)
4968 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004969 BigEndian = false;
4970 }
4971 void getTargetDefines(const LangOptions &Opts,
4972 MacroBuilder &Builder) const override {
4973 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004974 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004975 }
4976};
4977
Tim Northover573cbee2014-05-24 12:52:07 +00004978class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004979 void setDescriptionString() override {
4980 assert(!getTriple().isOSBinFormatMachO());
4981 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4982 }
4983
4984public:
Tim Northover573cbee2014-05-24 12:52:07 +00004985 AArch64beTargetInfo(const llvm::Triple &Triple)
4986 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004987 void getTargetDefines(const LangOptions &Opts,
4988 MacroBuilder &Builder) const override {
4989 Builder.defineMacro("__AARCH64EB__");
4990 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4991 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004992 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004993 }
4994};
Tim Northovera2ee4332014-03-29 15:09:45 +00004995} // end anonymous namespace.
4996
4997namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004998class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004999protected:
5000 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5001 MacroBuilder &Builder) const override {
5002 Builder.defineMacro("__AARCH64_SIMD__");
5003 Builder.defineMacro("__ARM64_ARCH_8__");
5004 Builder.defineMacro("__ARM_NEON__");
5005 Builder.defineMacro("__LITTLE_ENDIAN__");
5006 Builder.defineMacro("__REGISTER_PREFIX__", "");
5007 Builder.defineMacro("__arm64", "1");
5008 Builder.defineMacro("__arm64__", "1");
5009
5010 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5011 }
5012
Tim Northovera2ee4332014-03-29 15:09:45 +00005013public:
Tim Northover573cbee2014-05-24 12:52:07 +00005014 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5015 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005016 Int64Type = SignedLongLong;
5017 WCharType = SignedInt;
5018 UseSignedCharForObjCBool = false;
5019
5020 LongDoubleWidth = LongDoubleAlign = 64;
5021 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5022
5023 TheCXXABI.set(TargetCXXABI::iOS64);
5024 }
5025
David Blaikie1cbb9712014-11-14 19:09:44 +00005026 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005027 return TargetInfo::CharPtrBuiltinVaList;
5028 }
5029};
5030} // end anonymous namespace
5031
5032namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005033// Hexagon abstract base class
5034class HexagonTargetInfo : public TargetInfo {
5035 static const Builtin::Info BuiltinInfo[];
5036 static const char * const GCCRegNames[];
5037 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5038 std::string CPU;
5039public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005040 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005041 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005042 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005043
5044 // {} in inline assembly are packet specifiers, not assembly variant
5045 // specifiers.
5046 NoAsmVariants = true;
5047 }
5048
Craig Topper3164f332014-03-11 03:39:26 +00005049 void getTargetBuiltins(const Builtin::Info *&Records,
5050 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005051 Records = BuiltinInfo;
5052 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5053 }
5054
Craig Topper3164f332014-03-11 03:39:26 +00005055 bool validateAsmConstraint(const char *&Name,
5056 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005057 return true;
5058 }
5059
Craig Topper3164f332014-03-11 03:39:26 +00005060 void getTargetDefines(const LangOptions &Opts,
5061 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005062
Craig Topper3164f332014-03-11 03:39:26 +00005063 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005064 return Feature == "hexagon";
5065 }
Craig Topper3164f332014-03-11 03:39:26 +00005066
5067 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005068 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005069 }
Craig Topper3164f332014-03-11 03:39:26 +00005070 void getGCCRegNames(const char * const *&Names,
5071 unsigned &NumNames) const override;
5072 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5073 unsigned &NumAliases) const override;
5074 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005075 return "";
5076 }
Sebastian Pop86500282012-01-13 20:37:10 +00005077
5078 static const char *getHexagonCPUSuffix(StringRef Name) {
5079 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005080 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005081 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005082 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005083 }
5084
Craig Topper3164f332014-03-11 03:39:26 +00005085 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005086 if (!getHexagonCPUSuffix(Name))
5087 return false;
5088
Tony Linthicum76329bf2011-12-12 21:14:55 +00005089 CPU = Name;
5090 return true;
5091 }
5092};
5093
5094void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5095 MacroBuilder &Builder) const {
5096 Builder.defineMacro("qdsp6");
5097 Builder.defineMacro("__qdsp6", "1");
5098 Builder.defineMacro("__qdsp6__", "1");
5099
5100 Builder.defineMacro("hexagon");
5101 Builder.defineMacro("__hexagon", "1");
5102 Builder.defineMacro("__hexagon__", "1");
5103
5104 if(CPU == "hexagonv1") {
5105 Builder.defineMacro("__HEXAGON_V1__");
5106 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5107 if(Opts.HexagonQdsp6Compat) {
5108 Builder.defineMacro("__QDSP6_V1__");
5109 Builder.defineMacro("__QDSP6_ARCH__", "1");
5110 }
5111 }
5112 else if(CPU == "hexagonv2") {
5113 Builder.defineMacro("__HEXAGON_V2__");
5114 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5115 if(Opts.HexagonQdsp6Compat) {
5116 Builder.defineMacro("__QDSP6_V2__");
5117 Builder.defineMacro("__QDSP6_ARCH__", "2");
5118 }
5119 }
5120 else if(CPU == "hexagonv3") {
5121 Builder.defineMacro("__HEXAGON_V3__");
5122 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5123 if(Opts.HexagonQdsp6Compat) {
5124 Builder.defineMacro("__QDSP6_V3__");
5125 Builder.defineMacro("__QDSP6_ARCH__", "3");
5126 }
5127 }
5128 else if(CPU == "hexagonv4") {
5129 Builder.defineMacro("__HEXAGON_V4__");
5130 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5131 if(Opts.HexagonQdsp6Compat) {
5132 Builder.defineMacro("__QDSP6_V4__");
5133 Builder.defineMacro("__QDSP6_ARCH__", "4");
5134 }
5135 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005136 else if(CPU == "hexagonv5") {
5137 Builder.defineMacro("__HEXAGON_V5__");
5138 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5139 if(Opts.HexagonQdsp6Compat) {
5140 Builder.defineMacro("__QDSP6_V5__");
5141 Builder.defineMacro("__QDSP6_ARCH__", "5");
5142 }
5143 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005144}
5145
5146const char * const HexagonTargetInfo::GCCRegNames[] = {
5147 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5148 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5149 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5150 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5151 "p0", "p1", "p2", "p3",
5152 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5153};
5154
5155void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5156 unsigned &NumNames) const {
5157 Names = GCCRegNames;
5158 NumNames = llvm::array_lengthof(GCCRegNames);
5159}
5160
5161
5162const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5163 { { "sp" }, "r29" },
5164 { { "fp" }, "r30" },
5165 { { "lr" }, "r31" },
5166 };
5167
5168void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5169 unsigned &NumAliases) const {
5170 Aliases = GCCRegAliases;
5171 NumAliases = llvm::array_lengthof(GCCRegAliases);
5172}
5173
5174
5175const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5176#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5177#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5178 ALL_LANGUAGES },
5179#include "clang/Basic/BuiltinsHexagon.def"
5180};
5181}
5182
5183
Chris Lattner5ba61f02006-10-14 07:39:34 +00005184namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005185// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5186class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005187 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5188 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005189 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005190public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005191 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005192
Craig Topper3164f332014-03-11 03:39:26 +00005193 bool handleTargetFeatures(std::vector<std::string> &Features,
5194 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005195 SoftFloat = false;
5196 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5197 if (Features[i] == "+soft-float")
5198 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005199 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005200 }
Craig Topper3164f332014-03-11 03:39:26 +00005201 void getTargetDefines(const LangOptions &Opts,
5202 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005203 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005204 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005205
5206 if (SoftFloat)
5207 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005208 }
Craig Topper3164f332014-03-11 03:39:26 +00005209
5210 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005211 return llvm::StringSwitch<bool>(Feature)
5212 .Case("softfloat", SoftFloat)
5213 .Case("sparc", true)
5214 .Default(false);
5215 }
Craig Topper3164f332014-03-11 03:39:26 +00005216
5217 void getTargetBuiltins(const Builtin::Info *&Records,
5218 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005219 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005220 }
Craig Topper3164f332014-03-11 03:39:26 +00005221 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005222 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005223 }
Craig Topper3164f332014-03-11 03:39:26 +00005224 void getGCCRegNames(const char * const *&Names,
5225 unsigned &NumNames) const override;
5226 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5227 unsigned &NumAliases) const override;
5228 bool validateAsmConstraint(const char *&Name,
5229 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005230 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005231 switch (*Name) {
5232 case 'I': // Signed 13-bit constant
5233 case 'J': // Zero
5234 case 'K': // 32-bit constant with the low 12 bits clear
5235 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5236 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5237 case 'N': // Same as 'K' but zext (required for SIMode)
5238 case 'O': // The constant 4096
5239 return true;
5240 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005241 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005242 }
Craig Topper3164f332014-03-11 03:39:26 +00005243 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005244 // FIXME: Implement!
5245 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005246 }
5247};
5248
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005249const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005250 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5251 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5252 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5253 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5254};
5255
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005256void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5257 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005258 Names = GCCRegNames;
5259 NumNames = llvm::array_lengthof(GCCRegNames);
5260}
5261
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005262const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005263 { { "g0" }, "r0" },
5264 { { "g1" }, "r1" },
5265 { { "g2" }, "r2" },
5266 { { "g3" }, "r3" },
5267 { { "g4" }, "r4" },
5268 { { "g5" }, "r5" },
5269 { { "g6" }, "r6" },
5270 { { "g7" }, "r7" },
5271 { { "o0" }, "r8" },
5272 { { "o1" }, "r9" },
5273 { { "o2" }, "r10" },
5274 { { "o3" }, "r11" },
5275 { { "o4" }, "r12" },
5276 { { "o5" }, "r13" },
5277 { { "o6", "sp" }, "r14" },
5278 { { "o7" }, "r15" },
5279 { { "l0" }, "r16" },
5280 { { "l1" }, "r17" },
5281 { { "l2" }, "r18" },
5282 { { "l3" }, "r19" },
5283 { { "l4" }, "r20" },
5284 { { "l5" }, "r21" },
5285 { { "l6" }, "r22" },
5286 { { "l7" }, "r23" },
5287 { { "i0" }, "r24" },
5288 { { "i1" }, "r25" },
5289 { { "i2" }, "r26" },
5290 { { "i3" }, "r27" },
5291 { { "i4" }, "r28" },
5292 { { "i5" }, "r29" },
5293 { { "i6", "fp" }, "r30" },
5294 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005295};
5296
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005297void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5298 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005299 Aliases = GCCRegAliases;
5300 NumAliases = llvm::array_lengthof(GCCRegAliases);
5301}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005302
5303// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5304class SparcV8TargetInfo : public SparcTargetInfo {
5305public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005306 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005307 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005308 }
5309
Craig Topper3164f332014-03-11 03:39:26 +00005310 void getTargetDefines(const LangOptions &Opts,
5311 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005312 SparcTargetInfo::getTargetDefines(Opts, Builder);
5313 Builder.defineMacro("__sparcv8");
5314 }
5315};
5316
5317// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5318class SparcV9TargetInfo : public SparcTargetInfo {
5319public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005320 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005321 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005322 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005323 // This is an LP64 platform.
5324 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005325
5326 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005327 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005328 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005329 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005330 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005331 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005332
5333 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5334 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5335 LongDoubleWidth = 128;
5336 LongDoubleAlign = 128;
5337 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005338 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005339 }
5340
Craig Topper3164f332014-03-11 03:39:26 +00005341 void getTargetDefines(const LangOptions &Opts,
5342 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005343 SparcTargetInfo::getTargetDefines(Opts, Builder);
5344 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005345 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005346 // Solaris doesn't need these variants, but the BSDs do.
5347 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005348 Builder.defineMacro("__sparc64__");
5349 Builder.defineMacro("__sparc_v9__");
5350 Builder.defineMacro("__sparcv9__");
5351 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005352 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005353
Craig Topper3164f332014-03-11 03:39:26 +00005354 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005355 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5356 .Case("v9", true)
5357 .Case("ultrasparc", true)
5358 .Case("ultrasparc3", true)
5359 .Case("niagara", true)
5360 .Case("niagara2", true)
5361 .Case("niagara3", true)
5362 .Case("niagara4", true)
5363 .Default(false);
5364
5365 // No need to store the CPU yet. There aren't any CPU-specific
5366 // macros to define.
5367 return CPUKnown;
5368 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005369};
5370
Gabor Greif49991682008-02-21 16:29:08 +00005371} // end anonymous namespace.
5372
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005373namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005374class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005375public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005376 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5377 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005378 SizeType = UnsignedInt;
5379 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005380 }
5381};
5382} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005383
Chris Lattnerb781dc792008-05-08 05:58:21 +00005384namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005385class SystemZTargetInfo : public TargetInfo {
5386 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005387
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005388public:
5389 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5390 TLSSupported = true;
5391 IntWidth = IntAlign = 32;
5392 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5393 PointerWidth = PointerAlign = 64;
5394 LongDoubleWidth = 128;
5395 LongDoubleAlign = 64;
5396 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5397 MinGlobalAlign = 16;
5398 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5399 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5400 }
5401 void getTargetDefines(const LangOptions &Opts,
5402 MacroBuilder &Builder) const override {
5403 Builder.defineMacro("__s390__");
5404 Builder.defineMacro("__s390x__");
5405 Builder.defineMacro("__zarch__");
5406 Builder.defineMacro("__LONG_DOUBLE_128__");
5407 }
5408 void getTargetBuiltins(const Builtin::Info *&Records,
5409 unsigned &NumRecords) const override {
5410 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005411 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005412 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005413 }
5414
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005415 void getGCCRegNames(const char *const *&Names,
5416 unsigned &NumNames) const override;
5417 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5418 unsigned &NumAliases) const override {
5419 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005420 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005421 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005422 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005423 bool validateAsmConstraint(const char *&Name,
5424 TargetInfo::ConstraintInfo &info) const override;
5425 const char *getClobbers() const override {
5426 // FIXME: Is this really right?
5427 return "";
5428 }
5429 BuiltinVaListKind getBuiltinVaListKind() const override {
5430 return TargetInfo::SystemZBuiltinVaList;
5431 }
5432 bool setCPU(const std::string &Name) override {
5433 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5434 .Case("z10", true)
5435 .Case("z196", true)
5436 .Case("zEC12", true)
5437 .Default(false);
5438
5439 // No need to store the CPU yet. There aren't any CPU-specific
5440 // macros to define.
5441 return CPUKnown;
5442 }
5443};
5444
5445const char *const SystemZTargetInfo::GCCRegNames[] = {
5446 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5447 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5448 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5449 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5450};
5451
5452void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5453 unsigned &NumNames) const {
5454 Names = GCCRegNames;
5455 NumNames = llvm::array_lengthof(GCCRegNames);
5456}
5457
5458bool SystemZTargetInfo::
5459validateAsmConstraint(const char *&Name,
5460 TargetInfo::ConstraintInfo &Info) const {
5461 switch (*Name) {
5462 default:
5463 return false;
5464
5465 case 'a': // Address register
5466 case 'd': // Data register (equivalent to 'r')
5467 case 'f': // Floating-point register
5468 Info.setAllowsRegister();
5469 return true;
5470
5471 case 'I': // Unsigned 8-bit constant
5472 case 'J': // Unsigned 12-bit constant
5473 case 'K': // Signed 16-bit constant
5474 case 'L': // Signed 20-bit displacement (on all targets we support)
5475 case 'M': // 0x7fffffff
5476 return true;
5477
5478 case 'Q': // Memory with base and unsigned 12-bit displacement
5479 case 'R': // Likewise, plus an index
5480 case 'S': // Memory with base and signed 20-bit displacement
5481 case 'T': // Likewise, plus an index
5482 Info.setAllowsMemory();
5483 return true;
5484 }
5485}
Ulrich Weigand47445072013-05-06 16:26:41 +00005486}
5487
5488namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005489 class MSP430TargetInfo : public TargetInfo {
5490 static const char * const GCCRegNames[];
5491 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005492 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005493 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005494 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005495 IntWidth = 16; IntAlign = 16;
5496 LongWidth = 32; LongLongWidth = 64;
5497 LongAlign = LongLongAlign = 16;
5498 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005499 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005500 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005501 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005502 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005503 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005504 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005505 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005506 }
5507 void getTargetDefines(const LangOptions &Opts,
5508 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005509 Builder.defineMacro("MSP430");
5510 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005511 // FIXME: defines for different 'flavours' of MCU
5512 }
Craig Topper3164f332014-03-11 03:39:26 +00005513 void getTargetBuiltins(const Builtin::Info *&Records,
5514 unsigned &NumRecords) const override {
5515 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005516 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005517 NumRecords = 0;
5518 }
Craig Topper3164f332014-03-11 03:39:26 +00005519 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005520 return Feature == "msp430";
5521 }
Craig Topper3164f332014-03-11 03:39:26 +00005522 void getGCCRegNames(const char * const *&Names,
5523 unsigned &NumNames) const override;
5524 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5525 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005526 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005527 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005528 NumAliases = 0;
5529 }
Eric Christopher917e9522014-11-18 22:36:15 +00005530 bool
5531 validateAsmConstraint(const char *&Name,
5532 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005533 // FIXME: implement
5534 switch (*Name) {
5535 case 'K': // the constant 1
5536 case 'L': // constant -1^20 .. 1^19
5537 case 'M': // constant 1-4:
5538 return true;
5539 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005540 // No target constraints for now.
5541 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005542 }
Craig Topper3164f332014-03-11 03:39:26 +00005543 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005544 // FIXME: Is this really right?
5545 return "";
5546 }
Craig Topper3164f332014-03-11 03:39:26 +00005547 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005548 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005549 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005550 }
5551 };
5552
5553 const char * const MSP430TargetInfo::GCCRegNames[] = {
5554 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5555 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5556 };
5557
5558 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5559 unsigned &NumNames) const {
5560 Names = GCCRegNames;
5561 NumNames = llvm::array_lengthof(GCCRegNames);
5562 }
5563}
5564
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005565namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005566
Mike Stump11289f42009-09-09 15:08:12 +00005567 // LLVM and Clang cannot be used directly to output native binaries for
5568 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005569 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005570 //
5571 // TCE uses the llvm bitcode as input and uses it for generating customized
5572 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005573 // publicly available in http://tce.cs.tut.fi
5574
Eli Friedman1f191002011-10-07 19:51:42 +00005575 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5576 3, // opencl_global
5577 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005578 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005579 // FIXME: generic has to be added to the target
5580 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005581 0, // cuda_device
5582 0, // cuda_constant
5583 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005584 };
5585
Eli Friedmana9c3d712009-08-19 20:47:07 +00005586 class TCETargetInfo : public TargetInfo{
5587 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005588 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005589 TLSSupported = false;
5590 IntWidth = 32;
5591 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005592 PointerWidth = 32;
5593 IntAlign = 32;
5594 LongAlign = LongLongAlign = 32;
5595 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005596 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005597 SizeType = UnsignedInt;
5598 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005599 IntPtrType = SignedInt;
5600 PtrDiffType = SignedInt;
5601 FloatWidth = 32;
5602 FloatAlign = 32;
5603 DoubleWidth = 32;
5604 DoubleAlign = 32;
5605 LongDoubleWidth = 32;
5606 LongDoubleAlign = 32;
5607 FloatFormat = &llvm::APFloat::IEEEsingle;
5608 DoubleFormat = &llvm::APFloat::IEEEsingle;
5609 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005610 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5611 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005612 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005613 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005614 }
5615
Craig Topper3164f332014-03-11 03:39:26 +00005616 void getTargetDefines(const LangOptions &Opts,
5617 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005618 DefineStd(Builder, "tce", Opts);
5619 Builder.defineMacro("__TCE__");
5620 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005621 }
Craig Topper3164f332014-03-11 03:39:26 +00005622 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005623 return Feature == "tce";
5624 }
Craig Topper3164f332014-03-11 03:39:26 +00005625
5626 void getTargetBuiltins(const Builtin::Info *&Records,
5627 unsigned &NumRecords) const override {}
5628 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005629 return "";
5630 }
Craig Topper3164f332014-03-11 03:39:26 +00005631 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005632 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005633 }
Craig Topper3164f332014-03-11 03:39:26 +00005634 void getGCCRegNames(const char * const *&Names,
5635 unsigned &NumNames) const override {}
5636 bool validateAsmConstraint(const char *&Name,
5637 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005638 return true;
5639 }
Craig Topper3164f332014-03-11 03:39:26 +00005640 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5641 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005642 };
5643}
5644
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005645namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005646class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005647 virtual void setDescriptionString() = 0;
5648
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005649 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005650 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005651 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005652 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005653 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005654 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005655 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005656 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005657 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005658 enum DspRevEnum {
5659 NoDSP, DSP1, DSP2
5660 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005661 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005662
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005663protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005664 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005665 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005666
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005667public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005668 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5669 const std::string &CPUStr)
5670 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005671 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005672 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005673
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005674 bool isNaN2008Default() const {
5675 return CPU == "mips32r6" || CPU == "mips64r6";
5676 }
5677
5678 bool isFP64Default() const {
5679 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5680 }
5681
Alp Toker4925ba72014-06-07 23:30:42 +00005682 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005683 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005684 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5685 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005686 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005687 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005688 .Case("mips1", IsMips32)
5689 .Case("mips2", IsMips32)
5690 .Case("mips3", true)
5691 .Case("mips4", true)
5692 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005693 .Case("mips32", IsMips32)
5694 .Case("mips32r2", IsMips32)
5695 .Case("mips32r6", IsMips32)
5696 .Case("mips64", true)
5697 .Case("mips64r2", true)
5698 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005699 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005700 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005701 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005702 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005703 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005704 // The backend enables certain ABI's by default according to the
5705 // architecture.
5706 // Disable both possible defaults so that we don't end up with multiple
5707 // ABI's selected and trigger an assertion.
5708 Features["o32"] = false;
5709 Features["n64"] = false;
5710
Eric Christopher0b26a612010-03-02 02:41:08 +00005711 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005712 if (CPU == "octeon")
5713 Features["mips64r2"] = Features["cnmips"] = true;
5714 else
5715 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005716 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005717
Craig Topper3164f332014-03-11 03:39:26 +00005718 void getTargetDefines(const LangOptions &Opts,
5719 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005720 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005721 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005722 if (Opts.GNUMode)
5723 Builder.defineMacro("mips");
5724
Simon Atanasyan683535b2012-08-29 19:14:58 +00005725 Builder.defineMacro("__REGISTER_PREFIX__", "");
5726
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005727 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005728 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005729 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005730 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005731 case SoftFloat:
5732 Builder.defineMacro("__mips_soft_float", Twine(1));
5733 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005734 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005735
Simon Atanasyan16071912013-04-14 14:07:30 +00005736 if (IsSingleFloat)
5737 Builder.defineMacro("__mips_single_float", Twine(1));
5738
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005739 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5740 Builder.defineMacro("_MIPS_FPSET",
5741 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5742
Simon Atanasyan72244b62012-07-05 16:06:06 +00005743 if (IsMips16)
5744 Builder.defineMacro("__mips16", Twine(1));
5745
Simon Atanasyan60777612013-04-14 14:07:51 +00005746 if (IsMicromips)
5747 Builder.defineMacro("__mips_micromips", Twine(1));
5748
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005749 if (IsNan2008)
5750 Builder.defineMacro("__mips_nan2008", Twine(1));
5751
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005752 switch (DspRev) {
5753 default:
5754 break;
5755 case DSP1:
5756 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5757 Builder.defineMacro("__mips_dsp", Twine(1));
5758 break;
5759 case DSP2:
5760 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5761 Builder.defineMacro("__mips_dspr2", Twine(1));
5762 Builder.defineMacro("__mips_dsp", Twine(1));
5763 break;
5764 }
5765
Jack Carter44ff1e52013-08-12 17:20:29 +00005766 if (HasMSA)
5767 Builder.defineMacro("__mips_msa", Twine(1));
5768
Simon Atanasyan26f19672012-04-05 19:28:31 +00005769 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5770 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5771 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005772
5773 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5774 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005775 }
5776
Craig Topper3164f332014-03-11 03:39:26 +00005777 void getTargetBuiltins(const Builtin::Info *&Records,
5778 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005779 Records = BuiltinInfo;
5780 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005781 }
Craig Topper3164f332014-03-11 03:39:26 +00005782 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005783 return llvm::StringSwitch<bool>(Feature)
5784 .Case("mips", true)
5785 .Case("fp64", HasFP64)
5786 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005787 }
Craig Topper3164f332014-03-11 03:39:26 +00005788 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005789 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005790 }
Craig Topper3164f332014-03-11 03:39:26 +00005791 void getGCCRegNames(const char * const *&Names,
5792 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005793 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005794 // CPU register names
5795 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005796 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5797 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5798 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005799 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5800 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005801 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5802 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5803 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5804 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005805 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005806 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005807 "$fcc5","$fcc6","$fcc7",
5808 // MSA register names
5809 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5810 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5811 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5812 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5813 // MSA control register names
5814 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5815 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005816 };
5817 Names = GCCRegNames;
5818 NumNames = llvm::array_lengthof(GCCRegNames);
5819 }
Craig Topper3164f332014-03-11 03:39:26 +00005820 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5821 unsigned &NumAliases) const override = 0;
5822 bool validateAsmConstraint(const char *&Name,
5823 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005824 switch (*Name) {
5825 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005826 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005827 case 'r': // CPU registers.
5828 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005829 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005830 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005831 case 'c': // $25 for indirect jumps
5832 case 'l': // lo register
5833 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005834 Info.setAllowsRegister();
5835 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005836 case 'I': // Signed 16-bit constant
5837 case 'J': // Integer 0
5838 case 'K': // Unsigned 16-bit constant
5839 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5840 case 'M': // Constants not loadable via lui, addiu, or ori
5841 case 'N': // Constant -1 to -65535
5842 case 'O': // A signed 15-bit constant
5843 case 'P': // A constant between 1 go 65535
5844 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005845 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005846 Info.setAllowsMemory();
5847 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005848 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005849 }
5850
Craig Topper3164f332014-03-11 03:39:26 +00005851 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005852 // In GCC, $1 is not widely used in generated code (it's used only in a few
5853 // specific situations), so there is no real need for users to add it to
5854 // the clobbers list if they want to use it in their inline assembly code.
5855 //
5856 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5857 // code generation, so using it in inline assembly without adding it to the
5858 // clobbers list can cause conflicts between the inline assembly code and
5859 // the surrounding generated code.
5860 //
5861 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5862 // operands, which will conflict with the ".set at" assembler option (which
5863 // we use only for inline assembly, in order to maintain compatibility with
5864 // GCC) and will also conflict with the user's usage of $1.
5865 //
5866 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5867 // register for generated code is to automatically clobber $1 for all inline
5868 // assembly code.
5869 //
5870 // FIXME: We should automatically clobber $1 only for inline assembly code
5871 // which actually uses it. This would allow LLVM to use $1 for inline
5872 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005873 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005874 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005875
Craig Topper3164f332014-03-11 03:39:26 +00005876 bool handleTargetFeatures(std::vector<std::string> &Features,
5877 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005878 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005879 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005880 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005881 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005882 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005883 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005884 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005885
5886 for (std::vector<std::string>::iterator it = Features.begin(),
5887 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005888 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005889 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005890 else if (*it == "+soft-float")
5891 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005892 else if (*it == "+mips16")
5893 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005894 else if (*it == "+micromips")
5895 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005896 else if (*it == "+dsp")
5897 DspRev = std::max(DspRev, DSP1);
5898 else if (*it == "+dspr2")
5899 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005900 else if (*it == "+msa")
5901 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005902 else if (*it == "+fp64")
5903 HasFP64 = true;
5904 else if (*it == "-fp64")
5905 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005906 else if (*it == "+nan2008")
5907 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005908 else if (*it == "-nan2008")
5909 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005910 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005911
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005912 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005913 std::vector<std::string>::iterator it =
5914 std::find(Features.begin(), Features.end(), "+soft-float");
5915 if (it != Features.end())
5916 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005917
Akira Hatanaka9064e362013-10-29 18:30:33 +00005918 setDescriptionString();
5919
Rafael Espindolaeb265472013-08-21 21:59:03 +00005920 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005921 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005922
Craig Topper3164f332014-03-11 03:39:26 +00005923 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005924 if (RegNo == 0) return 4;
5925 if (RegNo == 1) return 5;
5926 return -1;
5927 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005928
5929 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005930};
5931
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005932const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5933#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5934#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5935 ALL_LANGUAGES },
5936#include "clang/Basic/BuiltinsMips.def"
5937};
5938
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005939class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005940public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005941 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005942 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005943 SizeType = UnsignedInt;
5944 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00005945 Int64Type = SignedLongLong;
5946 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005947 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005948 }
Craig Topper3164f332014-03-11 03:39:26 +00005949 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005950 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005951 ABI = Name;
5952 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005953 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005954 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005955 }
Craig Topper3164f332014-03-11 03:39:26 +00005956 void getTargetDefines(const LangOptions &Opts,
5957 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005958 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005959
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005960 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005961 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5962
5963 const std::string& CPUStr = getCPU();
5964 if (CPUStr == "mips32")
5965 Builder.defineMacro("__mips_isa_rev", "1");
5966 else if (CPUStr == "mips32r2")
5967 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00005968 else if (CPUStr == "mips32r6")
5969 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005970
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005971 if (ABI == "o32") {
5972 Builder.defineMacro("__mips_o32");
5973 Builder.defineMacro("_ABIO32", "1");
5974 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5975 }
5976 else if (ABI == "eabi")
5977 Builder.defineMacro("__mips_eabi");
5978 else
David Blaikie83d382b2011-09-23 05:06:16 +00005979 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005980 }
Craig Topper3164f332014-03-11 03:39:26 +00005981 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5982 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005983 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5984 { { "at" }, "$1" },
5985 { { "v0" }, "$2" },
5986 { { "v1" }, "$3" },
5987 { { "a0" }, "$4" },
5988 { { "a1" }, "$5" },
5989 { { "a2" }, "$6" },
5990 { { "a3" }, "$7" },
5991 { { "t0" }, "$8" },
5992 { { "t1" }, "$9" },
5993 { { "t2" }, "$10" },
5994 { { "t3" }, "$11" },
5995 { { "t4" }, "$12" },
5996 { { "t5" }, "$13" },
5997 { { "t6" }, "$14" },
5998 { { "t7" }, "$15" },
5999 { { "s0" }, "$16" },
6000 { { "s1" }, "$17" },
6001 { { "s2" }, "$18" },
6002 { { "s3" }, "$19" },
6003 { { "s4" }, "$20" },
6004 { { "s5" }, "$21" },
6005 { { "s6" }, "$22" },
6006 { { "s7" }, "$23" },
6007 { { "t8" }, "$24" },
6008 { { "t9" }, "$25" },
6009 { { "k0" }, "$26" },
6010 { { "k1" }, "$27" },
6011 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006012 { { "sp","$sp" }, "$29" },
6013 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006014 { { "ra" }, "$31" }
6015 };
6016 Aliases = GCCRegAliases;
6017 NumAliases = llvm::array_lengthof(GCCRegAliases);
6018 }
6019};
6020
6021class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006022 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006023 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006024 }
6025
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006026public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006027 Mips32EBTargetInfo(const llvm::Triple &Triple)
6028 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006029 }
Craig Topper3164f332014-03-11 03:39:26 +00006030 void getTargetDefines(const LangOptions &Opts,
6031 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006032 DefineStd(Builder, "MIPSEB", Opts);
6033 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006034 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006035 }
6036};
6037
6038class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006039 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006040 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006041 }
6042
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006043public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006044 Mips32ELTargetInfo(const llvm::Triple &Triple)
6045 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006046 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006047 }
Craig Topper3164f332014-03-11 03:39:26 +00006048 void getTargetDefines(const LangOptions &Opts,
6049 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006050 DefineStd(Builder, "MIPSEL", Opts);
6051 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006052 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006053 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006054};
Akira Hatanakabef17452011-09-20 19:21:49 +00006055
6056class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006057public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006058 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006059 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006060 LongDoubleWidth = LongDoubleAlign = 128;
6061 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006062 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6063 LongDoubleWidth = LongDoubleAlign = 64;
6064 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6065 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006066 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006067 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006068 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006069 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006070
6071 void setN64ABITypes() {
6072 LongWidth = LongAlign = 64;
6073 PointerWidth = PointerAlign = 64;
6074 SizeType = UnsignedLong;
6075 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006076 Int64Type = SignedLong;
6077 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006078 }
6079
6080 void setN32ABITypes() {
6081 LongWidth = LongAlign = 32;
6082 PointerWidth = PointerAlign = 32;
6083 SizeType = UnsignedInt;
6084 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006085 Int64Type = SignedLongLong;
6086 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006087 }
6088
Craig Topper3164f332014-03-11 03:39:26 +00006089 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006090 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006091 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006092 ABI = Name;
6093 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006094 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006095 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006096 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006097 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006098 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006099 }
6100 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006101 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006102
Craig Topper3164f332014-03-11 03:39:26 +00006103 void getTargetDefines(const LangOptions &Opts,
6104 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006105 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006106
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006107 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006108 Builder.defineMacro("__mips64");
6109 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006110 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6111
6112 const std::string& CPUStr = getCPU();
6113 if (CPUStr == "mips64")
6114 Builder.defineMacro("__mips_isa_rev", "1");
6115 else if (CPUStr == "mips64r2")
6116 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006117 else if (CPUStr == "mips64r6")
6118 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006119
Akira Hatanakabef17452011-09-20 19:21:49 +00006120 if (ABI == "n32") {
6121 Builder.defineMacro("__mips_n32");
6122 Builder.defineMacro("_ABIN32", "2");
6123 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6124 }
6125 else if (ABI == "n64") {
6126 Builder.defineMacro("__mips_n64");
6127 Builder.defineMacro("_ABI64", "3");
6128 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6129 }
6130 else
David Blaikie83d382b2011-09-23 05:06:16 +00006131 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006132 }
Craig Topper3164f332014-03-11 03:39:26 +00006133 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6134 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006135 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6136 { { "at" }, "$1" },
6137 { { "v0" }, "$2" },
6138 { { "v1" }, "$3" },
6139 { { "a0" }, "$4" },
6140 { { "a1" }, "$5" },
6141 { { "a2" }, "$6" },
6142 { { "a3" }, "$7" },
6143 { { "a4" }, "$8" },
6144 { { "a5" }, "$9" },
6145 { { "a6" }, "$10" },
6146 { { "a7" }, "$11" },
6147 { { "t0" }, "$12" },
6148 { { "t1" }, "$13" },
6149 { { "t2" }, "$14" },
6150 { { "t3" }, "$15" },
6151 { { "s0" }, "$16" },
6152 { { "s1" }, "$17" },
6153 { { "s2" }, "$18" },
6154 { { "s3" }, "$19" },
6155 { { "s4" }, "$20" },
6156 { { "s5" }, "$21" },
6157 { { "s6" }, "$22" },
6158 { { "s7" }, "$23" },
6159 { { "t8" }, "$24" },
6160 { { "t9" }, "$25" },
6161 { { "k0" }, "$26" },
6162 { { "k1" }, "$27" },
6163 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006164 { { "sp","$sp" }, "$29" },
6165 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006166 { { "ra" }, "$31" }
6167 };
6168 Aliases = GCCRegAliases;
6169 NumAliases = llvm::array_lengthof(GCCRegAliases);
6170 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006171
6172 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006173};
6174
6175class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006176 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006177 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006178 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 +00006179 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006180 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006181
Akira Hatanakabef17452011-09-20 19:21:49 +00006182 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006183
Akira Hatanakabef17452011-09-20 19:21:49 +00006184public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006185 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006186 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006187 void getTargetDefines(const LangOptions &Opts,
6188 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006189 DefineStd(Builder, "MIPSEB", Opts);
6190 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006191 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006192 }
6193};
6194
6195class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006196 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006197 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006198 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 +00006199 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006200 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006201 }
6202public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006203 Mips64ELTargetInfo(const llvm::Triple &Triple)
6204 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006205 // Default ABI is n64.
6206 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006207 }
Craig Topper3164f332014-03-11 03:39:26 +00006208 void getTargetDefines(const LangOptions &Opts,
6209 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006210 DefineStd(Builder, "MIPSEL", Opts);
6211 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006212 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006213 }
6214};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006215} // end anonymous namespace.
6216
Ivan Krasindd7403e2011-08-24 20:22:22 +00006217namespace {
6218class PNaClTargetInfo : public TargetInfo {
6219public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006220 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006221 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006222 this->UserLabelPrefix = "";
6223 this->LongAlign = 32;
6224 this->LongWidth = 32;
6225 this->PointerAlign = 32;
6226 this->PointerWidth = 32;
6227 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006228 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006229 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006230 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006231 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006232 this->SizeType = TargetInfo::UnsignedInt;
6233 this->PtrDiffType = TargetInfo::SignedInt;
6234 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006235 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006236 }
6237
Craig Topper3164f332014-03-11 03:39:26 +00006238 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006239 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006240 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006241 Builder.defineMacro("__le32__");
6242 Builder.defineMacro("__pnacl__");
6243 }
Craig Topper3164f332014-03-11 03:39:26 +00006244 void getTargetDefines(const LangOptions &Opts,
6245 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006246 getArchDefines(Opts, Builder);
6247 }
Craig Topper3164f332014-03-11 03:39:26 +00006248 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006249 return Feature == "pnacl";
6250 }
Craig Topper3164f332014-03-11 03:39:26 +00006251 void getTargetBuiltins(const Builtin::Info *&Records,
6252 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006253 }
Craig Topper3164f332014-03-11 03:39:26 +00006254 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006255 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006256 }
Craig Topper3164f332014-03-11 03:39:26 +00006257 void getGCCRegNames(const char * const *&Names,
6258 unsigned &NumNames) const override;
6259 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6260 unsigned &NumAliases) const override;
6261 bool validateAsmConstraint(const char *&Name,
6262 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006263 return false;
6264 }
6265
Craig Topper3164f332014-03-11 03:39:26 +00006266 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006267 return "";
6268 }
6269};
6270
6271void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6272 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006273 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006274 NumNames = 0;
6275}
6276
6277void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6278 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006279 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006280 NumAliases = 0;
6281}
6282} // end anonymous namespace.
6283
Guy Benyeib798fc92012-12-11 21:38:14 +00006284namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006285class Le64TargetInfo : public TargetInfo {
6286 static const Builtin::Info BuiltinInfo[];
6287
6288public:
6289 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6290 BigEndian = false;
6291 NoAsmVariants = true;
6292 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6293 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6294 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006295 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006296 }
6297
6298 void getTargetDefines(const LangOptions &Opts,
6299 MacroBuilder &Builder) const override {
6300 DefineStd(Builder, "unix", Opts);
6301 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6302 Builder.defineMacro("__ELF__");
6303 }
6304 void getTargetBuiltins(const Builtin::Info *&Records,
6305 unsigned &NumRecords) const override {
6306 Records = BuiltinInfo;
6307 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6308 }
6309 BuiltinVaListKind getBuiltinVaListKind() const override {
6310 return TargetInfo::PNaClABIBuiltinVaList;
6311 }
6312 const char *getClobbers() const override { return ""; }
6313 void getGCCRegNames(const char *const *&Names,
6314 unsigned &NumNames) const override {
6315 Names = nullptr;
6316 NumNames = 0;
6317 }
6318 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6319 unsigned &NumAliases) const override {
6320 Aliases = nullptr;
6321 NumAliases = 0;
6322 }
6323 bool validateAsmConstraint(const char *&Name,
6324 TargetInfo::ConstraintInfo &Info) const override {
6325 return false;
6326 }
6327
6328 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006329};
6330} // end anonymous namespace.
6331
6332const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6333#define BUILTIN(ID, TYPE, ATTRS) \
6334 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6335#include "clang/Basic/BuiltinsLe64.def"
6336};
6337
6338namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006339 static const unsigned SPIRAddrSpaceMap[] = {
6340 1, // opencl_global
6341 3, // opencl_local
6342 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006343 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006344 0, // cuda_device
6345 0, // cuda_constant
6346 0 // cuda_shared
6347 };
6348 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006349 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006350 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006351 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6352 "SPIR target must use unknown OS");
6353 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6354 "SPIR target must use unknown environment type");
6355 BigEndian = false;
6356 TLSSupported = false;
6357 LongWidth = LongAlign = 64;
6358 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006359 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006360 // Define available target features
6361 // These must be defined in sorted order!
6362 NoAsmVariants = true;
6363 }
Craig Topper3164f332014-03-11 03:39:26 +00006364 void getTargetDefines(const LangOptions &Opts,
6365 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006366 DefineStd(Builder, "SPIR", Opts);
6367 }
Craig Topper3164f332014-03-11 03:39:26 +00006368 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006369 return Feature == "spir";
6370 }
Craig Topper3164f332014-03-11 03:39:26 +00006371
6372 void getTargetBuiltins(const Builtin::Info *&Records,
6373 unsigned &NumRecords) const override {}
6374 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006375 return "";
6376 }
Craig Topper3164f332014-03-11 03:39:26 +00006377 void getGCCRegNames(const char * const *&Names,
6378 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006379 bool
6380 validateAsmConstraint(const char *&Name,
6381 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006382 return true;
6383 }
Craig Topper3164f332014-03-11 03:39:26 +00006384 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6385 unsigned &NumAliases) const override {}
6386 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006387 return TargetInfo::VoidPtrBuiltinVaList;
6388 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006389
6390 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6391 return (CC == CC_SpirFunction ||
6392 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6393 }
6394
6395 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6396 return CC_SpirFunction;
6397 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006398 };
6399
6400
6401 class SPIR32TargetInfo : public SPIRTargetInfo {
6402 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006403 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006404 PointerWidth = PointerAlign = 32;
6405 SizeType = TargetInfo::UnsignedInt;
6406 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6407 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006408 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6409 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006410 }
Craig Topper3164f332014-03-11 03:39:26 +00006411 void getTargetDefines(const LangOptions &Opts,
6412 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006413 DefineStd(Builder, "SPIR32", Opts);
6414 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006415 };
6416
6417 class SPIR64TargetInfo : public SPIRTargetInfo {
6418 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006419 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006420 PointerWidth = PointerAlign = 64;
6421 SizeType = TargetInfo::UnsignedLong;
6422 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006423 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6424 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006425 }
Craig Topper3164f332014-03-11 03:39:26 +00006426 void getTargetDefines(const LangOptions &Opts,
6427 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006428 DefineStd(Builder, "SPIR64", Opts);
6429 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006430 };
6431}
6432
Robert Lytton0e076492013-08-13 09:43:10 +00006433namespace {
6434class XCoreTargetInfo : public TargetInfo {
6435 static const Builtin::Info BuiltinInfo[];
6436public:
6437 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6438 BigEndian = false;
6439 NoAsmVariants = true;
6440 LongLongAlign = 32;
6441 SuitableAlign = 32;
6442 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006443 SizeType = UnsignedInt;
6444 PtrDiffType = SignedInt;
6445 IntPtrType = SignedInt;
6446 WCharType = UnsignedChar;
6447 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006448 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006449 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 +00006450 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006451 }
Craig Topper3164f332014-03-11 03:39:26 +00006452 void getTargetDefines(const LangOptions &Opts,
6453 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006454 Builder.defineMacro("__XS1B__");
6455 }
Craig Topper3164f332014-03-11 03:39:26 +00006456 void getTargetBuiltins(const Builtin::Info *&Records,
6457 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006458 Records = BuiltinInfo;
6459 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6460 }
Craig Topper3164f332014-03-11 03:39:26 +00006461 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006462 return TargetInfo::VoidPtrBuiltinVaList;
6463 }
Craig Topper3164f332014-03-11 03:39:26 +00006464 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006465 return "";
6466 }
Craig Topper3164f332014-03-11 03:39:26 +00006467 void getGCCRegNames(const char * const *&Names,
6468 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006469 static const char * const GCCRegNames[] = {
6470 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6471 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6472 };
6473 Names = GCCRegNames;
6474 NumNames = llvm::array_lengthof(GCCRegNames);
6475 }
Craig Topper3164f332014-03-11 03:39:26 +00006476 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6477 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006478 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006479 NumAliases = 0;
6480 }
Craig Topper3164f332014-03-11 03:39:26 +00006481 bool validateAsmConstraint(const char *&Name,
6482 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006483 return false;
6484 }
Craig Topper3164f332014-03-11 03:39:26 +00006485 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006486 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6487 return (RegNo < 2)? RegNo : -1;
6488 }
Robert Lytton0e076492013-08-13 09:43:10 +00006489};
6490
6491const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6492#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6493#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6494 ALL_LANGUAGES },
6495#include "clang/Basic/BuiltinsXCore.def"
6496};
6497} // end anonymous namespace.
6498
Ivan Krasindd7403e2011-08-24 20:22:22 +00006499
Chris Lattner5ba61f02006-10-14 07:39:34 +00006500//===----------------------------------------------------------------------===//
6501// Driver code
6502//===----------------------------------------------------------------------===//
6503
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006504static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006505 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006506
Daniel Dunbar52322032009-08-18 05:47:58 +00006507 switch (Triple.getArch()) {
6508 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006509 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006510
Tim Northover2a0783d2014-05-30 14:14:07 +00006511 case llvm::Triple::xcore:
6512 return new XCoreTargetInfo(Triple);
6513
6514 case llvm::Triple::hexagon:
6515 return new HexagonTargetInfo(Triple);
6516
6517 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006518 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006519 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006520
6521 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006522 case llvm::Triple::FreeBSD:
6523 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006524 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006525 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006526 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006527 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006528 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006529 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006530 }
6531
Christian Pirker9b019ae2014-02-25 13:51:00 +00006532 case llvm::Triple::aarch64_be:
6533 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006534 case llvm::Triple::FreeBSD:
6535 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006536 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006537 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006538 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006539 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006540 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006541 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006542 }
6543
Daniel Dunbar52322032009-08-18 05:47:58 +00006544 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006545 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006546 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006547 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006548
Daniel Dunbar52322032009-08-18 05:47:58 +00006549 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006550 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006551 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006552 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006553 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006554 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006555 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006556 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006557 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006558 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006559 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006560 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006561 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006562 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006563 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006564 case llvm::Triple::Win32:
6565 switch (Triple.getEnvironment()) {
6566 default:
6567 return new ARMleTargetInfo(Triple);
6568 case llvm::Triple::Itanium:
6569 return new ItaniumWindowsARMleTargetInfo(Triple);
6570 case llvm::Triple::MSVC:
6571 return new MicrosoftARMleTargetInfo(Triple);
6572 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006573 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006574 return new ARMleTargetInfo(Triple);
6575 }
6576
6577 case llvm::Triple::armeb:
6578 case llvm::Triple::thumbeb:
6579 if (Triple.isOSDarwin())
6580 return new DarwinARMTargetInfo(Triple);
6581
6582 switch (os) {
6583 case llvm::Triple::Linux:
6584 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6585 case llvm::Triple::FreeBSD:
6586 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6587 case llvm::Triple::NetBSD:
6588 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6589 case llvm::Triple::OpenBSD:
6590 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6591 case llvm::Triple::Bitrig:
6592 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6593 case llvm::Triple::RTEMS:
6594 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6595 case llvm::Triple::NaCl:
6596 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6597 default:
6598 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006599 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006600
Daniel Dunbar52322032009-08-18 05:47:58 +00006601 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006602 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006603
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006604 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006605 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006606 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006607 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006608 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006609 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006610 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006611 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006612 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006613 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006614 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006615 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006616 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006617
6618 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006619 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006620 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006621 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006622 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006623 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006624 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006625 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006626 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006627 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006628 case llvm::Triple::NaCl:
6629 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006630 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006631 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006632 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006633
Akira Hatanakabef17452011-09-20 19:21:49 +00006634 case llvm::Triple::mips64:
6635 switch (os) {
6636 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006637 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006638 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006639 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006640 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006641 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006642 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006643 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006644 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006645 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006646 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006647 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006648 }
6649
6650 case llvm::Triple::mips64el:
6651 switch (os) {
6652 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006653 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006654 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006655 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006656 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006657 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006658 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006659 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006660 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006661 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006662 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006663 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006664 }
6665
Ivan Krasindd7403e2011-08-24 20:22:22 +00006666 case llvm::Triple::le32:
6667 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006668 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006669 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006670 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006671 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006672 }
6673
JF Bastien643817d2014-09-12 17:52:47 +00006674 case llvm::Triple::le64:
6675 return new Le64TargetInfo(Triple);
6676
Daniel Dunbar52322032009-08-18 05:47:58 +00006677 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006678 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006679 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006680 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006681 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006682 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006683 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006684 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006685 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006686 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006687 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006688 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006689 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006690 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006691 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006692 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006693 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006694
6695 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006696 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006697 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006698 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006699 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006700 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006701 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006702 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006703 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006704 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006705 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006706 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006707 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006708 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006709 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006710
Bill Schmidt778d3872013-07-26 01:36:11 +00006711 case llvm::Triple::ppc64le:
6712 switch (os) {
6713 case llvm::Triple::Linux:
6714 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6715 default:
6716 return new PPC64TargetInfo(Triple);
6717 }
6718
Peter Collingbournec947aae2012-05-20 23:28:41 +00006719 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006720 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006721 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006722 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006723
Tom Stellardd8e38a32015-01-06 20:34:47 +00006724 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006725 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006726 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006727
Daniel Dunbar52322032009-08-18 05:47:58 +00006728 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006729 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006730 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006731 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006732 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006733 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006734 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006735 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006736 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006737 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006738 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006739 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006740 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006741 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006742 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006743
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006744 case llvm::Triple::sparcv9:
6745 switch (os) {
6746 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006747 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006748 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006749 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006750 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006751 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006752 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006753 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006754 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006755 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006756 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006757 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006758 }
6759
Ulrich Weigand47445072013-05-06 16:26:41 +00006760 case llvm::Triple::systemz:
6761 switch (os) {
6762 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006763 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006764 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006765 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006766 }
6767
Eli Friedmana9c3d712009-08-19 20:47:07 +00006768 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006769 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006770
Daniel Dunbar52322032009-08-18 05:47:58 +00006771 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006772 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006773 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006774
Daniel Dunbar52322032009-08-18 05:47:58 +00006775 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006776 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006777 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006778 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006779 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006780 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006781 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006782 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006783 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006784 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006785 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006786 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006787 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006788 case llvm::Triple::KFreeBSD:
6789 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006790 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006791 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006792 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006793 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006794 case llvm::Triple::Win32: {
6795 switch (Triple.getEnvironment()) {
6796 default:
6797 return new X86_32TargetInfo(Triple);
6798 case llvm::Triple::Cygnus:
6799 return new CygwinX86_32TargetInfo(Triple);
6800 case llvm::Triple::GNU:
6801 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006802 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006803 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006804 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006805 }
6806 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006807 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006808 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006809 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006810 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006811 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006812 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006813 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006814 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006815 }
6816
6817 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006818 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006819 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006820
Daniel Dunbar52322032009-08-18 05:47:58 +00006821 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006822 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006823 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006824 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006825 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006826 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006827 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006828 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006829 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006830 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006831 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006832 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006833 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006834 case llvm::Triple::KFreeBSD:
6835 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006836 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006837 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006838 case llvm::Triple::Win32: {
6839 switch (Triple.getEnvironment()) {
6840 default:
6841 return new X86_64TargetInfo(Triple);
6842 case llvm::Triple::GNU:
6843 return new MinGWX86_64TargetInfo(Triple);
6844 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006845 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006846 }
6847 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006848 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006849 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006850 case llvm::Triple::PS4:
6851 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006852 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006853 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006854 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006855
6856 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006857 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006858 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006859 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006860 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006861 }
6862 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006863 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006864 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006865 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006866 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006867 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006868 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006869}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006870
6871/// CreateTargetInfo - Return the target info object for the specified target
6872/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006873TargetInfo *
6874TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6875 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006876 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006877
6878 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006879 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006880 if (!Target) {
6881 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006882 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006883 }
Alp Toker80758082014-07-06 05:26:44 +00006884 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006885
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006886 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006887 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6888 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006889 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006890 }
6891
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006892 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006893 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6894 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006895 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006896 }
6897
Rafael Espindolaeb265472013-08-21 21:59:03 +00006898 // Set the fp math unit.
6899 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6900 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006901 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006902 }
6903
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006904 // Compute the default target features, we need the target to handle this
6905 // because features may have dependencies on one another.
6906 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006907 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006908
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006909 // Apply the user specified deltas.
6910 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6911 I < N; ++I) {
6912 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006913 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006914 bool Enabled = Name[0] == '+';
6915 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006916 }
6917
6918 // Add the features to the compile options.
6919 //
6920 // FIXME: If we are completely confident that we have the right set, we only
6921 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006922 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006923 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6924 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006925 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006926 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006927 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006928
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006929 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006930}