blob: e6fb097f45eac15b35b4db491285bf9c2af9ee10 [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
Reid Kleckner16514352015-01-30 21:42:55 +0000603 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000604 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 }
689};
Mike Stump11289f42009-09-09 15:08:12 +0000690} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000691
Chris Lattner09d98f52008-10-05 21:50:58 +0000692//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000693// Specific target implementations.
694//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000695
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000696namespace {
697// PPC abstract base class
698class PPCTargetInfo : public TargetInfo {
699 static const Builtin::Info BuiltinInfo[];
700 static const char * const GCCRegNames[];
701 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000702 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000703
704 // Target cpu features.
705 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000706 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000707
Ulrich Weigand8afad612014-07-28 13:17:52 +0000708protected:
709 std::string ABI;
710
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000711public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000712 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000713 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000714 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000715 LongDoubleWidth = LongDoubleAlign = 128;
716 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
717 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000718
Hal Finkel6b984f02012-07-03 16:51:04 +0000719 /// \brief Flags for architecture specific defines.
720 typedef enum {
721 ArchDefineNone = 0,
722 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
723 ArchDefinePpcgr = 1 << 1,
724 ArchDefinePpcsq = 1 << 2,
725 ArchDefine440 = 1 << 3,
726 ArchDefine603 = 1 << 4,
727 ArchDefine604 = 1 << 5,
728 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000729 ArchDefinePwr5 = 1 << 7,
730 ArchDefinePwr5x = 1 << 8,
731 ArchDefinePwr6 = 1 << 9,
732 ArchDefinePwr6x = 1 << 10,
733 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000734 ArchDefinePwr8 = 1 << 12,
735 ArchDefineA2 = 1 << 13,
736 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000737 } ArchDefineTypes;
738
Bill Schmidt38378a02013-02-01 20:23:10 +0000739 // Note: GCC recognizes the following additional cpus:
740 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
741 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
742 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000743 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000744 bool CPUKnown = llvm::StringSwitch<bool>(Name)
745 .Case("generic", true)
746 .Case("440", true)
747 .Case("450", true)
748 .Case("601", true)
749 .Case("602", true)
750 .Case("603", true)
751 .Case("603e", true)
752 .Case("603ev", true)
753 .Case("604", true)
754 .Case("604e", true)
755 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000756 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000757 .Case("g3", true)
758 .Case("7400", true)
759 .Case("g4", true)
760 .Case("7450", true)
761 .Case("g4+", true)
762 .Case("750", true)
763 .Case("970", true)
764 .Case("g5", true)
765 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000766 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000767 .Case("e500mc", true)
768 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000769 .Case("power3", true)
770 .Case("pwr3", true)
771 .Case("power4", true)
772 .Case("pwr4", true)
773 .Case("power5", true)
774 .Case("pwr5", true)
775 .Case("power5x", true)
776 .Case("pwr5x", true)
777 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000778 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000779 .Case("power6x", true)
780 .Case("pwr6x", true)
781 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000782 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000783 .Case("power8", true)
784 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000785 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000786 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000787 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000788 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000789 .Case("powerpc64le", true)
790 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000791 .Default(false);
792
793 if (CPUKnown)
794 CPU = Name;
795
796 return CPUKnown;
797 }
798
Ulrich Weigand8afad612014-07-28 13:17:52 +0000799
800 StringRef getABI() const override { return ABI; }
801
Craig Topper3164f332014-03-11 03:39:26 +0000802 void getTargetBuiltins(const Builtin::Info *&Records,
803 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000804 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000805 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000806 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000807
Craig Topper3164f332014-03-11 03:39:26 +0000808 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000809
Craig Topper3164f332014-03-11 03:39:26 +0000810 void getTargetDefines(const LangOptions &Opts,
811 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000812
Craig Topper3164f332014-03-11 03:39:26 +0000813 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000814
Craig Topper3164f332014-03-11 03:39:26 +0000815 bool handleTargetFeatures(std::vector<std::string> &Features,
816 DiagnosticsEngine &Diags) override;
817 bool hasFeature(StringRef Feature) const override;
818
819 void getGCCRegNames(const char * const *&Names,
820 unsigned &NumNames) const override;
821 void getGCCRegAliases(const GCCRegAlias *&Aliases,
822 unsigned &NumAliases) const override;
823 bool validateAsmConstraint(const char *&Name,
824 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000825 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000826 default: return false;
827 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000828 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000829 case 'b': // Base register
830 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000831 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000832 break;
833 // FIXME: The following are added to allow parsing.
834 // I just took a guess at what the actions should be.
835 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000836 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000837 case 'v': // Altivec vector register
838 Info.setAllowsRegister();
839 break;
840 case 'w':
841 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000842 case 'd':// VSX vector register to hold vector double data
843 case 'f':// VSX vector register to hold vector float data
844 case 's':// VSX vector register to hold scalar float data
845 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000846 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000847 break;
848 default:
849 return false;
850 }
851 Info.setAllowsRegister();
852 Name++; // Skip over 'w'.
853 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 case 'h': // `MQ', `CTR', or `LINK' register
855 case 'q': // `MQ' register
856 case 'c': // `CTR' register
857 case 'l': // `LINK' register
858 case 'x': // `CR' register (condition register) number 0
859 case 'y': // `CR' register (condition register)
860 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000861 Info.setAllowsRegister();
862 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000863 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000864 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000865 // (use `L' instead for SImode constants)
866 case 'K': // Unsigned 16-bit constant
867 case 'L': // Signed 16-bit constant shifted left 16 bits
868 case 'M': // Constant larger than 31
869 case 'N': // Exact power of 2
870 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000871 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000872 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000873 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000874 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000875 break;
876 case 'm': // Memory operand. Note that on PowerPC targets, m can
877 // include addresses that update the base register. It
878 // is therefore only safe to use `m' in an asm statement
879 // if that asm statement accesses the operand exactly once.
880 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000881 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000882 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000883 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000884 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000885 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
886 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000887 // register to be updated.
888 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000889 if (Name[1] != 's')
890 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000891 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000892 // include any automodification of the base register. Unlike
893 // `m', this constraint can be used in asm statements that
894 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000895 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000896 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000897 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000898 break;
899 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000900 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000901 case 'Z': // Memory operand that is an indexed or indirect from a
902 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000903 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000904 Info.setAllowsMemory();
905 Info.setAllowsRegister();
906 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000907 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000908 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000909 // register (`p' is preferable for asm statements)
910 case 'S': // Constant suitable as a 64-bit mask operand
911 case 'T': // Constant suitable as a 32-bit mask operand
912 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000913 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000914 // instructions
915 case 'W': // Vector constant that does not require memory
916 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000917 break;
918 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000919 }
John Thompson07a61a42010-06-24 22:44:13 +0000920 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000921 }
Craig Topper3164f332014-03-11 03:39:26 +0000922 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000923 std::string R;
924 switch (*Constraint) {
925 case 'e':
926 case 'w':
927 // Two-character constraint; add "^" hint for later parsing.
928 R = std::string("^") + std::string(Constraint, 2);
929 Constraint++;
930 break;
931 default:
932 return TargetInfo::convertConstraint(Constraint);
933 }
934 return R;
935 }
Craig Topper3164f332014-03-11 03:39:26 +0000936 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000937 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000938 }
Craig Topper3164f332014-03-11 03:39:26 +0000939 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000940 if (RegNo == 0) return 3;
941 if (RegNo == 1) return 4;
942 return -1;
943 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000944};
Anders Carlssonf511f642007-11-27 04:11:28 +0000945
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000946const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000947#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000948#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000949 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000950#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000951};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000952
Eric Christopher917e9522014-11-18 22:36:15 +0000953/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000954/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000955bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000956 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000957 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
958 // Ignore disabled features.
959 if (Features[i][0] == '-')
960 continue;
961
962 StringRef Feature = StringRef(Features[i]).substr(1);
963
964 if (Feature == "vsx") {
965 HasVSX = true;
966 continue;
967 }
968
Bill Schmidt59eb7672014-10-10 15:09:43 +0000969 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000970 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000971 continue;
972 }
973
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000974 // TODO: Finish this list and add an assert that we've handled them
975 // all.
976 }
977
978 return true;
979}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000980
Chris Lattnerecd49032009-03-02 22:27:17 +0000981/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
982/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000983void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000984 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000985 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000986 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000987 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000988 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000989 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000990 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000991 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000992 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000993 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000994 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000995 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000996 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000997
Chris Lattnerecd49032009-03-02 22:27:17 +0000998 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000999 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1000 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001001 } else {
1002 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1003 getTriple().getOS() != llvm::Triple::OpenBSD)
1004 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001005 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001006
Ulrich Weigand8afad612014-07-28 13:17:52 +00001007 // ABI options.
1008 if (ABI == "elfv1")
1009 Builder.defineMacro("_CALL_ELF", "1");
1010 if (ABI == "elfv2")
1011 Builder.defineMacro("_CALL_ELF", "2");
1012
Chris Lattnerecd49032009-03-02 22:27:17 +00001013 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001014 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1015 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001016
Chris Lattnerecd49032009-03-02 22:27:17 +00001017 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001018 if (LongDoubleWidth == 128)
1019 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001020
John Thompsone467e192009-11-19 17:18:50 +00001021 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001022 Builder.defineMacro("__VEC__", "10206");
1023 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001024 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001025
1026 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001027 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1028 .Case("440", ArchDefineName)
1029 .Case("450", ArchDefineName | ArchDefine440)
1030 .Case("601", ArchDefineName)
1031 .Case("602", ArchDefineName | ArchDefinePpcgr)
1032 .Case("603", ArchDefineName | ArchDefinePpcgr)
1033 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1034 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1035 .Case("604", ArchDefineName | ArchDefinePpcgr)
1036 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1037 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001038 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001039 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1040 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1041 .Case("750", ArchDefineName | ArchDefinePpcgr)
1042 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1043 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001044 .Case("a2", ArchDefineA2)
1045 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001046 .Case("pwr3", ArchDefinePpcgr)
1047 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1048 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1049 | ArchDefinePpcsq)
1050 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1051 | ArchDefinePpcgr | ArchDefinePpcsq)
1052 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1053 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1054 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1055 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1056 | ArchDefinePpcsq)
1057 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1058 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001059 | ArchDefinePpcgr | ArchDefinePpcsq)
1060 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1061 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1062 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001063 .Case("power3", ArchDefinePpcgr)
1064 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1065 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1066 | ArchDefinePpcsq)
1067 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1068 | ArchDefinePpcgr | ArchDefinePpcsq)
1069 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1070 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1071 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1072 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1073 | ArchDefinePpcsq)
1074 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1075 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001076 | ArchDefinePpcgr | ArchDefinePpcsq)
1077 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1078 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1079 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001080 .Default(ArchDefineNone);
1081
1082 if (defs & ArchDefineName)
1083 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1084 if (defs & ArchDefinePpcgr)
1085 Builder.defineMacro("_ARCH_PPCGR");
1086 if (defs & ArchDefinePpcsq)
1087 Builder.defineMacro("_ARCH_PPCSQ");
1088 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001089 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001090 if (defs & ArchDefine603)
1091 Builder.defineMacro("_ARCH_603");
1092 if (defs & ArchDefine604)
1093 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001094 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001095 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001096 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001097 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001098 if (defs & ArchDefinePwr5x)
1099 Builder.defineMacro("_ARCH_PWR5X");
1100 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001101 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001102 if (defs & ArchDefinePwr6x)
1103 Builder.defineMacro("_ARCH_PWR6X");
1104 if (defs & ArchDefinePwr7)
1105 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001106 if (defs & ArchDefinePwr8)
1107 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001108 if (defs & ArchDefineA2)
1109 Builder.defineMacro("_ARCH_A2");
1110 if (defs & ArchDefineA2q) {
1111 Builder.defineMacro("_ARCH_A2Q");
1112 Builder.defineMacro("_ARCH_QP");
1113 }
1114
1115 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1116 Builder.defineMacro("__bg__");
1117 Builder.defineMacro("__THW_BLUEGENE__");
1118 Builder.defineMacro("__bgq__");
1119 Builder.defineMacro("__TOS_BGQ__");
1120 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001121
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001122 if (HasVSX)
1123 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001124 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001125 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001126
Bill Schmidt38378a02013-02-01 20:23:10 +00001127 // FIXME: The following are not yet generated here by Clang, but are
1128 // generated by GCC:
1129 //
1130 // _SOFT_FLOAT_
1131 // __RECIP_PRECISION__
1132 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001133 // __RECIP__
1134 // __RECIPF__
1135 // __RSQRTE__
1136 // __RSQRTEF__
1137 // _SOFT_DOUBLE_
1138 // __NO_LWSYNC__
1139 // __HAVE_BSWAP__
1140 // __LONGDOUBLE128
1141 // __CMODEL_MEDIUM__
1142 // __CMODEL_LARGE__
1143 // _CALL_SYSV
1144 // _CALL_DARWIN
1145 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001146}
1147
1148void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1149 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1150 .Case("7400", true)
1151 .Case("g4", true)
1152 .Case("7450", true)
1153 .Case("g4+", true)
1154 .Case("970", true)
1155 .Case("g5", true)
1156 .Case("pwr6", true)
1157 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001158 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001159 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001160 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001161 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001162
1163 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001164}
1165
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001166bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001167 return llvm::StringSwitch<bool>(Feature)
1168 .Case("powerpc", true)
1169 .Case("vsx", HasVSX)
1170 .Case("power8-vector", HasP8Vector)
1171 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001172}
Chris Lattner17df24e2008-04-21 18:56:49 +00001173
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001174const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001175 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1176 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1177 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1178 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1179 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1180 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1181 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1182 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001183 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001184 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001185 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001186 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1187 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1188 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1189 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001190 "vrsave", "vscr",
1191 "spe_acc", "spefscr",
1192 "sfp"
1193};
Chris Lattner10a5b382007-01-29 05:24:35 +00001194
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001195void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001196 unsigned &NumNames) const {
1197 Names = GCCRegNames;
1198 NumNames = llvm::array_lengthof(GCCRegNames);
1199}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001200
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001201const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1202 // While some of these aliases do map to different registers
1203 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001204 { { "0" }, "r0" },
1205 { { "1"}, "r1" },
1206 { { "2" }, "r2" },
1207 { { "3" }, "r3" },
1208 { { "4" }, "r4" },
1209 { { "5" }, "r5" },
1210 { { "6" }, "r6" },
1211 { { "7" }, "r7" },
1212 { { "8" }, "r8" },
1213 { { "9" }, "r9" },
1214 { { "10" }, "r10" },
1215 { { "11" }, "r11" },
1216 { { "12" }, "r12" },
1217 { { "13" }, "r13" },
1218 { { "14" }, "r14" },
1219 { { "15" }, "r15" },
1220 { { "16" }, "r16" },
1221 { { "17" }, "r17" },
1222 { { "18" }, "r18" },
1223 { { "19" }, "r19" },
1224 { { "20" }, "r20" },
1225 { { "21" }, "r21" },
1226 { { "22" }, "r22" },
1227 { { "23" }, "r23" },
1228 { { "24" }, "r24" },
1229 { { "25" }, "r25" },
1230 { { "26" }, "r26" },
1231 { { "27" }, "r27" },
1232 { { "28" }, "r28" },
1233 { { "29" }, "r29" },
1234 { { "30" }, "r30" },
1235 { { "31" }, "r31" },
1236 { { "fr0" }, "f0" },
1237 { { "fr1" }, "f1" },
1238 { { "fr2" }, "f2" },
1239 { { "fr3" }, "f3" },
1240 { { "fr4" }, "f4" },
1241 { { "fr5" }, "f5" },
1242 { { "fr6" }, "f6" },
1243 { { "fr7" }, "f7" },
1244 { { "fr8" }, "f8" },
1245 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001246 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001247 { { "fr11" }, "f11" },
1248 { { "fr12" }, "f12" },
1249 { { "fr13" }, "f13" },
1250 { { "fr14" }, "f14" },
1251 { { "fr15" }, "f15" },
1252 { { "fr16" }, "f16" },
1253 { { "fr17" }, "f17" },
1254 { { "fr18" }, "f18" },
1255 { { "fr19" }, "f19" },
1256 { { "fr20" }, "f20" },
1257 { { "fr21" }, "f21" },
1258 { { "fr22" }, "f22" },
1259 { { "fr23" }, "f23" },
1260 { { "fr24" }, "f24" },
1261 { { "fr25" }, "f25" },
1262 { { "fr26" }, "f26" },
1263 { { "fr27" }, "f27" },
1264 { { "fr28" }, "f28" },
1265 { { "fr29" }, "f29" },
1266 { { "fr30" }, "f30" },
1267 { { "fr31" }, "f31" },
1268 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001269};
1270
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001271void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001272 unsigned &NumAliases) const {
1273 Aliases = GCCRegAliases;
1274 NumAliases = llvm::array_lengthof(GCCRegAliases);
1275}
1276} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001277
Chris Lattner5ba61f02006-10-14 07:39:34 +00001278namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001279class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001280public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001281 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001282 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001283
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001284 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001285 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001286 case llvm::Triple::FreeBSD:
1287 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001288 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001289 PtrDiffType = SignedInt;
1290 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001291 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001292 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001293 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001294 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001295
Roman Divacky3ffe7462012-03-13 19:20:17 +00001296 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1297 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001298 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001299 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001300
1301 // PPC32 supports atomics up to 4 bytes.
1302 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001303 }
1304
Craig Topper3164f332014-03-11 03:39:26 +00001305 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001306 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001307 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001308 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001309};
1310} // end anonymous namespace.
1311
Bill Schmidt778d3872013-07-26 01:36:11 +00001312// Note: ABI differences may eventually require us to have a separate
1313// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001314namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001315class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001316public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001317 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001318 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001319 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001320 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001321
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001322 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1323 DescriptionString = "e-m:e-i64:64-n32:64";
1324 ABI = "elfv2";
1325 } else {
1326 DescriptionString = "E-m:e-i64:64-n32:64";
1327 ABI = "elfv1";
1328 }
1329
1330 switch (getTriple().getOS()) {
1331 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001332 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001333 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001334 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001335 case llvm::Triple::NetBSD:
1336 IntMaxType = SignedLongLong;
1337 Int64Type = SignedLongLong;
1338 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001339 default:
1340 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001341 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001342
1343 // PPC64 supports atomics up to 8 bytes.
1344 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001345 }
Craig Topper3164f332014-03-11 03:39:26 +00001346 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001347 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001348 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001349 // PPC64 Linux-specifc ABI options.
1350 bool setABI(const std::string &Name) override {
1351 if (Name == "elfv1" || Name == "elfv2") {
1352 ABI = Name;
1353 return true;
1354 }
1355 return false;
1356 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001357};
1358} // end anonymous namespace.
1359
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001360
1361namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001362class DarwinPPC32TargetInfo :
1363 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001364public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001365 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1366 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001367 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001368 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001369 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001370 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001371 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001372 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001373 }
Craig Topper3164f332014-03-11 03:39:26 +00001374 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001375 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001376 }
1377};
1378
1379class DarwinPPC64TargetInfo :
1380 public DarwinTargetInfo<PPC64TargetInfo> {
1381public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001382 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1383 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001384 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001385 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001386 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001387 }
1388};
1389} // end anonymous namespace.
1390
Chris Lattner5ba61f02006-10-14 07:39:34 +00001391namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001392 static const unsigned NVPTXAddrSpaceMap[] = {
1393 1, // opencl_global
1394 3, // opencl_local
1395 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001396 // FIXME: generic has to be added to the target
1397 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001398 1, // cuda_device
1399 4, // cuda_constant
1400 3, // cuda_shared
1401 };
1402 class NVPTXTargetInfo : public TargetInfo {
1403 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001404 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001405
1406 // The GPU profiles supported by the NVPTX backend
1407 enum GPUKind {
1408 GK_NONE,
1409 GK_SM20,
1410 GK_SM21,
1411 GK_SM30,
1412 GK_SM35,
1413 } GPU;
1414
Peter Collingbournec947aae2012-05-20 23:28:41 +00001415 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001416 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001417 BigEndian = false;
1418 TLSSupported = false;
1419 LongWidth = LongAlign = 64;
1420 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001421 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001422 // Define available target features
1423 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001424 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001425 // Set the default GPU to sm20
1426 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001427 }
Craig Topper3164f332014-03-11 03:39:26 +00001428 void getTargetDefines(const LangOptions &Opts,
1429 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001430 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001431 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001432 if (Opts.CUDAIsDevice) {
1433 // Set __CUDA_ARCH__ for the GPU specified.
1434 std::string CUDAArchCode;
1435 switch (GPU) {
1436 case GK_SM20:
1437 CUDAArchCode = "200";
1438 break;
1439 case GK_SM21:
1440 CUDAArchCode = "210";
1441 break;
1442 case GK_SM30:
1443 CUDAArchCode = "300";
1444 break;
1445 case GK_SM35:
1446 CUDAArchCode = "350";
1447 break;
1448 default:
1449 llvm_unreachable("Unhandled target CPU");
1450 }
1451 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1452 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001453 }
Craig Topper3164f332014-03-11 03:39:26 +00001454 void getTargetBuiltins(const Builtin::Info *&Records,
1455 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001456 Records = BuiltinInfo;
1457 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001458 }
Craig Topper3164f332014-03-11 03:39:26 +00001459 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001460 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001461 }
Craig Topper3164f332014-03-11 03:39:26 +00001462
1463 void getGCCRegNames(const char * const *&Names,
1464 unsigned &NumNames) const override;
1465 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1466 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001467 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001468 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001469 NumAliases = 0;
1470 }
Eric Christopher917e9522014-11-18 22:36:15 +00001471 bool
1472 validateAsmConstraint(const char *&Name,
1473 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001474 switch (*Name) {
1475 default: return false;
1476 case 'c':
1477 case 'h':
1478 case 'r':
1479 case 'l':
1480 case 'f':
1481 case 'd':
1482 Info.setAllowsRegister();
1483 return true;
1484 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001485 }
Craig Topper3164f332014-03-11 03:39:26 +00001486 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001487 // FIXME: Is this really right?
1488 return "";
1489 }
Craig Topper3164f332014-03-11 03:39:26 +00001490 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001491 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001492 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001493 }
Craig Topper3164f332014-03-11 03:39:26 +00001494 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001495 GPU = llvm::StringSwitch<GPUKind>(Name)
1496 .Case("sm_20", GK_SM20)
1497 .Case("sm_21", GK_SM21)
1498 .Case("sm_30", GK_SM30)
1499 .Case("sm_35", GK_SM35)
1500 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001501
Reid Klecknerbbc01782014-12-03 21:53:36 +00001502 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001503 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001504 };
1505
1506 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1507#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1508#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1509 ALL_LANGUAGES },
1510#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001511 };
1512
1513 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1514 "r0"
1515 };
1516
1517 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1518 unsigned &NumNames) const {
1519 Names = GCCRegNames;
1520 NumNames = llvm::array_lengthof(GCCRegNames);
1521 }
1522
1523 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1524 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001525 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001526 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001527 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1528 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001529 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001530 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001531 };
1532
1533 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1534 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001535 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001536 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001537 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1538 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001539 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001540 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001541 };
1542}
1543
1544namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001545
1546static const unsigned R600AddrSpaceMap[] = {
1547 1, // opencl_global
1548 3, // opencl_local
1549 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001550 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001551 1, // cuda_device
1552 2, // cuda_constant
1553 3 // cuda_shared
1554};
1555
Tom Stellarda96344b2014-08-21 13:58:40 +00001556// If you edit the description strings, make sure you update
1557// getPointerWidthV().
1558
Tom Stellardc74b1e02013-03-04 17:40:53 +00001559static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001560 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1561 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001562
1563static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001564 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1565 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001566
1567static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001568 "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 +00001569 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1570 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001571
Eli Friedmand13b41e2012-10-12 23:32:00 +00001572class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001573 static const Builtin::Info BuiltinInfo[];
1574
Tom Stellardc74b1e02013-03-04 17:40:53 +00001575 /// \brief The GPU profiles supported by the R600 target.
1576 enum GPUKind {
1577 GK_NONE,
1578 GK_R600,
1579 GK_R600_DOUBLE_OPS,
1580 GK_R700,
1581 GK_R700_DOUBLE_OPS,
1582 GK_EVERGREEN,
1583 GK_EVERGREEN_DOUBLE_OPS,
1584 GK_NORTHERN_ISLANDS,
1585 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001586 GK_SOUTHERN_ISLANDS,
1587 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001588 } GPU;
1589
Eli Friedmand13b41e2012-10-12 23:32:00 +00001590public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001591 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001592 : TargetInfo(Triple) {
1593
1594 if (Triple.getArch() == llvm::Triple::amdgcn) {
1595 DescriptionString = DescriptionStringSI;
1596 GPU = GK_SOUTHERN_ISLANDS;
1597 } else {
1598 DescriptionString = DescriptionStringR600;
1599 GPU = GK_R600;
1600 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001601 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001602 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001603 }
1604
Tom Stellarda96344b2014-08-21 13:58:40 +00001605 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1606 if (GPU <= GK_CAYMAN)
1607 return 32;
1608
1609 switch(AddrSpace) {
1610 default:
1611 return 64;
1612 case 0:
1613 case 3:
1614 case 5:
1615 return 32;
1616 }
1617 }
1618
Craig Topper3164f332014-03-11 03:39:26 +00001619 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001620 return "";
1621 }
1622
Craig Topper3164f332014-03-11 03:39:26 +00001623 void getGCCRegNames(const char * const *&Names,
1624 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001625 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001626 numNames = 0;
1627 }
1628
Craig Topper3164f332014-03-11 03:39:26 +00001629 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1630 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001631 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001632 NumAliases = 0;
1633 }
1634
Craig Topper3164f332014-03-11 03:39:26 +00001635 bool validateAsmConstraint(const char *&Name,
1636 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001637 return true;
1638 }
1639
Craig Topper3164f332014-03-11 03:39:26 +00001640 void getTargetBuiltins(const Builtin::Info *&Records,
1641 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001642 Records = BuiltinInfo;
1643 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001644 }
1645
Craig Topper3164f332014-03-11 03:39:26 +00001646 void getTargetDefines(const LangOptions &Opts,
1647 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001648 Builder.defineMacro("__R600__");
1649 }
1650
Craig Topper3164f332014-03-11 03:39:26 +00001651 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001652 return TargetInfo::CharPtrBuiltinVaList;
1653 }
1654
Craig Topper3164f332014-03-11 03:39:26 +00001655 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001656 GPU = llvm::StringSwitch<GPUKind>(Name)
1657 .Case("r600" , GK_R600)
1658 .Case("rv610", GK_R600)
1659 .Case("rv620", GK_R600)
1660 .Case("rv630", GK_R600)
1661 .Case("rv635", GK_R600)
1662 .Case("rs780", GK_R600)
1663 .Case("rs880", GK_R600)
1664 .Case("rv670", GK_R600_DOUBLE_OPS)
1665 .Case("rv710", GK_R700)
1666 .Case("rv730", GK_R700)
1667 .Case("rv740", GK_R700_DOUBLE_OPS)
1668 .Case("rv770", GK_R700_DOUBLE_OPS)
1669 .Case("palm", GK_EVERGREEN)
1670 .Case("cedar", GK_EVERGREEN)
1671 .Case("sumo", GK_EVERGREEN)
1672 .Case("sumo2", GK_EVERGREEN)
1673 .Case("redwood", GK_EVERGREEN)
1674 .Case("juniper", GK_EVERGREEN)
1675 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1676 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1677 .Case("barts", GK_NORTHERN_ISLANDS)
1678 .Case("turks", GK_NORTHERN_ISLANDS)
1679 .Case("caicos", GK_NORTHERN_ISLANDS)
1680 .Case("cayman", GK_CAYMAN)
1681 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001682 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001683 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1684 .Case("verde", GK_SOUTHERN_ISLANDS)
1685 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001686 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001687 .Case("bonaire", GK_SEA_ISLANDS)
1688 .Case("kabini", GK_SEA_ISLANDS)
1689 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001690 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001691 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001692 .Default(GK_NONE);
1693
1694 if (GPU == GK_NONE) {
1695 return false;
1696 }
1697
1698 // Set the correct data layout
1699 switch (GPU) {
1700 case GK_NONE:
1701 case GK_R600:
1702 case GK_R700:
1703 case GK_EVERGREEN:
1704 case GK_NORTHERN_ISLANDS:
1705 DescriptionString = DescriptionStringR600;
1706 break;
1707 case GK_R600_DOUBLE_OPS:
1708 case GK_R700_DOUBLE_OPS:
1709 case GK_EVERGREEN_DOUBLE_OPS:
1710 case GK_CAYMAN:
1711 DescriptionString = DescriptionStringR600DoubleOps;
1712 break;
1713 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001714 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001715 DescriptionString = DescriptionStringSI;
1716 break;
1717 }
1718
1719 return true;
1720 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001721};
1722
Matt Arsenault56f008d2014-06-24 20:45:01 +00001723const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1724#define BUILTIN(ID, TYPE, ATTRS) \
1725 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1726#include "clang/Basic/BuiltinsR600.def"
1727};
1728
Eli Friedmand13b41e2012-10-12 23:32:00 +00001729} // end anonymous namespace
1730
1731namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001732// Namespace for x86 abstract base class
1733const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001734#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001735#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001736 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001737#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001738};
Eli Friedmanb5366062008-05-20 14:21:01 +00001739
Nuno Lopescfca1f02009-12-23 17:49:57 +00001740static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001741 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1742 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001743 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001744 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1745 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1746 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001747 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001748 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1749 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001750};
1751
Eric Christophercdd36352011-06-21 00:05:20 +00001752const TargetInfo::AddlRegName AddlRegNames[] = {
1753 { { "al", "ah", "eax", "rax" }, 0 },
1754 { { "bl", "bh", "ebx", "rbx" }, 3 },
1755 { { "cl", "ch", "ecx", "rcx" }, 2 },
1756 { { "dl", "dh", "edx", "rdx" }, 1 },
1757 { { "esi", "rsi" }, 4 },
1758 { { "edi", "rdi" }, 5 },
1759 { { "esp", "rsp" }, 7 },
1760 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001761};
1762
1763// X86 target abstract base class; x86-32 and x86-64 are very close, so
1764// most of the implementation can be shared.
1765class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001766 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001767 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001768 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001769 enum MMX3DNowEnum {
1770 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1771 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001772 enum XOPEnum {
1773 NoXOP,
1774 SSE4A,
1775 FMA4,
1776 XOP
1777 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001778
Eric Christophere1ddaf92010-04-02 23:50:19 +00001779 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001780 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001781 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001782 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001783 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001784 bool HasBMI;
1785 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001786 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001787 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001788 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001789 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001790 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001791 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001792 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001793 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001794 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1795 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001796 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001797 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001798
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001799 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1800 ///
1801 /// Each enumeration represents a particular CPU supported by Clang. These
1802 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1803 enum CPUKind {
1804 CK_Generic,
1805
1806 /// \name i386
1807 /// i386-generation processors.
1808 //@{
1809 CK_i386,
1810 //@}
1811
1812 /// \name i486
1813 /// i486-generation processors.
1814 //@{
1815 CK_i486,
1816 CK_WinChipC6,
1817 CK_WinChip2,
1818 CK_C3,
1819 //@}
1820
1821 /// \name i586
1822 /// i586-generation processors, P5 microarchitecture based.
1823 //@{
1824 CK_i586,
1825 CK_Pentium,
1826 CK_PentiumMMX,
1827 //@}
1828
1829 /// \name i686
1830 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1831 //@{
1832 CK_i686,
1833 CK_PentiumPro,
1834 CK_Pentium2,
1835 CK_Pentium3,
1836 CK_Pentium3M,
1837 CK_PentiumM,
1838 CK_C3_2,
1839
1840 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1841 /// Clang however has some logic to suport this.
1842 // FIXME: Warn, deprecate, and potentially remove this.
1843 CK_Yonah,
1844 //@}
1845
1846 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001847 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001848 //@{
1849 CK_Pentium4,
1850 CK_Pentium4M,
1851 CK_Prescott,
1852 CK_Nocona,
1853 //@}
1854
1855 /// \name Core
1856 /// Core microarchitecture based processors.
1857 //@{
1858 CK_Core2,
1859
1860 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1861 /// codename which GCC no longer accepts as an option to -march, but Clang
1862 /// has some logic for recognizing it.
1863 // FIXME: Warn, deprecate, and potentially remove this.
1864 CK_Penryn,
1865 //@}
1866
1867 /// \name Atom
1868 /// Atom processors
1869 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001870 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001871 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001872 //@}
1873
1874 /// \name Nehalem
1875 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001876 CK_Nehalem,
1877
1878 /// \name Westmere
1879 /// Westmere microarchitecture based processors.
1880 CK_Westmere,
1881
1882 /// \name Sandy Bridge
1883 /// Sandy Bridge microarchitecture based processors.
1884 CK_SandyBridge,
1885
1886 /// \name Ivy Bridge
1887 /// Ivy Bridge microarchitecture based processors.
1888 CK_IvyBridge,
1889
1890 /// \name Haswell
1891 /// Haswell microarchitecture based processors.
1892 CK_Haswell,
1893
1894 /// \name Broadwell
1895 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001896 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001897
1898 /// \name Skylake
1899 /// Skylake microarchitecture based processors.
1900 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001901
Craig Topper449314e2013-08-20 07:09:39 +00001902 /// \name Knights Landing
1903 /// Knights Landing processor.
1904 CK_KNL,
1905
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001906 /// \name K6
1907 /// K6 architecture processors.
1908 //@{
1909 CK_K6,
1910 CK_K6_2,
1911 CK_K6_3,
1912 //@}
1913
1914 /// \name K7
1915 /// K7 architecture processors.
1916 //@{
1917 CK_Athlon,
1918 CK_AthlonThunderbird,
1919 CK_Athlon4,
1920 CK_AthlonXP,
1921 CK_AthlonMP,
1922 //@}
1923
1924 /// \name K8
1925 /// K8 architecture processors.
1926 //@{
1927 CK_Athlon64,
1928 CK_Athlon64SSE3,
1929 CK_AthlonFX,
1930 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001931 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001932 CK_Opteron,
1933 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001934 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001935 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001936
Benjamin Kramer569f2152012-01-10 11:50:18 +00001937 /// \name Bobcat
1938 /// Bobcat architecture processors.
1939 //@{
1940 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001941 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001942 //@}
1943
1944 /// \name Bulldozer
1945 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001946 //@{
1947 CK_BDVER1,
1948 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001949 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001950 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001951 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001952
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001953 /// This specification is deprecated and will be removed in the future.
1954 /// Users should prefer \see CK_K8.
1955 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001956 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001957 CK_x86_64,
1958 //@}
1959
1960 /// \name Geode
1961 /// Geode processors.
1962 //@{
1963 CK_Geode
1964 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001965 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001966
Rafael Espindolaeb265472013-08-21 21:59:03 +00001967 enum FPMathKind {
1968 FP_Default,
1969 FP_SSE,
1970 FP_387
1971 } FPMath;
1972
Eli Friedman3fd920a2008-08-20 02:34:37 +00001973public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001974 X86TargetInfo(const llvm::Triple &Triple)
1975 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001976 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001977 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1978 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1979 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1980 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1981 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1982 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001983 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001984 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001985 }
Craig Topper3164f332014-03-11 03:39:26 +00001986 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001987 // X87 evaluates with 80 bits "long double" precision.
1988 return SSELevel == NoSSE ? 2 : 0;
1989 }
Craig Topper3164f332014-03-11 03:39:26 +00001990 void getTargetBuiltins(const Builtin::Info *&Records,
1991 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001992 Records = BuiltinInfo;
1993 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001994 }
Craig Topper3164f332014-03-11 03:39:26 +00001995 void getGCCRegNames(const char * const *&Names,
1996 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001997 Names = GCCRegNames;
1998 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001999 }
Craig Topper3164f332014-03-11 03:39:26 +00002000 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2001 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002002 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002003 NumAliases = 0;
2004 }
Craig Topper3164f332014-03-11 03:39:26 +00002005 void getGCCAddlRegNames(const AddlRegName *&Names,
2006 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002007 Names = AddlRegNames;
2008 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002009 }
Craig Topper3164f332014-03-11 03:39:26 +00002010 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002011 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002012
Akira Hatanaka974131e2014-09-18 18:17:18 +00002013 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2014
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002015 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2016
Akira Hatanaka974131e2014-09-18 18:17:18 +00002017 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2018
Craig Topper3164f332014-03-11 03:39:26 +00002019 std::string convertConstraint(const char *&Constraint) const override;
2020 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002021 return "~{dirflag},~{fpsr},~{flags}";
2022 }
Craig Topper3164f332014-03-11 03:39:26 +00002023 void getTargetDefines(const LangOptions &Opts,
2024 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002025 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2026 bool Enabled);
2027 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2028 bool Enabled);
2029 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2030 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002031 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2032 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002033 setFeatureEnabledImpl(Features, Name, Enabled);
2034 }
2035 // This exists purely to cut down on the number of virtual calls in
2036 // getDefaultFeatures which calls this repeatedly.
2037 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2038 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002039 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2040 bool hasFeature(StringRef Feature) const override;
2041 bool handleTargetFeatures(std::vector<std::string> &Features,
2042 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002043 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002044 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002045 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002046 else if (getTriple().getArch() == llvm::Triple::x86 &&
2047 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002048 return "no-mmx";
2049 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002050 }
Craig Topper3164f332014-03-11 03:39:26 +00002051 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002052 CPU = llvm::StringSwitch<CPUKind>(Name)
2053 .Case("i386", CK_i386)
2054 .Case("i486", CK_i486)
2055 .Case("winchip-c6", CK_WinChipC6)
2056 .Case("winchip2", CK_WinChip2)
2057 .Case("c3", CK_C3)
2058 .Case("i586", CK_i586)
2059 .Case("pentium", CK_Pentium)
2060 .Case("pentium-mmx", CK_PentiumMMX)
2061 .Case("i686", CK_i686)
2062 .Case("pentiumpro", CK_PentiumPro)
2063 .Case("pentium2", CK_Pentium2)
2064 .Case("pentium3", CK_Pentium3)
2065 .Case("pentium3m", CK_Pentium3M)
2066 .Case("pentium-m", CK_PentiumM)
2067 .Case("c3-2", CK_C3_2)
2068 .Case("yonah", CK_Yonah)
2069 .Case("pentium4", CK_Pentium4)
2070 .Case("pentium4m", CK_Pentium4M)
2071 .Case("prescott", CK_Prescott)
2072 .Case("nocona", CK_Nocona)
2073 .Case("core2", CK_Core2)
2074 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002075 .Case("bonnell", CK_Bonnell)
2076 .Case("atom", CK_Bonnell) // Legacy name.
2077 .Case("silvermont", CK_Silvermont)
2078 .Case("slm", CK_Silvermont) // Legacy name.
2079 .Case("nehalem", CK_Nehalem)
2080 .Case("corei7", CK_Nehalem) // Legacy name.
2081 .Case("westmere", CK_Westmere)
2082 .Case("sandybridge", CK_SandyBridge)
2083 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2084 .Case("ivybridge", CK_IvyBridge)
2085 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2086 .Case("haswell", CK_Haswell)
2087 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002088 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002089 .Case("skylake", CK_Skylake)
2090 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002091 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002092 .Case("k6", CK_K6)
2093 .Case("k6-2", CK_K6_2)
2094 .Case("k6-3", CK_K6_3)
2095 .Case("athlon", CK_Athlon)
2096 .Case("athlon-tbird", CK_AthlonThunderbird)
2097 .Case("athlon-4", CK_Athlon4)
2098 .Case("athlon-xp", CK_AthlonXP)
2099 .Case("athlon-mp", CK_AthlonMP)
2100 .Case("athlon64", CK_Athlon64)
2101 .Case("athlon64-sse3", CK_Athlon64SSE3)
2102 .Case("athlon-fx", CK_AthlonFX)
2103 .Case("k8", CK_K8)
2104 .Case("k8-sse3", CK_K8SSE3)
2105 .Case("opteron", CK_Opteron)
2106 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002107 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002108 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002109 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002110 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002111 .Case("bdver1", CK_BDVER1)
2112 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002113 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002114 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002115 .Case("x86-64", CK_x86_64)
2116 .Case("geode", CK_Geode)
2117 .Default(CK_Generic);
2118
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002119 // Perform any per-CPU checks necessary to determine if this CPU is
2120 // acceptable.
2121 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2122 // invalid without explaining *why*.
2123 switch (CPU) {
2124 case CK_Generic:
2125 // No processor selected!
2126 return false;
2127
2128 case CK_i386:
2129 case CK_i486:
2130 case CK_WinChipC6:
2131 case CK_WinChip2:
2132 case CK_C3:
2133 case CK_i586:
2134 case CK_Pentium:
2135 case CK_PentiumMMX:
2136 case CK_i686:
2137 case CK_PentiumPro:
2138 case CK_Pentium2:
2139 case CK_Pentium3:
2140 case CK_Pentium3M:
2141 case CK_PentiumM:
2142 case CK_Yonah:
2143 case CK_C3_2:
2144 case CK_Pentium4:
2145 case CK_Pentium4M:
2146 case CK_Prescott:
2147 case CK_K6:
2148 case CK_K6_2:
2149 case CK_K6_3:
2150 case CK_Athlon:
2151 case CK_AthlonThunderbird:
2152 case CK_Athlon4:
2153 case CK_AthlonXP:
2154 case CK_AthlonMP:
2155 case CK_Geode:
2156 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002157 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002158 return false;
2159
2160 // Fallthrough
2161 case CK_Nocona:
2162 case CK_Core2:
2163 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002164 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002165 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002166 case CK_Nehalem:
2167 case CK_Westmere:
2168 case CK_SandyBridge:
2169 case CK_IvyBridge:
2170 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002171 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002172 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002173 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002174 case CK_Athlon64:
2175 case CK_Athlon64SSE3:
2176 case CK_AthlonFX:
2177 case CK_K8:
2178 case CK_K8SSE3:
2179 case CK_Opteron:
2180 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002181 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002182 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002183 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002184 case CK_BDVER1:
2185 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002186 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002187 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002188 case CK_x86_64:
2189 return true;
2190 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002191 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002192 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002193
Craig Topper3164f332014-03-11 03:39:26 +00002194 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002195
Craig Topper3164f332014-03-11 03:39:26 +00002196 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002197 // We accept all non-ARM calling conventions
2198 return (CC == CC_X86ThisCall ||
2199 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002200 CC == CC_X86StdCall ||
2201 CC == CC_X86VectorCall ||
2202 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002203 CC == CC_X86Pascal ||
2204 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002205 }
2206
Craig Topper3164f332014-03-11 03:39:26 +00002207 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002208 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002209 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002210};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002211
Rafael Espindolaeb265472013-08-21 21:59:03 +00002212bool X86TargetInfo::setFPMath(StringRef Name) {
2213 if (Name == "387") {
2214 FPMath = FP_387;
2215 return true;
2216 }
2217 if (Name == "sse") {
2218 FPMath = FP_SSE;
2219 return true;
2220 }
2221 return false;
2222}
2223
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002224void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002225 // FIXME: This *really* should not be here.
2226
2227 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002228 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002229 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002230
Chandler Carruth212334f2011-09-28 08:55:37 +00002231 switch (CPU) {
2232 case CK_Generic:
2233 case CK_i386:
2234 case CK_i486:
2235 case CK_i586:
2236 case CK_Pentium:
2237 case CK_i686:
2238 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002239 break;
2240 case CK_PentiumMMX:
2241 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002242 case CK_K6:
2243 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002244 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002245 break;
2246 case CK_Pentium3:
2247 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002248 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002249 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002250 break;
2251 case CK_PentiumM:
2252 case CK_Pentium4:
2253 case CK_Pentium4M:
2254 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002255 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002256 break;
2257 case CK_Yonah:
2258 case CK_Prescott:
2259 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002260 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002261 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002262 break;
2263 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002264 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002265 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002266 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002267 break;
2268 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002269 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002270 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002271 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002272 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002273 setFeatureEnabledImpl(Features, "avx512f", true);
2274 setFeatureEnabledImpl(Features, "avx512cd", true);
2275 setFeatureEnabledImpl(Features, "avx512dq", true);
2276 setFeatureEnabledImpl(Features, "avx512bw", true);
2277 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002278 // FALLTHROUGH
2279 case CK_Broadwell:
2280 setFeatureEnabledImpl(Features, "rdseed", true);
2281 setFeatureEnabledImpl(Features, "adx", true);
2282 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002283 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002284 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002285 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002286 setFeatureEnabledImpl(Features, "bmi", true);
2287 setFeatureEnabledImpl(Features, "bmi2", true);
2288 setFeatureEnabledImpl(Features, "rtm", true);
2289 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002290 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002291 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002292 setFeatureEnabledImpl(Features, "rdrnd", true);
2293 setFeatureEnabledImpl(Features, "f16c", true);
2294 setFeatureEnabledImpl(Features, "fsgsbase", true);
2295 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002296 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002297 setFeatureEnabledImpl(Features, "avx", true);
2298 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002299 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002300 case CK_Silvermont:
2301 setFeatureEnabledImpl(Features, "aes", true);
2302 setFeatureEnabledImpl(Features, "pclmul", true);
2303 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002304 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002305 setFeatureEnabledImpl(Features, "sse4.2", true);
2306 setFeatureEnabledImpl(Features, "cx16", true);
2307 break;
2308 case CK_KNL:
2309 setFeatureEnabledImpl(Features, "avx512f", true);
2310 setFeatureEnabledImpl(Features, "avx512cd", true);
2311 setFeatureEnabledImpl(Features, "avx512er", true);
2312 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002313 setFeatureEnabledImpl(Features, "rdseed", true);
2314 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002315 setFeatureEnabledImpl(Features, "lzcnt", true);
2316 setFeatureEnabledImpl(Features, "bmi", true);
2317 setFeatureEnabledImpl(Features, "bmi2", true);
2318 setFeatureEnabledImpl(Features, "rtm", true);
2319 setFeatureEnabledImpl(Features, "fma", true);
2320 setFeatureEnabledImpl(Features, "rdrnd", true);
2321 setFeatureEnabledImpl(Features, "f16c", true);
2322 setFeatureEnabledImpl(Features, "fsgsbase", true);
2323 setFeatureEnabledImpl(Features, "aes", true);
2324 setFeatureEnabledImpl(Features, "pclmul", true);
2325 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002326 break;
2327 case CK_K6_2:
2328 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002329 case CK_WinChip2:
2330 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002331 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002332 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002333 case CK_Athlon:
2334 case CK_AthlonThunderbird:
2335 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002336 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002337 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002338 case CK_Athlon4:
2339 case CK_AthlonXP:
2340 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002341 setFeatureEnabledImpl(Features, "sse", true);
2342 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002343 break;
2344 case CK_K8:
2345 case CK_Opteron:
2346 case CK_Athlon64:
2347 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002348 setFeatureEnabledImpl(Features, "sse2", true);
2349 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002350 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002351 case CK_AMDFAM10:
2352 setFeatureEnabledImpl(Features, "sse4a", true);
2353 setFeatureEnabledImpl(Features, "lzcnt", true);
2354 setFeatureEnabledImpl(Features, "popcnt", true);
2355 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002356 case CK_K8SSE3:
2357 case CK_OpteronSSE3:
2358 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002359 setFeatureEnabledImpl(Features, "sse3", true);
2360 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002361 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002362 case CK_BTVER2:
2363 setFeatureEnabledImpl(Features, "avx", true);
2364 setFeatureEnabledImpl(Features, "aes", true);
2365 setFeatureEnabledImpl(Features, "pclmul", true);
2366 setFeatureEnabledImpl(Features, "bmi", true);
2367 setFeatureEnabledImpl(Features, "f16c", true);
2368 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002369 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002370 setFeatureEnabledImpl(Features, "ssse3", true);
2371 setFeatureEnabledImpl(Features, "sse4a", true);
2372 setFeatureEnabledImpl(Features, "lzcnt", true);
2373 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002374 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002375 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002376 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002377 case CK_BDVER4:
2378 setFeatureEnabledImpl(Features, "avx2", true);
2379 setFeatureEnabledImpl(Features, "bmi2", true);
2380 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002381 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002382 setFeatureEnabledImpl(Features, "fsgsbase", true);
2383 // FALLTHROUGH
2384 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002385 setFeatureEnabledImpl(Features, "bmi", true);
2386 setFeatureEnabledImpl(Features, "fma", true);
2387 setFeatureEnabledImpl(Features, "f16c", true);
2388 setFeatureEnabledImpl(Features, "tbm", true);
2389 // FALLTHROUGH
2390 case CK_BDVER1:
2391 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002392 setFeatureEnabledImpl(Features, "xop", true);
2393 setFeatureEnabledImpl(Features, "lzcnt", true);
2394 setFeatureEnabledImpl(Features, "aes", true);
2395 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002396 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002397 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002398 break;
Eli Friedman33465822011-07-08 23:31:17 +00002399 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002400}
2401
Rafael Espindolae62e2792013-08-20 13:44:29 +00002402void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002403 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002404 if (Enabled) {
2405 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002406 case AVX512F:
2407 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002408 case AVX2:
2409 Features["avx2"] = true;
2410 case AVX:
2411 Features["avx"] = true;
2412 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002413 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002414 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002415 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002416 case SSSE3:
2417 Features["ssse3"] = true;
2418 case SSE3:
2419 Features["sse3"] = true;
2420 case SSE2:
2421 Features["sse2"] = true;
2422 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002423 Features["sse"] = true;
2424 case NoSSE:
2425 break;
2426 }
2427 return;
2428 }
2429
2430 switch (Level) {
2431 case NoSSE:
2432 case SSE1:
2433 Features["sse"] = false;
2434 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002435 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2436 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002437 case SSE3:
2438 Features["sse3"] = false;
2439 setXOPLevel(Features, NoXOP, false);
2440 case SSSE3:
2441 Features["ssse3"] = false;
2442 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002443 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002444 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002445 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002446 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002447 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002448 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002449 case AVX2:
2450 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002451 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002452 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002453 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2454 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002455 }
2456}
2457
2458void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002459 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002460 if (Enabled) {
2461 switch (Level) {
2462 case AMD3DNowAthlon:
2463 Features["3dnowa"] = true;
2464 case AMD3DNow:
2465 Features["3dnow"] = true;
2466 case MMX:
2467 Features["mmx"] = true;
2468 case NoMMX3DNow:
2469 break;
2470 }
2471 return;
2472 }
2473
2474 switch (Level) {
2475 case NoMMX3DNow:
2476 case MMX:
2477 Features["mmx"] = false;
2478 case AMD3DNow:
2479 Features["3dnow"] = false;
2480 case AMD3DNowAthlon:
2481 Features["3dnowa"] = false;
2482 }
2483}
2484
2485void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002486 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002487 if (Enabled) {
2488 switch (Level) {
2489 case XOP:
2490 Features["xop"] = true;
2491 case FMA4:
2492 Features["fma4"] = true;
2493 setSSELevel(Features, AVX, true);
2494 case SSE4A:
2495 Features["sse4a"] = true;
2496 setSSELevel(Features, SSE3, true);
2497 case NoXOP:
2498 break;
2499 }
2500 return;
2501 }
2502
2503 switch (Level) {
2504 case NoXOP:
2505 case SSE4A:
2506 Features["sse4a"] = false;
2507 case FMA4:
2508 Features["fma4"] = false;
2509 case XOP:
2510 Features["xop"] = false;
2511 }
2512}
2513
Craig Topper86d79ef2013-09-17 04:51:29 +00002514void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2515 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002516 // FIXME: This *really* should not be here. We need some way of translating
2517 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002518 if (Name == "sse4")
2519 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002520
Rafael Espindolae62e2792013-08-20 13:44:29 +00002521 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002522
Craig Topper29561122013-09-19 01:13:07 +00002523 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002524 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002525 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002526 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002527 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002528 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002529 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002530 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002531 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002532 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002533 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002534 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002535 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002536 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002537 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002538 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002539 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002540 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002541 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002542 if (Enabled)
2543 setSSELevel(Features, SSE2, Enabled);
2544 } else if (Name == "pclmul") {
2545 if (Enabled)
2546 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002547 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002548 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002549 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002550 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002551 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002552 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002553 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2554 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002555 if (Enabled)
2556 setSSELevel(Features, AVX512F, Enabled);
2557 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002558 if (Enabled)
2559 setSSELevel(Features, AVX, Enabled);
2560 } else if (Name == "fma4") {
2561 setXOPLevel(Features, FMA4, Enabled);
2562 } else if (Name == "xop") {
2563 setXOPLevel(Features, XOP, Enabled);
2564 } else if (Name == "sse4a") {
2565 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002566 } else if (Name == "f16c") {
2567 if (Enabled)
2568 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002569 } else if (Name == "sha") {
2570 if (Enabled)
2571 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002572 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002573}
2574
Eric Christopher3ff21b32013-10-16 21:26:26 +00002575/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002576/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002577bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002578 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002579 // Remember the maximum enabled sselevel.
2580 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2581 // Ignore disabled features.
2582 if (Features[i][0] == '-')
2583 continue;
2584
Benjamin Kramer27402c62012-03-05 15:10:44 +00002585 StringRef Feature = StringRef(Features[i]).substr(1);
2586
2587 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002588 HasAES = true;
2589 continue;
2590 }
2591
Craig Topper3f122a72012-05-31 05:18:48 +00002592 if (Feature == "pclmul") {
2593 HasPCLMUL = true;
2594 continue;
2595 }
2596
Benjamin Kramer27402c62012-03-05 15:10:44 +00002597 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002598 HasLZCNT = true;
2599 continue;
2600 }
2601
Rafael Espindola89049822013-08-23 20:21:37 +00002602 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002603 HasRDRND = true;
2604 continue;
2605 }
2606
Craig Topper8c7f2512014-11-03 06:51:41 +00002607 if (Feature == "fsgsbase") {
2608 HasFSGSBASE = true;
2609 continue;
2610 }
2611
Benjamin Kramer27402c62012-03-05 15:10:44 +00002612 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002613 HasBMI = true;
2614 continue;
2615 }
2616
Benjamin Kramer27402c62012-03-05 15:10:44 +00002617 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002618 HasBMI2 = true;
2619 continue;
2620 }
2621
Benjamin Kramer27402c62012-03-05 15:10:44 +00002622 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002623 HasPOPCNT = true;
2624 continue;
2625 }
2626
Michael Liao625a8752012-11-10 05:17:46 +00002627 if (Feature == "rtm") {
2628 HasRTM = true;
2629 continue;
2630 }
2631
Michael Liao74f4eaf2013-03-26 17:52:08 +00002632 if (Feature == "prfchw") {
2633 HasPRFCHW = true;
2634 continue;
2635 }
2636
Michael Liaoffaae352013-03-29 05:17:55 +00002637 if (Feature == "rdseed") {
2638 HasRDSEED = true;
2639 continue;
2640 }
2641
Robert Khasanov50e6f582014-09-19 09:53:48 +00002642 if (Feature == "adx") {
2643 HasADX = true;
2644 continue;
2645 }
2646
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002647 if (Feature == "tbm") {
2648 HasTBM = true;
2649 continue;
2650 }
2651
Craig Topperbba778b2012-06-03 21:46:30 +00002652 if (Feature == "fma") {
2653 HasFMA = true;
2654 continue;
2655 }
2656
Manman Rena45358c2012-10-11 00:59:55 +00002657 if (Feature == "f16c") {
2658 HasF16C = true;
2659 continue;
2660 }
2661
Craig Topper679b53a2013-08-21 05:29:10 +00002662 if (Feature == "avx512cd") {
2663 HasAVX512CD = true;
2664 continue;
2665 }
2666
2667 if (Feature == "avx512er") {
2668 HasAVX512ER = true;
2669 continue;
2670 }
2671
2672 if (Feature == "avx512pf") {
2673 HasAVX512PF = true;
2674 continue;
2675 }
2676
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002677 if (Feature == "avx512dq") {
2678 HasAVX512DQ = true;
2679 continue;
2680 }
2681
2682 if (Feature == "avx512bw") {
2683 HasAVX512BW = true;
2684 continue;
2685 }
2686
2687 if (Feature == "avx512vl") {
2688 HasAVX512VL = true;
2689 continue;
2690 }
2691
Ben Langmuir58078d02013-09-19 13:22:04 +00002692 if (Feature == "sha") {
2693 HasSHA = true;
2694 continue;
2695 }
2696
Nick Lewycky50e8f482013-10-05 20:14:27 +00002697 if (Feature == "cx16") {
2698 HasCX16 = true;
2699 continue;
2700 }
2701
Daniel Dunbar979586e2009-11-11 09:38:56 +00002702 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002703 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002704 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002705 .Case("avx2", AVX2)
2706 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002707 .Case("sse4.2", SSE42)
2708 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002709 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002710 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002711 .Case("sse2", SSE2)
2712 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002713 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002714 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002715
Eli Friedman33465822011-07-08 23:31:17 +00002716 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002717 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002718 .Case("3dnowa", AMD3DNowAthlon)
2719 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002720 .Case("mmx", MMX)
2721 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002722 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002723
2724 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2725 .Case("xop", XOP)
2726 .Case("fma4", FMA4)
2727 .Case("sse4a", SSE4A)
2728 .Default(NoXOP);
2729 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002730 }
Eli Friedman33465822011-07-08 23:31:17 +00002731
Craig Topper7481d8a2013-09-10 06:55:47 +00002732 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2733 // Can't do this earlier because we need to be able to explicitly enable
2734 // popcnt and still disable sse4.2.
2735 if (!HasPOPCNT && SSELevel >= SSE42 &&
2736 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2737 HasPOPCNT = true;
2738 Features.push_back("+popcnt");
2739 }
2740
Yunzhong Gao61089362013-10-16 19:07:02 +00002741 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2742 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2743 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2744 HasPRFCHW = true;
2745 Features.push_back("+prfchw");
2746 }
2747
Rafael Espindolaeb265472013-08-21 21:59:03 +00002748 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2749 // matches the selected sse level.
2750 if (FPMath == FP_SSE && SSELevel < SSE1) {
2751 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2752 return false;
2753 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2754 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2755 return false;
2756 }
2757
Eli Friedman33465822011-07-08 23:31:17 +00002758 // Don't tell the backend if we're turning off mmx; it will end up disabling
2759 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002760 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2761 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002762 std::vector<std::string>::iterator it;
2763 it = std::find(Features.begin(), Features.end(), "-mmx");
2764 if (it != Features.end())
2765 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002766 else if (SSELevel > NoSSE)
2767 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002768 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002769}
Chris Lattnerecd49032009-03-02 22:27:17 +00002770
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002771/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2772/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002773void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002774 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002775 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002776 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002777 Builder.defineMacro("__amd64__");
2778 Builder.defineMacro("__amd64");
2779 Builder.defineMacro("__x86_64");
2780 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002781 if (getTriple().getArchName() == "x86_64h") {
2782 Builder.defineMacro("__x86_64h");
2783 Builder.defineMacro("__x86_64h__");
2784 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002785 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002786 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002787 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002788
Chris Lattnerecd49032009-03-02 22:27:17 +00002789 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002790 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2791 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002792 switch (CPU) {
2793 case CK_Generic:
2794 break;
2795 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002796 // The rest are coming from the i386 define above.
2797 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002798 break;
2799 case CK_i486:
2800 case CK_WinChipC6:
2801 case CK_WinChip2:
2802 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002803 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002804 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002805 case CK_PentiumMMX:
2806 Builder.defineMacro("__pentium_mmx__");
2807 Builder.defineMacro("__tune_pentium_mmx__");
2808 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002809 case CK_i586:
2810 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002811 defineCPUMacros(Builder, "i586");
2812 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002813 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002814 case CK_Pentium3:
2815 case CK_Pentium3M:
2816 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002817 Builder.defineMacro("__tune_pentium3__");
2818 // Fallthrough
2819 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002820 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002821 Builder.defineMacro("__tune_pentium2__");
2822 // Fallthrough
2823 case CK_PentiumPro:
2824 Builder.defineMacro("__tune_i686__");
2825 Builder.defineMacro("__tune_pentiumpro__");
2826 // Fallthrough
2827 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002828 Builder.defineMacro("__i686");
2829 Builder.defineMacro("__i686__");
2830 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2831 Builder.defineMacro("__pentiumpro");
2832 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002833 break;
2834 case CK_Pentium4:
2835 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002836 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002837 break;
2838 case CK_Yonah:
2839 case CK_Prescott:
2840 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002841 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002842 break;
2843 case CK_Core2:
2844 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002845 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002846 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002847 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002848 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002849 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002850 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002851 defineCPUMacros(Builder, "slm");
2852 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002853 case CK_Nehalem:
2854 case CK_Westmere:
2855 case CK_SandyBridge:
2856 case CK_IvyBridge:
2857 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002858 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002859 // FIXME: Historically, we defined this legacy name, it would be nice to
2860 // remove it at some point. We've never exposed fine-grained names for
2861 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002862 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002863 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002864 case CK_Skylake:
2865 // FIXME: Historically, we defined this legacy name, it would be nice to
2866 // remove it at some point. This is the only fine-grained CPU macro in the
2867 // main intel CPU line, and it would be better to not have these and force
2868 // people to use ISA macros.
2869 defineCPUMacros(Builder, "skx");
2870 break;
Craig Topper449314e2013-08-20 07:09:39 +00002871 case CK_KNL:
2872 defineCPUMacros(Builder, "knl");
2873 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002874 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002875 Builder.defineMacro("__k6_2__");
2876 Builder.defineMacro("__tune_k6_2__");
2877 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002878 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002879 if (CPU != CK_K6_2) { // In case of fallthrough
2880 // FIXME: GCC may be enabling these in cases where some other k6
2881 // architecture is specified but -m3dnow is explicitly provided. The
2882 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002883 Builder.defineMacro("__k6_3__");
2884 Builder.defineMacro("__tune_k6_3__");
2885 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002886 // Fallthrough
2887 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002888 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002889 break;
2890 case CK_Athlon:
2891 case CK_AthlonThunderbird:
2892 case CK_Athlon4:
2893 case CK_AthlonXP:
2894 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002895 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002896 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002897 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002898 Builder.defineMacro("__tune_athlon_sse__");
2899 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002900 break;
2901 case CK_K8:
2902 case CK_K8SSE3:
2903 case CK_x86_64:
2904 case CK_Opteron:
2905 case CK_OpteronSSE3:
2906 case CK_Athlon64:
2907 case CK_Athlon64SSE3:
2908 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002909 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002910 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002911 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002912 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002913 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002914 case CK_BTVER1:
2915 defineCPUMacros(Builder, "btver1");
2916 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002917 case CK_BTVER2:
2918 defineCPUMacros(Builder, "btver2");
2919 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002920 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002921 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002922 break;
2923 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002924 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002925 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002926 case CK_BDVER3:
2927 defineCPUMacros(Builder, "bdver3");
2928 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002929 case CK_BDVER4:
2930 defineCPUMacros(Builder, "bdver4");
2931 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002932 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002933 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002934 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002935 }
Chris Lattner96e43572009-03-02 22:40:39 +00002936
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002937 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002938 Builder.defineMacro("__REGISTER_PREFIX__", "");
2939
Chris Lattner6df41af2009-04-19 17:32:33 +00002940 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2941 // functions in glibc header files that use FP Stack inline asm which the
2942 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002943 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002944
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002945 if (HasAES)
2946 Builder.defineMacro("__AES__");
2947
Craig Topper3f122a72012-05-31 05:18:48 +00002948 if (HasPCLMUL)
2949 Builder.defineMacro("__PCLMUL__");
2950
Craig Topper22967d42011-12-25 05:06:45 +00002951 if (HasLZCNT)
2952 Builder.defineMacro("__LZCNT__");
2953
Benjamin Kramer1e250392012-07-07 09:39:18 +00002954 if (HasRDRND)
2955 Builder.defineMacro("__RDRND__");
2956
Craig Topper8c7f2512014-11-03 06:51:41 +00002957 if (HasFSGSBASE)
2958 Builder.defineMacro("__FSGSBASE__");
2959
Craig Topper22967d42011-12-25 05:06:45 +00002960 if (HasBMI)
2961 Builder.defineMacro("__BMI__");
2962
2963 if (HasBMI2)
2964 Builder.defineMacro("__BMI2__");
2965
Craig Topper1de83482011-12-29 16:10:46 +00002966 if (HasPOPCNT)
2967 Builder.defineMacro("__POPCNT__");
2968
Michael Liao625a8752012-11-10 05:17:46 +00002969 if (HasRTM)
2970 Builder.defineMacro("__RTM__");
2971
Michael Liao74f4eaf2013-03-26 17:52:08 +00002972 if (HasPRFCHW)
2973 Builder.defineMacro("__PRFCHW__");
2974
Michael Liaoffaae352013-03-29 05:17:55 +00002975 if (HasRDSEED)
2976 Builder.defineMacro("__RDSEED__");
2977
Robert Khasanov50e6f582014-09-19 09:53:48 +00002978 if (HasADX)
2979 Builder.defineMacro("__ADX__");
2980
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002981 if (HasTBM)
2982 Builder.defineMacro("__TBM__");
2983
Rafael Espindolae62e2792013-08-20 13:44:29 +00002984 switch (XOPLevel) {
2985 case XOP:
2986 Builder.defineMacro("__XOP__");
2987 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002988 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002989 case SSE4A:
2990 Builder.defineMacro("__SSE4A__");
2991 case NoXOP:
2992 break;
2993 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002994
Craig Topperbba778b2012-06-03 21:46:30 +00002995 if (HasFMA)
2996 Builder.defineMacro("__FMA__");
2997
Manman Rena45358c2012-10-11 00:59:55 +00002998 if (HasF16C)
2999 Builder.defineMacro("__F16C__");
3000
Craig Topper679b53a2013-08-21 05:29:10 +00003001 if (HasAVX512CD)
3002 Builder.defineMacro("__AVX512CD__");
3003 if (HasAVX512ER)
3004 Builder.defineMacro("__AVX512ER__");
3005 if (HasAVX512PF)
3006 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003007 if (HasAVX512DQ)
3008 Builder.defineMacro("__AVX512DQ__");
3009 if (HasAVX512BW)
3010 Builder.defineMacro("__AVX512BW__");
3011 if (HasAVX512VL)
3012 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003013
Ben Langmuir58078d02013-09-19 13:22:04 +00003014 if (HasSHA)
3015 Builder.defineMacro("__SHA__");
3016
Nick Lewycky50e8f482013-10-05 20:14:27 +00003017 if (HasCX16)
3018 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3019
Chris Lattner96e43572009-03-02 22:40:39 +00003020 // Each case falls through to the previous one here.
3021 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003022 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003023 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003024 case AVX2:
3025 Builder.defineMacro("__AVX2__");
3026 case AVX:
3027 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003028 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003029 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003030 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003031 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003032 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003033 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003034 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003035 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003036 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003037 Builder.defineMacro("__SSE2__");
3038 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003039 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003040 Builder.defineMacro("__SSE__");
3041 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003042 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003043 break;
3044 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003045
Derek Schuffc7dd7222012-10-11 15:52:22 +00003046 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003047 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003048 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003049 case AVX2:
3050 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003051 case SSE42:
3052 case SSE41:
3053 case SSSE3:
3054 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003055 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003056 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003057 break;
3058 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003059 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003060 break;
3061 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003062 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003063 }
3064 }
3065
Anders Carlssone437c682010-01-27 03:47:49 +00003066 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003067 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003068 case AMD3DNowAthlon:
3069 Builder.defineMacro("__3dNOW_A__");
3070 case AMD3DNow:
3071 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003072 case MMX:
3073 Builder.defineMacro("__MMX__");
3074 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003075 break;
3076 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003077
3078 if (CPU >= CK_i486) {
3079 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3080 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3081 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3082 }
3083 if (CPU >= CK_i586)
3084 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003085}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003086
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003087bool X86TargetInfo::hasFeature(StringRef Feature) const {
3088 return llvm::StringSwitch<bool>(Feature)
3089 .Case("aes", HasAES)
3090 .Case("avx", SSELevel >= AVX)
3091 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003092 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003093 .Case("avx512cd", HasAVX512CD)
3094 .Case("avx512er", HasAVX512ER)
3095 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003096 .Case("avx512dq", HasAVX512DQ)
3097 .Case("avx512bw", HasAVX512BW)
3098 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003099 .Case("bmi", HasBMI)
3100 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003101 .Case("cx16", HasCX16)
3102 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003103 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003104 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003105 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003106 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003107 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3108 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3109 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003110 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003111 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003112 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003113 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003114 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003115 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003116 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003117 .Case("sse", SSELevel >= SSE1)
3118 .Case("sse2", SSELevel >= SSE2)
3119 .Case("sse3", SSELevel >= SSE3)
3120 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003121 .Case("sse4.1", SSELevel >= SSE41)
3122 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003123 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003124 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003125 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003126 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3127 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003128 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003129 .Default(false);
3130}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003131
Eli Friedman3fd920a2008-08-20 02:34:37 +00003132bool
Anders Carlsson58436352009-02-28 17:11:49 +00003133X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003134 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003135 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003136 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003137 case 'I':
3138 Info.setRequiresImmediate(0, 31);
3139 return true;
3140 case 'J':
3141 Info.setRequiresImmediate(0, 63);
3142 return true;
3143 case 'K':
3144 Info.setRequiresImmediate(-128, 127);
3145 return true;
3146 case 'L':
3147 // FIXME: properly analyze this constraint:
3148 // must be one of 0xff, 0xffff, or 0xffffffff
3149 return true;
3150 case 'M':
3151 Info.setRequiresImmediate(0, 3);
3152 return true;
3153 case 'N':
3154 Info.setRequiresImmediate(0, 255);
3155 return true;
3156 case 'O':
3157 Info.setRequiresImmediate(0, 127);
3158 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003159 case 'Y': // first letter of a pair:
3160 switch (*(Name+1)) {
3161 default: return false;
3162 case '0': // First SSE register.
3163 case 't': // Any SSE register, when SSE2 is enabled.
3164 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3165 case 'm': // any MMX register, when inter-unit moves enabled.
3166 break; // falls through to setAllowsRegister.
3167 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003168 case 'f': // any x87 floating point stack register.
3169 // Constraint 'f' cannot be used for output operands.
3170 if (Info.ConstraintStr[0] == '=')
3171 return false;
3172
3173 Info.setAllowsRegister();
3174 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003175 case 'a': // eax.
3176 case 'b': // ebx.
3177 case 'c': // ecx.
3178 case 'd': // edx.
3179 case 'S': // esi.
3180 case 'D': // edi.
3181 case 'A': // edx:eax.
3182 case 't': // top of floating point stack.
3183 case 'u': // second from top of floating point stack.
3184 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003185 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003186 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003187 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003188 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3189 case 'l': // "Index" registers: any general register that can be used as an
3190 // index in a base+index memory access.
3191 Info.setAllowsRegister();
3192 return true;
3193 case 'C': // SSE floating point constant.
3194 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003195 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003196 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003197 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003198 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003199 return true;
3200 }
3201}
3202
Akira Hatanaka974131e2014-09-18 18:17:18 +00003203bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3204 unsigned Size) const {
3205 // Strip off constraint modifiers.
3206 while (Constraint[0] == '=' ||
3207 Constraint[0] == '+' ||
3208 Constraint[0] == '&')
3209 Constraint = Constraint.substr(1);
3210
3211 return validateOperandSize(Constraint, Size);
3212}
3213
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003214bool X86TargetInfo::validateInputSize(StringRef Constraint,
3215 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003216 return validateOperandSize(Constraint, Size);
3217}
3218
3219bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3220 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003221 switch (Constraint[0]) {
3222 default: break;
3223 case 'y':
3224 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003225 case 'f':
3226 case 't':
3227 case 'u':
3228 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003229 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003230 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003231 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003232 }
3233
3234 return true;
3235}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003236
Eli Friedman3fd920a2008-08-20 02:34:37 +00003237std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003238X86TargetInfo::convertConstraint(const char *&Constraint) const {
3239 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003240 case 'a': return std::string("{ax}");
3241 case 'b': return std::string("{bx}");
3242 case 'c': return std::string("{cx}");
3243 case 'd': return std::string("{dx}");
3244 case 'S': return std::string("{si}");
3245 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003246 case 'p': // address
3247 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003248 case 't': // top of floating point stack.
3249 return std::string("{st}");
3250 case 'u': // second from top of floating point stack.
3251 return std::string("{st(1)}"); // second from top of floating point stack.
3252 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003253 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003254 }
3255}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003256} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003257
3258namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003259// X86-32 generic target
3260class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003262 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003263 DoubleAlign = LongLongAlign = 32;
3264 LongDoubleWidth = 96;
3265 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003266 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003267 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003268 SizeType = UnsignedInt;
3269 PtrDiffType = SignedInt;
3270 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003271 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003272
3273 // Use fpret for all types.
3274 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3275 (1 << TargetInfo::Double) |
3276 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003277
3278 // x86-32 has atomics up to 8 bytes
3279 // FIXME: Check that we actually have cmpxchg8b before setting
3280 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3281 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003282 }
Craig Topper3164f332014-03-11 03:39:26 +00003283 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003284 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003285 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003286
Craig Topper3164f332014-03-11 03:39:26 +00003287 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003288 if (RegNo == 0) return 0;
3289 if (RegNo == 1) return 2;
3290 return -1;
3291 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003292 bool validateOperandSize(StringRef Constraint,
3293 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003294 switch (Constraint[0]) {
3295 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003296 case 'R':
3297 case 'q':
3298 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003299 case 'a':
3300 case 'b':
3301 case 'c':
3302 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003303 case 'S':
3304 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003305 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003306 case 'A':
3307 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003308 }
3309
Akira Hatanaka974131e2014-09-18 18:17:18 +00003310 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003311 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003312};
3313} // end anonymous namespace
3314
3315namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003316class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3317public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003318 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3319 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003320
Craig Topper3164f332014-03-11 03:39:26 +00003321 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003322 unsigned Major, Minor, Micro;
3323 getTriple().getOSVersion(Major, Minor, Micro);
3324 // New NetBSD uses the default rounding mode.
3325 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3326 return X86_32TargetInfo::getFloatEvalMethod();
3327 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003328 return 1;
3329 }
3330};
3331} // end anonymous namespace
3332
3333namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003334class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3335public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003336 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3337 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003338 SizeType = UnsignedLong;
3339 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003340 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003341 }
3342};
3343} // end anonymous namespace
3344
3345namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003346class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3347public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003348 BitrigI386TargetInfo(const llvm::Triple &Triple)
3349 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003350 SizeType = UnsignedLong;
3351 IntPtrType = SignedLong;
3352 PtrDiffType = SignedLong;
3353 }
3354};
3355} // end anonymous namespace
3356
3357namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003358class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003359public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003360 DarwinI386TargetInfo(const llvm::Triple &Triple)
3361 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003362 LongDoubleWidth = 128;
3363 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003364 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003365 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003366 SizeType = UnsignedLong;
3367 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003368 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003369 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003370 }
3371
Eli Friedman3fd920a2008-08-20 02:34:37 +00003372};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003373} // end anonymous namespace
3374
3375namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003376// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003377class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003378public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003379 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3380 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003381 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003382 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003383 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003384 }
Craig Topper3164f332014-03-11 03:39:26 +00003385 void getTargetDefines(const LangOptions &Opts,
3386 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003387 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3388 }
3389};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003390
3391// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003392class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003393public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003394 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003395 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003396 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003397 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3398 }
Craig Topper3164f332014-03-11 03:39:26 +00003399 void getTargetDefines(const LangOptions &Opts,
3400 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003401 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3402 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3403 // The value of the following reflects processor type.
3404 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3405 // We lost the original triple, so we use the default.
3406 Builder.defineMacro("_M_IX86", "600");
3407 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003408};
3409} // end anonymous namespace
3410
Reid Kleckner47606832014-04-21 20:58:00 +00003411static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3412 Builder.defineMacro("__MSVCRT__");
3413 Builder.defineMacro("__MINGW32__");
3414
3415 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3416 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3417 // macro anyway for pre-processor compatibility.
3418 if (Opts.MicrosoftExt)
3419 Builder.defineMacro("__declspec", "__declspec");
3420 else
3421 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3422
3423 if (!Opts.MicrosoftExt) {
3424 // Provide macros for all the calling convention keywords. Provide both
3425 // single and double underscore prefixed variants. These are available on
3426 // x64 as well as x86, even though they have no effect.
3427 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3428 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003429 std::string GCCSpelling = "__attribute__((__";
3430 GCCSpelling += CC;
3431 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003432 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3433 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3434 }
3435 }
3436}
3437
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003438namespace {
3439// x86-32 MinGW target
3440class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3441public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003442 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3443 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003444 void getTargetDefines(const LangOptions &Opts,
3445 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003446 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003447 DefineStd(Builder, "WIN32", Opts);
3448 DefineStd(Builder, "WINNT", Opts);
3449 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003450 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003451 }
3452};
3453} // end anonymous namespace
3454
3455namespace {
3456// x86-32 Cygwin target
3457class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3458public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003459 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3460 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003461 TLSSupported = false;
3462 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003463 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003464 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003465 }
Craig Topper3164f332014-03-11 03:39:26 +00003466 void getTargetDefines(const LangOptions &Opts,
3467 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003468 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003469 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003470 Builder.defineMacro("__CYGWIN__");
3471 Builder.defineMacro("__CYGWIN32__");
3472 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003473 if (Opts.CPlusPlus)
3474 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003475 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003476};
3477} // end anonymous namespace
3478
3479namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003480// x86-32 Haiku target
3481class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3482public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003483 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003484 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003485 IntPtrType = SignedLong;
3486 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003487 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003488 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003489 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003490 }
Craig Topper3164f332014-03-11 03:39:26 +00003491 void getTargetDefines(const LangOptions &Opts,
3492 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003493 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3494 Builder.defineMacro("__INTEL__");
3495 Builder.defineMacro("__HAIKU__");
3496 }
3497};
3498} // end anonymous namespace
3499
Douglas Gregor9fabd852011-07-01 22:41:14 +00003500// RTEMS Target
3501template<typename Target>
3502class RTEMSTargetInfo : public OSTargetInfo<Target> {
3503protected:
Craig Topper3164f332014-03-11 03:39:26 +00003504 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3505 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003506 // RTEMS defines; list based off of gcc output
3507
Douglas Gregor9fabd852011-07-01 22:41:14 +00003508 Builder.defineMacro("__rtems__");
3509 Builder.defineMacro("__ELF__");
3510 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003511
Douglas Gregor9fabd852011-07-01 22:41:14 +00003512public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003513 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3514 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003515
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003516 switch (Triple.getArch()) {
3517 default:
3518 case llvm::Triple::x86:
3519 // this->MCountName = ".mcount";
3520 break;
3521 case llvm::Triple::mips:
3522 case llvm::Triple::mipsel:
3523 case llvm::Triple::ppc:
3524 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003525 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003526 // this->MCountName = "_mcount";
3527 break;
3528 case llvm::Triple::arm:
3529 // this->MCountName = "__mcount";
3530 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003531 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003532 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003533};
3534
3535namespace {
3536// x86-32 RTEMS target
3537class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3538public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003539 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003540 SizeType = UnsignedLong;
3541 IntPtrType = SignedLong;
3542 PtrDiffType = SignedLong;
3543 this->UserLabelPrefix = "";
3544 }
Craig Topper3164f332014-03-11 03:39:26 +00003545 void getTargetDefines(const LangOptions &Opts,
3546 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003547 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3548 Builder.defineMacro("__INTEL__");
3549 Builder.defineMacro("__rtems__");
3550 }
3551};
3552} // end anonymous namespace
3553
Chris Lattnerb986aba2010-04-11 19:29:39 +00003554namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003555// x86-64 generic target
3556class X86_64TargetInfo : public X86TargetInfo {
3557public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003558 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003559 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003560 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003561 LongDoubleWidth = 128;
3562 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003563 LargeArrayMinWidth = 128;
3564 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003565 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003566 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3567 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3568 IntPtrType = IsX32 ? SignedInt : SignedLong;
3569 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003570 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003571 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003572
Eric Christopher917e9522014-11-18 22:36:15 +00003573 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003574 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003575 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3576 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003577
3578 // Use fpret only for long double.
3579 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003580
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003581 // Use fp2ret for _Complex long double.
3582 ComplexLongDoubleUsesFP2Ret = true;
3583
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003584 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003585 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003586 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003587 }
Craig Topper3164f332014-03-11 03:39:26 +00003588 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003589 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003590 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003591
Craig Topper3164f332014-03-11 03:39:26 +00003592 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003593 if (RegNo == 0) return 0;
3594 if (RegNo == 1) return 1;
3595 return -1;
3596 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003597
Craig Topper3164f332014-03-11 03:39:26 +00003598 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003599 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003600 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003601 CC == CC_IntelOclBicc ||
3602 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003603 }
3604
Craig Topper3164f332014-03-11 03:39:26 +00003605 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003606 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003607 }
3608
Pavel Chupinfd223e12014-08-04 12:39:43 +00003609 // for x32 we need it here explicitly
3610 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003611};
3612} // end anonymous namespace
3613
3614namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003615// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003616class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003617public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003618 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3619 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003620 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003621 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003622 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003623 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003624 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003625 SizeType = UnsignedLongLong;
3626 PtrDiffType = SignedLongLong;
3627 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003628 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003629 }
Craig Topper3164f332014-03-11 03:39:26 +00003630 void getTargetDefines(const LangOptions &Opts,
3631 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003632 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003633 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003634 }
Craig Topper3164f332014-03-11 03:39:26 +00003635 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003636 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003637 }
Craig Topper3164f332014-03-11 03:39:26 +00003638 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003639 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003640 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003641 CC == CC_IntelOclBicc ||
3642 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3643 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003644};
3645} // end anonymous namespace
3646
3647namespace {
3648// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003649class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003650public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003651 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003652 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003653 LongDoubleWidth = LongDoubleAlign = 64;
3654 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003655 }
Craig Topper3164f332014-03-11 03:39:26 +00003656 void getTargetDefines(const LangOptions &Opts,
3657 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003658 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3659 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003660 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003661 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003662 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003663};
3664} // end anonymous namespace
3665
3666namespace {
3667// x86-64 MinGW target
3668class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3669public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003670 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3671 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003672 void getTargetDefines(const LangOptions &Opts,
3673 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003674 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003675 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003676 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003677 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003678
3679 // GCC defines this macro when it is using __gxx_personality_seh0.
3680 if (!Opts.SjLjExceptions)
3681 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003682 }
3683};
3684} // end anonymous namespace
3685
3686namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003687class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3688public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003689 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3690 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003691 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003692 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003693 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3694 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003695 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003696 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003697 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003698 }
3699};
3700} // end anonymous namespace
3701
3702namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003703class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3704public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003705 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3706 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003707 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003708 Int64Type = SignedLongLong;
3709 }
3710};
3711} // end anonymous namespace
3712
3713namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003714class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3715public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003716 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3717 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3718 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003719 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003720 }
3721};
Tim Northover9bb857a2013-01-31 12:13:10 +00003722}
3723
Eli Friedman9fa28852012-08-08 23:57:20 +00003724
3725namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003726class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003727 // Possible FPU choices.
3728 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003729 VFP2FPU = (1 << 0),
3730 VFP3FPU = (1 << 1),
3731 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003732 NeonFPU = (1 << 3),
3733 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003734 };
3735
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003736 // Possible HWDiv features.
3737 enum HWDivMode {
3738 HWDivThumb = (1 << 0),
3739 HWDivARM = (1 << 1)
3740 };
3741
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003742 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003743 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003744 }
3745
3746 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3747 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003748
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003749 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003750
Rafael Espindolaeb265472013-08-21 21:59:03 +00003751 enum {
3752 FP_Default,
3753 FP_VFP,
3754 FP_Neon
3755 } FPMath;
3756
Bernard Ogdenda13af32013-10-24 18:32:51 +00003757 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003758
Logan Chien57086ce2012-10-10 06:56:20 +00003759 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003760 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003761 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003762
3763 // Initialized via features.
3764 unsigned SoftFloat : 1;
3765 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003766
Bernard Ogden18b57012013-10-29 09:47:51 +00003767 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003768 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003769
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003770 // ACLE 6.5.1 Hardware floating point
3771 enum {
3772 HW_FP_HP = (1 << 1), /// half (16-bit)
3773 HW_FP_SP = (1 << 2), /// single (32-bit)
3774 HW_FP_DP = (1 << 3), /// double (64-bit)
3775 };
3776 uint32_t HW_FP;
3777
Chris Lattner5cc15e02010-03-03 19:03:45 +00003778 static const Builtin::Info BuiltinInfo[];
3779
Rafael Espindola101d5b92013-05-13 20:09:47 +00003780 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003781 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003782 if (T.getArch() == llvm::Triple::arm ||
3783 T.getArch() == llvm::Triple::armeb) {
3784 StringRef VersionStr;
3785 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003786 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003787 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003788 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003789 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003790 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003791 unsigned Version;
3792 if (VersionStr.getAsInteger(10, Version))
3793 return false;
3794 return Version >= 6;
3795 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003796 assert(T.getArch() == llvm::Triple::thumb ||
3797 T.getArch() == llvm::Triple::thumbeb);
3798 StringRef VersionStr;
3799 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003800 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003801 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003802 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003803 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003804 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003805 unsigned Version;
3806 if (VersionStr.getAsInteger(10, Version))
3807 return false;
3808 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003809 }
3810
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003811 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003812 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003813
3814 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003815 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003816
Tim Northover00853e52014-08-05 11:07:26 +00003817 // size_t is unsigned long on MachO-derived environments and NetBSD.
3818 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003819 SizeType = UnsignedLong;
3820 else
3821 SizeType = UnsignedInt;
3822
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003823 switch (T.getOS()) {
3824 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003825 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003826 break;
3827 case llvm::Triple::Win32:
3828 WCharType = UnsignedShort;
3829 break;
3830 case llvm::Triple::Linux:
3831 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003832 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3833 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003834 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003835 }
3836
3837 UseBitFieldTypeAlignment = true;
3838
3839 ZeroLengthBitfieldBoundary = 0;
3840
Tim Northover147cd2f2014-10-14 22:12:21 +00003841 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3842 // so set preferred for small types to 32.
3843 if (T.isOSBinFormatMachO()) {
3844 DescriptionString =
3845 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3846 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3847 } else if (T.isOSWindows()) {
3848 // FIXME: this is invalid for WindowsCE
3849 assert(!BigEndian && "Windows on ARM does not support big endian");
3850 DescriptionString = "e"
3851 "-m:e"
3852 "-p:32:32"
3853 "-i64:64"
3854 "-v128:64:128"
3855 "-a:0:32"
3856 "-n32"
3857 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003858 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003859 DescriptionString =
3860 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3861 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003862 }
3863
3864 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003865 }
3866
3867 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003868 const llvm::Triple &T = getTriple();
3869
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003870 IsAAPCS = false;
3871
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003872 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003873
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003874 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003875 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003876 SizeType = UnsignedInt;
3877 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003878 SizeType = UnsignedLong;
3879
3880 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3881 WCharType = SignedInt;
3882
3883 // Do not respect the alignment of bit-field types when laying out
3884 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3885 UseBitFieldTypeAlignment = false;
3886
3887 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3888 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3889 /// gcc.
3890 ZeroLengthBitfieldBoundary = 32;
3891
Tim Northover147cd2f2014-10-14 22:12:21 +00003892 if (T.isOSBinFormatMachO())
3893 DescriptionString =
3894 BigEndian
3895 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3896 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3897 else
3898 DescriptionString =
3899 BigEndian
3900 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3901 : "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 +00003902
3903 // FIXME: Override "preferred align" for double and long long.
3904 }
3905
Chris Lattner17df24e2008-04-21 18:56:49 +00003906public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003907 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003908 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003909 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003910 BigEndian = IsBigEndian;
3911
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003912 switch (getTriple().getOS()) {
3913 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003914 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003915 break;
3916 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003917 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003918 break;
3919 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003920
Chris Lattner1a8f3942010-04-23 16:29:58 +00003921 // {} in inline assembly are neon specifiers, not assembly variant
3922 // specifiers.
3923 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003924
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003925 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003926 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003927
Eric Christopher0e261882014-12-05 01:06:59 +00003928 // FIXME: This duplicates code from the driver that sets the -target-abi
3929 // option - this code is used if -target-abi isn't passed and should
3930 // be unified in some way.
3931 if (Triple.isOSBinFormatMachO()) {
3932 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3933 // the frontend matches that.
3934 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3935 Triple.getOS() == llvm::Triple::UnknownOS ||
3936 StringRef(CPU).startswith("cortex-m")) {
3937 setABI("aapcs");
3938 } else {
3939 setABI("apcs-gnu");
3940 }
3941 } else if (Triple.isOSWindows()) {
3942 // FIXME: this is invalid for WindowsCE
3943 setABI("aapcs");
3944 } else {
3945 // Select the default based on the platform.
3946 switch (Triple.getEnvironment()) {
3947 case llvm::Triple::Android:
3948 case llvm::Triple::GNUEABI:
3949 case llvm::Triple::GNUEABIHF:
3950 setABI("aapcs-linux");
3951 break;
3952 case llvm::Triple::EABIHF:
3953 case llvm::Triple::EABI:
3954 setABI("aapcs");
3955 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00003956 case llvm::Triple::GNU:
3957 setABI("apcs-gnu");
3958 break;
Eric Christopher0e261882014-12-05 01:06:59 +00003959 default:
3960 if (Triple.getOS() == llvm::Triple::NetBSD)
3961 setABI("apcs-gnu");
3962 else
3963 setABI("aapcs");
3964 break;
3965 }
3966 }
John McCall86353412010-08-21 22:46:04 +00003967
3968 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003969 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003970
3971 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003972 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003973 if (shouldUseInlineAtomic(getTriple()))
3974 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003975
3976 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00003977 // the alignment of the zero-length bitfield is greater than the member
3978 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00003979 // zero length bitfield.
3980 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003981 }
Alp Toker4925ba72014-06-07 23:30:42 +00003982 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003983 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003984 ABI = Name;
3985
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003986 // The defaults (above) are for AAPCS, check if we need to change them.
3987 //
3988 // FIXME: We need support for -meabi... we could just mangle it into the
3989 // name.
3990 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003991 setABIAPCS();
3992 return true;
3993 }
3994 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3995 setABIAAPCS();
3996 return true;
3997 }
3998 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003999 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004000
Craig Topper3164f332014-03-11 03:39:26 +00004001 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004002 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004003 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4004 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004005 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004006 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004007 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004008 }
4009 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004010 Features["vfp4"] = true;
4011 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004012 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4013 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004014 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004015 Features["vfp4"] = true;
4016 Features["neon"] = true;
4017 Features["hwdiv"] = true;
4018 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004019 } else if (CPU == "cyclone") {
4020 Features["v8fp"] = true;
4021 Features["neon"] = true;
4022 Features["hwdiv"] = true;
4023 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004024 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004025 Features["fp-armv8"] = true;
4026 Features["neon"] = true;
4027 Features["hwdiv"] = true;
4028 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004029 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004030 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004031 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004032 // Enable the hwdiv extension for all v8a AArch32 cores by
4033 // default.
4034 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004035 ArchName == "armebv8a" || ArchName == "armebv8" ||
4036 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4037 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004038 Features["hwdiv"] = true;
4039 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00004040 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004041 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004042 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004043 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004044
Craig Topper3164f332014-03-11 03:39:26 +00004045 bool handleTargetFeatures(std::vector<std::string> &Features,
4046 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004047 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004048 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004049 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004050 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004051 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004052
4053 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004054 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004055 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004056 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004057 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004058 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004059 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004060 HW_FP = HW_FP_SP | HW_FP_DP;
4061 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004062 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004063 HW_FP = HW_FP_SP | HW_FP_DP;
4064 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004065 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004066 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4067 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004068 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004069 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4070 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004071 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004072 HW_FP = HW_FP_SP | HW_FP_DP;
4073 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004074 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004075 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004076 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004077 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004078 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004079 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004080 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004081 } else if (Feature == "+fp-only-sp") {
4082 HW_FP &= ~HW_FP_DP;
4083 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004084 }
4085
Rafael Espindolaeb265472013-08-21 21:59:03 +00004086 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4087 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4088 return false;
4089 }
4090
4091 if (FPMath == FP_Neon)
4092 Features.push_back("+neonfp");
4093 else if (FPMath == FP_VFP)
4094 Features.push_back("-neonfp");
4095
Daniel Dunbar893d4752009-12-19 04:15:38 +00004096 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004097 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4098 for (const auto &FEFeature : FrontEndFeatures) {
4099 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4100 if (Feature != Features.end())
4101 Features.erase(Feature);
4102 }
4103
Rafael Espindolaeb265472013-08-21 21:59:03 +00004104 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004105 }
4106
Craig Topper3164f332014-03-11 03:39:26 +00004107 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004108 return llvm::StringSwitch<bool>(Feature)
4109 .Case("arm", true)
4110 .Case("softfloat", SoftFloat)
4111 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004112 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004113 .Case("hwdiv", HWDiv & HWDivThumb)
4114 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004115 .Default(false);
4116 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004117 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004118 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004119 return llvm::StringSwitch<const char *>(Name)
4120 .Cases("arm8", "arm810", "4")
4121 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4122 "4")
4123 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4124 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4125 .Case("ep9312", "4T")
4126 .Cases("arm10tdmi", "arm1020t", "5T")
4127 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4128 .Case("arm926ej-s", "5TEJ")
4129 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4130 .Cases("xscale", "iwmmxt", "5TE")
4131 .Case("arm1136j-s", "6J")
4132 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4133 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4134 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4135 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4136 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4137 "7A")
4138 .Cases("cortex-r4", "cortex-r5", "7R")
4139 .Case("swift", "7S")
4140 .Case("cyclone", "8A")
4141 .Case("cortex-m3", "7M")
4142 .Cases("cortex-m4", "cortex-m7", "7EM")
4143 .Case("cortex-m0", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004144 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004145 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004146 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004147 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004148 return llvm::StringSwitch<const char *>(Name)
4149 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4150 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4151 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004152 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Eric Christopher917e9522014-11-18 22:36:15 +00004153 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
4154 .Cases("cortex-r4", "cortex-r5", "R")
4155 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004156 }
Craig Topper3164f332014-03-11 03:39:26 +00004157 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004158 if (!getCPUDefineSuffix(Name))
4159 return false;
4160
Tim Northovere8c37212014-07-09 09:24:43 +00004161 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4162 StringRef Profile = getCPUProfile(Name);
4163 if (Profile == "M" && MaxAtomicInlineWidth) {
4164 MaxAtomicPromoteWidth = 32;
4165 MaxAtomicInlineWidth = 32;
4166 }
4167
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004168 CPU = Name;
4169 return true;
4170 }
Craig Topper3164f332014-03-11 03:39:26 +00004171 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004172 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4173 unsigned CPUArchVer) const {
4174 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4175 (CPUArch.find('M') != StringRef::npos);
4176 }
4177 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4178 unsigned CPUArchVer) const {
4179 // We check both CPUArchVer and ArchName because when only triple is
4180 // specified, the default CPU is arm1136j-s.
4181 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4182 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4183 }
Craig Topper3164f332014-03-11 03:39:26 +00004184 void getTargetDefines(const LangOptions &Opts,
4185 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004186 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004187 Builder.defineMacro("__arm");
4188 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004189
Chris Lattnerecd49032009-03-02 22:27:17 +00004190 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004191 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004192
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004193 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004194 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004195 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004196 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004197 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004198
4199 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004200 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004201 StringRef ArchName = getTriple().getArchName();
4202
4203 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4204 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004205 if (CPUArch[0] >= '8') {
4206 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4207 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004208 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004209
4210 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4211 // is not defined for the M-profile.
4212 // NOTE that the deffault profile is assumed to be 'A'
4213 if (CPUProfile.empty() || CPUProfile != "M")
4214 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4215
4216 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4217 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4218 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4219 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4220 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4221 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4222 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4223
4224 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4225 // instruction set such as ARM or Thumb.
4226 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4227
4228 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4229
4230 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004231 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004232 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004233
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004234 // ACLE 6.5.1 Hardware Floating Point
4235 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004236 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004237
Yi Konga44c4d72014-06-27 21:25:42 +00004238 // ACLE predefines.
4239 Builder.defineMacro("__ARM_ACLE", "200");
4240
Mike Stump9d54bd72009-04-08 02:07:04 +00004241 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004242
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004243 // FIXME: It's more complicated than this and we don't really support
4244 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004245 // Windows on ARM does not "support" interworking
4246 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004247 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004248
David Tweed8f676532012-10-25 13:33:01 +00004249 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004250 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004251 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4252 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004253 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004254 Builder.defineMacro("__ARM_PCS", "1");
4255
David Tweed8f676532012-10-25 13:33:01 +00004256 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004257 Builder.defineMacro("__ARM_PCS_VFP", "1");
4258 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004259
Daniel Dunbar893d4752009-12-19 04:15:38 +00004260 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004261 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004262
4263 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004264 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004265
4266 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004267 Builder.defineMacro("__THUMBEL__");
4268 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004269 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004270 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004271 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004272 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4273 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004274
4275 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004276 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004277
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004278 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004279 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004280 if (FPU & VFP2FPU)
4281 Builder.defineMacro("__ARM_VFPV2__");
4282 if (FPU & VFP3FPU)
4283 Builder.defineMacro("__ARM_VFPV3__");
4284 if (FPU & VFP4FPU)
4285 Builder.defineMacro("__ARM_VFPV4__");
4286 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004287
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004288 // This only gets set when Neon instructions are actually available, unlike
4289 // the VFP define, hence the soft float and arch check. This is subtly
4290 // different from gcc, we follow the intent which was that it should be set
4291 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004292 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4293 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004294 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004295 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004296
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004297 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4298 Opts.ShortWChar ? "2" : "4");
4299
4300 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4301 Opts.ShortEnums ? "1" : "4");
4302
Bernard Ogden18b57012013-10-29 09:47:51 +00004303 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004304 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004305
Tim Northover02e38602014-02-03 17:28:04 +00004306 if (Crypto)
4307 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4308
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004309 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004310 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4311 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4312 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4313 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4314 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004315
4316 bool is5EOrAbove = (CPUArchVer >= 6 ||
4317 (CPUArchVer == 5 &&
4318 CPUArch.find('E') != StringRef::npos));
4319 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4320 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4321 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004322 }
Craig Topper3164f332014-03-11 03:39:26 +00004323 void getTargetBuiltins(const Builtin::Info *&Records,
4324 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004325 Records = BuiltinInfo;
4326 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004327 }
Craig Topper3164f332014-03-11 03:39:26 +00004328 bool isCLZForZeroUndef() const override { return false; }
4329 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004330 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004331 }
Craig Topper3164f332014-03-11 03:39:26 +00004332 void getGCCRegNames(const char * const *&Names,
4333 unsigned &NumNames) const override;
4334 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4335 unsigned &NumAliases) const override;
4336 bool validateAsmConstraint(const char *&Name,
4337 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004338 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004339 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004340 case 'l': // r0-r7
4341 case 'h': // r8-r15
4342 case 'w': // VFP Floating point register single precision
4343 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004344 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004345 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004346 case 'I':
4347 case 'J':
4348 case 'K':
4349 case 'L':
4350 case 'M':
4351 // FIXME
4352 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004353 case 'Q': // A memory address that is a single base register.
4354 Info.setAllowsMemory();
4355 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004356 case 'U': // a memory reference...
4357 switch (Name[1]) {
4358 case 'q': // ...ARMV4 ldrsb
4359 case 'v': // ...VFP load/store (reg+constant offset)
4360 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004361 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004362 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004363 case 'n': // valid address for Neon doubleword vector load/store
4364 case 'm': // valid address for Neon element and structure load/store
4365 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004366 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004367 Info.setAllowsMemory();
4368 Name++;
4369 return true;
4370 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004371 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004372 return false;
4373 }
Craig Topper3164f332014-03-11 03:39:26 +00004374 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004375 std::string R;
4376 switch (*Constraint) {
4377 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004378 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004379 Constraint++;
4380 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004381 case 'p': // 'p' should be translated to 'r' by default.
4382 R = std::string("r");
4383 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004384 default:
4385 return std::string(1, *Constraint);
4386 }
4387 return R;
4388 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004389 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004390 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004391 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004392 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004393 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004394
Bill Wendling9d1ee112012-10-25 23:28:48 +00004395 // Strip off constraint modifiers.
4396 while (Constraint[0] == '=' ||
4397 Constraint[0] == '+' ||
4398 Constraint[0] == '&')
4399 Constraint = Constraint.substr(1);
4400
4401 switch (Constraint[0]) {
4402 default: break;
4403 case 'r': {
4404 switch (Modifier) {
4405 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004406 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004407 case 'q':
4408 // A register of size 32 cannot fit a vector type.
4409 return false;
4410 }
4411 }
4412 }
4413
4414 return true;
4415 }
Craig Topper3164f332014-03-11 03:39:26 +00004416 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004417 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004418 return "";
4419 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004420
Craig Topper3164f332014-03-11 03:39:26 +00004421 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004422 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4423 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004424
Craig Topper3164f332014-03-11 03:39:26 +00004425 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004426 if (RegNo == 0) return 0;
4427 if (RegNo == 1) return 1;
4428 return -1;
4429 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004430};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004431
Rafael Espindolaeb265472013-08-21 21:59:03 +00004432bool ARMTargetInfo::setFPMath(StringRef Name) {
4433 if (Name == "neon") {
4434 FPMath = FP_Neon;
4435 return true;
4436 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4437 Name == "vfp4") {
4438 FPMath = FP_VFP;
4439 return true;
4440 }
4441 return false;
4442}
4443
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004444const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004445 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004446 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004447 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4448
4449 // Float registers
4450 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4451 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4452 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004453 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004454
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004455 // Double registers
4456 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4457 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004458 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4459 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004460
4461 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004462 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4463 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004464};
4465
4466void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004467 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004468 Names = GCCRegNames;
4469 NumNames = llvm::array_lengthof(GCCRegNames);
4470}
4471
4472const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004473 { { "a1" }, "r0" },
4474 { { "a2" }, "r1" },
4475 { { "a3" }, "r2" },
4476 { { "a4" }, "r3" },
4477 { { "v1" }, "r4" },
4478 { { "v2" }, "r5" },
4479 { { "v3" }, "r6" },
4480 { { "v4" }, "r7" },
4481 { { "v5" }, "r8" },
4482 { { "v6", "rfp" }, "r9" },
4483 { { "sl" }, "r10" },
4484 { { "fp" }, "r11" },
4485 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004486 { { "r13" }, "sp" },
4487 { { "r14" }, "lr" },
4488 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004489 // The S, D and Q registers overlap, but aren't really aliases; we
4490 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004491};
4492
4493void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4494 unsigned &NumAliases) const {
4495 Aliases = GCCRegAliases;
4496 NumAliases = llvm::array_lengthof(GCCRegAliases);
4497}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004498
4499const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004500#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004501#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004502 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004503#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004504
4505#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004506#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004507#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4508 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004509#include "clang/Basic/BuiltinsARM.def"
4510};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004511
4512class ARMleTargetInfo : public ARMTargetInfo {
4513public:
4514 ARMleTargetInfo(const llvm::Triple &Triple)
4515 : ARMTargetInfo(Triple, false) { }
4516 virtual void getTargetDefines(const LangOptions &Opts,
4517 MacroBuilder &Builder) const {
4518 Builder.defineMacro("__ARMEL__");
4519 ARMTargetInfo::getTargetDefines(Opts, Builder);
4520 }
4521};
4522
4523class ARMbeTargetInfo : public ARMTargetInfo {
4524public:
4525 ARMbeTargetInfo(const llvm::Triple &Triple)
4526 : ARMTargetInfo(Triple, true) { }
4527 virtual void getTargetDefines(const LangOptions &Opts,
4528 MacroBuilder &Builder) const {
4529 Builder.defineMacro("__ARMEB__");
4530 Builder.defineMacro("__ARM_BIG_ENDIAN");
4531 ARMTargetInfo::getTargetDefines(Opts, Builder);
4532 }
4533};
Chris Lattner17df24e2008-04-21 18:56:49 +00004534} // end anonymous namespace.
4535
Eli Friedmanf05b7722008-08-20 07:44:10 +00004536namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004537class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4538 const llvm::Triple Triple;
4539public:
4540 WindowsARMTargetInfo(const llvm::Triple &Triple)
4541 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4542 TLSSupported = false;
4543 WCharType = UnsignedShort;
4544 SizeType = UnsignedInt;
4545 UserLabelPrefix = "";
4546 }
4547 void getVisualStudioDefines(const LangOptions &Opts,
4548 MacroBuilder &Builder) const {
4549 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4550
4551 // FIXME: this is invalid for WindowsCE
4552 Builder.defineMacro("_M_ARM_NT", "1");
4553 Builder.defineMacro("_M_ARMT", "_M_ARM");
4554 Builder.defineMacro("_M_THUMB", "_M_ARM");
4555
4556 assert((Triple.getArch() == llvm::Triple::arm ||
4557 Triple.getArch() == llvm::Triple::thumb) &&
4558 "invalid architecture for Windows ARM target info");
4559 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4560 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4561
4562 // TODO map the complete set of values
4563 // 31: VFPv3 40: VFPv4
4564 Builder.defineMacro("_M_ARM_FP", "31");
4565 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004566 BuiltinVaListKind getBuiltinVaListKind() const override {
4567 return TargetInfo::CharPtrBuiltinVaList;
4568 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004569};
4570
4571// Windows ARM + Itanium C++ ABI Target
4572class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4573public:
4574 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4575 : WindowsARMTargetInfo(Triple) {
4576 TheCXXABI.set(TargetCXXABI::GenericARM);
4577 }
4578
4579 void getTargetDefines(const LangOptions &Opts,
4580 MacroBuilder &Builder) const override {
4581 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4582
4583 if (Opts.MSVCCompat)
4584 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4585 }
4586};
4587
4588// Windows ARM, MS (C++) ABI
4589class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4590public:
4591 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4592 : WindowsARMTargetInfo(Triple) {
4593 TheCXXABI.set(TargetCXXABI::Microsoft);
4594 }
4595
4596 void getTargetDefines(const LangOptions &Opts,
4597 MacroBuilder &Builder) const override {
4598 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4599 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4600 }
4601};
4602}
4603
4604
4605namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004606class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004607 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004608protected:
Craig Topper3164f332014-03-11 03:39:26 +00004609 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4610 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004611 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004612 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004613
Torok Edwinb2b37c62009-06-30 17:10:35 +00004614public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004615 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004616 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004617 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004618 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004619 // FIXME: This should be based off of the target features in
4620 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004621 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004622
4623 // Darwin on iOS uses a variant of the ARM C++ ABI.
4624 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004625 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004626};
4627} // end anonymous namespace.
4628
Tony Linthicum76329bf2011-12-12 21:14:55 +00004629
4630namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004631class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004632 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004633 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4634 static const char *const GCCRegNames[];
4635
James Molloy75f5f9e2014-04-16 15:33:48 +00004636 enum FPUModeEnum {
4637 FPUMode,
4638 NeonMode
4639 };
4640
4641 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004642 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004643 unsigned Crypto;
4644
Tim Northovera2ee4332014-03-29 15:09:45 +00004645 static const Builtin::Info BuiltinInfo[];
4646
4647 std::string ABI;
4648
4649public:
Tim Northover573cbee2014-05-24 12:52:07 +00004650 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004651 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004652
4653 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4654 WCharType = SignedInt;
4655
4656 // NetBSD apparently prefers consistency across ARM targets to consistency
4657 // across 64-bit targets.
4658 Int64Type = SignedLongLong;
4659 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004660 } else {
4661 WCharType = UnsignedInt;
4662 Int64Type = SignedLong;
4663 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004664 }
4665
Tim Northovera2ee4332014-03-29 15:09:45 +00004666 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004667 MaxVectorAlign = 128;
4668 RegParmMax = 8;
4669 MaxAtomicInlineWidth = 128;
4670 MaxAtomicPromoteWidth = 128;
4671
Tim Northovera6a19f12015-02-06 01:25:07 +00004672 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004673 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4674
Tim Northovera2ee4332014-03-29 15:09:45 +00004675 // {} in inline assembly are neon specifiers, not assembly variant
4676 // specifiers.
4677 NoAsmVariants = true;
4678
Tim Northover7ad87af2015-01-16 18:44:04 +00004679 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4680 // contributes to the alignment of the containing aggregate in the same way
4681 // a plain (non bit-field) member of that type would, without exception for
4682 // zero-sized or anonymous bit-fields."
4683 UseBitFieldTypeAlignment = true;
4684 UseZeroLengthBitfieldAlignment = true;
4685
Tim Northover573cbee2014-05-24 12:52:07 +00004686 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004687 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4688 }
4689
Alp Toker4925ba72014-06-07 23:30:42 +00004690 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004691 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004692 if (Name != "aapcs" && Name != "darwinpcs")
4693 return false;
4694
4695 ABI = Name;
4696 return true;
4697 }
4698
David Blaikie1cbb9712014-11-14 19:09:44 +00004699 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004700 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004701 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004702 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004703 .Case("cyclone", true)
4704 .Default(false);
4705 return CPUKnown;
4706 }
4707
4708 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004709 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004710 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004711 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004712
4713 // Target properties.
4714 Builder.defineMacro("_LP64");
4715 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004716
4717 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4718 Builder.defineMacro("__ARM_ACLE", "200");
4719 Builder.defineMacro("__ARM_ARCH", "8");
4720 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4721
4722 Builder.defineMacro("__ARM_64BIT_STATE");
4723 Builder.defineMacro("__ARM_PCS_AAPCS64");
4724 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4725
4726 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4727 Builder.defineMacro("__ARM_FEATURE_CLZ");
4728 Builder.defineMacro("__ARM_FEATURE_FMA");
4729 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004730 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4731 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4732 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4733 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004734
4735 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4736
4737 // 0xe implies support for half, single and double precision operations.
4738 Builder.defineMacro("__ARM_FP", "0xe");
4739
4740 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4741 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4742 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4743
4744 if (Opts.FastMath || Opts.FiniteMathOnly)
4745 Builder.defineMacro("__ARM_FP_FAST");
4746
Richard Smithab506ad2014-10-20 23:26:58 +00004747 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004748 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4749
4750 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4751
4752 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4753 Opts.ShortEnums ? "1" : "4");
4754
James Molloy75f5f9e2014-04-16 15:33:48 +00004755 if (FPU == NeonMode) {
4756 Builder.defineMacro("__ARM_NEON");
4757 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004758 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004759 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004760
Bradley Smith418c5932014-05-02 15:17:51 +00004761 if (CRC)
4762 Builder.defineMacro("__ARM_FEATURE_CRC32");
4763
James Molloy75f5f9e2014-04-16 15:33:48 +00004764 if (Crypto)
4765 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004766 }
4767
4768 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004769 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004770 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004771 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004772 }
4773
David Blaikie1cbb9712014-11-14 19:09:44 +00004774 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004775 return Feature == "aarch64" ||
4776 Feature == "arm64" ||
4777 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004778 }
4779
James Molloy5e73df52014-04-16 15:06:20 +00004780 bool handleTargetFeatures(std::vector<std::string> &Features,
4781 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004782 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004783 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004784 Crypto = 0;
4785 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4786 if (Features[i] == "+neon")
4787 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004788 if (Features[i] == "+crc")
4789 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004790 if (Features[i] == "+crypto")
4791 Crypto = 1;
4792 }
4793
James Molloy5e73df52014-04-16 15:06:20 +00004794 setDescriptionString();
4795
4796 return true;
4797 }
4798
David Blaikie1cbb9712014-11-14 19:09:44 +00004799 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004800
David Blaikie1cbb9712014-11-14 19:09:44 +00004801 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004802 return TargetInfo::AArch64ABIBuiltinVaList;
4803 }
4804
4805 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004806 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004807 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004808 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004809
Eric Christopher917e9522014-11-18 22:36:15 +00004810 virtual bool
4811 validateAsmConstraint(const char *&Name,
4812 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004813 switch (*Name) {
4814 default:
4815 return false;
4816 case 'w': // Floating point and SIMD registers (V0-V31)
4817 Info.setAllowsRegister();
4818 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004819 case 'I': // Constant that can be used with an ADD instruction
4820 case 'J': // Constant that can be used with a SUB instruction
4821 case 'K': // Constant that can be used with a 32-bit logical instruction
4822 case 'L': // Constant that can be used with a 64-bit logical instruction
4823 case 'M': // Constant that can be used as a 32-bit MOV immediate
4824 case 'N': // Constant that can be used as a 64-bit MOV immediate
4825 case 'Y': // Floating point constant zero
4826 case 'Z': // Integer constant zero
4827 return true;
4828 case 'Q': // A memory reference with base register and no offset
4829 Info.setAllowsMemory();
4830 return true;
4831 case 'S': // A symbolic address
4832 Info.setAllowsRegister();
4833 return true;
4834 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004835 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4836 // Utf: A memory address suitable for ldp/stp in TF mode.
4837 // Usa: An absolute symbolic address.
4838 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4839 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004840 case 'z': // Zero register, wzr or xzr
4841 Info.setAllowsRegister();
4842 return true;
4843 case 'x': // Floating point and SIMD registers (V0-V15)
4844 Info.setAllowsRegister();
4845 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004846 }
4847 return false;
4848 }
4849
Akira Hatanaka987f1862014-08-22 06:05:21 +00004850 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004851 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004852 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004853 // Strip off constraint modifiers.
4854 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4855 Constraint = Constraint.substr(1);
4856
4857 switch (Constraint[0]) {
4858 default:
4859 return true;
4860 case 'z':
4861 case 'r': {
4862 switch (Modifier) {
4863 case 'x':
4864 case 'w':
4865 // For now assume that the person knows what they're
4866 // doing with the modifier.
4867 return true;
4868 default:
4869 // By default an 'r' constraint will be in the 'x'
4870 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004871 if (Size == 64)
4872 return true;
4873
4874 SuggestedModifier = "w";
4875 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004876 }
4877 }
4878 }
4879 }
4880
David Blaikie1cbb9712014-11-14 19:09:44 +00004881 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004882
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004883 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004884 if (RegNo == 0)
4885 return 0;
4886 if (RegNo == 1)
4887 return 1;
4888 return -1;
4889 }
4890};
4891
Tim Northover573cbee2014-05-24 12:52:07 +00004892const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004893 // 32-bit Integer registers
4894 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4895 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4896 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4897
4898 // 64-bit Integer registers
4899 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4900 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4901 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4902
4903 // 32-bit floating point regsisters
4904 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4905 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4906 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4907
4908 // 64-bit floating point regsisters
4909 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4910 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4911 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4912
4913 // Vector registers
4914 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4915 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4916 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4917};
4918
Tim Northover573cbee2014-05-24 12:52:07 +00004919void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004920 unsigned &NumNames) const {
4921 Names = GCCRegNames;
4922 NumNames = llvm::array_lengthof(GCCRegNames);
4923}
4924
Tim Northover573cbee2014-05-24 12:52:07 +00004925const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004926 { { "w31" }, "wsp" },
4927 { { "x29" }, "fp" },
4928 { { "x30" }, "lr" },
4929 { { "x31" }, "sp" },
4930 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4931 // don't want to substitute one of these for a different-sized one.
4932};
4933
Tim Northover573cbee2014-05-24 12:52:07 +00004934void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004935 unsigned &NumAliases) const {
4936 Aliases = GCCRegAliases;
4937 NumAliases = llvm::array_lengthof(GCCRegAliases);
4938}
4939
Tim Northover573cbee2014-05-24 12:52:07 +00004940const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004941#define BUILTIN(ID, TYPE, ATTRS) \
4942 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4943#include "clang/Basic/BuiltinsNEON.def"
4944
4945#define BUILTIN(ID, TYPE, ATTRS) \
4946 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004947#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004948};
James Molloy5e73df52014-04-16 15:06:20 +00004949
Tim Northover573cbee2014-05-24 12:52:07 +00004950class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004951 void setDescriptionString() override {
4952 if (getTriple().isOSBinFormatMachO())
4953 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4954 else
4955 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4956 }
4957
4958public:
Tim Northover573cbee2014-05-24 12:52:07 +00004959 AArch64leTargetInfo(const llvm::Triple &Triple)
4960 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004961 BigEndian = false;
4962 }
4963 void getTargetDefines(const LangOptions &Opts,
4964 MacroBuilder &Builder) const override {
4965 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004966 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004967 }
4968};
4969
Tim Northover573cbee2014-05-24 12:52:07 +00004970class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004971 void setDescriptionString() override {
4972 assert(!getTriple().isOSBinFormatMachO());
4973 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4974 }
4975
4976public:
Tim Northover573cbee2014-05-24 12:52:07 +00004977 AArch64beTargetInfo(const llvm::Triple &Triple)
4978 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004979 void getTargetDefines(const LangOptions &Opts,
4980 MacroBuilder &Builder) const override {
4981 Builder.defineMacro("__AARCH64EB__");
4982 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4983 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004984 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004985 }
4986};
Tim Northovera2ee4332014-03-29 15:09:45 +00004987} // end anonymous namespace.
4988
4989namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004990class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004991protected:
4992 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4993 MacroBuilder &Builder) const override {
4994 Builder.defineMacro("__AARCH64_SIMD__");
4995 Builder.defineMacro("__ARM64_ARCH_8__");
4996 Builder.defineMacro("__ARM_NEON__");
4997 Builder.defineMacro("__LITTLE_ENDIAN__");
4998 Builder.defineMacro("__REGISTER_PREFIX__", "");
4999 Builder.defineMacro("__arm64", "1");
5000 Builder.defineMacro("__arm64__", "1");
5001
5002 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5003 }
5004
Tim Northovera2ee4332014-03-29 15:09:45 +00005005public:
Tim Northover573cbee2014-05-24 12:52:07 +00005006 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5007 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005008 Int64Type = SignedLongLong;
5009 WCharType = SignedInt;
5010 UseSignedCharForObjCBool = false;
5011
Tim Northovera6a19f12015-02-06 01:25:07 +00005012 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005013 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5014
5015 TheCXXABI.set(TargetCXXABI::iOS64);
5016 }
5017
David Blaikie1cbb9712014-11-14 19:09:44 +00005018 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005019 return TargetInfo::CharPtrBuiltinVaList;
5020 }
5021};
5022} // end anonymous namespace
5023
5024namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005025// Hexagon abstract base class
5026class HexagonTargetInfo : public TargetInfo {
5027 static const Builtin::Info BuiltinInfo[];
5028 static const char * const GCCRegNames[];
5029 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5030 std::string CPU;
5031public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005032 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005033 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005034 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005035
5036 // {} in inline assembly are packet specifiers, not assembly variant
5037 // specifiers.
5038 NoAsmVariants = true;
5039 }
5040
Craig Topper3164f332014-03-11 03:39:26 +00005041 void getTargetBuiltins(const Builtin::Info *&Records,
5042 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005043 Records = BuiltinInfo;
5044 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5045 }
5046
Craig Topper3164f332014-03-11 03:39:26 +00005047 bool validateAsmConstraint(const char *&Name,
5048 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005049 return true;
5050 }
5051
Craig Topper3164f332014-03-11 03:39:26 +00005052 void getTargetDefines(const LangOptions &Opts,
5053 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005054
Craig Topper3164f332014-03-11 03:39:26 +00005055 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005056 return Feature == "hexagon";
5057 }
Craig Topper3164f332014-03-11 03:39:26 +00005058
5059 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005060 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005061 }
Craig Topper3164f332014-03-11 03:39:26 +00005062 void getGCCRegNames(const char * const *&Names,
5063 unsigned &NumNames) const override;
5064 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5065 unsigned &NumAliases) const override;
5066 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005067 return "";
5068 }
Sebastian Pop86500282012-01-13 20:37:10 +00005069
5070 static const char *getHexagonCPUSuffix(StringRef Name) {
5071 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005072 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005073 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005074 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005075 }
5076
Craig Topper3164f332014-03-11 03:39:26 +00005077 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005078 if (!getHexagonCPUSuffix(Name))
5079 return false;
5080
Tony Linthicum76329bf2011-12-12 21:14:55 +00005081 CPU = Name;
5082 return true;
5083 }
5084};
5085
5086void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5087 MacroBuilder &Builder) const {
5088 Builder.defineMacro("qdsp6");
5089 Builder.defineMacro("__qdsp6", "1");
5090 Builder.defineMacro("__qdsp6__", "1");
5091
5092 Builder.defineMacro("hexagon");
5093 Builder.defineMacro("__hexagon", "1");
5094 Builder.defineMacro("__hexagon__", "1");
5095
5096 if(CPU == "hexagonv1") {
5097 Builder.defineMacro("__HEXAGON_V1__");
5098 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5099 if(Opts.HexagonQdsp6Compat) {
5100 Builder.defineMacro("__QDSP6_V1__");
5101 Builder.defineMacro("__QDSP6_ARCH__", "1");
5102 }
5103 }
5104 else if(CPU == "hexagonv2") {
5105 Builder.defineMacro("__HEXAGON_V2__");
5106 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5107 if(Opts.HexagonQdsp6Compat) {
5108 Builder.defineMacro("__QDSP6_V2__");
5109 Builder.defineMacro("__QDSP6_ARCH__", "2");
5110 }
5111 }
5112 else if(CPU == "hexagonv3") {
5113 Builder.defineMacro("__HEXAGON_V3__");
5114 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5115 if(Opts.HexagonQdsp6Compat) {
5116 Builder.defineMacro("__QDSP6_V3__");
5117 Builder.defineMacro("__QDSP6_ARCH__", "3");
5118 }
5119 }
5120 else if(CPU == "hexagonv4") {
5121 Builder.defineMacro("__HEXAGON_V4__");
5122 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5123 if(Opts.HexagonQdsp6Compat) {
5124 Builder.defineMacro("__QDSP6_V4__");
5125 Builder.defineMacro("__QDSP6_ARCH__", "4");
5126 }
5127 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005128 else if(CPU == "hexagonv5") {
5129 Builder.defineMacro("__HEXAGON_V5__");
5130 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5131 if(Opts.HexagonQdsp6Compat) {
5132 Builder.defineMacro("__QDSP6_V5__");
5133 Builder.defineMacro("__QDSP6_ARCH__", "5");
5134 }
5135 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005136}
5137
5138const char * const HexagonTargetInfo::GCCRegNames[] = {
5139 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5140 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5141 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5142 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5143 "p0", "p1", "p2", "p3",
5144 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5145};
5146
5147void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5148 unsigned &NumNames) const {
5149 Names = GCCRegNames;
5150 NumNames = llvm::array_lengthof(GCCRegNames);
5151}
5152
5153
5154const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5155 { { "sp" }, "r29" },
5156 { { "fp" }, "r30" },
5157 { { "lr" }, "r31" },
5158 };
5159
5160void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5161 unsigned &NumAliases) const {
5162 Aliases = GCCRegAliases;
5163 NumAliases = llvm::array_lengthof(GCCRegAliases);
5164}
5165
5166
5167const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5168#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5169#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5170 ALL_LANGUAGES },
5171#include "clang/Basic/BuiltinsHexagon.def"
5172};
5173}
5174
5175
Chris Lattner5ba61f02006-10-14 07:39:34 +00005176namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005177// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5178class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005179 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5180 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005181 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005182public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005183 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005184
Craig Topper3164f332014-03-11 03:39:26 +00005185 bool handleTargetFeatures(std::vector<std::string> &Features,
5186 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005187 SoftFloat = false;
5188 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5189 if (Features[i] == "+soft-float")
5190 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005191 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005192 }
Craig Topper3164f332014-03-11 03:39:26 +00005193 void getTargetDefines(const LangOptions &Opts,
5194 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005195 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005196 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005197
5198 if (SoftFloat)
5199 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005200 }
Craig Topper3164f332014-03-11 03:39:26 +00005201
5202 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005203 return llvm::StringSwitch<bool>(Feature)
5204 .Case("softfloat", SoftFloat)
5205 .Case("sparc", true)
5206 .Default(false);
5207 }
Craig Topper3164f332014-03-11 03:39:26 +00005208
5209 void getTargetBuiltins(const Builtin::Info *&Records,
5210 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005211 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005212 }
Craig Topper3164f332014-03-11 03:39:26 +00005213 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005214 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005215 }
Craig Topper3164f332014-03-11 03:39:26 +00005216 void getGCCRegNames(const char * const *&Names,
5217 unsigned &NumNames) const override;
5218 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5219 unsigned &NumAliases) const override;
5220 bool validateAsmConstraint(const char *&Name,
5221 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005222 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005223 switch (*Name) {
5224 case 'I': // Signed 13-bit constant
5225 case 'J': // Zero
5226 case 'K': // 32-bit constant with the low 12 bits clear
5227 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5228 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5229 case 'N': // Same as 'K' but zext (required for SIMode)
5230 case 'O': // The constant 4096
5231 return true;
5232 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005233 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005234 }
Craig Topper3164f332014-03-11 03:39:26 +00005235 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005236 // FIXME: Implement!
5237 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005238 }
5239};
5240
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005241const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005242 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5243 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5244 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5245 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5246};
5247
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005248void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5249 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005250 Names = GCCRegNames;
5251 NumNames = llvm::array_lengthof(GCCRegNames);
5252}
5253
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005254const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005255 { { "g0" }, "r0" },
5256 { { "g1" }, "r1" },
5257 { { "g2" }, "r2" },
5258 { { "g3" }, "r3" },
5259 { { "g4" }, "r4" },
5260 { { "g5" }, "r5" },
5261 { { "g6" }, "r6" },
5262 { { "g7" }, "r7" },
5263 { { "o0" }, "r8" },
5264 { { "o1" }, "r9" },
5265 { { "o2" }, "r10" },
5266 { { "o3" }, "r11" },
5267 { { "o4" }, "r12" },
5268 { { "o5" }, "r13" },
5269 { { "o6", "sp" }, "r14" },
5270 { { "o7" }, "r15" },
5271 { { "l0" }, "r16" },
5272 { { "l1" }, "r17" },
5273 { { "l2" }, "r18" },
5274 { { "l3" }, "r19" },
5275 { { "l4" }, "r20" },
5276 { { "l5" }, "r21" },
5277 { { "l6" }, "r22" },
5278 { { "l7" }, "r23" },
5279 { { "i0" }, "r24" },
5280 { { "i1" }, "r25" },
5281 { { "i2" }, "r26" },
5282 { { "i3" }, "r27" },
5283 { { "i4" }, "r28" },
5284 { { "i5" }, "r29" },
5285 { { "i6", "fp" }, "r30" },
5286 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005287};
5288
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005289void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5290 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005291 Aliases = GCCRegAliases;
5292 NumAliases = llvm::array_lengthof(GCCRegAliases);
5293}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005294
5295// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5296class SparcV8TargetInfo : public SparcTargetInfo {
5297public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005298 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005299 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005300 }
5301
Craig Topper3164f332014-03-11 03:39:26 +00005302 void getTargetDefines(const LangOptions &Opts,
5303 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005304 SparcTargetInfo::getTargetDefines(Opts, Builder);
5305 Builder.defineMacro("__sparcv8");
5306 }
5307};
5308
5309// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5310class SparcV9TargetInfo : public SparcTargetInfo {
5311public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005312 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005313 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005314 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005315 // This is an LP64 platform.
5316 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005317
5318 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005319 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005320 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005321 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005322 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005323 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005324
5325 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5326 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5327 LongDoubleWidth = 128;
5328 LongDoubleAlign = 128;
5329 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005330 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005331 }
5332
Craig Topper3164f332014-03-11 03:39:26 +00005333 void getTargetDefines(const LangOptions &Opts,
5334 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005335 SparcTargetInfo::getTargetDefines(Opts, Builder);
5336 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005337 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005338 // Solaris doesn't need these variants, but the BSDs do.
5339 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005340 Builder.defineMacro("__sparc64__");
5341 Builder.defineMacro("__sparc_v9__");
5342 Builder.defineMacro("__sparcv9__");
5343 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005344 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005345
Craig Topper3164f332014-03-11 03:39:26 +00005346 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005347 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5348 .Case("v9", true)
5349 .Case("ultrasparc", true)
5350 .Case("ultrasparc3", true)
5351 .Case("niagara", true)
5352 .Case("niagara2", true)
5353 .Case("niagara3", true)
5354 .Case("niagara4", true)
5355 .Default(false);
5356
5357 // No need to store the CPU yet. There aren't any CPU-specific
5358 // macros to define.
5359 return CPUKnown;
5360 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005361};
5362
Gabor Greif49991682008-02-21 16:29:08 +00005363} // end anonymous namespace.
5364
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005365namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005366class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005367public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005368 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5369 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005370 SizeType = UnsignedInt;
5371 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005372 }
5373};
5374} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005375
Chris Lattnerb781dc792008-05-08 05:58:21 +00005376namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005377class SystemZTargetInfo : public TargetInfo {
5378 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005379
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005380public:
5381 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5382 TLSSupported = true;
5383 IntWidth = IntAlign = 32;
5384 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5385 PointerWidth = PointerAlign = 64;
5386 LongDoubleWidth = 128;
5387 LongDoubleAlign = 64;
5388 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5389 MinGlobalAlign = 16;
5390 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5391 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5392 }
5393 void getTargetDefines(const LangOptions &Opts,
5394 MacroBuilder &Builder) const override {
5395 Builder.defineMacro("__s390__");
5396 Builder.defineMacro("__s390x__");
5397 Builder.defineMacro("__zarch__");
5398 Builder.defineMacro("__LONG_DOUBLE_128__");
5399 }
5400 void getTargetBuiltins(const Builtin::Info *&Records,
5401 unsigned &NumRecords) const override {
5402 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005403 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005404 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005405 }
5406
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005407 void getGCCRegNames(const char *const *&Names,
5408 unsigned &NumNames) const override;
5409 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5410 unsigned &NumAliases) const override {
5411 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005412 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005413 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005414 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005415 bool validateAsmConstraint(const char *&Name,
5416 TargetInfo::ConstraintInfo &info) const override;
5417 const char *getClobbers() const override {
5418 // FIXME: Is this really right?
5419 return "";
5420 }
5421 BuiltinVaListKind getBuiltinVaListKind() const override {
5422 return TargetInfo::SystemZBuiltinVaList;
5423 }
5424 bool setCPU(const std::string &Name) override {
5425 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5426 .Case("z10", true)
5427 .Case("z196", true)
5428 .Case("zEC12", true)
5429 .Default(false);
5430
5431 // No need to store the CPU yet. There aren't any CPU-specific
5432 // macros to define.
5433 return CPUKnown;
5434 }
5435};
5436
5437const char *const SystemZTargetInfo::GCCRegNames[] = {
5438 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5439 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5440 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5441 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5442};
5443
5444void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5445 unsigned &NumNames) const {
5446 Names = GCCRegNames;
5447 NumNames = llvm::array_lengthof(GCCRegNames);
5448}
5449
5450bool SystemZTargetInfo::
5451validateAsmConstraint(const char *&Name,
5452 TargetInfo::ConstraintInfo &Info) const {
5453 switch (*Name) {
5454 default:
5455 return false;
5456
5457 case 'a': // Address register
5458 case 'd': // Data register (equivalent to 'r')
5459 case 'f': // Floating-point register
5460 Info.setAllowsRegister();
5461 return true;
5462
5463 case 'I': // Unsigned 8-bit constant
5464 case 'J': // Unsigned 12-bit constant
5465 case 'K': // Signed 16-bit constant
5466 case 'L': // Signed 20-bit displacement (on all targets we support)
5467 case 'M': // 0x7fffffff
5468 return true;
5469
5470 case 'Q': // Memory with base and unsigned 12-bit displacement
5471 case 'R': // Likewise, plus an index
5472 case 'S': // Memory with base and signed 20-bit displacement
5473 case 'T': // Likewise, plus an index
5474 Info.setAllowsMemory();
5475 return true;
5476 }
5477}
Ulrich Weigand47445072013-05-06 16:26:41 +00005478}
5479
5480namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005481 class MSP430TargetInfo : public TargetInfo {
5482 static const char * const GCCRegNames[];
5483 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005484 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005485 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005486 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005487 IntWidth = 16; IntAlign = 16;
5488 LongWidth = 32; LongLongWidth = 64;
5489 LongAlign = LongLongAlign = 16;
5490 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005491 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005492 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005493 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005494 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005495 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005496 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005497 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005498 }
5499 void getTargetDefines(const LangOptions &Opts,
5500 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005501 Builder.defineMacro("MSP430");
5502 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005503 // FIXME: defines for different 'flavours' of MCU
5504 }
Craig Topper3164f332014-03-11 03:39:26 +00005505 void getTargetBuiltins(const Builtin::Info *&Records,
5506 unsigned &NumRecords) const override {
5507 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005508 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005509 NumRecords = 0;
5510 }
Craig Topper3164f332014-03-11 03:39:26 +00005511 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005512 return Feature == "msp430";
5513 }
Craig Topper3164f332014-03-11 03:39:26 +00005514 void getGCCRegNames(const char * const *&Names,
5515 unsigned &NumNames) const override;
5516 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5517 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005518 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005519 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005520 NumAliases = 0;
5521 }
Eric Christopher917e9522014-11-18 22:36:15 +00005522 bool
5523 validateAsmConstraint(const char *&Name,
5524 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005525 // FIXME: implement
5526 switch (*Name) {
5527 case 'K': // the constant 1
5528 case 'L': // constant -1^20 .. 1^19
5529 case 'M': // constant 1-4:
5530 return true;
5531 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005532 // No target constraints for now.
5533 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005534 }
Craig Topper3164f332014-03-11 03:39:26 +00005535 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005536 // FIXME: Is this really right?
5537 return "";
5538 }
Craig Topper3164f332014-03-11 03:39:26 +00005539 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005540 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005541 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005542 }
5543 };
5544
5545 const char * const MSP430TargetInfo::GCCRegNames[] = {
5546 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5547 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5548 };
5549
5550 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5551 unsigned &NumNames) const {
5552 Names = GCCRegNames;
5553 NumNames = llvm::array_lengthof(GCCRegNames);
5554 }
5555}
5556
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005557namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005558
Mike Stump11289f42009-09-09 15:08:12 +00005559 // LLVM and Clang cannot be used directly to output native binaries for
5560 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005561 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005562 //
5563 // TCE uses the llvm bitcode as input and uses it for generating customized
5564 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005565 // publicly available in http://tce.cs.tut.fi
5566
Eli Friedman1f191002011-10-07 19:51:42 +00005567 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5568 3, // opencl_global
5569 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005570 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005571 // FIXME: generic has to be added to the target
5572 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005573 0, // cuda_device
5574 0, // cuda_constant
5575 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005576 };
5577
Eli Friedmana9c3d712009-08-19 20:47:07 +00005578 class TCETargetInfo : public TargetInfo{
5579 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005580 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005581 TLSSupported = false;
5582 IntWidth = 32;
5583 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005584 PointerWidth = 32;
5585 IntAlign = 32;
5586 LongAlign = LongLongAlign = 32;
5587 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005588 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005589 SizeType = UnsignedInt;
5590 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005591 IntPtrType = SignedInt;
5592 PtrDiffType = SignedInt;
5593 FloatWidth = 32;
5594 FloatAlign = 32;
5595 DoubleWidth = 32;
5596 DoubleAlign = 32;
5597 LongDoubleWidth = 32;
5598 LongDoubleAlign = 32;
5599 FloatFormat = &llvm::APFloat::IEEEsingle;
5600 DoubleFormat = &llvm::APFloat::IEEEsingle;
5601 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005602 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5603 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005604 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005605 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005606 }
5607
Craig Topper3164f332014-03-11 03:39:26 +00005608 void getTargetDefines(const LangOptions &Opts,
5609 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005610 DefineStd(Builder, "tce", Opts);
5611 Builder.defineMacro("__TCE__");
5612 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005613 }
Craig Topper3164f332014-03-11 03:39:26 +00005614 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005615 return Feature == "tce";
5616 }
Craig Topper3164f332014-03-11 03:39:26 +00005617
5618 void getTargetBuiltins(const Builtin::Info *&Records,
5619 unsigned &NumRecords) const override {}
5620 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005621 return "";
5622 }
Craig Topper3164f332014-03-11 03:39:26 +00005623 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005624 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005625 }
Craig Topper3164f332014-03-11 03:39:26 +00005626 void getGCCRegNames(const char * const *&Names,
5627 unsigned &NumNames) const override {}
5628 bool validateAsmConstraint(const char *&Name,
5629 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005630 return true;
5631 }
Craig Topper3164f332014-03-11 03:39:26 +00005632 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5633 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005634 };
5635}
5636
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005637namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005638class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005639 virtual void setDescriptionString() = 0;
5640
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005641 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005642 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005643 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005644 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005645 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005646 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005647 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005648 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005649 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005650 enum DspRevEnum {
5651 NoDSP, DSP1, DSP2
5652 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005653 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005654
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005655protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005656 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005657 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005658
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005659public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005660 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5661 const std::string &CPUStr)
5662 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005663 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005664 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005665
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005666 bool isNaN2008Default() const {
5667 return CPU == "mips32r6" || CPU == "mips64r6";
5668 }
5669
5670 bool isFP64Default() const {
5671 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5672 }
5673
Alp Toker4925ba72014-06-07 23:30:42 +00005674 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005675 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005676 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5677 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005678 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005679 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005680 .Case("mips1", IsMips32)
5681 .Case("mips2", IsMips32)
5682 .Case("mips3", true)
5683 .Case("mips4", true)
5684 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005685 .Case("mips32", IsMips32)
5686 .Case("mips32r2", IsMips32)
5687 .Case("mips32r6", IsMips32)
5688 .Case("mips64", true)
5689 .Case("mips64r2", true)
5690 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005691 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005692 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005693 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005694 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005695 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005696 if (CPU == "octeon")
5697 Features["mips64r2"] = Features["cnmips"] = true;
5698 else
5699 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005700 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005701
Craig Topper3164f332014-03-11 03:39:26 +00005702 void getTargetDefines(const LangOptions &Opts,
5703 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005704 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005705 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005706 if (Opts.GNUMode)
5707 Builder.defineMacro("mips");
5708
Simon Atanasyan683535b2012-08-29 19:14:58 +00005709 Builder.defineMacro("__REGISTER_PREFIX__", "");
5710
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005711 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005712 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005713 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005714 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005715 case SoftFloat:
5716 Builder.defineMacro("__mips_soft_float", Twine(1));
5717 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005718 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005719
Simon Atanasyan16071912013-04-14 14:07:30 +00005720 if (IsSingleFloat)
5721 Builder.defineMacro("__mips_single_float", Twine(1));
5722
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005723 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5724 Builder.defineMacro("_MIPS_FPSET",
5725 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5726
Simon Atanasyan72244b62012-07-05 16:06:06 +00005727 if (IsMips16)
5728 Builder.defineMacro("__mips16", Twine(1));
5729
Simon Atanasyan60777612013-04-14 14:07:51 +00005730 if (IsMicromips)
5731 Builder.defineMacro("__mips_micromips", Twine(1));
5732
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005733 if (IsNan2008)
5734 Builder.defineMacro("__mips_nan2008", Twine(1));
5735
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005736 switch (DspRev) {
5737 default:
5738 break;
5739 case DSP1:
5740 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5741 Builder.defineMacro("__mips_dsp", Twine(1));
5742 break;
5743 case DSP2:
5744 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5745 Builder.defineMacro("__mips_dspr2", Twine(1));
5746 Builder.defineMacro("__mips_dsp", Twine(1));
5747 break;
5748 }
5749
Jack Carter44ff1e52013-08-12 17:20:29 +00005750 if (HasMSA)
5751 Builder.defineMacro("__mips_msa", Twine(1));
5752
Simon Atanasyan26f19672012-04-05 19:28:31 +00005753 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5754 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5755 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005756
5757 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5758 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005759 }
5760
Craig Topper3164f332014-03-11 03:39:26 +00005761 void getTargetBuiltins(const Builtin::Info *&Records,
5762 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005763 Records = BuiltinInfo;
5764 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005765 }
Craig Topper3164f332014-03-11 03:39:26 +00005766 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005767 return llvm::StringSwitch<bool>(Feature)
5768 .Case("mips", true)
5769 .Case("fp64", HasFP64)
5770 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005771 }
Craig Topper3164f332014-03-11 03:39:26 +00005772 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005773 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005774 }
Craig Topper3164f332014-03-11 03:39:26 +00005775 void getGCCRegNames(const char * const *&Names,
5776 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005777 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005778 // CPU register names
5779 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005780 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5781 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5782 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005783 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5784 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005785 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5786 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5787 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5788 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005789 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005790 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005791 "$fcc5","$fcc6","$fcc7",
5792 // MSA register names
5793 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5794 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5795 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5796 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5797 // MSA control register names
5798 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5799 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005800 };
5801 Names = GCCRegNames;
5802 NumNames = llvm::array_lengthof(GCCRegNames);
5803 }
Craig Topper3164f332014-03-11 03:39:26 +00005804 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5805 unsigned &NumAliases) const override = 0;
5806 bool validateAsmConstraint(const char *&Name,
5807 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005808 switch (*Name) {
5809 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005810 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005811 case 'r': // CPU registers.
5812 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005813 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005814 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005815 case 'c': // $25 for indirect jumps
5816 case 'l': // lo register
5817 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005818 Info.setAllowsRegister();
5819 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005820 case 'I': // Signed 16-bit constant
5821 case 'J': // Integer 0
5822 case 'K': // Unsigned 16-bit constant
5823 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5824 case 'M': // Constants not loadable via lui, addiu, or ori
5825 case 'N': // Constant -1 to -65535
5826 case 'O': // A signed 15-bit constant
5827 case 'P': // A constant between 1 go 65535
5828 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005829 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005830 Info.setAllowsMemory();
5831 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005832 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005833 }
5834
Craig Topper3164f332014-03-11 03:39:26 +00005835 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005836 // In GCC, $1 is not widely used in generated code (it's used only in a few
5837 // specific situations), so there is no real need for users to add it to
5838 // the clobbers list if they want to use it in their inline assembly code.
5839 //
5840 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5841 // code generation, so using it in inline assembly without adding it to the
5842 // clobbers list can cause conflicts between the inline assembly code and
5843 // the surrounding generated code.
5844 //
5845 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5846 // operands, which will conflict with the ".set at" assembler option (which
5847 // we use only for inline assembly, in order to maintain compatibility with
5848 // GCC) and will also conflict with the user's usage of $1.
5849 //
5850 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5851 // register for generated code is to automatically clobber $1 for all inline
5852 // assembly code.
5853 //
5854 // FIXME: We should automatically clobber $1 only for inline assembly code
5855 // which actually uses it. This would allow LLVM to use $1 for inline
5856 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005857 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005858 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005859
Craig Topper3164f332014-03-11 03:39:26 +00005860 bool handleTargetFeatures(std::vector<std::string> &Features,
5861 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005862 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005863 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005864 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005865 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005866 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005867 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005868 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005869
5870 for (std::vector<std::string>::iterator it = Features.begin(),
5871 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005872 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005873 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005874 else if (*it == "+soft-float")
5875 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005876 else if (*it == "+mips16")
5877 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005878 else if (*it == "+micromips")
5879 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005880 else if (*it == "+dsp")
5881 DspRev = std::max(DspRev, DSP1);
5882 else if (*it == "+dspr2")
5883 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005884 else if (*it == "+msa")
5885 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005886 else if (*it == "+fp64")
5887 HasFP64 = true;
5888 else if (*it == "-fp64")
5889 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005890 else if (*it == "+nan2008")
5891 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005892 else if (*it == "-nan2008")
5893 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005894 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005895
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005896 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005897 std::vector<std::string>::iterator it =
5898 std::find(Features.begin(), Features.end(), "+soft-float");
5899 if (it != Features.end())
5900 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005901
Akira Hatanaka9064e362013-10-29 18:30:33 +00005902 setDescriptionString();
5903
Rafael Espindolaeb265472013-08-21 21:59:03 +00005904 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005905 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005906
Craig Topper3164f332014-03-11 03:39:26 +00005907 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005908 if (RegNo == 0) return 4;
5909 if (RegNo == 1) return 5;
5910 return -1;
5911 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005912
5913 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005914};
5915
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005916const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5917#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5918#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5919 ALL_LANGUAGES },
5920#include "clang/Basic/BuiltinsMips.def"
5921};
5922
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005923class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005924public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005925 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005926 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005927 SizeType = UnsignedInt;
5928 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00005929 Int64Type = SignedLongLong;
5930 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005931 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005932 }
Craig Topper3164f332014-03-11 03:39:26 +00005933 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005934 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005935 ABI = Name;
5936 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005937 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005938 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005939 }
Craig Topper3164f332014-03-11 03:39:26 +00005940 void getTargetDefines(const LangOptions &Opts,
5941 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005942 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005943
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005944 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005945 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5946
5947 const std::string& CPUStr = getCPU();
5948 if (CPUStr == "mips32")
5949 Builder.defineMacro("__mips_isa_rev", "1");
5950 else if (CPUStr == "mips32r2")
5951 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00005952 else if (CPUStr == "mips32r6")
5953 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005954
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005955 if (ABI == "o32") {
5956 Builder.defineMacro("__mips_o32");
5957 Builder.defineMacro("_ABIO32", "1");
5958 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5959 }
5960 else if (ABI == "eabi")
5961 Builder.defineMacro("__mips_eabi");
5962 else
David Blaikie83d382b2011-09-23 05:06:16 +00005963 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005964 }
Craig Topper3164f332014-03-11 03:39:26 +00005965 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5966 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005967 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5968 { { "at" }, "$1" },
5969 { { "v0" }, "$2" },
5970 { { "v1" }, "$3" },
5971 { { "a0" }, "$4" },
5972 { { "a1" }, "$5" },
5973 { { "a2" }, "$6" },
5974 { { "a3" }, "$7" },
5975 { { "t0" }, "$8" },
5976 { { "t1" }, "$9" },
5977 { { "t2" }, "$10" },
5978 { { "t3" }, "$11" },
5979 { { "t4" }, "$12" },
5980 { { "t5" }, "$13" },
5981 { { "t6" }, "$14" },
5982 { { "t7" }, "$15" },
5983 { { "s0" }, "$16" },
5984 { { "s1" }, "$17" },
5985 { { "s2" }, "$18" },
5986 { { "s3" }, "$19" },
5987 { { "s4" }, "$20" },
5988 { { "s5" }, "$21" },
5989 { { "s6" }, "$22" },
5990 { { "s7" }, "$23" },
5991 { { "t8" }, "$24" },
5992 { { "t9" }, "$25" },
5993 { { "k0" }, "$26" },
5994 { { "k1" }, "$27" },
5995 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005996 { { "sp","$sp" }, "$29" },
5997 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005998 { { "ra" }, "$31" }
5999 };
6000 Aliases = GCCRegAliases;
6001 NumAliases = llvm::array_lengthof(GCCRegAliases);
6002 }
6003};
6004
6005class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006006 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006007 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006008 }
6009
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006010public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006011 Mips32EBTargetInfo(const llvm::Triple &Triple)
6012 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006013 }
Craig Topper3164f332014-03-11 03:39:26 +00006014 void getTargetDefines(const LangOptions &Opts,
6015 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006016 DefineStd(Builder, "MIPSEB", Opts);
6017 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006018 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006019 }
6020};
6021
6022class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006023 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006024 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006025 }
6026
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006027public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006028 Mips32ELTargetInfo(const llvm::Triple &Triple)
6029 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006030 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006031 }
Craig Topper3164f332014-03-11 03:39:26 +00006032 void getTargetDefines(const LangOptions &Opts,
6033 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006034 DefineStd(Builder, "MIPSEL", Opts);
6035 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006036 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006037 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006038};
Akira Hatanakabef17452011-09-20 19:21:49 +00006039
6040class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006041public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006042 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006043 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006044 LongDoubleWidth = LongDoubleAlign = 128;
6045 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006046 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6047 LongDoubleWidth = LongDoubleAlign = 64;
6048 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6049 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006050 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006051 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006052 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006053 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006054
6055 void setN64ABITypes() {
6056 LongWidth = LongAlign = 64;
6057 PointerWidth = PointerAlign = 64;
6058 SizeType = UnsignedLong;
6059 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006060 Int64Type = SignedLong;
6061 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006062 }
6063
6064 void setN32ABITypes() {
6065 LongWidth = LongAlign = 32;
6066 PointerWidth = PointerAlign = 32;
6067 SizeType = UnsignedInt;
6068 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006069 Int64Type = SignedLongLong;
6070 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006071 }
6072
Craig Topper3164f332014-03-11 03:39:26 +00006073 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006074 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006075 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006076 ABI = Name;
6077 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006078 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006079 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006080 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006081 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006082 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006083 }
6084 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006085 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006086
Craig Topper3164f332014-03-11 03:39:26 +00006087 void getTargetDefines(const LangOptions &Opts,
6088 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006089 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006090
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006091 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006092 Builder.defineMacro("__mips64");
6093 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006094 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6095
6096 const std::string& CPUStr = getCPU();
6097 if (CPUStr == "mips64")
6098 Builder.defineMacro("__mips_isa_rev", "1");
6099 else if (CPUStr == "mips64r2")
6100 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006101 else if (CPUStr == "mips64r6")
6102 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006103
Akira Hatanakabef17452011-09-20 19:21:49 +00006104 if (ABI == "n32") {
6105 Builder.defineMacro("__mips_n32");
6106 Builder.defineMacro("_ABIN32", "2");
6107 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6108 }
6109 else if (ABI == "n64") {
6110 Builder.defineMacro("__mips_n64");
6111 Builder.defineMacro("_ABI64", "3");
6112 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6113 }
6114 else
David Blaikie83d382b2011-09-23 05:06:16 +00006115 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006116 }
Craig Topper3164f332014-03-11 03:39:26 +00006117 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6118 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006119 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6120 { { "at" }, "$1" },
6121 { { "v0" }, "$2" },
6122 { { "v1" }, "$3" },
6123 { { "a0" }, "$4" },
6124 { { "a1" }, "$5" },
6125 { { "a2" }, "$6" },
6126 { { "a3" }, "$7" },
6127 { { "a4" }, "$8" },
6128 { { "a5" }, "$9" },
6129 { { "a6" }, "$10" },
6130 { { "a7" }, "$11" },
6131 { { "t0" }, "$12" },
6132 { { "t1" }, "$13" },
6133 { { "t2" }, "$14" },
6134 { { "t3" }, "$15" },
6135 { { "s0" }, "$16" },
6136 { { "s1" }, "$17" },
6137 { { "s2" }, "$18" },
6138 { { "s3" }, "$19" },
6139 { { "s4" }, "$20" },
6140 { { "s5" }, "$21" },
6141 { { "s6" }, "$22" },
6142 { { "s7" }, "$23" },
6143 { { "t8" }, "$24" },
6144 { { "t9" }, "$25" },
6145 { { "k0" }, "$26" },
6146 { { "k1" }, "$27" },
6147 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006148 { { "sp","$sp" }, "$29" },
6149 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006150 { { "ra" }, "$31" }
6151 };
6152 Aliases = GCCRegAliases;
6153 NumAliases = llvm::array_lengthof(GCCRegAliases);
6154 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006155
6156 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006157};
6158
6159class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006160 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006161 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006162 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 +00006163 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006164 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006165
Akira Hatanakabef17452011-09-20 19:21:49 +00006166 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006167
Akira Hatanakabef17452011-09-20 19:21:49 +00006168public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006169 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006170 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006171 void getTargetDefines(const LangOptions &Opts,
6172 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006173 DefineStd(Builder, "MIPSEB", Opts);
6174 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006175 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006176 }
6177};
6178
6179class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006180 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006181 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006182 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 +00006183 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006184 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006185 }
6186public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006187 Mips64ELTargetInfo(const llvm::Triple &Triple)
6188 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006189 // Default ABI is n64.
6190 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006191 }
Craig Topper3164f332014-03-11 03:39:26 +00006192 void getTargetDefines(const LangOptions &Opts,
6193 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006194 DefineStd(Builder, "MIPSEL", Opts);
6195 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006196 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006197 }
6198};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006199} // end anonymous namespace.
6200
Ivan Krasindd7403e2011-08-24 20:22:22 +00006201namespace {
6202class PNaClTargetInfo : public TargetInfo {
6203public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006204 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006205 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006206 this->UserLabelPrefix = "";
6207 this->LongAlign = 32;
6208 this->LongWidth = 32;
6209 this->PointerAlign = 32;
6210 this->PointerWidth = 32;
6211 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006212 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006213 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006214 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006215 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006216 this->SizeType = TargetInfo::UnsignedInt;
6217 this->PtrDiffType = TargetInfo::SignedInt;
6218 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006219 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006220 }
6221
Craig Topper3164f332014-03-11 03:39:26 +00006222 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006223 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006224 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006225 Builder.defineMacro("__le32__");
6226 Builder.defineMacro("__pnacl__");
6227 }
Craig Topper3164f332014-03-11 03:39:26 +00006228 void getTargetDefines(const LangOptions &Opts,
6229 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006230 getArchDefines(Opts, Builder);
6231 }
Craig Topper3164f332014-03-11 03:39:26 +00006232 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006233 return Feature == "pnacl";
6234 }
Craig Topper3164f332014-03-11 03:39:26 +00006235 void getTargetBuiltins(const Builtin::Info *&Records,
6236 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006237 }
Craig Topper3164f332014-03-11 03:39:26 +00006238 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006239 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006240 }
Craig Topper3164f332014-03-11 03:39:26 +00006241 void getGCCRegNames(const char * const *&Names,
6242 unsigned &NumNames) const override;
6243 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6244 unsigned &NumAliases) const override;
6245 bool validateAsmConstraint(const char *&Name,
6246 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006247 return false;
6248 }
6249
Craig Topper3164f332014-03-11 03:39:26 +00006250 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006251 return "";
6252 }
6253};
6254
6255void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6256 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006257 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006258 NumNames = 0;
6259}
6260
6261void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6262 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006263 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006264 NumAliases = 0;
6265}
6266} // end anonymous namespace.
6267
Guy Benyeib798fc92012-12-11 21:38:14 +00006268namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006269class Le64TargetInfo : public TargetInfo {
6270 static const Builtin::Info BuiltinInfo[];
6271
6272public:
6273 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6274 BigEndian = false;
6275 NoAsmVariants = true;
6276 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6277 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6278 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006279 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006280 }
6281
6282 void getTargetDefines(const LangOptions &Opts,
6283 MacroBuilder &Builder) const override {
6284 DefineStd(Builder, "unix", Opts);
6285 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6286 Builder.defineMacro("__ELF__");
6287 }
6288 void getTargetBuiltins(const Builtin::Info *&Records,
6289 unsigned &NumRecords) const override {
6290 Records = BuiltinInfo;
6291 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6292 }
6293 BuiltinVaListKind getBuiltinVaListKind() const override {
6294 return TargetInfo::PNaClABIBuiltinVaList;
6295 }
6296 const char *getClobbers() const override { return ""; }
6297 void getGCCRegNames(const char *const *&Names,
6298 unsigned &NumNames) const override {
6299 Names = nullptr;
6300 NumNames = 0;
6301 }
6302 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6303 unsigned &NumAliases) const override {
6304 Aliases = nullptr;
6305 NumAliases = 0;
6306 }
6307 bool validateAsmConstraint(const char *&Name,
6308 TargetInfo::ConstraintInfo &Info) const override {
6309 return false;
6310 }
6311
6312 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006313};
6314} // end anonymous namespace.
6315
6316const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6317#define BUILTIN(ID, TYPE, ATTRS) \
6318 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6319#include "clang/Basic/BuiltinsLe64.def"
6320};
6321
6322namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006323 static const unsigned SPIRAddrSpaceMap[] = {
6324 1, // opencl_global
6325 3, // opencl_local
6326 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006327 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006328 0, // cuda_device
6329 0, // cuda_constant
6330 0 // cuda_shared
6331 };
6332 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006333 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006334 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006335 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6336 "SPIR target must use unknown OS");
6337 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6338 "SPIR target must use unknown environment type");
6339 BigEndian = false;
6340 TLSSupported = false;
6341 LongWidth = LongAlign = 64;
6342 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006343 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006344 // Define available target features
6345 // These must be defined in sorted order!
6346 NoAsmVariants = true;
6347 }
Craig Topper3164f332014-03-11 03:39:26 +00006348 void getTargetDefines(const LangOptions &Opts,
6349 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006350 DefineStd(Builder, "SPIR", Opts);
6351 }
Craig Topper3164f332014-03-11 03:39:26 +00006352 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006353 return Feature == "spir";
6354 }
Craig Topper3164f332014-03-11 03:39:26 +00006355
6356 void getTargetBuiltins(const Builtin::Info *&Records,
6357 unsigned &NumRecords) const override {}
6358 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006359 return "";
6360 }
Craig Topper3164f332014-03-11 03:39:26 +00006361 void getGCCRegNames(const char * const *&Names,
6362 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006363 bool
6364 validateAsmConstraint(const char *&Name,
6365 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006366 return true;
6367 }
Craig Topper3164f332014-03-11 03:39:26 +00006368 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6369 unsigned &NumAliases) const override {}
6370 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006371 return TargetInfo::VoidPtrBuiltinVaList;
6372 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006373
6374 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6375 return (CC == CC_SpirFunction ||
6376 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6377 }
6378
6379 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6380 return CC_SpirFunction;
6381 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006382 };
6383
6384
6385 class SPIR32TargetInfo : public SPIRTargetInfo {
6386 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006387 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006388 PointerWidth = PointerAlign = 32;
6389 SizeType = TargetInfo::UnsignedInt;
6390 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6391 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006392 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6393 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006394 }
Craig Topper3164f332014-03-11 03:39:26 +00006395 void getTargetDefines(const LangOptions &Opts,
6396 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006397 DefineStd(Builder, "SPIR32", Opts);
6398 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006399 };
6400
6401 class SPIR64TargetInfo : public SPIRTargetInfo {
6402 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006403 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006404 PointerWidth = PointerAlign = 64;
6405 SizeType = TargetInfo::UnsignedLong;
6406 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006407 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6408 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006409 }
Craig Topper3164f332014-03-11 03:39:26 +00006410 void getTargetDefines(const LangOptions &Opts,
6411 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006412 DefineStd(Builder, "SPIR64", Opts);
6413 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006414 };
6415}
6416
Robert Lytton0e076492013-08-13 09:43:10 +00006417namespace {
6418class XCoreTargetInfo : public TargetInfo {
6419 static const Builtin::Info BuiltinInfo[];
6420public:
6421 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6422 BigEndian = false;
6423 NoAsmVariants = true;
6424 LongLongAlign = 32;
6425 SuitableAlign = 32;
6426 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006427 SizeType = UnsignedInt;
6428 PtrDiffType = SignedInt;
6429 IntPtrType = SignedInt;
6430 WCharType = UnsignedChar;
6431 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006432 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006433 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 +00006434 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006435 }
Craig Topper3164f332014-03-11 03:39:26 +00006436 void getTargetDefines(const LangOptions &Opts,
6437 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006438 Builder.defineMacro("__XS1B__");
6439 }
Craig Topper3164f332014-03-11 03:39:26 +00006440 void getTargetBuiltins(const Builtin::Info *&Records,
6441 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006442 Records = BuiltinInfo;
6443 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6444 }
Craig Topper3164f332014-03-11 03:39:26 +00006445 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006446 return TargetInfo::VoidPtrBuiltinVaList;
6447 }
Craig Topper3164f332014-03-11 03:39:26 +00006448 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006449 return "";
6450 }
Craig Topper3164f332014-03-11 03:39:26 +00006451 void getGCCRegNames(const char * const *&Names,
6452 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006453 static const char * const GCCRegNames[] = {
6454 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6455 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6456 };
6457 Names = GCCRegNames;
6458 NumNames = llvm::array_lengthof(GCCRegNames);
6459 }
Craig Topper3164f332014-03-11 03:39:26 +00006460 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6461 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006462 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006463 NumAliases = 0;
6464 }
Craig Topper3164f332014-03-11 03:39:26 +00006465 bool validateAsmConstraint(const char *&Name,
6466 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006467 return false;
6468 }
Craig Topper3164f332014-03-11 03:39:26 +00006469 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006470 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6471 return (RegNo < 2)? RegNo : -1;
6472 }
Robert Lytton0e076492013-08-13 09:43:10 +00006473};
6474
6475const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6476#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6477#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6478 ALL_LANGUAGES },
6479#include "clang/Basic/BuiltinsXCore.def"
6480};
6481} // end anonymous namespace.
6482
Ivan Krasindd7403e2011-08-24 20:22:22 +00006483
Chris Lattner5ba61f02006-10-14 07:39:34 +00006484//===----------------------------------------------------------------------===//
6485// Driver code
6486//===----------------------------------------------------------------------===//
6487
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006488static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006489 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006490
Daniel Dunbar52322032009-08-18 05:47:58 +00006491 switch (Triple.getArch()) {
6492 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006493 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006494
Tim Northover2a0783d2014-05-30 14:14:07 +00006495 case llvm::Triple::xcore:
6496 return new XCoreTargetInfo(Triple);
6497
6498 case llvm::Triple::hexagon:
6499 return new HexagonTargetInfo(Triple);
6500
6501 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006502 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006503 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006504
6505 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006506 case llvm::Triple::FreeBSD:
6507 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006508 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006509 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006510 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006511 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006512 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006513 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006514 }
6515
Christian Pirker9b019ae2014-02-25 13:51:00 +00006516 case llvm::Triple::aarch64_be:
6517 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006518 case llvm::Triple::FreeBSD:
6519 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006520 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006521 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006522 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006523 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006524 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006525 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006526 }
6527
Daniel Dunbar52322032009-08-18 05:47:58 +00006528 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006529 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006530 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006531 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006532
Daniel Dunbar52322032009-08-18 05:47:58 +00006533 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006534 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006535 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006536 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006537 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006538 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006539 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006540 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006541 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006542 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006543 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006544 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006545 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006546 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006547 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006548 case llvm::Triple::Win32:
6549 switch (Triple.getEnvironment()) {
6550 default:
6551 return new ARMleTargetInfo(Triple);
6552 case llvm::Triple::Itanium:
6553 return new ItaniumWindowsARMleTargetInfo(Triple);
6554 case llvm::Triple::MSVC:
6555 return new MicrosoftARMleTargetInfo(Triple);
6556 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006557 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006558 return new ARMleTargetInfo(Triple);
6559 }
6560
6561 case llvm::Triple::armeb:
6562 case llvm::Triple::thumbeb:
6563 if (Triple.isOSDarwin())
6564 return new DarwinARMTargetInfo(Triple);
6565
6566 switch (os) {
6567 case llvm::Triple::Linux:
6568 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6569 case llvm::Triple::FreeBSD:
6570 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6571 case llvm::Triple::NetBSD:
6572 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6573 case llvm::Triple::OpenBSD:
6574 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6575 case llvm::Triple::Bitrig:
6576 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6577 case llvm::Triple::RTEMS:
6578 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6579 case llvm::Triple::NaCl:
6580 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6581 default:
6582 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006583 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006584
Daniel Dunbar52322032009-08-18 05:47:58 +00006585 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006586 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006587
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006588 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006589 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006590 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006591 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006592 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006593 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006594 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006595 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006596 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006597 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006598 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006599 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006600 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006601
6602 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006603 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006604 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006605 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006606 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006607 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006608 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006609 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006610 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006611 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006612 case llvm::Triple::NaCl:
6613 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006614 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006615 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006616 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006617
Akira Hatanakabef17452011-09-20 19:21:49 +00006618 case llvm::Triple::mips64:
6619 switch (os) {
6620 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006621 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006622 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006623 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006624 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006625 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006626 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006627 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006628 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006629 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006630 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006631 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006632 }
6633
6634 case llvm::Triple::mips64el:
6635 switch (os) {
6636 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006637 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006638 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006639 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006640 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006641 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006642 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006643 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006644 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006645 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006646 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006647 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006648 }
6649
Ivan Krasindd7403e2011-08-24 20:22:22 +00006650 case llvm::Triple::le32:
6651 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006652 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006653 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006654 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006655 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006656 }
6657
JF Bastien643817d2014-09-12 17:52:47 +00006658 case llvm::Triple::le64:
6659 return new Le64TargetInfo(Triple);
6660
Daniel Dunbar52322032009-08-18 05:47:58 +00006661 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006662 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006663 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006664 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006665 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006666 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006667 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006668 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006669 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006670 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006671 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006672 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006673 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006674 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006675 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006676 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006677 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006678
6679 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006680 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006681 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006682 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006683 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006684 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006685 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006686 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006687 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006688 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006689 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006690 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006691 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006692 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006693 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006694
Bill Schmidt778d3872013-07-26 01:36:11 +00006695 case llvm::Triple::ppc64le:
6696 switch (os) {
6697 case llvm::Triple::Linux:
6698 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6699 default:
6700 return new PPC64TargetInfo(Triple);
6701 }
6702
Peter Collingbournec947aae2012-05-20 23:28:41 +00006703 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006704 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006705 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006706 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006707
Tom Stellardd8e38a32015-01-06 20:34:47 +00006708 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006709 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006710 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006711
Daniel Dunbar52322032009-08-18 05:47:58 +00006712 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006713 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006714 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006715 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006716 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006717 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006718 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006719 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006720 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006721 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006722 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006723 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006724 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006725 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006726 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006727
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006728 case llvm::Triple::sparcv9:
6729 switch (os) {
6730 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006731 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006732 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006733 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006734 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006735 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006736 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006737 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006738 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006739 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006740 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006741 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006742 }
6743
Ulrich Weigand47445072013-05-06 16:26:41 +00006744 case llvm::Triple::systemz:
6745 switch (os) {
6746 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006747 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006748 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006749 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006750 }
6751
Eli Friedmana9c3d712009-08-19 20:47:07 +00006752 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006753 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006754
Daniel Dunbar52322032009-08-18 05:47:58 +00006755 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006756 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006757 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006758
Daniel Dunbar52322032009-08-18 05:47:58 +00006759 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006760 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006761 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006762 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006763 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006764 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006765 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006766 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006767 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006768 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006769 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006770 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006771 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006772 case llvm::Triple::KFreeBSD:
6773 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006774 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006775 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006776 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006777 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006778 case llvm::Triple::Win32: {
6779 switch (Triple.getEnvironment()) {
6780 default:
6781 return new X86_32TargetInfo(Triple);
6782 case llvm::Triple::Cygnus:
6783 return new CygwinX86_32TargetInfo(Triple);
6784 case llvm::Triple::GNU:
6785 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006786 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006787 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006788 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006789 }
6790 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006791 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006792 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006793 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006794 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006795 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006796 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006797 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006798 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006799 }
6800
6801 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006802 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006803 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006804
Daniel Dunbar52322032009-08-18 05:47:58 +00006805 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006806 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006807 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006808 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006809 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006810 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006811 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006812 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006813 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006814 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006815 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006816 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006817 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006818 case llvm::Triple::KFreeBSD:
6819 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006820 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006821 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006822 case llvm::Triple::Win32: {
6823 switch (Triple.getEnvironment()) {
6824 default:
6825 return new X86_64TargetInfo(Triple);
6826 case llvm::Triple::GNU:
6827 return new MinGWX86_64TargetInfo(Triple);
6828 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006829 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006830 }
6831 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006832 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006833 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006834 case llvm::Triple::PS4:
6835 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006836 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006837 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006838 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006839
6840 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006841 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006842 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006843 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006844 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006845 }
6846 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006847 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006848 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006849 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006850 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006851 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006852 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006853}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006854
6855/// CreateTargetInfo - Return the target info object for the specified target
6856/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006857TargetInfo *
6858TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6859 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006860 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006861
6862 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006863 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006864 if (!Target) {
6865 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006866 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006867 }
Alp Toker80758082014-07-06 05:26:44 +00006868 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006869
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006870 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006871 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6872 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006873 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006874 }
6875
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006876 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006877 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6878 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006879 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006880 }
6881
Rafael Espindolaeb265472013-08-21 21:59:03 +00006882 // Set the fp math unit.
6883 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6884 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006885 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006886 }
6887
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006888 // Compute the default target features, we need the target to handle this
6889 // because features may have dependencies on one another.
6890 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006891 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006892
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006893 // Apply the user specified deltas.
6894 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6895 I < N; ++I) {
6896 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006897 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006898 bool Enabled = Name[0] == '+';
6899 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006900 }
6901
6902 // Add the features to the compile options.
6903 //
6904 // FIXME: If we are completely confident that we have the right set, we only
6905 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006906 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006907 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6908 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006909 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006910 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006911 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006912
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006913 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006914}