blob: 2030e38c0435ccdc986b00e53695a88e61acdb1b [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000033using namespace clang;
34
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000036// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
38
Chris Lattner1e1c0b92009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000049 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000050
Chris Lattner1e1c0b92009-03-20 16:06:38 +000051 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056}
57
Benjamin Kramere3b442d2012-01-10 11:50:09 +000058static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
Chris Lattner09d98f52008-10-05 21:50:58 +000066//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000069
Torok Edwinb2b37c62009-06-30 17:10:35 +000070namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000071template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000073protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000074 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000075 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000077 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000078 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000082 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000083
84};
Chris Lattner859c37a2009-08-12 06:24:27 +000085} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000086
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Daniel Dunbard86666f2010-01-26 01:44:04 +000088static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000089 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000090 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000091 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000092 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000097 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000099
John McCall5d36a8c2011-06-16 00:03:19 +0000100 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000103
John McCall31168b02011-06-15 23:02:42 +0000104 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000105 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000109
John McCall31168b02011-06-15 23:02:42 +0000110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000114 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000115
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000118 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000120
121 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000122 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123
Daniel Dunbarecf13562011-04-19 21:40:34 +0000124 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000125 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000132 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000133
Sebastian Pop422377c2012-01-20 22:01:23 +0000134 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000135 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
Evan Cheng31dd9a62014-01-26 23:12:43 +0000142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000178 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000179
Tim Northover157d9112014-01-16 08:48:16 +0000180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
Daniel Dunbarecf13562011-04-19 21:40:34 +0000184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000185}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000186
Chris Lattner30ba6742009-08-10 19:03:04 +0000187namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
Craig Topper3164f332014-03-11 03:39:26 +0000191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000194 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195 }
Mike Stump11289f42009-09-09 15:08:12 +0000196
Torok Edwinb2b37c62009-06-30 17:10:35 +0000197public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000198 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
199 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
200 this->MCountName = "\01mcount";
201 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000202
Craig Topper3164f332014-03-11 03:39:26 +0000203 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000204 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000205 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000206 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000207 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000208 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000209 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000210 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000211
Craig Topper3164f332014-03-11 03:39:26 +0000212 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000213 // FIXME: We should return 0 when building kexts.
214 return "__TEXT,__StaticInit,regular,pure_instructions";
215 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000216
John McCalleed64c72012-01-29 01:20:30 +0000217 /// Darwin does not support protected visibility. Darwin's "default"
218 /// is very similar to ELF's "protected"; Darwin requires a "weak"
219 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000220 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000221 return false;
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223};
224
Chris Lattner30ba6742009-08-10 19:03:04 +0000225
Torok Edwinb2b37c62009-06-30 17:10:35 +0000226// DragonFlyBSD Target
227template<typename Target>
228class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
229protected:
Craig Topper3164f332014-03-11 03:39:26 +0000230 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
231 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000232 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000233 Builder.defineMacro("__DragonFly__");
234 Builder.defineMacro("__DragonFly_cc_version", "100001");
235 Builder.defineMacro("__ELF__");
236 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
237 Builder.defineMacro("__tune_i386__");
238 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000239 }
240public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000241 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
242 : OSTargetInfo<Target>(Triple) {
243 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000244
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000245 switch (Triple.getArch()) {
246 default:
247 case llvm::Triple::x86:
248 case llvm::Triple::x86_64:
249 this->MCountName = ".mcount";
250 break;
251 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253};
254
255// FreeBSD Target
256template<typename Target>
257class FreeBSDTargetInfo : public OSTargetInfo<Target> {
258protected:
Craig Topper3164f332014-03-11 03:39:26 +0000259 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
260 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000261 // FreeBSD defines; list based off of gcc output
262
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000263 unsigned Release = Triple.getOSMajorVersion();
264 if (Release == 0U)
265 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000267 Builder.defineMacro("__FreeBSD__", Twine(Release));
268 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000269 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
270 DefineStd(Builder, "unix", Opts);
271 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000272
273 // On FreeBSD, wchar_t contains the number of the code point as
274 // used by the character set of the locale. These character sets are
275 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000276 //
277 // FIXME: This is wrong; the macro refers to the numerical values
278 // of wchar_t *literals*, which are not locale-dependent. However,
279 // FreeBSD systems apparently depend on us getting this wrong, and
280 // setting this to 1 is conforming even if all the basic source
281 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000282 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000283 }
284public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000285 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
286 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000287
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000288 switch (Triple.getArch()) {
289 default:
290 case llvm::Triple::x86:
291 case llvm::Triple::x86_64:
292 this->MCountName = ".mcount";
293 break;
294 case llvm::Triple::mips:
295 case llvm::Triple::mipsel:
296 case llvm::Triple::ppc:
297 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000298 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000299 this->MCountName = "_mcount";
300 break;
301 case llvm::Triple::arm:
302 this->MCountName = "__mcount";
303 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000304 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000305 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306};
307
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000308// GNU/kFreeBSD Target
309template<typename Target>
310class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
311protected:
Craig Topper3164f332014-03-11 03:39:26 +0000312 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
313 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000314 // GNU/kFreeBSD defines; list based off of gcc output
315
316 DefineStd(Builder, "unix", Opts);
317 Builder.defineMacro("__FreeBSD_kernel__");
318 Builder.defineMacro("__GLIBC__");
319 Builder.defineMacro("__ELF__");
320 if (Opts.POSIXThreads)
321 Builder.defineMacro("_REENTRANT");
322 if (Opts.CPlusPlus)
323 Builder.defineMacro("_GNU_SOURCE");
324 }
325public:
Eric Christopher917e9522014-11-18 22:36:15 +0000326 KFreeBSDTargetInfo(const llvm::Triple &Triple)
327 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000328 this->UserLabelPrefix = "";
329 }
330};
331
Chris Lattner3e2ee142010-07-07 16:01:42 +0000332// Minix Target
333template<typename Target>
334class MinixTargetInfo : public OSTargetInfo<Target> {
335protected:
Craig Topper3164f332014-03-11 03:39:26 +0000336 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
337 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000338 // Minix defines
339
340 Builder.defineMacro("__minix", "3");
341 Builder.defineMacro("_EM_WSIZE", "4");
342 Builder.defineMacro("_EM_PSIZE", "4");
343 Builder.defineMacro("_EM_SSIZE", "2");
344 Builder.defineMacro("_EM_LSIZE", "4");
345 Builder.defineMacro("_EM_FSIZE", "4");
346 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000347 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000348 DefineStd(Builder, "unix", Opts);
349 }
350public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000351 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
352 this->UserLabelPrefix = "";
353 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000354};
355
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356// Linux target
357template<typename Target>
358class LinuxTargetInfo : public OSTargetInfo<Target> {
359protected:
Craig Topper3164f332014-03-11 03:39:26 +0000360 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
361 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000362 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000363 DefineStd(Builder, "unix", Opts);
364 DefineStd(Builder, "linux", Opts);
365 Builder.defineMacro("__gnu_linux__");
366 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000367 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000368 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000369 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000370 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000371 if (Opts.CPlusPlus)
372 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000373 }
374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000375 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000376 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000377 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000378
379 switch (Triple.getArch()) {
380 default:
381 break;
382 case llvm::Triple::ppc:
383 case llvm::Triple::ppc64:
384 case llvm::Triple::ppc64le:
385 this->MCountName = "_mcount";
386 break;
387 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000388 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000389
Craig Topper3164f332014-03-11 03:39:26 +0000390 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000391 return ".text.startup";
392 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000393};
394
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000395// NetBSD Target
396template<typename Target>
397class NetBSDTargetInfo : public OSTargetInfo<Target> {
398protected:
Craig Topper3164f332014-03-11 03:39:26 +0000399 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
400 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000401 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000402 Builder.defineMacro("__NetBSD__");
403 Builder.defineMacro("__unix__");
404 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000405 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000406 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000407
408 switch (Triple.getArch()) {
409 default:
410 break;
411 case llvm::Triple::arm:
412 case llvm::Triple::armeb:
413 case llvm::Triple::thumb:
414 case llvm::Triple::thumbeb:
415 Builder.defineMacro("__ARM_DWARF_EH__");
416 break;
417 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000418 }
419public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000420 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
421 this->UserLabelPrefix = "";
422 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000423};
424
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425// OpenBSD Target
426template<typename Target>
427class OpenBSDTargetInfo : public OSTargetInfo<Target> {
428protected:
Craig Topper3164f332014-03-11 03:39:26 +0000429 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
430 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431 // OpenBSD defines; list based off of gcc output
432
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000433 Builder.defineMacro("__OpenBSD__");
434 DefineStd(Builder, "unix", Opts);
435 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000436 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000437 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438 }
439public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000440 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
441 this->UserLabelPrefix = "";
442 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000443
Eli Friedman3715d1f2011-12-15 02:15:56 +0000444 switch (Triple.getArch()) {
445 default:
446 case llvm::Triple::x86:
447 case llvm::Triple::x86_64:
448 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000449 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000450 this->MCountName = "__mcount";
451 break;
452 case llvm::Triple::mips64:
453 case llvm::Triple::mips64el:
454 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000455 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000456 this->MCountName = "_mcount";
457 break;
458 }
459 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000460};
461
Eli Friedman9fa28852012-08-08 23:57:20 +0000462// Bitrig Target
463template<typename Target>
464class BitrigTargetInfo : public OSTargetInfo<Target> {
465protected:
Craig Topper3164f332014-03-11 03:39:26 +0000466 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
467 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000468 // Bitrig defines; list based off of gcc output
469
470 Builder.defineMacro("__Bitrig__");
471 DefineStd(Builder, "unix", Opts);
472 Builder.defineMacro("__ELF__");
473 if (Opts.POSIXThreads)
474 Builder.defineMacro("_REENTRANT");
475 }
476public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000477 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
478 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000479 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000480 }
481};
482
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000483// PSP Target
484template<typename Target>
485class PSPTargetInfo : public OSTargetInfo<Target> {
486protected:
Craig Topper3164f332014-03-11 03:39:26 +0000487 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
488 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000489 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000490 Builder.defineMacro("PSP");
491 Builder.defineMacro("_PSP");
492 Builder.defineMacro("__psp__");
493 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000494 }
495public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000496 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000497 this->UserLabelPrefix = "";
498 }
499};
500
John Thompsone467e192009-11-19 17:18:50 +0000501// PS3 PPU Target
502template<typename Target>
503class PS3PPUTargetInfo : public OSTargetInfo<Target> {
504protected:
Craig Topper3164f332014-03-11 03:39:26 +0000505 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
506 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000507 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000508 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__PPU__");
510 Builder.defineMacro("__CELLOS_LV2__");
511 Builder.defineMacro("__ELF__");
512 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000513 Builder.defineMacro("_ARCH_PPC64");
514 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000515 }
516public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000518 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000519 this->LongWidth = this->LongAlign = 32;
520 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000521 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000522 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000523 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000524 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000525 }
526};
527
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000528template <typename Target>
529class PS4OSTargetInfo : public OSTargetInfo<Target> {
530protected:
531 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
532 MacroBuilder &Builder) const override {
533 Builder.defineMacro("__FreeBSD__", "9");
534 Builder.defineMacro("__FreeBSD_cc_version", "900001");
535 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
536 DefineStd(Builder, "unix", Opts);
537 Builder.defineMacro("__ELF__");
538 Builder.defineMacro("__PS4__");
539 }
540public:
541 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
542 this->WCharType = this->UnsignedShort;
543
544 this->UserLabelPrefix = "";
545
546 switch (Triple.getArch()) {
547 default:
548 case llvm::Triple::x86_64:
549 this->MCountName = ".mcount";
550 break;
551 }
552 }
553};
554
Torok Edwinb2b37c62009-06-30 17:10:35 +0000555// Solaris target
556template<typename Target>
557class SolarisTargetInfo : public OSTargetInfo<Target> {
558protected:
Craig Topper3164f332014-03-11 03:39:26 +0000559 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
560 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000561 DefineStd(Builder, "sun", Opts);
562 DefineStd(Builder, "unix", Opts);
563 Builder.defineMacro("__ELF__");
564 Builder.defineMacro("__svr4__");
565 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000566 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
567 // newer, but to 500 for everything else. feature_test.h has a check to
568 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000569 // with a new version.
570 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000571 Builder.defineMacro("_XOPEN_SOURCE", "600");
572 else
573 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000574 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000575 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000576 Builder.defineMacro("_LARGEFILE_SOURCE");
577 Builder.defineMacro("_LARGEFILE64_SOURCE");
578 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000579 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000580 }
581public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000582 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000583 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000584 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000585 // FIXME: WIntType should be SignedLong
586 }
587};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000588
589// Windows target
590template<typename Target>
591class WindowsTargetInfo : public OSTargetInfo<Target> {
592protected:
Craig Topper3164f332014-03-11 03:39:26 +0000593 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
594 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000595 Builder.defineMacro("_WIN32");
596 }
597 void getVisualStudioDefines(const LangOptions &Opts,
598 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000599 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000600 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000601 Builder.defineMacro("_CPPRTTI");
602
603 if (Opts.Exceptions)
604 Builder.defineMacro("_CPPUNWIND");
605 }
606
607 if (!Opts.CharIsSigned)
608 Builder.defineMacro("_CHAR_UNSIGNED");
609
610 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
611 // but it works for now.
612 if (Opts.POSIXThreads)
613 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000614
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000615 if (Opts.MSCompatibilityVersion) {
616 Builder.defineMacro("_MSC_VER",
617 Twine(Opts.MSCompatibilityVersion / 100000));
618 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000619 // FIXME We cannot encode the revision information into 32-bits
620 Builder.defineMacro("_MSC_BUILD", Twine(1));
621 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000622
623 if (Opts.MicrosoftExt) {
624 Builder.defineMacro("_MSC_EXTENSIONS");
625
626 if (Opts.CPlusPlus11) {
627 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
628 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
629 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
630 }
631 }
632
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000633 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000634 }
635
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000636public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000637 WindowsTargetInfo(const llvm::Triple &Triple)
638 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639};
640
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000641template <typename Target>
642class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000643protected:
Craig Topper3164f332014-03-11 03:39:26 +0000644 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
645 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000646 if (Opts.POSIXThreads)
647 Builder.defineMacro("_REENTRANT");
648 if (Opts.CPlusPlus)
649 Builder.defineMacro("_GNU_SOURCE");
650
651 DefineStd(Builder, "unix", Opts);
652 Builder.defineMacro("__ELF__");
653 Builder.defineMacro("__native_client__");
654 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000655
656public:
657 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000658 this->UserLabelPrefix = "";
659 this->LongAlign = 32;
660 this->LongWidth = 32;
661 this->PointerAlign = 32;
662 this->PointerWidth = 32;
663 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000664 this->Int64Type = TargetInfo::SignedLongLong;
665 this->DoubleAlign = 64;
666 this->LongDoubleWidth = 64;
667 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000668 this->LongLongWidth = 64;
669 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000670 this->SizeType = TargetInfo::UnsignedInt;
671 this->PtrDiffType = TargetInfo::SignedInt;
672 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000673 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000674 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000675 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000676 this->DescriptionString =
677 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000678 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000679 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000680 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000681 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000682 } else if (Triple.getArch() == llvm::Triple::mipsel) {
683 // Handled on mips' setDescriptionString.
684 } else {
685 assert(Triple.getArch() == llvm::Triple::le32);
686 this->DescriptionString = "e-p:32:32-i64:64";
687 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000688 }
Craig Topper3164f332014-03-11 03:39:26 +0000689 typename Target::CallingConvCheckResult checkCallingConvention(
690 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000691 return CC == CC_PnaclCall ? Target::CCCR_OK :
692 Target::checkCallingConvention(CC);
693 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000694};
Mike Stump11289f42009-09-09 15:08:12 +0000695} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000696
Chris Lattner09d98f52008-10-05 21:50:58 +0000697//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000698// Specific target implementations.
699//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000700
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000701namespace {
702// PPC abstract base class
703class PPCTargetInfo : public TargetInfo {
704 static const Builtin::Info BuiltinInfo[];
705 static const char * const GCCRegNames[];
706 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000707 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000708
709 // Target cpu features.
710 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000711 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000712
Ulrich Weigand8afad612014-07-28 13:17:52 +0000713protected:
714 std::string ABI;
715
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000716public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000717 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000718 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000719 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000720 LongDoubleWidth = LongDoubleAlign = 128;
721 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
722 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000723
Hal Finkel6b984f02012-07-03 16:51:04 +0000724 /// \brief Flags for architecture specific defines.
725 typedef enum {
726 ArchDefineNone = 0,
727 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
728 ArchDefinePpcgr = 1 << 1,
729 ArchDefinePpcsq = 1 << 2,
730 ArchDefine440 = 1 << 3,
731 ArchDefine603 = 1 << 4,
732 ArchDefine604 = 1 << 5,
733 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000734 ArchDefinePwr5 = 1 << 7,
735 ArchDefinePwr5x = 1 << 8,
736 ArchDefinePwr6 = 1 << 9,
737 ArchDefinePwr6x = 1 << 10,
738 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000739 ArchDefinePwr8 = 1 << 12,
740 ArchDefineA2 = 1 << 13,
741 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000742 } ArchDefineTypes;
743
Bill Schmidt38378a02013-02-01 20:23:10 +0000744 // Note: GCC recognizes the following additional cpus:
745 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
746 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
747 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000748 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000749 bool CPUKnown = llvm::StringSwitch<bool>(Name)
750 .Case("generic", true)
751 .Case("440", true)
752 .Case("450", true)
753 .Case("601", true)
754 .Case("602", true)
755 .Case("603", true)
756 .Case("603e", true)
757 .Case("603ev", true)
758 .Case("604", true)
759 .Case("604e", true)
760 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000761 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000762 .Case("g3", true)
763 .Case("7400", true)
764 .Case("g4", true)
765 .Case("7450", true)
766 .Case("g4+", true)
767 .Case("750", true)
768 .Case("970", true)
769 .Case("g5", true)
770 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000771 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000772 .Case("e500mc", true)
773 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000774 .Case("power3", true)
775 .Case("pwr3", true)
776 .Case("power4", true)
777 .Case("pwr4", true)
778 .Case("power5", true)
779 .Case("pwr5", true)
780 .Case("power5x", true)
781 .Case("pwr5x", true)
782 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000783 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000784 .Case("power6x", true)
785 .Case("pwr6x", true)
786 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000787 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000788 .Case("power8", true)
789 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000790 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000791 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000792 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000793 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000794 .Case("powerpc64le", true)
795 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000796 .Default(false);
797
798 if (CPUKnown)
799 CPU = Name;
800
801 return CPUKnown;
802 }
803
Ulrich Weigand8afad612014-07-28 13:17:52 +0000804
805 StringRef getABI() const override { return ABI; }
806
Craig Topper3164f332014-03-11 03:39:26 +0000807 void getTargetBuiltins(const Builtin::Info *&Records,
808 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000809 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000810 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000811 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000812
Craig Topper3164f332014-03-11 03:39:26 +0000813 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000814
Craig Topper3164f332014-03-11 03:39:26 +0000815 void getTargetDefines(const LangOptions &Opts,
816 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000817
Craig Topper3164f332014-03-11 03:39:26 +0000818 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000819
Craig Topper3164f332014-03-11 03:39:26 +0000820 bool handleTargetFeatures(std::vector<std::string> &Features,
821 DiagnosticsEngine &Diags) override;
822 bool hasFeature(StringRef Feature) const override;
823
824 void getGCCRegNames(const char * const *&Names,
825 unsigned &NumNames) const override;
826 void getGCCRegAliases(const GCCRegAlias *&Aliases,
827 unsigned &NumAliases) const override;
828 bool validateAsmConstraint(const char *&Name,
829 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000830 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000831 default: return false;
832 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000833 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000834 case 'b': // Base register
835 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000836 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000837 break;
838 // FIXME: The following are added to allow parsing.
839 // I just took a guess at what the actions should be.
840 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000841 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000842 case 'v': // Altivec vector register
843 Info.setAllowsRegister();
844 break;
845 case 'w':
846 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000847 case 'd':// VSX vector register to hold vector double data
848 case 'f':// VSX vector register to hold vector float data
849 case 's':// VSX vector register to hold scalar float data
850 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000851 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000852 break;
853 default:
854 return false;
855 }
856 Info.setAllowsRegister();
857 Name++; // Skip over 'w'.
858 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 case 'h': // `MQ', `CTR', or `LINK' register
860 case 'q': // `MQ' register
861 case 'c': // `CTR' register
862 case 'l': // `LINK' register
863 case 'x': // `CR' register (condition register) number 0
864 case 'y': // `CR' register (condition register)
865 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000866 Info.setAllowsRegister();
867 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000868 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000869 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000870 // (use `L' instead for SImode constants)
871 case 'K': // Unsigned 16-bit constant
872 case 'L': // Signed 16-bit constant shifted left 16 bits
873 case 'M': // Constant larger than 31
874 case 'N': // Exact power of 2
875 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000876 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000877 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000878 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000879 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000880 break;
881 case 'm': // Memory operand. Note that on PowerPC targets, m can
882 // include addresses that update the base register. It
883 // is therefore only safe to use `m' in an asm statement
884 // if that asm statement accesses the operand exactly once.
885 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000886 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000887 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000888 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000889 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000890 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
891 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000892 // register to be updated.
893 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000894 if (Name[1] != 's')
895 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000896 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000897 // include any automodification of the base register. Unlike
898 // `m', this constraint can be used in asm statements that
899 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000900 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000901 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000902 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000903 break;
904 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000905 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000906 case 'Z': // Memory operand that is an indexed or indirect from a
907 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000908 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000909 Info.setAllowsMemory();
910 Info.setAllowsRegister();
911 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000912 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000913 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000914 // register (`p' is preferable for asm statements)
915 case 'S': // Constant suitable as a 64-bit mask operand
916 case 'T': // Constant suitable as a 32-bit mask operand
917 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000918 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000919 // instructions
920 case 'W': // Vector constant that does not require memory
921 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000922 break;
923 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000924 }
John Thompson07a61a42010-06-24 22:44:13 +0000925 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000926 }
Craig Topper3164f332014-03-11 03:39:26 +0000927 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000928 std::string R;
929 switch (*Constraint) {
930 case 'e':
931 case 'w':
932 // Two-character constraint; add "^" hint for later parsing.
933 R = std::string("^") + std::string(Constraint, 2);
934 Constraint++;
935 break;
936 default:
937 return TargetInfo::convertConstraint(Constraint);
938 }
939 return R;
940 }
Craig Topper3164f332014-03-11 03:39:26 +0000941 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000942 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000943 }
Craig Topper3164f332014-03-11 03:39:26 +0000944 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000945 if (RegNo == 0) return 3;
946 if (RegNo == 1) return 4;
947 return -1;
948 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000949};
Anders Carlssonf511f642007-11-27 04:11:28 +0000950
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000951const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000952#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000953#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000954 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000955#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000956};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000957
Eric Christopher917e9522014-11-18 22:36:15 +0000958/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000959/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000960bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000961 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000962 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
963 // Ignore disabled features.
964 if (Features[i][0] == '-')
965 continue;
966
967 StringRef Feature = StringRef(Features[i]).substr(1);
968
969 if (Feature == "vsx") {
970 HasVSX = true;
971 continue;
972 }
973
Bill Schmidt59eb7672014-10-10 15:09:43 +0000974 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000975 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000976 continue;
977 }
978
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000979 // TODO: Finish this list and add an assert that we've handled them
980 // all.
981 }
982
983 return true;
984}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000985
Chris Lattnerecd49032009-03-02 22:27:17 +0000986/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
987/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000988void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000989 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000990 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000991 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000992 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000993 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000994 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000995 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000996 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000997 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000998 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000999 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001000 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001001 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001002
Chris Lattnerecd49032009-03-02 22:27:17 +00001003 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001004 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1005 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001006 } else {
1007 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1008 getTriple().getOS() != llvm::Triple::OpenBSD)
1009 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001010 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001011
Ulrich Weigand8afad612014-07-28 13:17:52 +00001012 // ABI options.
1013 if (ABI == "elfv1")
1014 Builder.defineMacro("_CALL_ELF", "1");
1015 if (ABI == "elfv2")
1016 Builder.defineMacro("_CALL_ELF", "2");
1017
Chris Lattnerecd49032009-03-02 22:27:17 +00001018 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001019 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1020 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001021
Chris Lattnerecd49032009-03-02 22:27:17 +00001022 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001023 if (LongDoubleWidth == 128)
1024 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001025
John Thompsone467e192009-11-19 17:18:50 +00001026 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001027 Builder.defineMacro("__VEC__", "10206");
1028 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001029 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001030
1031 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001032 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1033 .Case("440", ArchDefineName)
1034 .Case("450", ArchDefineName | ArchDefine440)
1035 .Case("601", ArchDefineName)
1036 .Case("602", ArchDefineName | ArchDefinePpcgr)
1037 .Case("603", ArchDefineName | ArchDefinePpcgr)
1038 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1039 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1040 .Case("604", ArchDefineName | ArchDefinePpcgr)
1041 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1042 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001043 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001044 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1045 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1046 .Case("750", ArchDefineName | ArchDefinePpcgr)
1047 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1048 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001049 .Case("a2", ArchDefineA2)
1050 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001051 .Case("pwr3", ArchDefinePpcgr)
1052 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1053 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1054 | ArchDefinePpcsq)
1055 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1056 | ArchDefinePpcgr | ArchDefinePpcsq)
1057 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1058 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1059 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1060 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1061 | ArchDefinePpcsq)
1062 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1063 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001064 | ArchDefinePpcgr | ArchDefinePpcsq)
1065 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1066 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1067 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 .Case("power3", ArchDefinePpcgr)
1069 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1070 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1071 | ArchDefinePpcsq)
1072 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1073 | ArchDefinePpcgr | ArchDefinePpcsq)
1074 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1075 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1076 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1077 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1078 | ArchDefinePpcsq)
1079 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1080 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001081 | ArchDefinePpcgr | ArchDefinePpcsq)
1082 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1083 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1084 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001085 .Default(ArchDefineNone);
1086
1087 if (defs & ArchDefineName)
1088 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1089 if (defs & ArchDefinePpcgr)
1090 Builder.defineMacro("_ARCH_PPCGR");
1091 if (defs & ArchDefinePpcsq)
1092 Builder.defineMacro("_ARCH_PPCSQ");
1093 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001094 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001095 if (defs & ArchDefine603)
1096 Builder.defineMacro("_ARCH_603");
1097 if (defs & ArchDefine604)
1098 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001099 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001100 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001101 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001102 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001103 if (defs & ArchDefinePwr5x)
1104 Builder.defineMacro("_ARCH_PWR5X");
1105 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001106 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001107 if (defs & ArchDefinePwr6x)
1108 Builder.defineMacro("_ARCH_PWR6X");
1109 if (defs & ArchDefinePwr7)
1110 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001111 if (defs & ArchDefinePwr8)
1112 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001113 if (defs & ArchDefineA2)
1114 Builder.defineMacro("_ARCH_A2");
1115 if (defs & ArchDefineA2q) {
1116 Builder.defineMacro("_ARCH_A2Q");
1117 Builder.defineMacro("_ARCH_QP");
1118 }
1119
1120 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1121 Builder.defineMacro("__bg__");
1122 Builder.defineMacro("__THW_BLUEGENE__");
1123 Builder.defineMacro("__bgq__");
1124 Builder.defineMacro("__TOS_BGQ__");
1125 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001126
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001127 if (HasVSX)
1128 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001129 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001130 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001131
Bill Schmidt38378a02013-02-01 20:23:10 +00001132 // FIXME: The following are not yet generated here by Clang, but are
1133 // generated by GCC:
1134 //
1135 // _SOFT_FLOAT_
1136 // __RECIP_PRECISION__
1137 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001138 // __RECIP__
1139 // __RECIPF__
1140 // __RSQRTE__
1141 // __RSQRTEF__
1142 // _SOFT_DOUBLE_
1143 // __NO_LWSYNC__
1144 // __HAVE_BSWAP__
1145 // __LONGDOUBLE128
1146 // __CMODEL_MEDIUM__
1147 // __CMODEL_LARGE__
1148 // _CALL_SYSV
1149 // _CALL_DARWIN
1150 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001151}
1152
1153void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1154 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1155 .Case("7400", true)
1156 .Case("g4", true)
1157 .Case("7450", true)
1158 .Case("g4+", true)
1159 .Case("970", true)
1160 .Case("g5", true)
1161 .Case("pwr6", true)
1162 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001163 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001164 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001165 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001166 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001167
1168 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001169
1170 if (!ABI.empty())
1171 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001172}
1173
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001174bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001175 return llvm::StringSwitch<bool>(Feature)
1176 .Case("powerpc", true)
1177 .Case("vsx", HasVSX)
1178 .Case("power8-vector", HasP8Vector)
1179 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001180}
Chris Lattner17df24e2008-04-21 18:56:49 +00001181
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001182const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001183 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1184 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1185 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1186 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1187 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1188 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1189 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1190 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001191 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001192 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001193 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001194 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1195 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1196 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1197 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001198 "vrsave", "vscr",
1199 "spe_acc", "spefscr",
1200 "sfp"
1201};
Chris Lattner10a5b382007-01-29 05:24:35 +00001202
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001203void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001204 unsigned &NumNames) const {
1205 Names = GCCRegNames;
1206 NumNames = llvm::array_lengthof(GCCRegNames);
1207}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001208
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001209const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1210 // While some of these aliases do map to different registers
1211 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001212 { { "0" }, "r0" },
1213 { { "1"}, "r1" },
1214 { { "2" }, "r2" },
1215 { { "3" }, "r3" },
1216 { { "4" }, "r4" },
1217 { { "5" }, "r5" },
1218 { { "6" }, "r6" },
1219 { { "7" }, "r7" },
1220 { { "8" }, "r8" },
1221 { { "9" }, "r9" },
1222 { { "10" }, "r10" },
1223 { { "11" }, "r11" },
1224 { { "12" }, "r12" },
1225 { { "13" }, "r13" },
1226 { { "14" }, "r14" },
1227 { { "15" }, "r15" },
1228 { { "16" }, "r16" },
1229 { { "17" }, "r17" },
1230 { { "18" }, "r18" },
1231 { { "19" }, "r19" },
1232 { { "20" }, "r20" },
1233 { { "21" }, "r21" },
1234 { { "22" }, "r22" },
1235 { { "23" }, "r23" },
1236 { { "24" }, "r24" },
1237 { { "25" }, "r25" },
1238 { { "26" }, "r26" },
1239 { { "27" }, "r27" },
1240 { { "28" }, "r28" },
1241 { { "29" }, "r29" },
1242 { { "30" }, "r30" },
1243 { { "31" }, "r31" },
1244 { { "fr0" }, "f0" },
1245 { { "fr1" }, "f1" },
1246 { { "fr2" }, "f2" },
1247 { { "fr3" }, "f3" },
1248 { { "fr4" }, "f4" },
1249 { { "fr5" }, "f5" },
1250 { { "fr6" }, "f6" },
1251 { { "fr7" }, "f7" },
1252 { { "fr8" }, "f8" },
1253 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001254 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001255 { { "fr11" }, "f11" },
1256 { { "fr12" }, "f12" },
1257 { { "fr13" }, "f13" },
1258 { { "fr14" }, "f14" },
1259 { { "fr15" }, "f15" },
1260 { { "fr16" }, "f16" },
1261 { { "fr17" }, "f17" },
1262 { { "fr18" }, "f18" },
1263 { { "fr19" }, "f19" },
1264 { { "fr20" }, "f20" },
1265 { { "fr21" }, "f21" },
1266 { { "fr22" }, "f22" },
1267 { { "fr23" }, "f23" },
1268 { { "fr24" }, "f24" },
1269 { { "fr25" }, "f25" },
1270 { { "fr26" }, "f26" },
1271 { { "fr27" }, "f27" },
1272 { { "fr28" }, "f28" },
1273 { { "fr29" }, "f29" },
1274 { { "fr30" }, "f30" },
1275 { { "fr31" }, "f31" },
1276 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001277};
1278
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001279void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001280 unsigned &NumAliases) const {
1281 Aliases = GCCRegAliases;
1282 NumAliases = llvm::array_lengthof(GCCRegAliases);
1283}
1284} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001285
Chris Lattner5ba61f02006-10-14 07:39:34 +00001286namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001287class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001288public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001289 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001290 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001291
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001292 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001293 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001294 case llvm::Triple::FreeBSD:
1295 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001296 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001297 PtrDiffType = SignedInt;
1298 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001299 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001300 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001301 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001302 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001303
Roman Divacky3ffe7462012-03-13 19:20:17 +00001304 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1305 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001306 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001307 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001308
1309 // PPC32 supports atomics up to 4 bytes.
1310 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001311 }
1312
Craig Topper3164f332014-03-11 03:39:26 +00001313 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001314 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001315 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001316 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001317};
1318} // end anonymous namespace.
1319
Bill Schmidt778d3872013-07-26 01:36:11 +00001320// Note: ABI differences may eventually require us to have a separate
1321// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001322namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001323class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001324public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001325 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001326 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001327 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001328 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001329
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001330 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1331 DescriptionString = "e-m:e-i64:64-n32:64";
1332 ABI = "elfv2";
1333 } else {
1334 DescriptionString = "E-m:e-i64:64-n32:64";
1335 ABI = "elfv1";
1336 }
1337
1338 switch (getTriple().getOS()) {
1339 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001340 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001341 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001342 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001343 case llvm::Triple::NetBSD:
1344 IntMaxType = SignedLongLong;
1345 Int64Type = SignedLongLong;
1346 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001347 default:
1348 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001349 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001350
1351 // PPC64 supports atomics up to 8 bytes.
1352 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001353 }
Craig Topper3164f332014-03-11 03:39:26 +00001354 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001355 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001356 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001357 // PPC64 Linux-specifc ABI options.
1358 bool setABI(const std::string &Name) override {
1359 if (Name == "elfv1" || Name == "elfv2") {
1360 ABI = Name;
1361 return true;
1362 }
1363 return false;
1364 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001365};
1366} // end anonymous namespace.
1367
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001368
1369namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001370class DarwinPPC32TargetInfo :
1371 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001372public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001373 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1374 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001375 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001376 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001377 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001378 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001379 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001380 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001381 }
Craig Topper3164f332014-03-11 03:39:26 +00001382 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001383 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001384 }
1385};
1386
1387class DarwinPPC64TargetInfo :
1388 public DarwinTargetInfo<PPC64TargetInfo> {
1389public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001390 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1391 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001392 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001393 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001394 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001395 }
1396};
1397} // end anonymous namespace.
1398
Chris Lattner5ba61f02006-10-14 07:39:34 +00001399namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001400 static const unsigned NVPTXAddrSpaceMap[] = {
1401 1, // opencl_global
1402 3, // opencl_local
1403 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001404 // FIXME: generic has to be added to the target
1405 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001406 1, // cuda_device
1407 4, // cuda_constant
1408 3, // cuda_shared
1409 };
1410 class NVPTXTargetInfo : public TargetInfo {
1411 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001412 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001413
1414 // The GPU profiles supported by the NVPTX backend
1415 enum GPUKind {
1416 GK_NONE,
1417 GK_SM20,
1418 GK_SM21,
1419 GK_SM30,
1420 GK_SM35,
1421 } GPU;
1422
Peter Collingbournec947aae2012-05-20 23:28:41 +00001423 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001424 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001425 BigEndian = false;
1426 TLSSupported = false;
1427 LongWidth = LongAlign = 64;
1428 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001429 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001430 // Define available target features
1431 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001432 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001433 // Set the default GPU to sm20
1434 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001435 }
Craig Topper3164f332014-03-11 03:39:26 +00001436 void getTargetDefines(const LangOptions &Opts,
1437 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001438 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001439 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001440 if (Opts.CUDAIsDevice) {
1441 // Set __CUDA_ARCH__ for the GPU specified.
1442 std::string CUDAArchCode;
1443 switch (GPU) {
1444 case GK_SM20:
1445 CUDAArchCode = "200";
1446 break;
1447 case GK_SM21:
1448 CUDAArchCode = "210";
1449 break;
1450 case GK_SM30:
1451 CUDAArchCode = "300";
1452 break;
1453 case GK_SM35:
1454 CUDAArchCode = "350";
1455 break;
1456 default:
1457 llvm_unreachable("Unhandled target CPU");
1458 }
1459 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1460 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001461 }
Craig Topper3164f332014-03-11 03:39:26 +00001462 void getTargetBuiltins(const Builtin::Info *&Records,
1463 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001464 Records = BuiltinInfo;
1465 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001466 }
Craig Topper3164f332014-03-11 03:39:26 +00001467 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001468 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001469 }
Craig Topper3164f332014-03-11 03:39:26 +00001470
1471 void getGCCRegNames(const char * const *&Names,
1472 unsigned &NumNames) const override;
1473 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1474 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001475 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001476 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001477 NumAliases = 0;
1478 }
Eric Christopher917e9522014-11-18 22:36:15 +00001479 bool
1480 validateAsmConstraint(const char *&Name,
1481 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001482 switch (*Name) {
1483 default: return false;
1484 case 'c':
1485 case 'h':
1486 case 'r':
1487 case 'l':
1488 case 'f':
1489 case 'd':
1490 Info.setAllowsRegister();
1491 return true;
1492 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001493 }
Craig Topper3164f332014-03-11 03:39:26 +00001494 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001495 // FIXME: Is this really right?
1496 return "";
1497 }
Craig Topper3164f332014-03-11 03:39:26 +00001498 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001499 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001500 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001501 }
Craig Topper3164f332014-03-11 03:39:26 +00001502 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001503 GPU = llvm::StringSwitch<GPUKind>(Name)
1504 .Case("sm_20", GK_SM20)
1505 .Case("sm_21", GK_SM21)
1506 .Case("sm_30", GK_SM30)
1507 .Case("sm_35", GK_SM35)
1508 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001509
Reid Klecknerbbc01782014-12-03 21:53:36 +00001510 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001511 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001512 };
1513
1514 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1515#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1516#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1517 ALL_LANGUAGES },
1518#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001519 };
1520
1521 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1522 "r0"
1523 };
1524
1525 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1526 unsigned &NumNames) const {
1527 Names = GCCRegNames;
1528 NumNames = llvm::array_lengthof(GCCRegNames);
1529 }
1530
1531 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1532 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001533 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001534 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001535 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1536 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001537 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001538 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001539 };
1540
1541 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1542 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001543 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001544 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001545 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1546 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001547 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001548 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001549 };
1550}
1551
1552namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001553
1554static const unsigned R600AddrSpaceMap[] = {
1555 1, // opencl_global
1556 3, // opencl_local
1557 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001558 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001559 1, // cuda_device
1560 2, // cuda_constant
1561 3 // cuda_shared
1562};
1563
Tom Stellarda96344b2014-08-21 13:58:40 +00001564// If you edit the description strings, make sure you update
1565// getPointerWidthV().
1566
Tom Stellardc74b1e02013-03-04 17:40:53 +00001567static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001568 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1569 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001570
1571static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001572 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1573 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001574
1575static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001576 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001577 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1578 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001579
Eli Friedmand13b41e2012-10-12 23:32:00 +00001580class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001581 static const Builtin::Info BuiltinInfo[];
1582
Tom Stellardc74b1e02013-03-04 17:40:53 +00001583 /// \brief The GPU profiles supported by the R600 target.
1584 enum GPUKind {
1585 GK_NONE,
1586 GK_R600,
1587 GK_R600_DOUBLE_OPS,
1588 GK_R700,
1589 GK_R700_DOUBLE_OPS,
1590 GK_EVERGREEN,
1591 GK_EVERGREEN_DOUBLE_OPS,
1592 GK_NORTHERN_ISLANDS,
1593 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001594 GK_SOUTHERN_ISLANDS,
1595 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001596 } GPU;
1597
Eli Friedmand13b41e2012-10-12 23:32:00 +00001598public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001599 R600TargetInfo(const llvm::Triple &Triple)
1600 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001601 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001602 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001603 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001604 }
1605
Tom Stellarda96344b2014-08-21 13:58:40 +00001606 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1607 if (GPU <= GK_CAYMAN)
1608 return 32;
1609
1610 switch(AddrSpace) {
1611 default:
1612 return 64;
1613 case 0:
1614 case 3:
1615 case 5:
1616 return 32;
1617 }
1618 }
1619
Craig Topper3164f332014-03-11 03:39:26 +00001620 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001621 return "";
1622 }
1623
Craig Topper3164f332014-03-11 03:39:26 +00001624 void getGCCRegNames(const char * const *&Names,
1625 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001626 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001627 numNames = 0;
1628 }
1629
Craig Topper3164f332014-03-11 03:39:26 +00001630 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1631 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001632 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001633 NumAliases = 0;
1634 }
1635
Craig Topper3164f332014-03-11 03:39:26 +00001636 bool validateAsmConstraint(const char *&Name,
1637 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001638 return true;
1639 }
1640
Craig Topper3164f332014-03-11 03:39:26 +00001641 void getTargetBuiltins(const Builtin::Info *&Records,
1642 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001643 Records = BuiltinInfo;
1644 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001645 }
1646
Craig Topper3164f332014-03-11 03:39:26 +00001647 void getTargetDefines(const LangOptions &Opts,
1648 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001649 Builder.defineMacro("__R600__");
1650 }
1651
Craig Topper3164f332014-03-11 03:39:26 +00001652 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001653 return TargetInfo::CharPtrBuiltinVaList;
1654 }
1655
Craig Topper3164f332014-03-11 03:39:26 +00001656 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001657 GPU = llvm::StringSwitch<GPUKind>(Name)
1658 .Case("r600" , GK_R600)
1659 .Case("rv610", GK_R600)
1660 .Case("rv620", GK_R600)
1661 .Case("rv630", GK_R600)
1662 .Case("rv635", GK_R600)
1663 .Case("rs780", GK_R600)
1664 .Case("rs880", GK_R600)
1665 .Case("rv670", GK_R600_DOUBLE_OPS)
1666 .Case("rv710", GK_R700)
1667 .Case("rv730", GK_R700)
1668 .Case("rv740", GK_R700_DOUBLE_OPS)
1669 .Case("rv770", GK_R700_DOUBLE_OPS)
1670 .Case("palm", GK_EVERGREEN)
1671 .Case("cedar", GK_EVERGREEN)
1672 .Case("sumo", GK_EVERGREEN)
1673 .Case("sumo2", GK_EVERGREEN)
1674 .Case("redwood", GK_EVERGREEN)
1675 .Case("juniper", GK_EVERGREEN)
1676 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1677 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1678 .Case("barts", GK_NORTHERN_ISLANDS)
1679 .Case("turks", GK_NORTHERN_ISLANDS)
1680 .Case("caicos", GK_NORTHERN_ISLANDS)
1681 .Case("cayman", GK_CAYMAN)
1682 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001683 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001684 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1685 .Case("verde", GK_SOUTHERN_ISLANDS)
1686 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001687 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001688 .Case("bonaire", GK_SEA_ISLANDS)
1689 .Case("kabini", GK_SEA_ISLANDS)
1690 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001691 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001692 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001693 .Default(GK_NONE);
1694
1695 if (GPU == GK_NONE) {
1696 return false;
1697 }
1698
1699 // Set the correct data layout
1700 switch (GPU) {
1701 case GK_NONE:
1702 case GK_R600:
1703 case GK_R700:
1704 case GK_EVERGREEN:
1705 case GK_NORTHERN_ISLANDS:
1706 DescriptionString = DescriptionStringR600;
1707 break;
1708 case GK_R600_DOUBLE_OPS:
1709 case GK_R700_DOUBLE_OPS:
1710 case GK_EVERGREEN_DOUBLE_OPS:
1711 case GK_CAYMAN:
1712 DescriptionString = DescriptionStringR600DoubleOps;
1713 break;
1714 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001715 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001716 DescriptionString = DescriptionStringSI;
1717 break;
1718 }
1719
1720 return true;
1721 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001722};
1723
Matt Arsenault56f008d2014-06-24 20:45:01 +00001724const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1725#define BUILTIN(ID, TYPE, ATTRS) \
1726 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1727#include "clang/Basic/BuiltinsR600.def"
1728};
1729
Eli Friedmand13b41e2012-10-12 23:32:00 +00001730} // end anonymous namespace
1731
1732namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001733// Namespace for x86 abstract base class
1734const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001735#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001736#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001737 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001738#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001739};
Eli Friedmanb5366062008-05-20 14:21:01 +00001740
Nuno Lopescfca1f02009-12-23 17:49:57 +00001741static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001742 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1743 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001744 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001745 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1746 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1747 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001748 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001749 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1750 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001751};
1752
Eric Christophercdd36352011-06-21 00:05:20 +00001753const TargetInfo::AddlRegName AddlRegNames[] = {
1754 { { "al", "ah", "eax", "rax" }, 0 },
1755 { { "bl", "bh", "ebx", "rbx" }, 3 },
1756 { { "cl", "ch", "ecx", "rcx" }, 2 },
1757 { { "dl", "dh", "edx", "rdx" }, 1 },
1758 { { "esi", "rsi" }, 4 },
1759 { { "edi", "rdi" }, 5 },
1760 { { "esp", "rsp" }, 7 },
1761 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001762};
1763
1764// X86 target abstract base class; x86-32 and x86-64 are very close, so
1765// most of the implementation can be shared.
1766class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001767 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001768 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001769 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001770 enum MMX3DNowEnum {
1771 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1772 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001773 enum XOPEnum {
1774 NoXOP,
1775 SSE4A,
1776 FMA4,
1777 XOP
1778 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001779
Eric Christophere1ddaf92010-04-02 23:50:19 +00001780 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001781 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001782 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001783 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001784 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001785 bool HasBMI;
1786 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001787 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001788 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001789 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001790 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001791 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001792 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001793 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001794 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001795 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1796 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001797 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001798 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001799
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001800 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1801 ///
1802 /// Each enumeration represents a particular CPU supported by Clang. These
1803 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1804 enum CPUKind {
1805 CK_Generic,
1806
1807 /// \name i386
1808 /// i386-generation processors.
1809 //@{
1810 CK_i386,
1811 //@}
1812
1813 /// \name i486
1814 /// i486-generation processors.
1815 //@{
1816 CK_i486,
1817 CK_WinChipC6,
1818 CK_WinChip2,
1819 CK_C3,
1820 //@}
1821
1822 /// \name i586
1823 /// i586-generation processors, P5 microarchitecture based.
1824 //@{
1825 CK_i586,
1826 CK_Pentium,
1827 CK_PentiumMMX,
1828 //@}
1829
1830 /// \name i686
1831 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1832 //@{
1833 CK_i686,
1834 CK_PentiumPro,
1835 CK_Pentium2,
1836 CK_Pentium3,
1837 CK_Pentium3M,
1838 CK_PentiumM,
1839 CK_C3_2,
1840
1841 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1842 /// Clang however has some logic to suport this.
1843 // FIXME: Warn, deprecate, and potentially remove this.
1844 CK_Yonah,
1845 //@}
1846
1847 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001848 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001849 //@{
1850 CK_Pentium4,
1851 CK_Pentium4M,
1852 CK_Prescott,
1853 CK_Nocona,
1854 //@}
1855
1856 /// \name Core
1857 /// Core microarchitecture based processors.
1858 //@{
1859 CK_Core2,
1860
1861 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1862 /// codename which GCC no longer accepts as an option to -march, but Clang
1863 /// has some logic for recognizing it.
1864 // FIXME: Warn, deprecate, and potentially remove this.
1865 CK_Penryn,
1866 //@}
1867
1868 /// \name Atom
1869 /// Atom processors
1870 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001871 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001872 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001873 //@}
1874
1875 /// \name Nehalem
1876 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001877 CK_Nehalem,
1878
1879 /// \name Westmere
1880 /// Westmere microarchitecture based processors.
1881 CK_Westmere,
1882
1883 /// \name Sandy Bridge
1884 /// Sandy Bridge microarchitecture based processors.
1885 CK_SandyBridge,
1886
1887 /// \name Ivy Bridge
1888 /// Ivy Bridge microarchitecture based processors.
1889 CK_IvyBridge,
1890
1891 /// \name Haswell
1892 /// Haswell microarchitecture based processors.
1893 CK_Haswell,
1894
1895 /// \name Broadwell
1896 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001897 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001898
1899 /// \name Skylake
1900 /// Skylake microarchitecture based processors.
1901 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001902
Craig Topper449314e2013-08-20 07:09:39 +00001903 /// \name Knights Landing
1904 /// Knights Landing processor.
1905 CK_KNL,
1906
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001907 /// \name K6
1908 /// K6 architecture processors.
1909 //@{
1910 CK_K6,
1911 CK_K6_2,
1912 CK_K6_3,
1913 //@}
1914
1915 /// \name K7
1916 /// K7 architecture processors.
1917 //@{
1918 CK_Athlon,
1919 CK_AthlonThunderbird,
1920 CK_Athlon4,
1921 CK_AthlonXP,
1922 CK_AthlonMP,
1923 //@}
1924
1925 /// \name K8
1926 /// K8 architecture processors.
1927 //@{
1928 CK_Athlon64,
1929 CK_Athlon64SSE3,
1930 CK_AthlonFX,
1931 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001932 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001933 CK_Opteron,
1934 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001935 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001936 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001937
Benjamin Kramer569f2152012-01-10 11:50:18 +00001938 /// \name Bobcat
1939 /// Bobcat architecture processors.
1940 //@{
1941 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001942 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001943 //@}
1944
1945 /// \name Bulldozer
1946 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001947 //@{
1948 CK_BDVER1,
1949 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001950 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001951 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001952 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001953
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001954 /// This specification is deprecated and will be removed in the future.
1955 /// Users should prefer \see CK_K8.
1956 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001957 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001958 CK_x86_64,
1959 //@}
1960
1961 /// \name Geode
1962 /// Geode processors.
1963 //@{
1964 CK_Geode
1965 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001966 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001967
Rafael Espindolaeb265472013-08-21 21:59:03 +00001968 enum FPMathKind {
1969 FP_Default,
1970 FP_SSE,
1971 FP_387
1972 } FPMath;
1973
Eli Friedman3fd920a2008-08-20 02:34:37 +00001974public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001975 X86TargetInfo(const llvm::Triple &Triple)
1976 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001977 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001978 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1979 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1980 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1981 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1982 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1983 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001984 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001985 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001986 }
Craig Topper3164f332014-03-11 03:39:26 +00001987 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001988 // X87 evaluates with 80 bits "long double" precision.
1989 return SSELevel == NoSSE ? 2 : 0;
1990 }
Craig Topper3164f332014-03-11 03:39:26 +00001991 void getTargetBuiltins(const Builtin::Info *&Records,
1992 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001993 Records = BuiltinInfo;
1994 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001995 }
Craig Topper3164f332014-03-11 03:39:26 +00001996 void getGCCRegNames(const char * const *&Names,
1997 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001998 Names = GCCRegNames;
1999 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002000 }
Craig Topper3164f332014-03-11 03:39:26 +00002001 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2002 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002003 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002004 NumAliases = 0;
2005 }
Craig Topper3164f332014-03-11 03:39:26 +00002006 void getGCCAddlRegNames(const AddlRegName *&Names,
2007 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002008 Names = AddlRegNames;
2009 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002010 }
Craig Topper3164f332014-03-11 03:39:26 +00002011 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002012 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002013
Akira Hatanaka974131e2014-09-18 18:17:18 +00002014 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2015
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002016 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2017
Akira Hatanaka974131e2014-09-18 18:17:18 +00002018 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2019
Craig Topper3164f332014-03-11 03:39:26 +00002020 std::string convertConstraint(const char *&Constraint) const override;
2021 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002022 return "~{dirflag},~{fpsr},~{flags}";
2023 }
Craig Topper3164f332014-03-11 03:39:26 +00002024 void getTargetDefines(const LangOptions &Opts,
2025 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002026 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2027 bool Enabled);
2028 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2029 bool Enabled);
2030 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2031 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002032 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2033 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002034 setFeatureEnabledImpl(Features, Name, Enabled);
2035 }
2036 // This exists purely to cut down on the number of virtual calls in
2037 // getDefaultFeatures which calls this repeatedly.
2038 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2039 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002040 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2041 bool hasFeature(StringRef Feature) const override;
2042 bool handleTargetFeatures(std::vector<std::string> &Features,
2043 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002044 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002045 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002046 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002047 else if (getTriple().getArch() == llvm::Triple::x86 &&
2048 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002049 return "no-mmx";
2050 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002051 }
Craig Topper3164f332014-03-11 03:39:26 +00002052 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002053 CPU = llvm::StringSwitch<CPUKind>(Name)
2054 .Case("i386", CK_i386)
2055 .Case("i486", CK_i486)
2056 .Case("winchip-c6", CK_WinChipC6)
2057 .Case("winchip2", CK_WinChip2)
2058 .Case("c3", CK_C3)
2059 .Case("i586", CK_i586)
2060 .Case("pentium", CK_Pentium)
2061 .Case("pentium-mmx", CK_PentiumMMX)
2062 .Case("i686", CK_i686)
2063 .Case("pentiumpro", CK_PentiumPro)
2064 .Case("pentium2", CK_Pentium2)
2065 .Case("pentium3", CK_Pentium3)
2066 .Case("pentium3m", CK_Pentium3M)
2067 .Case("pentium-m", CK_PentiumM)
2068 .Case("c3-2", CK_C3_2)
2069 .Case("yonah", CK_Yonah)
2070 .Case("pentium4", CK_Pentium4)
2071 .Case("pentium4m", CK_Pentium4M)
2072 .Case("prescott", CK_Prescott)
2073 .Case("nocona", CK_Nocona)
2074 .Case("core2", CK_Core2)
2075 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002076 .Case("bonnell", CK_Bonnell)
2077 .Case("atom", CK_Bonnell) // Legacy name.
2078 .Case("silvermont", CK_Silvermont)
2079 .Case("slm", CK_Silvermont) // Legacy name.
2080 .Case("nehalem", CK_Nehalem)
2081 .Case("corei7", CK_Nehalem) // Legacy name.
2082 .Case("westmere", CK_Westmere)
2083 .Case("sandybridge", CK_SandyBridge)
2084 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2085 .Case("ivybridge", CK_IvyBridge)
2086 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2087 .Case("haswell", CK_Haswell)
2088 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002089 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002090 .Case("skylake", CK_Skylake)
2091 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002092 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002093 .Case("k6", CK_K6)
2094 .Case("k6-2", CK_K6_2)
2095 .Case("k6-3", CK_K6_3)
2096 .Case("athlon", CK_Athlon)
2097 .Case("athlon-tbird", CK_AthlonThunderbird)
2098 .Case("athlon-4", CK_Athlon4)
2099 .Case("athlon-xp", CK_AthlonXP)
2100 .Case("athlon-mp", CK_AthlonMP)
2101 .Case("athlon64", CK_Athlon64)
2102 .Case("athlon64-sse3", CK_Athlon64SSE3)
2103 .Case("athlon-fx", CK_AthlonFX)
2104 .Case("k8", CK_K8)
2105 .Case("k8-sse3", CK_K8SSE3)
2106 .Case("opteron", CK_Opteron)
2107 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002108 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002109 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002110 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002111 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002112 .Case("bdver1", CK_BDVER1)
2113 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002114 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002115 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002116 .Case("x86-64", CK_x86_64)
2117 .Case("geode", CK_Geode)
2118 .Default(CK_Generic);
2119
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002120 // Perform any per-CPU checks necessary to determine if this CPU is
2121 // acceptable.
2122 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2123 // invalid without explaining *why*.
2124 switch (CPU) {
2125 case CK_Generic:
2126 // No processor selected!
2127 return false;
2128
2129 case CK_i386:
2130 case CK_i486:
2131 case CK_WinChipC6:
2132 case CK_WinChip2:
2133 case CK_C3:
2134 case CK_i586:
2135 case CK_Pentium:
2136 case CK_PentiumMMX:
2137 case CK_i686:
2138 case CK_PentiumPro:
2139 case CK_Pentium2:
2140 case CK_Pentium3:
2141 case CK_Pentium3M:
2142 case CK_PentiumM:
2143 case CK_Yonah:
2144 case CK_C3_2:
2145 case CK_Pentium4:
2146 case CK_Pentium4M:
2147 case CK_Prescott:
2148 case CK_K6:
2149 case CK_K6_2:
2150 case CK_K6_3:
2151 case CK_Athlon:
2152 case CK_AthlonThunderbird:
2153 case CK_Athlon4:
2154 case CK_AthlonXP:
2155 case CK_AthlonMP:
2156 case CK_Geode:
2157 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002158 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002159 return false;
2160
2161 // Fallthrough
2162 case CK_Nocona:
2163 case CK_Core2:
2164 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002165 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002166 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002167 case CK_Nehalem:
2168 case CK_Westmere:
2169 case CK_SandyBridge:
2170 case CK_IvyBridge:
2171 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002172 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002173 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002174 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002175 case CK_Athlon64:
2176 case CK_Athlon64SSE3:
2177 case CK_AthlonFX:
2178 case CK_K8:
2179 case CK_K8SSE3:
2180 case CK_Opteron:
2181 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002182 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002183 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002184 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002185 case CK_BDVER1:
2186 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002187 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002188 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002189 case CK_x86_64:
2190 return true;
2191 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002192 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002193 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002194
Craig Topper3164f332014-03-11 03:39:26 +00002195 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002196
Craig Topper3164f332014-03-11 03:39:26 +00002197 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002198 // We accept all non-ARM calling conventions
2199 return (CC == CC_X86ThisCall ||
2200 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002201 CC == CC_X86StdCall ||
2202 CC == CC_X86VectorCall ||
2203 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002204 CC == CC_X86Pascal ||
2205 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002206 }
2207
Craig Topper3164f332014-03-11 03:39:26 +00002208 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002209 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002210 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002211};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002212
Rafael Espindolaeb265472013-08-21 21:59:03 +00002213bool X86TargetInfo::setFPMath(StringRef Name) {
2214 if (Name == "387") {
2215 FPMath = FP_387;
2216 return true;
2217 }
2218 if (Name == "sse") {
2219 FPMath = FP_SSE;
2220 return true;
2221 }
2222 return false;
2223}
2224
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002225void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002226 // FIXME: This *really* should not be here.
2227
2228 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002229 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002230 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002231
Chandler Carruth212334f2011-09-28 08:55:37 +00002232 switch (CPU) {
2233 case CK_Generic:
2234 case CK_i386:
2235 case CK_i486:
2236 case CK_i586:
2237 case CK_Pentium:
2238 case CK_i686:
2239 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002240 break;
2241 case CK_PentiumMMX:
2242 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002243 case CK_K6:
2244 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002245 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002246 break;
2247 case CK_Pentium3:
2248 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002249 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002250 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002251 break;
2252 case CK_PentiumM:
2253 case CK_Pentium4:
2254 case CK_Pentium4M:
2255 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002256 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002257 break;
2258 case CK_Yonah:
2259 case CK_Prescott:
2260 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002261 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002262 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002263 break;
2264 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002265 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002266 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002267 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002268 break;
2269 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002270 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002271 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002272 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002273 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002274 setFeatureEnabledImpl(Features, "avx512f", true);
2275 setFeatureEnabledImpl(Features, "avx512cd", true);
2276 setFeatureEnabledImpl(Features, "avx512dq", true);
2277 setFeatureEnabledImpl(Features, "avx512bw", true);
2278 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002279 // FALLTHROUGH
2280 case CK_Broadwell:
2281 setFeatureEnabledImpl(Features, "rdseed", true);
2282 setFeatureEnabledImpl(Features, "adx", true);
2283 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002284 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002285 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002286 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002287 setFeatureEnabledImpl(Features, "bmi", true);
2288 setFeatureEnabledImpl(Features, "bmi2", true);
2289 setFeatureEnabledImpl(Features, "rtm", true);
2290 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002291 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002292 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002293 setFeatureEnabledImpl(Features, "rdrnd", true);
2294 setFeatureEnabledImpl(Features, "f16c", true);
2295 setFeatureEnabledImpl(Features, "fsgsbase", true);
2296 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002297 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002298 setFeatureEnabledImpl(Features, "avx", true);
2299 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002300 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002301 case CK_Silvermont:
2302 setFeatureEnabledImpl(Features, "aes", true);
2303 setFeatureEnabledImpl(Features, "pclmul", true);
2304 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002305 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002306 setFeatureEnabledImpl(Features, "sse4.2", true);
2307 setFeatureEnabledImpl(Features, "cx16", true);
2308 break;
2309 case CK_KNL:
2310 setFeatureEnabledImpl(Features, "avx512f", true);
2311 setFeatureEnabledImpl(Features, "avx512cd", true);
2312 setFeatureEnabledImpl(Features, "avx512er", true);
2313 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002314 setFeatureEnabledImpl(Features, "rdseed", true);
2315 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002316 setFeatureEnabledImpl(Features, "lzcnt", true);
2317 setFeatureEnabledImpl(Features, "bmi", true);
2318 setFeatureEnabledImpl(Features, "bmi2", true);
2319 setFeatureEnabledImpl(Features, "rtm", true);
2320 setFeatureEnabledImpl(Features, "fma", true);
2321 setFeatureEnabledImpl(Features, "rdrnd", true);
2322 setFeatureEnabledImpl(Features, "f16c", true);
2323 setFeatureEnabledImpl(Features, "fsgsbase", true);
2324 setFeatureEnabledImpl(Features, "aes", true);
2325 setFeatureEnabledImpl(Features, "pclmul", true);
2326 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002327 break;
2328 case CK_K6_2:
2329 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002330 case CK_WinChip2:
2331 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002332 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002333 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002334 case CK_Athlon:
2335 case CK_AthlonThunderbird:
2336 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002337 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002338 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002339 case CK_Athlon4:
2340 case CK_AthlonXP:
2341 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002342 setFeatureEnabledImpl(Features, "sse", true);
2343 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002344 break;
2345 case CK_K8:
2346 case CK_Opteron:
2347 case CK_Athlon64:
2348 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002349 setFeatureEnabledImpl(Features, "sse2", true);
2350 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002351 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002352 case CK_AMDFAM10:
2353 setFeatureEnabledImpl(Features, "sse4a", true);
2354 setFeatureEnabledImpl(Features, "lzcnt", true);
2355 setFeatureEnabledImpl(Features, "popcnt", true);
2356 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002357 case CK_K8SSE3:
2358 case CK_OpteronSSE3:
2359 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002360 setFeatureEnabledImpl(Features, "sse3", true);
2361 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002362 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002363 case CK_BTVER2:
2364 setFeatureEnabledImpl(Features, "avx", true);
2365 setFeatureEnabledImpl(Features, "aes", true);
2366 setFeatureEnabledImpl(Features, "pclmul", true);
2367 setFeatureEnabledImpl(Features, "bmi", true);
2368 setFeatureEnabledImpl(Features, "f16c", true);
2369 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002370 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002371 setFeatureEnabledImpl(Features, "ssse3", true);
2372 setFeatureEnabledImpl(Features, "sse4a", true);
2373 setFeatureEnabledImpl(Features, "lzcnt", true);
2374 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002375 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002376 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002377 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002378 case CK_BDVER4:
2379 setFeatureEnabledImpl(Features, "avx2", true);
2380 setFeatureEnabledImpl(Features, "bmi2", true);
2381 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002382 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002383 setFeatureEnabledImpl(Features, "fsgsbase", true);
2384 // FALLTHROUGH
2385 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002386 setFeatureEnabledImpl(Features, "bmi", true);
2387 setFeatureEnabledImpl(Features, "fma", true);
2388 setFeatureEnabledImpl(Features, "f16c", true);
2389 setFeatureEnabledImpl(Features, "tbm", true);
2390 // FALLTHROUGH
2391 case CK_BDVER1:
2392 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002393 setFeatureEnabledImpl(Features, "xop", true);
2394 setFeatureEnabledImpl(Features, "lzcnt", true);
2395 setFeatureEnabledImpl(Features, "aes", true);
2396 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002397 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002398 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002399 break;
Eli Friedman33465822011-07-08 23:31:17 +00002400 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002401}
2402
Rafael Espindolae62e2792013-08-20 13:44:29 +00002403void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002404 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002405 if (Enabled) {
2406 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002407 case AVX512F:
2408 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002409 case AVX2:
2410 Features["avx2"] = true;
2411 case AVX:
2412 Features["avx"] = true;
2413 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002414 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002415 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002416 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002417 case SSSE3:
2418 Features["ssse3"] = true;
2419 case SSE3:
2420 Features["sse3"] = true;
2421 case SSE2:
2422 Features["sse2"] = true;
2423 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002424 Features["sse"] = true;
2425 case NoSSE:
2426 break;
2427 }
2428 return;
2429 }
2430
2431 switch (Level) {
2432 case NoSSE:
2433 case SSE1:
2434 Features["sse"] = false;
2435 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002436 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2437 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002438 case SSE3:
2439 Features["sse3"] = false;
2440 setXOPLevel(Features, NoXOP, false);
2441 case SSSE3:
2442 Features["ssse3"] = false;
2443 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002444 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002445 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002446 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002447 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002448 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002449 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002450 case AVX2:
2451 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002452 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002453 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002454 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2455 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002456 }
2457}
2458
2459void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002460 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002461 if (Enabled) {
2462 switch (Level) {
2463 case AMD3DNowAthlon:
2464 Features["3dnowa"] = true;
2465 case AMD3DNow:
2466 Features["3dnow"] = true;
2467 case MMX:
2468 Features["mmx"] = true;
2469 case NoMMX3DNow:
2470 break;
2471 }
2472 return;
2473 }
2474
2475 switch (Level) {
2476 case NoMMX3DNow:
2477 case MMX:
2478 Features["mmx"] = false;
2479 case AMD3DNow:
2480 Features["3dnow"] = false;
2481 case AMD3DNowAthlon:
2482 Features["3dnowa"] = false;
2483 }
2484}
2485
2486void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002487 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002488 if (Enabled) {
2489 switch (Level) {
2490 case XOP:
2491 Features["xop"] = true;
2492 case FMA4:
2493 Features["fma4"] = true;
2494 setSSELevel(Features, AVX, true);
2495 case SSE4A:
2496 Features["sse4a"] = true;
2497 setSSELevel(Features, SSE3, true);
2498 case NoXOP:
2499 break;
2500 }
2501 return;
2502 }
2503
2504 switch (Level) {
2505 case NoXOP:
2506 case SSE4A:
2507 Features["sse4a"] = false;
2508 case FMA4:
2509 Features["fma4"] = false;
2510 case XOP:
2511 Features["xop"] = false;
2512 }
2513}
2514
Craig Topper86d79ef2013-09-17 04:51:29 +00002515void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2516 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002517 // FIXME: This *really* should not be here. We need some way of translating
2518 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002519 if (Name == "sse4")
2520 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002521
Rafael Espindolae62e2792013-08-20 13:44:29 +00002522 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002523
Craig Topper29561122013-09-19 01:13:07 +00002524 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002525 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002526 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002527 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002528 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002529 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002530 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002531 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002532 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002533 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002534 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002535 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002536 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002537 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002538 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002539 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002540 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002541 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002542 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002543 if (Enabled)
2544 setSSELevel(Features, SSE2, Enabled);
2545 } else if (Name == "pclmul") {
2546 if (Enabled)
2547 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002548 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002549 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002550 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002551 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002552 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002553 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002554 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2555 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002556 if (Enabled)
2557 setSSELevel(Features, AVX512F, Enabled);
2558 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002559 if (Enabled)
2560 setSSELevel(Features, AVX, Enabled);
2561 } else if (Name == "fma4") {
2562 setXOPLevel(Features, FMA4, Enabled);
2563 } else if (Name == "xop") {
2564 setXOPLevel(Features, XOP, Enabled);
2565 } else if (Name == "sse4a") {
2566 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002567 } else if (Name == "f16c") {
2568 if (Enabled)
2569 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002570 } else if (Name == "sha") {
2571 if (Enabled)
2572 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002573 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002574}
2575
Eric Christopher3ff21b32013-10-16 21:26:26 +00002576/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002577/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002578bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002579 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002580 // Remember the maximum enabled sselevel.
2581 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2582 // Ignore disabled features.
2583 if (Features[i][0] == '-')
2584 continue;
2585
Benjamin Kramer27402c62012-03-05 15:10:44 +00002586 StringRef Feature = StringRef(Features[i]).substr(1);
2587
2588 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002589 HasAES = true;
2590 continue;
2591 }
2592
Craig Topper3f122a72012-05-31 05:18:48 +00002593 if (Feature == "pclmul") {
2594 HasPCLMUL = true;
2595 continue;
2596 }
2597
Benjamin Kramer27402c62012-03-05 15:10:44 +00002598 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002599 HasLZCNT = true;
2600 continue;
2601 }
2602
Rafael Espindola89049822013-08-23 20:21:37 +00002603 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002604 HasRDRND = true;
2605 continue;
2606 }
2607
Craig Topper8c7f2512014-11-03 06:51:41 +00002608 if (Feature == "fsgsbase") {
2609 HasFSGSBASE = true;
2610 continue;
2611 }
2612
Benjamin Kramer27402c62012-03-05 15:10:44 +00002613 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002614 HasBMI = true;
2615 continue;
2616 }
2617
Benjamin Kramer27402c62012-03-05 15:10:44 +00002618 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002619 HasBMI2 = true;
2620 continue;
2621 }
2622
Benjamin Kramer27402c62012-03-05 15:10:44 +00002623 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002624 HasPOPCNT = true;
2625 continue;
2626 }
2627
Michael Liao625a8752012-11-10 05:17:46 +00002628 if (Feature == "rtm") {
2629 HasRTM = true;
2630 continue;
2631 }
2632
Michael Liao74f4eaf2013-03-26 17:52:08 +00002633 if (Feature == "prfchw") {
2634 HasPRFCHW = true;
2635 continue;
2636 }
2637
Michael Liaoffaae352013-03-29 05:17:55 +00002638 if (Feature == "rdseed") {
2639 HasRDSEED = true;
2640 continue;
2641 }
2642
Robert Khasanov50e6f582014-09-19 09:53:48 +00002643 if (Feature == "adx") {
2644 HasADX = true;
2645 continue;
2646 }
2647
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002648 if (Feature == "tbm") {
2649 HasTBM = true;
2650 continue;
2651 }
2652
Craig Topperbba778b2012-06-03 21:46:30 +00002653 if (Feature == "fma") {
2654 HasFMA = true;
2655 continue;
2656 }
2657
Manman Rena45358c2012-10-11 00:59:55 +00002658 if (Feature == "f16c") {
2659 HasF16C = true;
2660 continue;
2661 }
2662
Craig Topper679b53a2013-08-21 05:29:10 +00002663 if (Feature == "avx512cd") {
2664 HasAVX512CD = true;
2665 continue;
2666 }
2667
2668 if (Feature == "avx512er") {
2669 HasAVX512ER = true;
2670 continue;
2671 }
2672
2673 if (Feature == "avx512pf") {
2674 HasAVX512PF = true;
2675 continue;
2676 }
2677
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002678 if (Feature == "avx512dq") {
2679 HasAVX512DQ = true;
2680 continue;
2681 }
2682
2683 if (Feature == "avx512bw") {
2684 HasAVX512BW = true;
2685 continue;
2686 }
2687
2688 if (Feature == "avx512vl") {
2689 HasAVX512VL = true;
2690 continue;
2691 }
2692
Ben Langmuir58078d02013-09-19 13:22:04 +00002693 if (Feature == "sha") {
2694 HasSHA = true;
2695 continue;
2696 }
2697
Nick Lewycky50e8f482013-10-05 20:14:27 +00002698 if (Feature == "cx16") {
2699 HasCX16 = true;
2700 continue;
2701 }
2702
Daniel Dunbar979586e2009-11-11 09:38:56 +00002703 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002704 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002705 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002706 .Case("avx2", AVX2)
2707 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002708 .Case("sse4.2", SSE42)
2709 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002710 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002711 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002712 .Case("sse2", SSE2)
2713 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002714 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002715 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002716
Eli Friedman33465822011-07-08 23:31:17 +00002717 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002718 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002719 .Case("3dnowa", AMD3DNowAthlon)
2720 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002721 .Case("mmx", MMX)
2722 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002723 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002724
2725 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2726 .Case("xop", XOP)
2727 .Case("fma4", FMA4)
2728 .Case("sse4a", SSE4A)
2729 .Default(NoXOP);
2730 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002731 }
Eli Friedman33465822011-07-08 23:31:17 +00002732
Craig Topper7481d8a2013-09-10 06:55:47 +00002733 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2734 // Can't do this earlier because we need to be able to explicitly enable
2735 // popcnt and still disable sse4.2.
2736 if (!HasPOPCNT && SSELevel >= SSE42 &&
2737 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2738 HasPOPCNT = true;
2739 Features.push_back("+popcnt");
2740 }
2741
Yunzhong Gao61089362013-10-16 19:07:02 +00002742 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2743 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2744 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2745 HasPRFCHW = true;
2746 Features.push_back("+prfchw");
2747 }
2748
Rafael Espindolaeb265472013-08-21 21:59:03 +00002749 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2750 // matches the selected sse level.
2751 if (FPMath == FP_SSE && SSELevel < SSE1) {
2752 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2753 return false;
2754 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2755 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2756 return false;
2757 }
2758
Eli Friedman33465822011-07-08 23:31:17 +00002759 // Don't tell the backend if we're turning off mmx; it will end up disabling
2760 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002761 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2762 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002763 std::vector<std::string>::iterator it;
2764 it = std::find(Features.begin(), Features.end(), "-mmx");
2765 if (it != Features.end())
2766 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002767 else if (SSELevel > NoSSE)
2768 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002769 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002770}
Chris Lattnerecd49032009-03-02 22:27:17 +00002771
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002772/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2773/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002774void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002775 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002776 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002777 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002778 Builder.defineMacro("__amd64__");
2779 Builder.defineMacro("__amd64");
2780 Builder.defineMacro("__x86_64");
2781 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002782 if (getTriple().getArchName() == "x86_64h") {
2783 Builder.defineMacro("__x86_64h");
2784 Builder.defineMacro("__x86_64h__");
2785 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002786 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002787 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002788 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002789
Chris Lattnerecd49032009-03-02 22:27:17 +00002790 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002791 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2792 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002793 switch (CPU) {
2794 case CK_Generic:
2795 break;
2796 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002797 // The rest are coming from the i386 define above.
2798 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002799 break;
2800 case CK_i486:
2801 case CK_WinChipC6:
2802 case CK_WinChip2:
2803 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002804 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002805 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002806 case CK_PentiumMMX:
2807 Builder.defineMacro("__pentium_mmx__");
2808 Builder.defineMacro("__tune_pentium_mmx__");
2809 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002810 case CK_i586:
2811 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002812 defineCPUMacros(Builder, "i586");
2813 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002814 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002815 case CK_Pentium3:
2816 case CK_Pentium3M:
2817 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002818 Builder.defineMacro("__tune_pentium3__");
2819 // Fallthrough
2820 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002821 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002822 Builder.defineMacro("__tune_pentium2__");
2823 // Fallthrough
2824 case CK_PentiumPro:
2825 Builder.defineMacro("__tune_i686__");
2826 Builder.defineMacro("__tune_pentiumpro__");
2827 // Fallthrough
2828 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002829 Builder.defineMacro("__i686");
2830 Builder.defineMacro("__i686__");
2831 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2832 Builder.defineMacro("__pentiumpro");
2833 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002834 break;
2835 case CK_Pentium4:
2836 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002837 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002838 break;
2839 case CK_Yonah:
2840 case CK_Prescott:
2841 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002842 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002843 break;
2844 case CK_Core2:
2845 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002846 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002847 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002848 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002849 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002850 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002851 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002852 defineCPUMacros(Builder, "slm");
2853 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002854 case CK_Nehalem:
2855 case CK_Westmere:
2856 case CK_SandyBridge:
2857 case CK_IvyBridge:
2858 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002859 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002860 // FIXME: Historically, we defined this legacy name, it would be nice to
2861 // remove it at some point. We've never exposed fine-grained names for
2862 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002863 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002864 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002865 case CK_Skylake:
2866 // FIXME: Historically, we defined this legacy name, it would be nice to
2867 // remove it at some point. This is the only fine-grained CPU macro in the
2868 // main intel CPU line, and it would be better to not have these and force
2869 // people to use ISA macros.
2870 defineCPUMacros(Builder, "skx");
2871 break;
Craig Topper449314e2013-08-20 07:09:39 +00002872 case CK_KNL:
2873 defineCPUMacros(Builder, "knl");
2874 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002875 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002876 Builder.defineMacro("__k6_2__");
2877 Builder.defineMacro("__tune_k6_2__");
2878 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002879 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002880 if (CPU != CK_K6_2) { // In case of fallthrough
2881 // FIXME: GCC may be enabling these in cases where some other k6
2882 // architecture is specified but -m3dnow is explicitly provided. The
2883 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002884 Builder.defineMacro("__k6_3__");
2885 Builder.defineMacro("__tune_k6_3__");
2886 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002887 // Fallthrough
2888 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002889 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002890 break;
2891 case CK_Athlon:
2892 case CK_AthlonThunderbird:
2893 case CK_Athlon4:
2894 case CK_AthlonXP:
2895 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002896 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002897 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002898 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002899 Builder.defineMacro("__tune_athlon_sse__");
2900 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002901 break;
2902 case CK_K8:
2903 case CK_K8SSE3:
2904 case CK_x86_64:
2905 case CK_Opteron:
2906 case CK_OpteronSSE3:
2907 case CK_Athlon64:
2908 case CK_Athlon64SSE3:
2909 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002910 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002911 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002912 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002913 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002914 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002915 case CK_BTVER1:
2916 defineCPUMacros(Builder, "btver1");
2917 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002918 case CK_BTVER2:
2919 defineCPUMacros(Builder, "btver2");
2920 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002921 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002922 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002923 break;
2924 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002925 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002926 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002927 case CK_BDVER3:
2928 defineCPUMacros(Builder, "bdver3");
2929 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002930 case CK_BDVER4:
2931 defineCPUMacros(Builder, "bdver4");
2932 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002933 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002934 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002935 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002936 }
Chris Lattner96e43572009-03-02 22:40:39 +00002937
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002938 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002939 Builder.defineMacro("__REGISTER_PREFIX__", "");
2940
Chris Lattner6df41af2009-04-19 17:32:33 +00002941 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2942 // functions in glibc header files that use FP Stack inline asm which the
2943 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002944 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002945
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002946 if (HasAES)
2947 Builder.defineMacro("__AES__");
2948
Craig Topper3f122a72012-05-31 05:18:48 +00002949 if (HasPCLMUL)
2950 Builder.defineMacro("__PCLMUL__");
2951
Craig Topper22967d42011-12-25 05:06:45 +00002952 if (HasLZCNT)
2953 Builder.defineMacro("__LZCNT__");
2954
Benjamin Kramer1e250392012-07-07 09:39:18 +00002955 if (HasRDRND)
2956 Builder.defineMacro("__RDRND__");
2957
Craig Topper8c7f2512014-11-03 06:51:41 +00002958 if (HasFSGSBASE)
2959 Builder.defineMacro("__FSGSBASE__");
2960
Craig Topper22967d42011-12-25 05:06:45 +00002961 if (HasBMI)
2962 Builder.defineMacro("__BMI__");
2963
2964 if (HasBMI2)
2965 Builder.defineMacro("__BMI2__");
2966
Craig Topper1de83482011-12-29 16:10:46 +00002967 if (HasPOPCNT)
2968 Builder.defineMacro("__POPCNT__");
2969
Michael Liao625a8752012-11-10 05:17:46 +00002970 if (HasRTM)
2971 Builder.defineMacro("__RTM__");
2972
Michael Liao74f4eaf2013-03-26 17:52:08 +00002973 if (HasPRFCHW)
2974 Builder.defineMacro("__PRFCHW__");
2975
Michael Liaoffaae352013-03-29 05:17:55 +00002976 if (HasRDSEED)
2977 Builder.defineMacro("__RDSEED__");
2978
Robert Khasanov50e6f582014-09-19 09:53:48 +00002979 if (HasADX)
2980 Builder.defineMacro("__ADX__");
2981
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002982 if (HasTBM)
2983 Builder.defineMacro("__TBM__");
2984
Rafael Espindolae62e2792013-08-20 13:44:29 +00002985 switch (XOPLevel) {
2986 case XOP:
2987 Builder.defineMacro("__XOP__");
2988 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002989 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002990 case SSE4A:
2991 Builder.defineMacro("__SSE4A__");
2992 case NoXOP:
2993 break;
2994 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002995
Craig Topperbba778b2012-06-03 21:46:30 +00002996 if (HasFMA)
2997 Builder.defineMacro("__FMA__");
2998
Manman Rena45358c2012-10-11 00:59:55 +00002999 if (HasF16C)
3000 Builder.defineMacro("__F16C__");
3001
Craig Topper679b53a2013-08-21 05:29:10 +00003002 if (HasAVX512CD)
3003 Builder.defineMacro("__AVX512CD__");
3004 if (HasAVX512ER)
3005 Builder.defineMacro("__AVX512ER__");
3006 if (HasAVX512PF)
3007 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003008 if (HasAVX512DQ)
3009 Builder.defineMacro("__AVX512DQ__");
3010 if (HasAVX512BW)
3011 Builder.defineMacro("__AVX512BW__");
3012 if (HasAVX512VL)
3013 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003014
Ben Langmuir58078d02013-09-19 13:22:04 +00003015 if (HasSHA)
3016 Builder.defineMacro("__SHA__");
3017
Nick Lewycky50e8f482013-10-05 20:14:27 +00003018 if (HasCX16)
3019 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3020
Chris Lattner96e43572009-03-02 22:40:39 +00003021 // Each case falls through to the previous one here.
3022 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003023 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003024 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003025 case AVX2:
3026 Builder.defineMacro("__AVX2__");
3027 case AVX:
3028 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003029 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003030 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003031 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003032 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003033 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003034 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003035 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003036 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003037 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003038 Builder.defineMacro("__SSE2__");
3039 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003040 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003041 Builder.defineMacro("__SSE__");
3042 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003043 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003044 break;
3045 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003046
Derek Schuffc7dd7222012-10-11 15:52:22 +00003047 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003048 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003049 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003050 case AVX2:
3051 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003052 case SSE42:
3053 case SSE41:
3054 case SSSE3:
3055 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003056 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003057 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003058 break;
3059 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003060 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003061 break;
3062 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003063 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003064 }
3065 }
3066
Anders Carlssone437c682010-01-27 03:47:49 +00003067 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003068 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003069 case AMD3DNowAthlon:
3070 Builder.defineMacro("__3dNOW_A__");
3071 case AMD3DNow:
3072 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003073 case MMX:
3074 Builder.defineMacro("__MMX__");
3075 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003076 break;
3077 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003078
3079 if (CPU >= CK_i486) {
3080 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3081 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3082 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3083 }
3084 if (CPU >= CK_i586)
3085 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003086}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003087
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003088bool X86TargetInfo::hasFeature(StringRef Feature) const {
3089 return llvm::StringSwitch<bool>(Feature)
3090 .Case("aes", HasAES)
3091 .Case("avx", SSELevel >= AVX)
3092 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003093 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003094 .Case("avx512cd", HasAVX512CD)
3095 .Case("avx512er", HasAVX512ER)
3096 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003097 .Case("avx512dq", HasAVX512DQ)
3098 .Case("avx512bw", HasAVX512BW)
3099 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003100 .Case("bmi", HasBMI)
3101 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003102 .Case("cx16", HasCX16)
3103 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003104 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003105 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003106 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003107 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003108 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3109 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3110 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003111 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003112 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003113 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003114 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003115 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003116 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003117 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003118 .Case("sse", SSELevel >= SSE1)
3119 .Case("sse2", SSELevel >= SSE2)
3120 .Case("sse3", SSELevel >= SSE3)
3121 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003122 .Case("sse4.1", SSELevel >= SSE41)
3123 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003124 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003125 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003126 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003127 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3128 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003129 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003130 .Default(false);
3131}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003132
Eli Friedman3fd920a2008-08-20 02:34:37 +00003133bool
Anders Carlsson58436352009-02-28 17:11:49 +00003134X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003135 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003136 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003137 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003138 case 'I':
3139 Info.setRequiresImmediate(0, 31);
3140 return true;
3141 case 'J':
3142 Info.setRequiresImmediate(0, 63);
3143 return true;
3144 case 'K':
3145 Info.setRequiresImmediate(-128, 127);
3146 return true;
3147 case 'L':
3148 // FIXME: properly analyze this constraint:
3149 // must be one of 0xff, 0xffff, or 0xffffffff
3150 return true;
3151 case 'M':
3152 Info.setRequiresImmediate(0, 3);
3153 return true;
3154 case 'N':
3155 Info.setRequiresImmediate(0, 255);
3156 return true;
3157 case 'O':
3158 Info.setRequiresImmediate(0, 127);
3159 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003160 case 'Y': // first letter of a pair:
3161 switch (*(Name+1)) {
3162 default: return false;
3163 case '0': // First SSE register.
3164 case 't': // Any SSE register, when SSE2 is enabled.
3165 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3166 case 'm': // any MMX register, when inter-unit moves enabled.
3167 break; // falls through to setAllowsRegister.
3168 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003169 case 'f': // any x87 floating point stack register.
3170 // Constraint 'f' cannot be used for output operands.
3171 if (Info.ConstraintStr[0] == '=')
3172 return false;
3173
3174 Info.setAllowsRegister();
3175 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003176 case 'a': // eax.
3177 case 'b': // ebx.
3178 case 'c': // ecx.
3179 case 'd': // edx.
3180 case 'S': // esi.
3181 case 'D': // edi.
3182 case 'A': // edx:eax.
3183 case 't': // top of floating point stack.
3184 case 'u': // second from top of floating point stack.
3185 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003186 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003187 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003188 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003189 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3190 case 'l': // "Index" registers: any general register that can be used as an
3191 // index in a base+index memory access.
3192 Info.setAllowsRegister();
3193 return true;
3194 case 'C': // SSE floating point constant.
3195 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003196 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003197 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003198 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003199 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003200 return true;
3201 }
3202}
3203
Akira Hatanaka974131e2014-09-18 18:17:18 +00003204bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3205 unsigned Size) const {
3206 // Strip off constraint modifiers.
3207 while (Constraint[0] == '=' ||
3208 Constraint[0] == '+' ||
3209 Constraint[0] == '&')
3210 Constraint = Constraint.substr(1);
3211
3212 return validateOperandSize(Constraint, Size);
3213}
3214
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003215bool X86TargetInfo::validateInputSize(StringRef Constraint,
3216 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003217 return validateOperandSize(Constraint, Size);
3218}
3219
3220bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3221 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003222 switch (Constraint[0]) {
3223 default: break;
3224 case 'y':
3225 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003226 case 'f':
3227 case 't':
3228 case 'u':
3229 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003230 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003231 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003232 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003233 }
3234
3235 return true;
3236}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003237
Eli Friedman3fd920a2008-08-20 02:34:37 +00003238std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003239X86TargetInfo::convertConstraint(const char *&Constraint) const {
3240 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003241 case 'a': return std::string("{ax}");
3242 case 'b': return std::string("{bx}");
3243 case 'c': return std::string("{cx}");
3244 case 'd': return std::string("{dx}");
3245 case 'S': return std::string("{si}");
3246 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003247 case 'p': // address
3248 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003249 case 't': // top of floating point stack.
3250 return std::string("{st}");
3251 case 'u': // second from top of floating point stack.
3252 return std::string("{st(1)}"); // second from top of floating point stack.
3253 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003254 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003255 }
3256}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003257} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003258
3259namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003260// X86-32 generic target
3261class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003262public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003263 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003264 DoubleAlign = LongLongAlign = 32;
3265 LongDoubleWidth = 96;
3266 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003267 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003268 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003269 SizeType = UnsignedInt;
3270 PtrDiffType = SignedInt;
3271 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003272 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003273
3274 // Use fpret for all types.
3275 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3276 (1 << TargetInfo::Double) |
3277 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003278
3279 // x86-32 has atomics up to 8 bytes
3280 // FIXME: Check that we actually have cmpxchg8b before setting
3281 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3282 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003283 }
Craig Topper3164f332014-03-11 03:39:26 +00003284 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003285 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003286 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003287
Craig Topper3164f332014-03-11 03:39:26 +00003288 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003289 if (RegNo == 0) return 0;
3290 if (RegNo == 1) return 2;
3291 return -1;
3292 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003293 bool validateOperandSize(StringRef Constraint,
3294 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003295 switch (Constraint[0]) {
3296 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003297 case 'R':
3298 case 'q':
3299 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003300 case 'a':
3301 case 'b':
3302 case 'c':
3303 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003304 case 'S':
3305 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003306 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003307 case 'A':
3308 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003309 }
3310
Akira Hatanaka974131e2014-09-18 18:17:18 +00003311 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003312 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003313};
3314} // end anonymous namespace
3315
3316namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003317class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3318public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003319 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3320 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003321
Craig Topper3164f332014-03-11 03:39:26 +00003322 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003323 unsigned Major, Minor, Micro;
3324 getTriple().getOSVersion(Major, Minor, Micro);
3325 // New NetBSD uses the default rounding mode.
3326 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3327 return X86_32TargetInfo::getFloatEvalMethod();
3328 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003329 return 1;
3330 }
3331};
3332} // end anonymous namespace
3333
3334namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003335class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3336public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003337 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3338 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003339 SizeType = UnsignedLong;
3340 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003341 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003342 }
3343};
3344} // end anonymous namespace
3345
3346namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003347class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3348public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003349 BitrigI386TargetInfo(const llvm::Triple &Triple)
3350 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003351 SizeType = UnsignedLong;
3352 IntPtrType = SignedLong;
3353 PtrDiffType = SignedLong;
3354 }
3355};
3356} // end anonymous namespace
3357
3358namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003359class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003360public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003361 DarwinI386TargetInfo(const llvm::Triple &Triple)
3362 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003363 LongDoubleWidth = 128;
3364 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003365 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003366 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003367 SizeType = UnsignedLong;
3368 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003369 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003370 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003371 }
3372
Eli Friedman3fd920a2008-08-20 02:34:37 +00003373};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003374} // end anonymous namespace
3375
3376namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003377// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003378class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003379public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003380 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3381 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003382 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003383 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003384 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003385 }
Craig Topper3164f332014-03-11 03:39:26 +00003386 void getTargetDefines(const LangOptions &Opts,
3387 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003388 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3389 }
3390};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003391
3392// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003393class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003394public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003395 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003396 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003397 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003398 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3399 }
Craig Topper3164f332014-03-11 03:39:26 +00003400 void getTargetDefines(const LangOptions &Opts,
3401 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003402 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3403 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3404 // The value of the following reflects processor type.
3405 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3406 // We lost the original triple, so we use the default.
3407 Builder.defineMacro("_M_IX86", "600");
3408 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003409};
3410} // end anonymous namespace
3411
Reid Kleckner47606832014-04-21 20:58:00 +00003412static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3413 Builder.defineMacro("__MSVCRT__");
3414 Builder.defineMacro("__MINGW32__");
3415
3416 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3417 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3418 // macro anyway for pre-processor compatibility.
3419 if (Opts.MicrosoftExt)
3420 Builder.defineMacro("__declspec", "__declspec");
3421 else
3422 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3423
3424 if (!Opts.MicrosoftExt) {
3425 // Provide macros for all the calling convention keywords. Provide both
3426 // single and double underscore prefixed variants. These are available on
3427 // x64 as well as x86, even though they have no effect.
3428 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3429 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003430 std::string GCCSpelling = "__attribute__((__";
3431 GCCSpelling += CC;
3432 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003433 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3434 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3435 }
3436 }
3437}
3438
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003439namespace {
3440// x86-32 MinGW target
3441class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3442public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003443 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3444 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003445 void getTargetDefines(const LangOptions &Opts,
3446 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003447 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003448 DefineStd(Builder, "WIN32", Opts);
3449 DefineStd(Builder, "WINNT", Opts);
3450 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003451 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003452 }
3453};
3454} // end anonymous namespace
3455
3456namespace {
3457// x86-32 Cygwin target
3458class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3459public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003460 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3461 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003462 TLSSupported = false;
3463 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003464 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003465 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003466 }
Craig Topper3164f332014-03-11 03:39:26 +00003467 void getTargetDefines(const LangOptions &Opts,
3468 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003469 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003470 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003471 Builder.defineMacro("__CYGWIN__");
3472 Builder.defineMacro("__CYGWIN32__");
3473 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003474 if (Opts.CPlusPlus)
3475 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003476 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003477};
3478} // end anonymous namespace
3479
3480namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003481// x86-32 Haiku target
3482class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3483public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003484 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003485 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003486 IntPtrType = SignedLong;
3487 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003488 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003489 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003490 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003491 }
Craig Topper3164f332014-03-11 03:39:26 +00003492 void getTargetDefines(const LangOptions &Opts,
3493 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003494 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3495 Builder.defineMacro("__INTEL__");
3496 Builder.defineMacro("__HAIKU__");
3497 }
3498};
3499} // end anonymous namespace
3500
Douglas Gregor9fabd852011-07-01 22:41:14 +00003501// RTEMS Target
3502template<typename Target>
3503class RTEMSTargetInfo : public OSTargetInfo<Target> {
3504protected:
Craig Topper3164f332014-03-11 03:39:26 +00003505 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3506 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003507 // RTEMS defines; list based off of gcc output
3508
Douglas Gregor9fabd852011-07-01 22:41:14 +00003509 Builder.defineMacro("__rtems__");
3510 Builder.defineMacro("__ELF__");
3511 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003512
Douglas Gregor9fabd852011-07-01 22:41:14 +00003513public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003514 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3515 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003516
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003517 switch (Triple.getArch()) {
3518 default:
3519 case llvm::Triple::x86:
3520 // this->MCountName = ".mcount";
3521 break;
3522 case llvm::Triple::mips:
3523 case llvm::Triple::mipsel:
3524 case llvm::Triple::ppc:
3525 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003526 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003527 // this->MCountName = "_mcount";
3528 break;
3529 case llvm::Triple::arm:
3530 // this->MCountName = "__mcount";
3531 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003532 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003533 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003534};
3535
3536namespace {
3537// x86-32 RTEMS target
3538class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3539public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003540 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003541 SizeType = UnsignedLong;
3542 IntPtrType = SignedLong;
3543 PtrDiffType = SignedLong;
3544 this->UserLabelPrefix = "";
3545 }
Craig Topper3164f332014-03-11 03:39:26 +00003546 void getTargetDefines(const LangOptions &Opts,
3547 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003548 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3549 Builder.defineMacro("__INTEL__");
3550 Builder.defineMacro("__rtems__");
3551 }
3552};
3553} // end anonymous namespace
3554
Chris Lattnerb986aba2010-04-11 19:29:39 +00003555namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003556// x86-64 generic target
3557class X86_64TargetInfo : public X86TargetInfo {
3558public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003559 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003560 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003561 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003562 LongDoubleWidth = 128;
3563 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003564 LargeArrayMinWidth = 128;
3565 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003566 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003567 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3568 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3569 IntPtrType = IsX32 ? SignedInt : SignedLong;
3570 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003571 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003572 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003573
Eric Christopher917e9522014-11-18 22:36:15 +00003574 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003575 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003576 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3577 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003578
3579 // Use fpret only for long double.
3580 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003581
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003582 // Use fp2ret for _Complex long double.
3583 ComplexLongDoubleUsesFP2Ret = true;
3584
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003585 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003586 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003587 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003588 }
Craig Topper3164f332014-03-11 03:39:26 +00003589 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003590 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003591 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003592
Craig Topper3164f332014-03-11 03:39:26 +00003593 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003594 if (RegNo == 0) return 0;
3595 if (RegNo == 1) return 1;
3596 return -1;
3597 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003598
Craig Topper3164f332014-03-11 03:39:26 +00003599 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003600 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003601 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003602 CC == CC_IntelOclBicc ||
3603 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003604 }
3605
Craig Topper3164f332014-03-11 03:39:26 +00003606 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003607 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003608 }
3609
Pavel Chupinfd223e12014-08-04 12:39:43 +00003610 // for x32 we need it here explicitly
3611 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003612};
3613} // end anonymous namespace
3614
3615namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003616// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003617class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003618public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003619 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3620 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003621 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003622 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003623 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003624 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003625 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003626 SizeType = UnsignedLongLong;
3627 PtrDiffType = SignedLongLong;
3628 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003629 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003630 }
Craig Topper3164f332014-03-11 03:39:26 +00003631 void getTargetDefines(const LangOptions &Opts,
3632 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003633 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003634 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003635 }
Craig Topper3164f332014-03-11 03:39:26 +00003636 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003637 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003638 }
Craig Topper3164f332014-03-11 03:39:26 +00003639 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003640 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003641 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003642 CC == CC_IntelOclBicc ||
3643 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3644 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003645};
3646} // end anonymous namespace
3647
3648namespace {
3649// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003650class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003651public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003652 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003653 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003654 LongDoubleWidth = LongDoubleAlign = 64;
3655 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003656 }
Craig Topper3164f332014-03-11 03:39:26 +00003657 void getTargetDefines(const LangOptions &Opts,
3658 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003659 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3660 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003661 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003662 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003663 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003664};
3665} // end anonymous namespace
3666
3667namespace {
3668// x86-64 MinGW target
3669class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3670public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003671 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3672 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003673 void getTargetDefines(const LangOptions &Opts,
3674 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003675 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003676 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003677 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003678 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003679
3680 // GCC defines this macro when it is using __gxx_personality_seh0.
3681 if (!Opts.SjLjExceptions)
3682 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003683 }
3684};
3685} // end anonymous namespace
3686
3687namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003688class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3689public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003690 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3691 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003692 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003693 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003694 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3695 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003696 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003697 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003698 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003699 }
3700};
3701} // end anonymous namespace
3702
3703namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003704class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3705public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003706 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3707 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003708 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003709 Int64Type = SignedLongLong;
3710 }
3711};
3712} // end anonymous namespace
3713
3714namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003715class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3716public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003717 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3718 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3719 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003720 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003721 }
3722};
Tim Northover9bb857a2013-01-31 12:13:10 +00003723}
3724
Eli Friedman9fa28852012-08-08 23:57:20 +00003725
3726namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003727class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003728 // Possible FPU choices.
3729 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003730 VFP2FPU = (1 << 0),
3731 VFP3FPU = (1 << 1),
3732 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003733 NeonFPU = (1 << 3),
3734 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003735 };
3736
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003737 // Possible HWDiv features.
3738 enum HWDivMode {
3739 HWDivThumb = (1 << 0),
3740 HWDivARM = (1 << 1)
3741 };
3742
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003743 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003744 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003745 }
3746
3747 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3748 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003749
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003750 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003751
Rafael Espindolaeb265472013-08-21 21:59:03 +00003752 enum {
3753 FP_Default,
3754 FP_VFP,
3755 FP_Neon
3756 } FPMath;
3757
Bernard Ogdenda13af32013-10-24 18:32:51 +00003758 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003759
Logan Chien57086ce2012-10-10 06:56:20 +00003760 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003761 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003762 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003763
3764 // Initialized via features.
3765 unsigned SoftFloat : 1;
3766 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003767
Bernard Ogden18b57012013-10-29 09:47:51 +00003768 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003769 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003770
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003771 // ACLE 6.5.1 Hardware floating point
3772 enum {
3773 HW_FP_HP = (1 << 1), /// half (16-bit)
3774 HW_FP_SP = (1 << 2), /// single (32-bit)
3775 HW_FP_DP = (1 << 3), /// double (64-bit)
3776 };
3777 uint32_t HW_FP;
3778
Chris Lattner5cc15e02010-03-03 19:03:45 +00003779 static const Builtin::Info BuiltinInfo[];
3780
Rafael Espindola101d5b92013-05-13 20:09:47 +00003781 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003782 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003783 if (T.getArch() == llvm::Triple::arm ||
3784 T.getArch() == llvm::Triple::armeb) {
3785 StringRef VersionStr;
3786 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003787 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003788 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003789 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003790 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003791 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003792 unsigned Version;
3793 if (VersionStr.getAsInteger(10, Version))
3794 return false;
3795 return Version >= 6;
3796 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003797 assert(T.getArch() == llvm::Triple::thumb ||
3798 T.getArch() == llvm::Triple::thumbeb);
3799 StringRef VersionStr;
3800 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003801 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003802 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003803 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003804 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003805 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003806 unsigned Version;
3807 if (VersionStr.getAsInteger(10, Version))
3808 return false;
3809 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003810 }
3811
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003812 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003813 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003814
3815 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003816 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003817
Tim Northover00853e52014-08-05 11:07:26 +00003818 // size_t is unsigned long on MachO-derived environments and NetBSD.
3819 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003820 SizeType = UnsignedLong;
3821 else
3822 SizeType = UnsignedInt;
3823
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003824 switch (T.getOS()) {
3825 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003826 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003827 break;
3828 case llvm::Triple::Win32:
3829 WCharType = UnsignedShort;
3830 break;
3831 case llvm::Triple::Linux:
3832 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003833 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3834 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003835 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003836 }
3837
3838 UseBitFieldTypeAlignment = true;
3839
3840 ZeroLengthBitfieldBoundary = 0;
3841
Tim Northover147cd2f2014-10-14 22:12:21 +00003842 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3843 // so set preferred for small types to 32.
3844 if (T.isOSBinFormatMachO()) {
3845 DescriptionString =
3846 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3847 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3848 } else if (T.isOSWindows()) {
3849 // FIXME: this is invalid for WindowsCE
3850 assert(!BigEndian && "Windows on ARM does not support big endian");
3851 DescriptionString = "e"
3852 "-m:e"
3853 "-p:32:32"
3854 "-i64:64"
3855 "-v128:64:128"
3856 "-a:0:32"
3857 "-n32"
3858 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003859 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003860 DescriptionString =
3861 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3862 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003863 }
3864
3865 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003866 }
3867
3868 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003869 const llvm::Triple &T = getTriple();
3870
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003871 IsAAPCS = false;
3872
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003873 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003874
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003875 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003876 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003877 SizeType = UnsignedInt;
3878 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003879 SizeType = UnsignedLong;
3880
3881 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3882 WCharType = SignedInt;
3883
3884 // Do not respect the alignment of bit-field types when laying out
3885 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3886 UseBitFieldTypeAlignment = false;
3887
3888 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3889 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3890 /// gcc.
3891 ZeroLengthBitfieldBoundary = 32;
3892
Tim Northover147cd2f2014-10-14 22:12:21 +00003893 if (T.isOSBinFormatMachO())
3894 DescriptionString =
3895 BigEndian
3896 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3897 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3898 else
3899 DescriptionString =
3900 BigEndian
3901 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3902 : "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 +00003903
3904 // FIXME: Override "preferred align" for double and long long.
3905 }
3906
Chris Lattner17df24e2008-04-21 18:56:49 +00003907public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003908 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003909 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003910 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003911 BigEndian = IsBigEndian;
3912
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003913 switch (getTriple().getOS()) {
3914 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003915 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003916 break;
3917 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003918 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003919 break;
3920 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003921
Chris Lattner1a8f3942010-04-23 16:29:58 +00003922 // {} in inline assembly are neon specifiers, not assembly variant
3923 // specifiers.
3924 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003925
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003926 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003927 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003928
Eric Christopher0e261882014-12-05 01:06:59 +00003929 // FIXME: This duplicates code from the driver that sets the -target-abi
3930 // option - this code is used if -target-abi isn't passed and should
3931 // be unified in some way.
3932 if (Triple.isOSBinFormatMachO()) {
3933 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3934 // the frontend matches that.
3935 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3936 Triple.getOS() == llvm::Triple::UnknownOS ||
3937 StringRef(CPU).startswith("cortex-m")) {
3938 setABI("aapcs");
3939 } else {
3940 setABI("apcs-gnu");
3941 }
3942 } else if (Triple.isOSWindows()) {
3943 // FIXME: this is invalid for WindowsCE
3944 setABI("aapcs");
3945 } else {
3946 // Select the default based on the platform.
3947 switch (Triple.getEnvironment()) {
3948 case llvm::Triple::Android:
3949 case llvm::Triple::GNUEABI:
3950 case llvm::Triple::GNUEABIHF:
3951 setABI("aapcs-linux");
3952 break;
3953 case llvm::Triple::EABIHF:
3954 case llvm::Triple::EABI:
3955 setABI("aapcs");
3956 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00003957 case llvm::Triple::GNU:
3958 setABI("apcs-gnu");
3959 break;
Eric Christopher0e261882014-12-05 01:06:59 +00003960 default:
3961 if (Triple.getOS() == llvm::Triple::NetBSD)
3962 setABI("apcs-gnu");
3963 else
3964 setABI("aapcs");
3965 break;
3966 }
3967 }
John McCall86353412010-08-21 22:46:04 +00003968
3969 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003970 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003971
3972 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003973 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003974 if (shouldUseInlineAtomic(getTriple()))
3975 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003976
3977 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00003978 // the alignment of the zero-length bitfield is greater than the member
3979 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00003980 // zero length bitfield.
3981 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003982 }
Alp Toker4925ba72014-06-07 23:30:42 +00003983 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003984 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003985 ABI = Name;
3986
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003987 // The defaults (above) are for AAPCS, check if we need to change them.
3988 //
3989 // FIXME: We need support for -meabi... we could just mangle it into the
3990 // name.
3991 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003992 setABIAPCS();
3993 return true;
3994 }
3995 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3996 setABIAAPCS();
3997 return true;
3998 }
3999 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004000 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004001
Craig Topper3164f332014-03-11 03:39:26 +00004002 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004003 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004004 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4005 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004006 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004007 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004008 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004009 }
4010 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004011 Features["vfp4"] = true;
4012 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004013 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4014 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004015 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004016 Features["vfp4"] = true;
4017 Features["neon"] = true;
4018 Features["hwdiv"] = true;
4019 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004020 } else if (CPU == "cyclone") {
4021 Features["v8fp"] = true;
4022 Features["neon"] = true;
4023 Features["hwdiv"] = true;
4024 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00004025 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
4026 Features["fp-armv8"] = true;
4027 Features["neon"] = true;
4028 Features["hwdiv"] = true;
4029 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004030 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004031 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004032 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004033 // Enable the hwdiv extension for all v8a AArch32 cores by
4034 // default.
4035 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004036 ArchName == "armebv8a" || ArchName == "armebv8" ||
4037 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4038 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004039 Features["hwdiv"] = true;
4040 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00004041 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004042 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004043 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004044 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004045
Craig Topper3164f332014-03-11 03:39:26 +00004046 bool handleTargetFeatures(std::vector<std::string> &Features,
4047 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004048 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004049 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004050 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004051 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004052 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004053
4054 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004055 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004056 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004057 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004058 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004059 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004060 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004061 HW_FP = HW_FP_SP | HW_FP_DP;
4062 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004063 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004064 HW_FP = HW_FP_SP | HW_FP_DP;
4065 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004066 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004067 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4068 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004069 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004070 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4071 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004072 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004073 HW_FP = HW_FP_SP | HW_FP_DP;
4074 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004075 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004076 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004077 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004078 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004079 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004080 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004081 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004082 } else if (Feature == "+fp-only-sp") {
4083 HW_FP &= ~HW_FP_DP;
4084 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004085 }
4086
Rafael Espindolaeb265472013-08-21 21:59:03 +00004087 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4088 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4089 return false;
4090 }
4091
4092 if (FPMath == FP_Neon)
4093 Features.push_back("+neonfp");
4094 else if (FPMath == FP_VFP)
4095 Features.push_back("-neonfp");
4096
Daniel Dunbar893d4752009-12-19 04:15:38 +00004097 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004098 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4099 for (const auto &FEFeature : FrontEndFeatures) {
4100 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4101 if (Feature != Features.end())
4102 Features.erase(Feature);
4103 }
4104
Rafael Espindolaeb265472013-08-21 21:59:03 +00004105 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004106 }
4107
Craig Topper3164f332014-03-11 03:39:26 +00004108 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004109 return llvm::StringSwitch<bool>(Feature)
4110 .Case("arm", true)
4111 .Case("softfloat", SoftFloat)
4112 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004113 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004114 .Case("hwdiv", HWDiv & HWDivThumb)
4115 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004116 .Default(false);
4117 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004118 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004119 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004120 return llvm::StringSwitch<const char *>(Name)
4121 .Cases("arm8", "arm810", "4")
4122 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4123 "4")
4124 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4125 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4126 .Case("ep9312", "4T")
4127 .Cases("arm10tdmi", "arm1020t", "5T")
4128 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4129 .Case("arm926ej-s", "5TEJ")
4130 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4131 .Cases("xscale", "iwmmxt", "5TE")
4132 .Case("arm1136j-s", "6J")
4133 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4134 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4135 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4136 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4137 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4138 "7A")
4139 .Cases("cortex-r4", "cortex-r5", "7R")
4140 .Case("swift", "7S")
4141 .Case("cyclone", "8A")
4142 .Case("cortex-m3", "7M")
4143 .Cases("cortex-m4", "cortex-m7", "7EM")
4144 .Case("cortex-m0", "6M")
4145 .Cases("cortex-a53", "cortex-a57", "8A")
4146 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004147 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004148 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004149 return llvm::StringSwitch<const char *>(Name)
4150 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4151 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4152 "A")
4153 .Cases("cortex-a53", "cortex-a57", "A")
4154 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
4155 .Cases("cortex-r4", "cortex-r5", "R")
4156 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004157 }
Craig Topper3164f332014-03-11 03:39:26 +00004158 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004159 if (!getCPUDefineSuffix(Name))
4160 return false;
4161
Tim Northovere8c37212014-07-09 09:24:43 +00004162 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4163 StringRef Profile = getCPUProfile(Name);
4164 if (Profile == "M" && MaxAtomicInlineWidth) {
4165 MaxAtomicPromoteWidth = 32;
4166 MaxAtomicInlineWidth = 32;
4167 }
4168
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004169 CPU = Name;
4170 return true;
4171 }
Craig Topper3164f332014-03-11 03:39:26 +00004172 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004173 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4174 unsigned CPUArchVer) const {
4175 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4176 (CPUArch.find('M') != StringRef::npos);
4177 }
4178 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4179 unsigned CPUArchVer) const {
4180 // We check both CPUArchVer and ArchName because when only triple is
4181 // specified, the default CPU is arm1136j-s.
4182 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4183 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4184 }
Craig Topper3164f332014-03-11 03:39:26 +00004185 void getTargetDefines(const LangOptions &Opts,
4186 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004187 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004188 Builder.defineMacro("__arm");
4189 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004190
Chris Lattnerecd49032009-03-02 22:27:17 +00004191 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004192 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004193
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004194 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004195 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004196 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004197 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004198 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004199
4200 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004201 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004202 StringRef ArchName = getTriple().getArchName();
4203
4204 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4205 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004206 if (CPUArch[0] >= '8') {
4207 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4208 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004209 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004210
4211 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4212 // is not defined for the M-profile.
4213 // NOTE that the deffault profile is assumed to be 'A'
4214 if (CPUProfile.empty() || CPUProfile != "M")
4215 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4216
4217 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4218 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4219 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4220 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4221 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4222 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4223 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4224
4225 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4226 // instruction set such as ARM or Thumb.
4227 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4228
4229 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4230
4231 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004232 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004233 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004234
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004235 // ACLE 6.5.1 Hardware Floating Point
4236 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004237 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004238
Yi Konga44c4d72014-06-27 21:25:42 +00004239 // ACLE predefines.
4240 Builder.defineMacro("__ARM_ACLE", "200");
4241
Mike Stump9d54bd72009-04-08 02:07:04 +00004242 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004243
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004244 // FIXME: It's more complicated than this and we don't really support
4245 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004246 // Windows on ARM does not "support" interworking
4247 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004248 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004249
David Tweed8f676532012-10-25 13:33:01 +00004250 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004251 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004252 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4253 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004254 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004255 Builder.defineMacro("__ARM_PCS", "1");
4256
David Tweed8f676532012-10-25 13:33:01 +00004257 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004258 Builder.defineMacro("__ARM_PCS_VFP", "1");
4259 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004260
Daniel Dunbar893d4752009-12-19 04:15:38 +00004261 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004262 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004263
4264 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004265 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004266
4267 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004268 Builder.defineMacro("__THUMBEL__");
4269 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004270 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004271 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004272 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004273 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4274 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004275
4276 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004277 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004278
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004279 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004280 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004281 if (FPU & VFP2FPU)
4282 Builder.defineMacro("__ARM_VFPV2__");
4283 if (FPU & VFP3FPU)
4284 Builder.defineMacro("__ARM_VFPV3__");
4285 if (FPU & VFP4FPU)
4286 Builder.defineMacro("__ARM_VFPV4__");
4287 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004288
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004289 // This only gets set when Neon instructions are actually available, unlike
4290 // the VFP define, hence the soft float and arch check. This is subtly
4291 // different from gcc, we follow the intent which was that it should be set
4292 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004293 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4294 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004295 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004296 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004297
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004298 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4299 Opts.ShortWChar ? "2" : "4");
4300
4301 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4302 Opts.ShortEnums ? "1" : "4");
4303
Bernard Ogden18b57012013-10-29 09:47:51 +00004304 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004305 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004306
Tim Northover02e38602014-02-03 17:28:04 +00004307 if (Crypto)
4308 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4309
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004310 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004311 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4312 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4313 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4314 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4315 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004316
4317 bool is5EOrAbove = (CPUArchVer >= 6 ||
4318 (CPUArchVer == 5 &&
4319 CPUArch.find('E') != StringRef::npos));
4320 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4321 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4322 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004323 }
Craig Topper3164f332014-03-11 03:39:26 +00004324 void getTargetBuiltins(const Builtin::Info *&Records,
4325 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004326 Records = BuiltinInfo;
4327 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004328 }
Craig Topper3164f332014-03-11 03:39:26 +00004329 bool isCLZForZeroUndef() const override { return false; }
4330 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004331 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004332 }
Craig Topper3164f332014-03-11 03:39:26 +00004333 void getGCCRegNames(const char * const *&Names,
4334 unsigned &NumNames) const override;
4335 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4336 unsigned &NumAliases) const override;
4337 bool validateAsmConstraint(const char *&Name,
4338 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004339 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004340 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004341 case 'l': // r0-r7
4342 case 'h': // r8-r15
4343 case 'w': // VFP Floating point register single precision
4344 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004345 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004346 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004347 case 'I':
4348 case 'J':
4349 case 'K':
4350 case 'L':
4351 case 'M':
4352 // FIXME
4353 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004354 case 'Q': // A memory address that is a single base register.
4355 Info.setAllowsMemory();
4356 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004357 case 'U': // a memory reference...
4358 switch (Name[1]) {
4359 case 'q': // ...ARMV4 ldrsb
4360 case 'v': // ...VFP load/store (reg+constant offset)
4361 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004362 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004363 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004364 case 'n': // valid address for Neon doubleword vector load/store
4365 case 'm': // valid address for Neon element and structure load/store
4366 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004367 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004368 Info.setAllowsMemory();
4369 Name++;
4370 return true;
4371 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004372 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004373 return false;
4374 }
Craig Topper3164f332014-03-11 03:39:26 +00004375 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004376 std::string R;
4377 switch (*Constraint) {
4378 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004379 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004380 Constraint++;
4381 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004382 case 'p': // 'p' should be translated to 'r' by default.
4383 R = std::string("r");
4384 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004385 default:
4386 return std::string(1, *Constraint);
4387 }
4388 return R;
4389 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004390 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004391 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004392 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004393 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004394 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004395
Bill Wendling9d1ee112012-10-25 23:28:48 +00004396 // Strip off constraint modifiers.
4397 while (Constraint[0] == '=' ||
4398 Constraint[0] == '+' ||
4399 Constraint[0] == '&')
4400 Constraint = Constraint.substr(1);
4401
4402 switch (Constraint[0]) {
4403 default: break;
4404 case 'r': {
4405 switch (Modifier) {
4406 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004407 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004408 case 'q':
4409 // A register of size 32 cannot fit a vector type.
4410 return false;
4411 }
4412 }
4413 }
4414
4415 return true;
4416 }
Craig Topper3164f332014-03-11 03:39:26 +00004417 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004418 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004419 return "";
4420 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004421
Craig Topper3164f332014-03-11 03:39:26 +00004422 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004423 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4424 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004425
Craig Topper3164f332014-03-11 03:39:26 +00004426 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004427 if (RegNo == 0) return 0;
4428 if (RegNo == 1) return 1;
4429 return -1;
4430 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004431};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004432
Rafael Espindolaeb265472013-08-21 21:59:03 +00004433bool ARMTargetInfo::setFPMath(StringRef Name) {
4434 if (Name == "neon") {
4435 FPMath = FP_Neon;
4436 return true;
4437 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4438 Name == "vfp4") {
4439 FPMath = FP_VFP;
4440 return true;
4441 }
4442 return false;
4443}
4444
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004445const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004446 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004447 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004448 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4449
4450 // Float registers
4451 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4452 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4453 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004454 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004455
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004456 // Double registers
4457 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4458 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004459 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4460 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004461
4462 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004463 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4464 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004465};
4466
4467void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004468 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004469 Names = GCCRegNames;
4470 NumNames = llvm::array_lengthof(GCCRegNames);
4471}
4472
4473const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004474 { { "a1" }, "r0" },
4475 { { "a2" }, "r1" },
4476 { { "a3" }, "r2" },
4477 { { "a4" }, "r3" },
4478 { { "v1" }, "r4" },
4479 { { "v2" }, "r5" },
4480 { { "v3" }, "r6" },
4481 { { "v4" }, "r7" },
4482 { { "v5" }, "r8" },
4483 { { "v6", "rfp" }, "r9" },
4484 { { "sl" }, "r10" },
4485 { { "fp" }, "r11" },
4486 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004487 { { "r13" }, "sp" },
4488 { { "r14" }, "lr" },
4489 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004490 // The S, D and Q registers overlap, but aren't really aliases; we
4491 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004492};
4493
4494void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4495 unsigned &NumAliases) const {
4496 Aliases = GCCRegAliases;
4497 NumAliases = llvm::array_lengthof(GCCRegAliases);
4498}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004499
4500const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004501#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004502#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004503 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004504#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004505
4506#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004507#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004508#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4509 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004510#include "clang/Basic/BuiltinsARM.def"
4511};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004512
4513class ARMleTargetInfo : public ARMTargetInfo {
4514public:
4515 ARMleTargetInfo(const llvm::Triple &Triple)
4516 : ARMTargetInfo(Triple, false) { }
4517 virtual void getTargetDefines(const LangOptions &Opts,
4518 MacroBuilder &Builder) const {
4519 Builder.defineMacro("__ARMEL__");
4520 ARMTargetInfo::getTargetDefines(Opts, Builder);
4521 }
4522};
4523
4524class ARMbeTargetInfo : public ARMTargetInfo {
4525public:
4526 ARMbeTargetInfo(const llvm::Triple &Triple)
4527 : ARMTargetInfo(Triple, true) { }
4528 virtual void getTargetDefines(const LangOptions &Opts,
4529 MacroBuilder &Builder) const {
4530 Builder.defineMacro("__ARMEB__");
4531 Builder.defineMacro("__ARM_BIG_ENDIAN");
4532 ARMTargetInfo::getTargetDefines(Opts, Builder);
4533 }
4534};
Chris Lattner17df24e2008-04-21 18:56:49 +00004535} // end anonymous namespace.
4536
Eli Friedmanf05b7722008-08-20 07:44:10 +00004537namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004538class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4539 const llvm::Triple Triple;
4540public:
4541 WindowsARMTargetInfo(const llvm::Triple &Triple)
4542 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4543 TLSSupported = false;
4544 WCharType = UnsignedShort;
4545 SizeType = UnsignedInt;
4546 UserLabelPrefix = "";
4547 }
4548 void getVisualStudioDefines(const LangOptions &Opts,
4549 MacroBuilder &Builder) const {
4550 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4551
4552 // FIXME: this is invalid for WindowsCE
4553 Builder.defineMacro("_M_ARM_NT", "1");
4554 Builder.defineMacro("_M_ARMT", "_M_ARM");
4555 Builder.defineMacro("_M_THUMB", "_M_ARM");
4556
4557 assert((Triple.getArch() == llvm::Triple::arm ||
4558 Triple.getArch() == llvm::Triple::thumb) &&
4559 "invalid architecture for Windows ARM target info");
4560 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4561 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4562
4563 // TODO map the complete set of values
4564 // 31: VFPv3 40: VFPv4
4565 Builder.defineMacro("_M_ARM_FP", "31");
4566 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004567 BuiltinVaListKind getBuiltinVaListKind() const override {
4568 return TargetInfo::CharPtrBuiltinVaList;
4569 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004570};
4571
4572// Windows ARM + Itanium C++ ABI Target
4573class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4574public:
4575 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4576 : WindowsARMTargetInfo(Triple) {
4577 TheCXXABI.set(TargetCXXABI::GenericARM);
4578 }
4579
4580 void getTargetDefines(const LangOptions &Opts,
4581 MacroBuilder &Builder) const override {
4582 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4583
4584 if (Opts.MSVCCompat)
4585 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4586 }
4587};
4588
4589// Windows ARM, MS (C++) ABI
4590class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4591public:
4592 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4593 : WindowsARMTargetInfo(Triple) {
4594 TheCXXABI.set(TargetCXXABI::Microsoft);
4595 }
4596
4597 void getTargetDefines(const LangOptions &Opts,
4598 MacroBuilder &Builder) const override {
4599 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4600 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4601 }
4602};
4603}
4604
4605
4606namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004607class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004608 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004609protected:
Craig Topper3164f332014-03-11 03:39:26 +00004610 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4611 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004612 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004613 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004614
Torok Edwinb2b37c62009-06-30 17:10:35 +00004615public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004616 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004617 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004618 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004619 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004620 // FIXME: This should be based off of the target features in
4621 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004622 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004623
4624 // Darwin on iOS uses a variant of the ARM C++ ABI.
4625 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004626 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004627};
4628} // end anonymous namespace.
4629
Tony Linthicum76329bf2011-12-12 21:14:55 +00004630
4631namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004632class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004633 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004634 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4635 static const char *const GCCRegNames[];
4636
James Molloy75f5f9e2014-04-16 15:33:48 +00004637 enum FPUModeEnum {
4638 FPUMode,
4639 NeonMode
4640 };
4641
4642 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004643 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004644 unsigned Crypto;
4645
Tim Northovera2ee4332014-03-29 15:09:45 +00004646 static const Builtin::Info BuiltinInfo[];
4647
4648 std::string ABI;
4649
4650public:
Tim Northover573cbee2014-05-24 12:52:07 +00004651 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004652 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004653
4654 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4655 WCharType = SignedInt;
4656
4657 // NetBSD apparently prefers consistency across ARM targets to consistency
4658 // across 64-bit targets.
4659 Int64Type = SignedLongLong;
4660 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004661 } else {
4662 WCharType = UnsignedInt;
4663 Int64Type = SignedLong;
4664 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004665 }
4666
Tim Northovera2ee4332014-03-29 15:09:45 +00004667 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004668 MaxVectorAlign = 128;
4669 RegParmMax = 8;
4670 MaxAtomicInlineWidth = 128;
4671 MaxAtomicPromoteWidth = 128;
4672
4673 LongDoubleWidth = LongDoubleAlign = 128;
4674 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4675
Tim Northovera2ee4332014-03-29 15:09:45 +00004676 // {} in inline assembly are neon specifiers, not assembly variant
4677 // specifiers.
4678 NoAsmVariants = true;
4679
Tim Northover7ad87af2015-01-16 18:44:04 +00004680 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4681 // contributes to the alignment of the containing aggregate in the same way
4682 // a plain (non bit-field) member of that type would, without exception for
4683 // zero-sized or anonymous bit-fields."
4684 UseBitFieldTypeAlignment = true;
4685 UseZeroLengthBitfieldAlignment = true;
4686
Tim Northover573cbee2014-05-24 12:52:07 +00004687 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004688 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4689 }
4690
Alp Toker4925ba72014-06-07 23:30:42 +00004691 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004692 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004693 if (Name != "aapcs" && Name != "darwinpcs")
4694 return false;
4695
4696 ABI = Name;
4697 return true;
4698 }
4699
David Blaikie1cbb9712014-11-14 19:09:44 +00004700 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004701 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004702 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004703 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004704 .Case("cyclone", true)
4705 .Default(false);
4706 return CPUKnown;
4707 }
4708
4709 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004710 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004711 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004712 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004713
4714 // Target properties.
4715 Builder.defineMacro("_LP64");
4716 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004717
4718 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4719 Builder.defineMacro("__ARM_ACLE", "200");
4720 Builder.defineMacro("__ARM_ARCH", "8");
4721 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4722
4723 Builder.defineMacro("__ARM_64BIT_STATE");
4724 Builder.defineMacro("__ARM_PCS_AAPCS64");
4725 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4726
4727 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4728 Builder.defineMacro("__ARM_FEATURE_CLZ");
4729 Builder.defineMacro("__ARM_FEATURE_FMA");
4730 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004731 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4732 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4733 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4734 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004735
4736 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4737
4738 // 0xe implies support for half, single and double precision operations.
4739 Builder.defineMacro("__ARM_FP", "0xe");
4740
4741 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4742 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4743 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4744
4745 if (Opts.FastMath || Opts.FiniteMathOnly)
4746 Builder.defineMacro("__ARM_FP_FAST");
4747
Richard Smithab506ad2014-10-20 23:26:58 +00004748 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004749 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4750
4751 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4752
4753 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4754 Opts.ShortEnums ? "1" : "4");
4755
James Molloy75f5f9e2014-04-16 15:33:48 +00004756 if (FPU == NeonMode) {
4757 Builder.defineMacro("__ARM_NEON");
4758 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004759 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004760 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004761
Bradley Smith418c5932014-05-02 15:17:51 +00004762 if (CRC)
4763 Builder.defineMacro("__ARM_FEATURE_CRC32");
4764
James Molloy75f5f9e2014-04-16 15:33:48 +00004765 if (Crypto)
4766 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004767 }
4768
4769 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004770 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004771 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004772 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004773 }
4774
David Blaikie1cbb9712014-11-14 19:09:44 +00004775 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004776 return Feature == "aarch64" ||
4777 Feature == "arm64" ||
4778 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004779 }
4780
James Molloy5e73df52014-04-16 15:06:20 +00004781 bool handleTargetFeatures(std::vector<std::string> &Features,
4782 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004783 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004784 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004785 Crypto = 0;
4786 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4787 if (Features[i] == "+neon")
4788 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004789 if (Features[i] == "+crc")
4790 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004791 if (Features[i] == "+crypto")
4792 Crypto = 1;
4793 }
4794
James Molloy5e73df52014-04-16 15:06:20 +00004795 setDescriptionString();
4796
4797 return true;
4798 }
4799
David Blaikie1cbb9712014-11-14 19:09:44 +00004800 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004801
David Blaikie1cbb9712014-11-14 19:09:44 +00004802 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004803 return TargetInfo::AArch64ABIBuiltinVaList;
4804 }
4805
4806 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004807 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004808 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004809 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004810
Eric Christopher917e9522014-11-18 22:36:15 +00004811 virtual bool
4812 validateAsmConstraint(const char *&Name,
4813 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004814 switch (*Name) {
4815 default:
4816 return false;
4817 case 'w': // Floating point and SIMD registers (V0-V31)
4818 Info.setAllowsRegister();
4819 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004820 case 'I': // Constant that can be used with an ADD instruction
4821 case 'J': // Constant that can be used with a SUB instruction
4822 case 'K': // Constant that can be used with a 32-bit logical instruction
4823 case 'L': // Constant that can be used with a 64-bit logical instruction
4824 case 'M': // Constant that can be used as a 32-bit MOV immediate
4825 case 'N': // Constant that can be used as a 64-bit MOV immediate
4826 case 'Y': // Floating point constant zero
4827 case 'Z': // Integer constant zero
4828 return true;
4829 case 'Q': // A memory reference with base register and no offset
4830 Info.setAllowsMemory();
4831 return true;
4832 case 'S': // A symbolic address
4833 Info.setAllowsRegister();
4834 return true;
4835 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004836 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4837 // Utf: A memory address suitable for ldp/stp in TF mode.
4838 // Usa: An absolute symbolic address.
4839 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4840 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004841 case 'z': // Zero register, wzr or xzr
4842 Info.setAllowsRegister();
4843 return true;
4844 case 'x': // Floating point and SIMD registers (V0-V15)
4845 Info.setAllowsRegister();
4846 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004847 }
4848 return false;
4849 }
4850
Akira Hatanaka987f1862014-08-22 06:05:21 +00004851 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004852 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004853 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004854 // Strip off constraint modifiers.
4855 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4856 Constraint = Constraint.substr(1);
4857
4858 switch (Constraint[0]) {
4859 default:
4860 return true;
4861 case 'z':
4862 case 'r': {
4863 switch (Modifier) {
4864 case 'x':
4865 case 'w':
4866 // For now assume that the person knows what they're
4867 // doing with the modifier.
4868 return true;
4869 default:
4870 // By default an 'r' constraint will be in the 'x'
4871 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004872 if (Size == 64)
4873 return true;
4874
4875 SuggestedModifier = "w";
4876 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004877 }
4878 }
4879 }
4880 }
4881
David Blaikie1cbb9712014-11-14 19:09:44 +00004882 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004883
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004884 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004885 if (RegNo == 0)
4886 return 0;
4887 if (RegNo == 1)
4888 return 1;
4889 return -1;
4890 }
4891};
4892
Tim Northover573cbee2014-05-24 12:52:07 +00004893const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004894 // 32-bit Integer registers
4895 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4896 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4897 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4898
4899 // 64-bit Integer registers
4900 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4901 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4902 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4903
4904 // 32-bit floating point regsisters
4905 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4906 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4907 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4908
4909 // 64-bit floating point regsisters
4910 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4911 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4912 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4913
4914 // Vector registers
4915 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4916 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4917 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4918};
4919
Tim Northover573cbee2014-05-24 12:52:07 +00004920void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004921 unsigned &NumNames) const {
4922 Names = GCCRegNames;
4923 NumNames = llvm::array_lengthof(GCCRegNames);
4924}
4925
Tim Northover573cbee2014-05-24 12:52:07 +00004926const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004927 { { "w31" }, "wsp" },
4928 { { "x29" }, "fp" },
4929 { { "x30" }, "lr" },
4930 { { "x31" }, "sp" },
4931 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4932 // don't want to substitute one of these for a different-sized one.
4933};
4934
Tim Northover573cbee2014-05-24 12:52:07 +00004935void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004936 unsigned &NumAliases) const {
4937 Aliases = GCCRegAliases;
4938 NumAliases = llvm::array_lengthof(GCCRegAliases);
4939}
4940
Tim Northover573cbee2014-05-24 12:52:07 +00004941const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004942#define BUILTIN(ID, TYPE, ATTRS) \
4943 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4944#include "clang/Basic/BuiltinsNEON.def"
4945
4946#define BUILTIN(ID, TYPE, ATTRS) \
4947 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004948#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004949};
James Molloy5e73df52014-04-16 15:06:20 +00004950
Tim Northover573cbee2014-05-24 12:52:07 +00004951class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004952 void setDescriptionString() override {
4953 if (getTriple().isOSBinFormatMachO())
4954 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4955 else
4956 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4957 }
4958
4959public:
Tim Northover573cbee2014-05-24 12:52:07 +00004960 AArch64leTargetInfo(const llvm::Triple &Triple)
4961 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004962 BigEndian = false;
4963 }
4964 void getTargetDefines(const LangOptions &Opts,
4965 MacroBuilder &Builder) const override {
4966 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004967 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004968 }
4969};
4970
Tim Northover573cbee2014-05-24 12:52:07 +00004971class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004972 void setDescriptionString() override {
4973 assert(!getTriple().isOSBinFormatMachO());
4974 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4975 }
4976
4977public:
Tim Northover573cbee2014-05-24 12:52:07 +00004978 AArch64beTargetInfo(const llvm::Triple &Triple)
4979 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004980 void getTargetDefines(const LangOptions &Opts,
4981 MacroBuilder &Builder) const override {
4982 Builder.defineMacro("__AARCH64EB__");
4983 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4984 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004985 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004986 }
4987};
Tim Northovera2ee4332014-03-29 15:09:45 +00004988} // end anonymous namespace.
4989
4990namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004991class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004992protected:
4993 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4994 MacroBuilder &Builder) const override {
4995 Builder.defineMacro("__AARCH64_SIMD__");
4996 Builder.defineMacro("__ARM64_ARCH_8__");
4997 Builder.defineMacro("__ARM_NEON__");
4998 Builder.defineMacro("__LITTLE_ENDIAN__");
4999 Builder.defineMacro("__REGISTER_PREFIX__", "");
5000 Builder.defineMacro("__arm64", "1");
5001 Builder.defineMacro("__arm64__", "1");
5002
5003 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5004 }
5005
Tim Northovera2ee4332014-03-29 15:09:45 +00005006public:
Tim Northover573cbee2014-05-24 12:52:07 +00005007 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5008 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005009 Int64Type = SignedLongLong;
5010 WCharType = SignedInt;
5011 UseSignedCharForObjCBool = false;
5012
5013 LongDoubleWidth = LongDoubleAlign = 64;
5014 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5015
5016 TheCXXABI.set(TargetCXXABI::iOS64);
5017 }
5018
David Blaikie1cbb9712014-11-14 19:09:44 +00005019 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005020 return TargetInfo::CharPtrBuiltinVaList;
5021 }
5022};
5023} // end anonymous namespace
5024
5025namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005026// Hexagon abstract base class
5027class HexagonTargetInfo : public TargetInfo {
5028 static const Builtin::Info BuiltinInfo[];
5029 static const char * const GCCRegNames[];
5030 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5031 std::string CPU;
5032public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005033 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005034 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005035 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005036
5037 // {} in inline assembly are packet specifiers, not assembly variant
5038 // specifiers.
5039 NoAsmVariants = true;
5040 }
5041
Craig Topper3164f332014-03-11 03:39:26 +00005042 void getTargetBuiltins(const Builtin::Info *&Records,
5043 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005044 Records = BuiltinInfo;
5045 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5046 }
5047
Craig Topper3164f332014-03-11 03:39:26 +00005048 bool validateAsmConstraint(const char *&Name,
5049 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005050 return true;
5051 }
5052
Craig Topper3164f332014-03-11 03:39:26 +00005053 void getTargetDefines(const LangOptions &Opts,
5054 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005055
Craig Topper3164f332014-03-11 03:39:26 +00005056 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005057 return Feature == "hexagon";
5058 }
Craig Topper3164f332014-03-11 03:39:26 +00005059
5060 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005061 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005062 }
Craig Topper3164f332014-03-11 03:39:26 +00005063 void getGCCRegNames(const char * const *&Names,
5064 unsigned &NumNames) const override;
5065 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5066 unsigned &NumAliases) const override;
5067 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005068 return "";
5069 }
Sebastian Pop86500282012-01-13 20:37:10 +00005070
5071 static const char *getHexagonCPUSuffix(StringRef Name) {
5072 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005073 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005074 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005075 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005076 }
5077
Craig Topper3164f332014-03-11 03:39:26 +00005078 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005079 if (!getHexagonCPUSuffix(Name))
5080 return false;
5081
Tony Linthicum76329bf2011-12-12 21:14:55 +00005082 CPU = Name;
5083 return true;
5084 }
5085};
5086
5087void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5088 MacroBuilder &Builder) const {
5089 Builder.defineMacro("qdsp6");
5090 Builder.defineMacro("__qdsp6", "1");
5091 Builder.defineMacro("__qdsp6__", "1");
5092
5093 Builder.defineMacro("hexagon");
5094 Builder.defineMacro("__hexagon", "1");
5095 Builder.defineMacro("__hexagon__", "1");
5096
5097 if(CPU == "hexagonv1") {
5098 Builder.defineMacro("__HEXAGON_V1__");
5099 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5100 if(Opts.HexagonQdsp6Compat) {
5101 Builder.defineMacro("__QDSP6_V1__");
5102 Builder.defineMacro("__QDSP6_ARCH__", "1");
5103 }
5104 }
5105 else if(CPU == "hexagonv2") {
5106 Builder.defineMacro("__HEXAGON_V2__");
5107 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5108 if(Opts.HexagonQdsp6Compat) {
5109 Builder.defineMacro("__QDSP6_V2__");
5110 Builder.defineMacro("__QDSP6_ARCH__", "2");
5111 }
5112 }
5113 else if(CPU == "hexagonv3") {
5114 Builder.defineMacro("__HEXAGON_V3__");
5115 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5116 if(Opts.HexagonQdsp6Compat) {
5117 Builder.defineMacro("__QDSP6_V3__");
5118 Builder.defineMacro("__QDSP6_ARCH__", "3");
5119 }
5120 }
5121 else if(CPU == "hexagonv4") {
5122 Builder.defineMacro("__HEXAGON_V4__");
5123 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5124 if(Opts.HexagonQdsp6Compat) {
5125 Builder.defineMacro("__QDSP6_V4__");
5126 Builder.defineMacro("__QDSP6_ARCH__", "4");
5127 }
5128 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005129 else if(CPU == "hexagonv5") {
5130 Builder.defineMacro("__HEXAGON_V5__");
5131 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5132 if(Opts.HexagonQdsp6Compat) {
5133 Builder.defineMacro("__QDSP6_V5__");
5134 Builder.defineMacro("__QDSP6_ARCH__", "5");
5135 }
5136 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005137}
5138
5139const char * const HexagonTargetInfo::GCCRegNames[] = {
5140 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5141 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5142 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5143 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5144 "p0", "p1", "p2", "p3",
5145 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5146};
5147
5148void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5149 unsigned &NumNames) const {
5150 Names = GCCRegNames;
5151 NumNames = llvm::array_lengthof(GCCRegNames);
5152}
5153
5154
5155const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5156 { { "sp" }, "r29" },
5157 { { "fp" }, "r30" },
5158 { { "lr" }, "r31" },
5159 };
5160
5161void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5162 unsigned &NumAliases) const {
5163 Aliases = GCCRegAliases;
5164 NumAliases = llvm::array_lengthof(GCCRegAliases);
5165}
5166
5167
5168const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5169#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5170#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5171 ALL_LANGUAGES },
5172#include "clang/Basic/BuiltinsHexagon.def"
5173};
5174}
5175
5176
Chris Lattner5ba61f02006-10-14 07:39:34 +00005177namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005178// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5179class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005180 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5181 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005182 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005183public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005184 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005185
Craig Topper3164f332014-03-11 03:39:26 +00005186 bool handleTargetFeatures(std::vector<std::string> &Features,
5187 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005188 SoftFloat = false;
5189 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5190 if (Features[i] == "+soft-float")
5191 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005192 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005193 }
Craig Topper3164f332014-03-11 03:39:26 +00005194 void getTargetDefines(const LangOptions &Opts,
5195 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005196 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005197 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005198
5199 if (SoftFloat)
5200 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005201 }
Craig Topper3164f332014-03-11 03:39:26 +00005202
5203 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005204 return llvm::StringSwitch<bool>(Feature)
5205 .Case("softfloat", SoftFloat)
5206 .Case("sparc", true)
5207 .Default(false);
5208 }
Craig Topper3164f332014-03-11 03:39:26 +00005209
5210 void getTargetBuiltins(const Builtin::Info *&Records,
5211 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005212 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005213 }
Craig Topper3164f332014-03-11 03:39:26 +00005214 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005215 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005216 }
Craig Topper3164f332014-03-11 03:39:26 +00005217 void getGCCRegNames(const char * const *&Names,
5218 unsigned &NumNames) const override;
5219 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5220 unsigned &NumAliases) const override;
5221 bool validateAsmConstraint(const char *&Name,
5222 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005223 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005224 switch (*Name) {
5225 case 'I': // Signed 13-bit constant
5226 case 'J': // Zero
5227 case 'K': // 32-bit constant with the low 12 bits clear
5228 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5229 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5230 case 'N': // Same as 'K' but zext (required for SIMode)
5231 case 'O': // The constant 4096
5232 return true;
5233 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005234 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005235 }
Craig Topper3164f332014-03-11 03:39:26 +00005236 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005237 // FIXME: Implement!
5238 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005239 }
5240};
5241
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005242const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005243 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5244 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5245 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5246 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5247};
5248
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005249void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5250 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005251 Names = GCCRegNames;
5252 NumNames = llvm::array_lengthof(GCCRegNames);
5253}
5254
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005255const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005256 { { "g0" }, "r0" },
5257 { { "g1" }, "r1" },
5258 { { "g2" }, "r2" },
5259 { { "g3" }, "r3" },
5260 { { "g4" }, "r4" },
5261 { { "g5" }, "r5" },
5262 { { "g6" }, "r6" },
5263 { { "g7" }, "r7" },
5264 { { "o0" }, "r8" },
5265 { { "o1" }, "r9" },
5266 { { "o2" }, "r10" },
5267 { { "o3" }, "r11" },
5268 { { "o4" }, "r12" },
5269 { { "o5" }, "r13" },
5270 { { "o6", "sp" }, "r14" },
5271 { { "o7" }, "r15" },
5272 { { "l0" }, "r16" },
5273 { { "l1" }, "r17" },
5274 { { "l2" }, "r18" },
5275 { { "l3" }, "r19" },
5276 { { "l4" }, "r20" },
5277 { { "l5" }, "r21" },
5278 { { "l6" }, "r22" },
5279 { { "l7" }, "r23" },
5280 { { "i0" }, "r24" },
5281 { { "i1" }, "r25" },
5282 { { "i2" }, "r26" },
5283 { { "i3" }, "r27" },
5284 { { "i4" }, "r28" },
5285 { { "i5" }, "r29" },
5286 { { "i6", "fp" }, "r30" },
5287 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005288};
5289
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005290void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5291 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005292 Aliases = GCCRegAliases;
5293 NumAliases = llvm::array_lengthof(GCCRegAliases);
5294}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005295
5296// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5297class SparcV8TargetInfo : public SparcTargetInfo {
5298public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005299 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005300 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005301 }
5302
Craig Topper3164f332014-03-11 03:39:26 +00005303 void getTargetDefines(const LangOptions &Opts,
5304 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005305 SparcTargetInfo::getTargetDefines(Opts, Builder);
5306 Builder.defineMacro("__sparcv8");
5307 }
5308};
5309
5310// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5311class SparcV9TargetInfo : public SparcTargetInfo {
5312public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005313 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005314 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005315 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005316 // This is an LP64 platform.
5317 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005318
5319 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005320 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005321 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005322 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005323 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005324 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005325
5326 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5327 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5328 LongDoubleWidth = 128;
5329 LongDoubleAlign = 128;
5330 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005331 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005332 }
5333
Craig Topper3164f332014-03-11 03:39:26 +00005334 void getTargetDefines(const LangOptions &Opts,
5335 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005336 SparcTargetInfo::getTargetDefines(Opts, Builder);
5337 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005338 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005339 // Solaris doesn't need these variants, but the BSDs do.
5340 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005341 Builder.defineMacro("__sparc64__");
5342 Builder.defineMacro("__sparc_v9__");
5343 Builder.defineMacro("__sparcv9__");
5344 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005345 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005346
Craig Topper3164f332014-03-11 03:39:26 +00005347 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005348 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5349 .Case("v9", true)
5350 .Case("ultrasparc", true)
5351 .Case("ultrasparc3", true)
5352 .Case("niagara", true)
5353 .Case("niagara2", true)
5354 .Case("niagara3", true)
5355 .Case("niagara4", true)
5356 .Default(false);
5357
5358 // No need to store the CPU yet. There aren't any CPU-specific
5359 // macros to define.
5360 return CPUKnown;
5361 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005362};
5363
Gabor Greif49991682008-02-21 16:29:08 +00005364} // end anonymous namespace.
5365
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005366namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005367class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005368public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005369 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5370 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005371 SizeType = UnsignedInt;
5372 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005373 }
5374};
5375} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005376
Chris Lattnerb781dc792008-05-08 05:58:21 +00005377namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005378class SystemZTargetInfo : public TargetInfo {
5379 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005380
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005381public:
5382 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5383 TLSSupported = true;
5384 IntWidth = IntAlign = 32;
5385 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5386 PointerWidth = PointerAlign = 64;
5387 LongDoubleWidth = 128;
5388 LongDoubleAlign = 64;
5389 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5390 MinGlobalAlign = 16;
5391 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5392 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5393 }
5394 void getTargetDefines(const LangOptions &Opts,
5395 MacroBuilder &Builder) const override {
5396 Builder.defineMacro("__s390__");
5397 Builder.defineMacro("__s390x__");
5398 Builder.defineMacro("__zarch__");
5399 Builder.defineMacro("__LONG_DOUBLE_128__");
5400 }
5401 void getTargetBuiltins(const Builtin::Info *&Records,
5402 unsigned &NumRecords) const override {
5403 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005404 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005405 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005406 }
5407
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005408 void getGCCRegNames(const char *const *&Names,
5409 unsigned &NumNames) const override;
5410 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5411 unsigned &NumAliases) const override {
5412 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005413 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005414 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005415 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005416 bool validateAsmConstraint(const char *&Name,
5417 TargetInfo::ConstraintInfo &info) const override;
5418 const char *getClobbers() const override {
5419 // FIXME: Is this really right?
5420 return "";
5421 }
5422 BuiltinVaListKind getBuiltinVaListKind() const override {
5423 return TargetInfo::SystemZBuiltinVaList;
5424 }
5425 bool setCPU(const std::string &Name) override {
5426 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5427 .Case("z10", true)
5428 .Case("z196", true)
5429 .Case("zEC12", true)
5430 .Default(false);
5431
5432 // No need to store the CPU yet. There aren't any CPU-specific
5433 // macros to define.
5434 return CPUKnown;
5435 }
5436};
5437
5438const char *const SystemZTargetInfo::GCCRegNames[] = {
5439 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5440 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5441 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5442 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5443};
5444
5445void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5446 unsigned &NumNames) const {
5447 Names = GCCRegNames;
5448 NumNames = llvm::array_lengthof(GCCRegNames);
5449}
5450
5451bool SystemZTargetInfo::
5452validateAsmConstraint(const char *&Name,
5453 TargetInfo::ConstraintInfo &Info) const {
5454 switch (*Name) {
5455 default:
5456 return false;
5457
5458 case 'a': // Address register
5459 case 'd': // Data register (equivalent to 'r')
5460 case 'f': // Floating-point register
5461 Info.setAllowsRegister();
5462 return true;
5463
5464 case 'I': // Unsigned 8-bit constant
5465 case 'J': // Unsigned 12-bit constant
5466 case 'K': // Signed 16-bit constant
5467 case 'L': // Signed 20-bit displacement (on all targets we support)
5468 case 'M': // 0x7fffffff
5469 return true;
5470
5471 case 'Q': // Memory with base and unsigned 12-bit displacement
5472 case 'R': // Likewise, plus an index
5473 case 'S': // Memory with base and signed 20-bit displacement
5474 case 'T': // Likewise, plus an index
5475 Info.setAllowsMemory();
5476 return true;
5477 }
5478}
Ulrich Weigand47445072013-05-06 16:26:41 +00005479}
5480
5481namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005482 class MSP430TargetInfo : public TargetInfo {
5483 static const char * const GCCRegNames[];
5484 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005485 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005486 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005487 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005488 IntWidth = 16; IntAlign = 16;
5489 LongWidth = 32; LongLongWidth = 64;
5490 LongAlign = LongLongAlign = 16;
5491 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005492 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005493 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005494 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005495 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005496 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005497 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005498 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005499 }
5500 void getTargetDefines(const LangOptions &Opts,
5501 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005502 Builder.defineMacro("MSP430");
5503 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005504 // FIXME: defines for different 'flavours' of MCU
5505 }
Craig Topper3164f332014-03-11 03:39:26 +00005506 void getTargetBuiltins(const Builtin::Info *&Records,
5507 unsigned &NumRecords) const override {
5508 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005509 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005510 NumRecords = 0;
5511 }
Craig Topper3164f332014-03-11 03:39:26 +00005512 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005513 return Feature == "msp430";
5514 }
Craig Topper3164f332014-03-11 03:39:26 +00005515 void getGCCRegNames(const char * const *&Names,
5516 unsigned &NumNames) const override;
5517 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5518 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005519 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005520 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005521 NumAliases = 0;
5522 }
Eric Christopher917e9522014-11-18 22:36:15 +00005523 bool
5524 validateAsmConstraint(const char *&Name,
5525 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005526 // FIXME: implement
5527 switch (*Name) {
5528 case 'K': // the constant 1
5529 case 'L': // constant -1^20 .. 1^19
5530 case 'M': // constant 1-4:
5531 return true;
5532 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005533 // No target constraints for now.
5534 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005535 }
Craig Topper3164f332014-03-11 03:39:26 +00005536 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005537 // FIXME: Is this really right?
5538 return "";
5539 }
Craig Topper3164f332014-03-11 03:39:26 +00005540 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005541 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005542 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005543 }
5544 };
5545
5546 const char * const MSP430TargetInfo::GCCRegNames[] = {
5547 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5548 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5549 };
5550
5551 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5552 unsigned &NumNames) const {
5553 Names = GCCRegNames;
5554 NumNames = llvm::array_lengthof(GCCRegNames);
5555 }
5556}
5557
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005558namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005559
Mike Stump11289f42009-09-09 15:08:12 +00005560 // LLVM and Clang cannot be used directly to output native binaries for
5561 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005562 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005563 //
5564 // TCE uses the llvm bitcode as input and uses it for generating customized
5565 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005566 // publicly available in http://tce.cs.tut.fi
5567
Eli Friedman1f191002011-10-07 19:51:42 +00005568 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5569 3, // opencl_global
5570 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005571 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005572 // FIXME: generic has to be added to the target
5573 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005574 0, // cuda_device
5575 0, // cuda_constant
5576 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005577 };
5578
Eli Friedmana9c3d712009-08-19 20:47:07 +00005579 class TCETargetInfo : public TargetInfo{
5580 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005581 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005582 TLSSupported = false;
5583 IntWidth = 32;
5584 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005585 PointerWidth = 32;
5586 IntAlign = 32;
5587 LongAlign = LongLongAlign = 32;
5588 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005589 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005590 SizeType = UnsignedInt;
5591 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005592 IntPtrType = SignedInt;
5593 PtrDiffType = SignedInt;
5594 FloatWidth = 32;
5595 FloatAlign = 32;
5596 DoubleWidth = 32;
5597 DoubleAlign = 32;
5598 LongDoubleWidth = 32;
5599 LongDoubleAlign = 32;
5600 FloatFormat = &llvm::APFloat::IEEEsingle;
5601 DoubleFormat = &llvm::APFloat::IEEEsingle;
5602 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005603 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5604 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005605 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005606 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005607 }
5608
Craig Topper3164f332014-03-11 03:39:26 +00005609 void getTargetDefines(const LangOptions &Opts,
5610 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005611 DefineStd(Builder, "tce", Opts);
5612 Builder.defineMacro("__TCE__");
5613 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005614 }
Craig Topper3164f332014-03-11 03:39:26 +00005615 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005616 return Feature == "tce";
5617 }
Craig Topper3164f332014-03-11 03:39:26 +00005618
5619 void getTargetBuiltins(const Builtin::Info *&Records,
5620 unsigned &NumRecords) const override {}
5621 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005622 return "";
5623 }
Craig Topper3164f332014-03-11 03:39:26 +00005624 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005625 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005626 }
Craig Topper3164f332014-03-11 03:39:26 +00005627 void getGCCRegNames(const char * const *&Names,
5628 unsigned &NumNames) const override {}
5629 bool validateAsmConstraint(const char *&Name,
5630 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005631 return true;
5632 }
Craig Topper3164f332014-03-11 03:39:26 +00005633 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5634 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005635 };
5636}
5637
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005638namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005639class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005640 virtual void setDescriptionString() = 0;
5641
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005642 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005643 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005644 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005645 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005646 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005647 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005648 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005649 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005650 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005651 enum DspRevEnum {
5652 NoDSP, DSP1, DSP2
5653 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005654 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005655
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005656protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005657 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005658 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005659
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005660public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005661 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5662 const std::string &CPUStr)
5663 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005664 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005665 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005666
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005667 bool isNaN2008Default() const {
5668 return CPU == "mips32r6" || CPU == "mips64r6";
5669 }
5670
5671 bool isFP64Default() const {
5672 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5673 }
5674
Alp Toker4925ba72014-06-07 23:30:42 +00005675 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005676 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005677 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5678 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005679 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005680 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005681 .Case("mips1", IsMips32)
5682 .Case("mips2", IsMips32)
5683 .Case("mips3", true)
5684 .Case("mips4", true)
5685 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005686 .Case("mips32", IsMips32)
5687 .Case("mips32r2", IsMips32)
5688 .Case("mips32r6", IsMips32)
5689 .Case("mips64", true)
5690 .Case("mips64r2", true)
5691 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005692 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005693 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005694 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005695 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005696 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005697 // The backend enables certain ABI's by default according to the
5698 // architecture.
5699 // Disable both possible defaults so that we don't end up with multiple
5700 // ABI's selected and trigger an assertion.
5701 Features["o32"] = false;
5702 Features["n64"] = false;
5703
Eric Christopher0b26a612010-03-02 02:41:08 +00005704 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005705 if (CPU == "octeon")
5706 Features["mips64r2"] = Features["cnmips"] = true;
5707 else
5708 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005709 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005710
Craig Topper3164f332014-03-11 03:39:26 +00005711 void getTargetDefines(const LangOptions &Opts,
5712 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005713 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005714 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005715 if (Opts.GNUMode)
5716 Builder.defineMacro("mips");
5717
Simon Atanasyan683535b2012-08-29 19:14:58 +00005718 Builder.defineMacro("__REGISTER_PREFIX__", "");
5719
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005720 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005721 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005722 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005723 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005724 case SoftFloat:
5725 Builder.defineMacro("__mips_soft_float", Twine(1));
5726 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005727 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005728
Simon Atanasyan16071912013-04-14 14:07:30 +00005729 if (IsSingleFloat)
5730 Builder.defineMacro("__mips_single_float", Twine(1));
5731
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005732 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5733 Builder.defineMacro("_MIPS_FPSET",
5734 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5735
Simon Atanasyan72244b62012-07-05 16:06:06 +00005736 if (IsMips16)
5737 Builder.defineMacro("__mips16", Twine(1));
5738
Simon Atanasyan60777612013-04-14 14:07:51 +00005739 if (IsMicromips)
5740 Builder.defineMacro("__mips_micromips", Twine(1));
5741
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005742 if (IsNan2008)
5743 Builder.defineMacro("__mips_nan2008", Twine(1));
5744
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005745 switch (DspRev) {
5746 default:
5747 break;
5748 case DSP1:
5749 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5750 Builder.defineMacro("__mips_dsp", Twine(1));
5751 break;
5752 case DSP2:
5753 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5754 Builder.defineMacro("__mips_dspr2", Twine(1));
5755 Builder.defineMacro("__mips_dsp", Twine(1));
5756 break;
5757 }
5758
Jack Carter44ff1e52013-08-12 17:20:29 +00005759 if (HasMSA)
5760 Builder.defineMacro("__mips_msa", Twine(1));
5761
Simon Atanasyan26f19672012-04-05 19:28:31 +00005762 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5763 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5764 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005765
5766 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5767 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005768 }
5769
Craig Topper3164f332014-03-11 03:39:26 +00005770 void getTargetBuiltins(const Builtin::Info *&Records,
5771 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005772 Records = BuiltinInfo;
5773 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005774 }
Craig Topper3164f332014-03-11 03:39:26 +00005775 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005776 return llvm::StringSwitch<bool>(Feature)
5777 .Case("mips", true)
5778 .Case("fp64", HasFP64)
5779 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005780 }
Craig Topper3164f332014-03-11 03:39:26 +00005781 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005782 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005783 }
Craig Topper3164f332014-03-11 03:39:26 +00005784 void getGCCRegNames(const char * const *&Names,
5785 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005786 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005787 // CPU register names
5788 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005789 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5790 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5791 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005792 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5793 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005794 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5795 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5796 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5797 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005798 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005799 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005800 "$fcc5","$fcc6","$fcc7",
5801 // MSA register names
5802 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5803 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5804 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5805 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5806 // MSA control register names
5807 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5808 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005809 };
5810 Names = GCCRegNames;
5811 NumNames = llvm::array_lengthof(GCCRegNames);
5812 }
Craig Topper3164f332014-03-11 03:39:26 +00005813 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5814 unsigned &NumAliases) const override = 0;
5815 bool validateAsmConstraint(const char *&Name,
5816 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005817 switch (*Name) {
5818 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005819 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005820 case 'r': // CPU registers.
5821 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005822 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005823 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005824 case 'c': // $25 for indirect jumps
5825 case 'l': // lo register
5826 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005827 Info.setAllowsRegister();
5828 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005829 case 'I': // Signed 16-bit constant
5830 case 'J': // Integer 0
5831 case 'K': // Unsigned 16-bit constant
5832 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5833 case 'M': // Constants not loadable via lui, addiu, or ori
5834 case 'N': // Constant -1 to -65535
5835 case 'O': // A signed 15-bit constant
5836 case 'P': // A constant between 1 go 65535
5837 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005838 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005839 Info.setAllowsMemory();
5840 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005841 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005842 }
5843
Craig Topper3164f332014-03-11 03:39:26 +00005844 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005845 // In GCC, $1 is not widely used in generated code (it's used only in a few
5846 // specific situations), so there is no real need for users to add it to
5847 // the clobbers list if they want to use it in their inline assembly code.
5848 //
5849 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5850 // code generation, so using it in inline assembly without adding it to the
5851 // clobbers list can cause conflicts between the inline assembly code and
5852 // the surrounding generated code.
5853 //
5854 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5855 // operands, which will conflict with the ".set at" assembler option (which
5856 // we use only for inline assembly, in order to maintain compatibility with
5857 // GCC) and will also conflict with the user's usage of $1.
5858 //
5859 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5860 // register for generated code is to automatically clobber $1 for all inline
5861 // assembly code.
5862 //
5863 // FIXME: We should automatically clobber $1 only for inline assembly code
5864 // which actually uses it. This would allow LLVM to use $1 for inline
5865 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005866 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005867 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005868
Craig Topper3164f332014-03-11 03:39:26 +00005869 bool handleTargetFeatures(std::vector<std::string> &Features,
5870 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005871 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005872 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005873 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005874 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005875 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005876 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005877 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005878
5879 for (std::vector<std::string>::iterator it = Features.begin(),
5880 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005881 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005882 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005883 else if (*it == "+soft-float")
5884 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005885 else if (*it == "+mips16")
5886 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005887 else if (*it == "+micromips")
5888 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005889 else if (*it == "+dsp")
5890 DspRev = std::max(DspRev, DSP1);
5891 else if (*it == "+dspr2")
5892 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005893 else if (*it == "+msa")
5894 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005895 else if (*it == "+fp64")
5896 HasFP64 = true;
5897 else if (*it == "-fp64")
5898 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005899 else if (*it == "+nan2008")
5900 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005901 else if (*it == "-nan2008")
5902 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005903 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005904
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005905 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005906 std::vector<std::string>::iterator it =
5907 std::find(Features.begin(), Features.end(), "+soft-float");
5908 if (it != Features.end())
5909 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005910
Akira Hatanaka9064e362013-10-29 18:30:33 +00005911 setDescriptionString();
5912
Rafael Espindolaeb265472013-08-21 21:59:03 +00005913 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005914 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005915
Craig Topper3164f332014-03-11 03:39:26 +00005916 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005917 if (RegNo == 0) return 4;
5918 if (RegNo == 1) return 5;
5919 return -1;
5920 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005921
5922 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005923};
5924
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005925const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5926#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5927#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5928 ALL_LANGUAGES },
5929#include "clang/Basic/BuiltinsMips.def"
5930};
5931
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005932class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005933public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005934 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005935 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005936 SizeType = UnsignedInt;
5937 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00005938 Int64Type = SignedLongLong;
5939 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005940 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005941 }
Craig Topper3164f332014-03-11 03:39:26 +00005942 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005943 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005944 ABI = Name;
5945 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005946 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005947 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005948 }
Craig Topper3164f332014-03-11 03:39:26 +00005949 void getTargetDefines(const LangOptions &Opts,
5950 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005951 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005952
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005953 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005954 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5955
5956 const std::string& CPUStr = getCPU();
5957 if (CPUStr == "mips32")
5958 Builder.defineMacro("__mips_isa_rev", "1");
5959 else if (CPUStr == "mips32r2")
5960 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00005961 else if (CPUStr == "mips32r6")
5962 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005963
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005964 if (ABI == "o32") {
5965 Builder.defineMacro("__mips_o32");
5966 Builder.defineMacro("_ABIO32", "1");
5967 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5968 }
5969 else if (ABI == "eabi")
5970 Builder.defineMacro("__mips_eabi");
5971 else
David Blaikie83d382b2011-09-23 05:06:16 +00005972 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005973 }
Craig Topper3164f332014-03-11 03:39:26 +00005974 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5975 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005976 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5977 { { "at" }, "$1" },
5978 { { "v0" }, "$2" },
5979 { { "v1" }, "$3" },
5980 { { "a0" }, "$4" },
5981 { { "a1" }, "$5" },
5982 { { "a2" }, "$6" },
5983 { { "a3" }, "$7" },
5984 { { "t0" }, "$8" },
5985 { { "t1" }, "$9" },
5986 { { "t2" }, "$10" },
5987 { { "t3" }, "$11" },
5988 { { "t4" }, "$12" },
5989 { { "t5" }, "$13" },
5990 { { "t6" }, "$14" },
5991 { { "t7" }, "$15" },
5992 { { "s0" }, "$16" },
5993 { { "s1" }, "$17" },
5994 { { "s2" }, "$18" },
5995 { { "s3" }, "$19" },
5996 { { "s4" }, "$20" },
5997 { { "s5" }, "$21" },
5998 { { "s6" }, "$22" },
5999 { { "s7" }, "$23" },
6000 { { "t8" }, "$24" },
6001 { { "t9" }, "$25" },
6002 { { "k0" }, "$26" },
6003 { { "k1" }, "$27" },
6004 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006005 { { "sp","$sp" }, "$29" },
6006 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006007 { { "ra" }, "$31" }
6008 };
6009 Aliases = GCCRegAliases;
6010 NumAliases = llvm::array_lengthof(GCCRegAliases);
6011 }
6012};
6013
6014class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006015 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006016 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006017 }
6018
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006019public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006020 Mips32EBTargetInfo(const llvm::Triple &Triple)
6021 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006022 }
Craig Topper3164f332014-03-11 03:39:26 +00006023 void getTargetDefines(const LangOptions &Opts,
6024 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006025 DefineStd(Builder, "MIPSEB", Opts);
6026 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006027 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006028 }
6029};
6030
6031class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006032 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006033 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006034 }
6035
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006036public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006037 Mips32ELTargetInfo(const llvm::Triple &Triple)
6038 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006039 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006040 }
Craig Topper3164f332014-03-11 03:39:26 +00006041 void getTargetDefines(const LangOptions &Opts,
6042 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006043 DefineStd(Builder, "MIPSEL", Opts);
6044 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006045 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006046 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006047};
Akira Hatanakabef17452011-09-20 19:21:49 +00006048
6049class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006050public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006051 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006052 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006053 LongDoubleWidth = LongDoubleAlign = 128;
6054 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006055 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6056 LongDoubleWidth = LongDoubleAlign = 64;
6057 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6058 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006059 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006060 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006061 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006062 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006063
6064 void setN64ABITypes() {
6065 LongWidth = LongAlign = 64;
6066 PointerWidth = PointerAlign = 64;
6067 SizeType = UnsignedLong;
6068 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006069 Int64Type = SignedLong;
6070 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006071 }
6072
6073 void setN32ABITypes() {
6074 LongWidth = LongAlign = 32;
6075 PointerWidth = PointerAlign = 32;
6076 SizeType = UnsignedInt;
6077 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006078 Int64Type = SignedLongLong;
6079 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006080 }
6081
Craig Topper3164f332014-03-11 03:39:26 +00006082 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006083 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006084 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006085 ABI = Name;
6086 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006087 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006088 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006089 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006090 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006091 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006092 }
6093 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006094 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006095
Craig Topper3164f332014-03-11 03:39:26 +00006096 void getTargetDefines(const LangOptions &Opts,
6097 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006098 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006099
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006100 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006101 Builder.defineMacro("__mips64");
6102 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006103 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6104
6105 const std::string& CPUStr = getCPU();
6106 if (CPUStr == "mips64")
6107 Builder.defineMacro("__mips_isa_rev", "1");
6108 else if (CPUStr == "mips64r2")
6109 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006110 else if (CPUStr == "mips64r6")
6111 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006112
Akira Hatanakabef17452011-09-20 19:21:49 +00006113 if (ABI == "n32") {
6114 Builder.defineMacro("__mips_n32");
6115 Builder.defineMacro("_ABIN32", "2");
6116 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6117 }
6118 else if (ABI == "n64") {
6119 Builder.defineMacro("__mips_n64");
6120 Builder.defineMacro("_ABI64", "3");
6121 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6122 }
6123 else
David Blaikie83d382b2011-09-23 05:06:16 +00006124 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006125 }
Craig Topper3164f332014-03-11 03:39:26 +00006126 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6127 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006128 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6129 { { "at" }, "$1" },
6130 { { "v0" }, "$2" },
6131 { { "v1" }, "$3" },
6132 { { "a0" }, "$4" },
6133 { { "a1" }, "$5" },
6134 { { "a2" }, "$6" },
6135 { { "a3" }, "$7" },
6136 { { "a4" }, "$8" },
6137 { { "a5" }, "$9" },
6138 { { "a6" }, "$10" },
6139 { { "a7" }, "$11" },
6140 { { "t0" }, "$12" },
6141 { { "t1" }, "$13" },
6142 { { "t2" }, "$14" },
6143 { { "t3" }, "$15" },
6144 { { "s0" }, "$16" },
6145 { { "s1" }, "$17" },
6146 { { "s2" }, "$18" },
6147 { { "s3" }, "$19" },
6148 { { "s4" }, "$20" },
6149 { { "s5" }, "$21" },
6150 { { "s6" }, "$22" },
6151 { { "s7" }, "$23" },
6152 { { "t8" }, "$24" },
6153 { { "t9" }, "$25" },
6154 { { "k0" }, "$26" },
6155 { { "k1" }, "$27" },
6156 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006157 { { "sp","$sp" }, "$29" },
6158 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006159 { { "ra" }, "$31" }
6160 };
6161 Aliases = GCCRegAliases;
6162 NumAliases = llvm::array_lengthof(GCCRegAliases);
6163 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006164
6165 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006166};
6167
6168class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006169 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006170 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006171 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 +00006172 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006173 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006174
Akira Hatanakabef17452011-09-20 19:21:49 +00006175 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006176
Akira Hatanakabef17452011-09-20 19:21:49 +00006177public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006178 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006179 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006180 void getTargetDefines(const LangOptions &Opts,
6181 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006182 DefineStd(Builder, "MIPSEB", Opts);
6183 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006184 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006185 }
6186};
6187
6188class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006189 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006190 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006191 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 +00006192 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006193 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006194 }
6195public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006196 Mips64ELTargetInfo(const llvm::Triple &Triple)
6197 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006198 // Default ABI is n64.
6199 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006200 }
Craig Topper3164f332014-03-11 03:39:26 +00006201 void getTargetDefines(const LangOptions &Opts,
6202 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006203 DefineStd(Builder, "MIPSEL", Opts);
6204 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006205 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006206 }
6207};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006208} // end anonymous namespace.
6209
Ivan Krasindd7403e2011-08-24 20:22:22 +00006210namespace {
6211class PNaClTargetInfo : public TargetInfo {
6212public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006213 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006214 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006215 this->UserLabelPrefix = "";
6216 this->LongAlign = 32;
6217 this->LongWidth = 32;
6218 this->PointerAlign = 32;
6219 this->PointerWidth = 32;
6220 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006221 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006222 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006223 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006224 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006225 this->SizeType = TargetInfo::UnsignedInt;
6226 this->PtrDiffType = TargetInfo::SignedInt;
6227 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006228 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006229 }
6230
Craig Topper3164f332014-03-11 03:39:26 +00006231 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006232 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006233 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006234 Builder.defineMacro("__le32__");
6235 Builder.defineMacro("__pnacl__");
6236 }
Craig Topper3164f332014-03-11 03:39:26 +00006237 void getTargetDefines(const LangOptions &Opts,
6238 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006239 getArchDefines(Opts, Builder);
6240 }
Craig Topper3164f332014-03-11 03:39:26 +00006241 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006242 return Feature == "pnacl";
6243 }
Craig Topper3164f332014-03-11 03:39:26 +00006244 void getTargetBuiltins(const Builtin::Info *&Records,
6245 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006246 }
Craig Topper3164f332014-03-11 03:39:26 +00006247 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006248 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006249 }
Craig Topper3164f332014-03-11 03:39:26 +00006250 void getGCCRegNames(const char * const *&Names,
6251 unsigned &NumNames) const override;
6252 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6253 unsigned &NumAliases) const override;
6254 bool validateAsmConstraint(const char *&Name,
6255 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006256 return false;
6257 }
6258
Craig Topper3164f332014-03-11 03:39:26 +00006259 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006260 return "";
6261 }
6262};
6263
6264void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6265 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006266 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006267 NumNames = 0;
6268}
6269
6270void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6271 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006272 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006273 NumAliases = 0;
6274}
6275} // end anonymous namespace.
6276
Guy Benyeib798fc92012-12-11 21:38:14 +00006277namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006278class Le64TargetInfo : public TargetInfo {
6279 static const Builtin::Info BuiltinInfo[];
6280
6281public:
6282 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6283 BigEndian = false;
6284 NoAsmVariants = true;
6285 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6286 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6287 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006288 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006289 }
6290
6291 void getTargetDefines(const LangOptions &Opts,
6292 MacroBuilder &Builder) const override {
6293 DefineStd(Builder, "unix", Opts);
6294 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6295 Builder.defineMacro("__ELF__");
6296 }
6297 void getTargetBuiltins(const Builtin::Info *&Records,
6298 unsigned &NumRecords) const override {
6299 Records = BuiltinInfo;
6300 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6301 }
6302 BuiltinVaListKind getBuiltinVaListKind() const override {
6303 return TargetInfo::PNaClABIBuiltinVaList;
6304 }
6305 const char *getClobbers() const override { return ""; }
6306 void getGCCRegNames(const char *const *&Names,
6307 unsigned &NumNames) const override {
6308 Names = nullptr;
6309 NumNames = 0;
6310 }
6311 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6312 unsigned &NumAliases) const override {
6313 Aliases = nullptr;
6314 NumAliases = 0;
6315 }
6316 bool validateAsmConstraint(const char *&Name,
6317 TargetInfo::ConstraintInfo &Info) const override {
6318 return false;
6319 }
6320
6321 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006322};
6323} // end anonymous namespace.
6324
6325const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6326#define BUILTIN(ID, TYPE, ATTRS) \
6327 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6328#include "clang/Basic/BuiltinsLe64.def"
6329};
6330
6331namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006332 static const unsigned SPIRAddrSpaceMap[] = {
6333 1, // opencl_global
6334 3, // opencl_local
6335 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006336 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006337 0, // cuda_device
6338 0, // cuda_constant
6339 0 // cuda_shared
6340 };
6341 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006342 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006343 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006344 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6345 "SPIR target must use unknown OS");
6346 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6347 "SPIR target must use unknown environment type");
6348 BigEndian = false;
6349 TLSSupported = false;
6350 LongWidth = LongAlign = 64;
6351 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006352 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006353 // Define available target features
6354 // These must be defined in sorted order!
6355 NoAsmVariants = true;
6356 }
Craig Topper3164f332014-03-11 03:39:26 +00006357 void getTargetDefines(const LangOptions &Opts,
6358 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006359 DefineStd(Builder, "SPIR", Opts);
6360 }
Craig Topper3164f332014-03-11 03:39:26 +00006361 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006362 return Feature == "spir";
6363 }
Craig Topper3164f332014-03-11 03:39:26 +00006364
6365 void getTargetBuiltins(const Builtin::Info *&Records,
6366 unsigned &NumRecords) const override {}
6367 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006368 return "";
6369 }
Craig Topper3164f332014-03-11 03:39:26 +00006370 void getGCCRegNames(const char * const *&Names,
6371 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006372 bool
6373 validateAsmConstraint(const char *&Name,
6374 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006375 return true;
6376 }
Craig Topper3164f332014-03-11 03:39:26 +00006377 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6378 unsigned &NumAliases) const override {}
6379 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006380 return TargetInfo::VoidPtrBuiltinVaList;
6381 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006382
6383 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6384 return (CC == CC_SpirFunction ||
6385 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6386 }
6387
6388 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6389 return CC_SpirFunction;
6390 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006391 };
6392
6393
6394 class SPIR32TargetInfo : public SPIRTargetInfo {
6395 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006396 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006397 PointerWidth = PointerAlign = 32;
6398 SizeType = TargetInfo::UnsignedInt;
6399 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6400 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006401 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6402 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006403 }
Craig Topper3164f332014-03-11 03:39:26 +00006404 void getTargetDefines(const LangOptions &Opts,
6405 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006406 DefineStd(Builder, "SPIR32", Opts);
6407 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006408 };
6409
6410 class SPIR64TargetInfo : public SPIRTargetInfo {
6411 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006412 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006413 PointerWidth = PointerAlign = 64;
6414 SizeType = TargetInfo::UnsignedLong;
6415 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006416 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6417 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006418 }
Craig Topper3164f332014-03-11 03:39:26 +00006419 void getTargetDefines(const LangOptions &Opts,
6420 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006421 DefineStd(Builder, "SPIR64", Opts);
6422 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006423 };
6424}
6425
Robert Lytton0e076492013-08-13 09:43:10 +00006426namespace {
6427class XCoreTargetInfo : public TargetInfo {
6428 static const Builtin::Info BuiltinInfo[];
6429public:
6430 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6431 BigEndian = false;
6432 NoAsmVariants = true;
6433 LongLongAlign = 32;
6434 SuitableAlign = 32;
6435 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006436 SizeType = UnsignedInt;
6437 PtrDiffType = SignedInt;
6438 IntPtrType = SignedInt;
6439 WCharType = UnsignedChar;
6440 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006441 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006442 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 +00006443 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006444 }
Craig Topper3164f332014-03-11 03:39:26 +00006445 void getTargetDefines(const LangOptions &Opts,
6446 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006447 Builder.defineMacro("__XS1B__");
6448 }
Craig Topper3164f332014-03-11 03:39:26 +00006449 void getTargetBuiltins(const Builtin::Info *&Records,
6450 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006451 Records = BuiltinInfo;
6452 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6453 }
Craig Topper3164f332014-03-11 03:39:26 +00006454 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006455 return TargetInfo::VoidPtrBuiltinVaList;
6456 }
Craig Topper3164f332014-03-11 03:39:26 +00006457 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006458 return "";
6459 }
Craig Topper3164f332014-03-11 03:39:26 +00006460 void getGCCRegNames(const char * const *&Names,
6461 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006462 static const char * const GCCRegNames[] = {
6463 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6464 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6465 };
6466 Names = GCCRegNames;
6467 NumNames = llvm::array_lengthof(GCCRegNames);
6468 }
Craig Topper3164f332014-03-11 03:39:26 +00006469 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6470 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006471 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006472 NumAliases = 0;
6473 }
Craig Topper3164f332014-03-11 03:39:26 +00006474 bool validateAsmConstraint(const char *&Name,
6475 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006476 return false;
6477 }
Craig Topper3164f332014-03-11 03:39:26 +00006478 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006479 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6480 return (RegNo < 2)? RegNo : -1;
6481 }
Robert Lytton0e076492013-08-13 09:43:10 +00006482};
6483
6484const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6485#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6486#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6487 ALL_LANGUAGES },
6488#include "clang/Basic/BuiltinsXCore.def"
6489};
6490} // end anonymous namespace.
6491
Ivan Krasindd7403e2011-08-24 20:22:22 +00006492
Chris Lattner5ba61f02006-10-14 07:39:34 +00006493//===----------------------------------------------------------------------===//
6494// Driver code
6495//===----------------------------------------------------------------------===//
6496
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006497static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006498 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006499
Daniel Dunbar52322032009-08-18 05:47:58 +00006500 switch (Triple.getArch()) {
6501 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006502 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006503
Tim Northover2a0783d2014-05-30 14:14:07 +00006504 case llvm::Triple::xcore:
6505 return new XCoreTargetInfo(Triple);
6506
6507 case llvm::Triple::hexagon:
6508 return new HexagonTargetInfo(Triple);
6509
6510 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006511 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006512 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006513
6514 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006515 case llvm::Triple::FreeBSD:
6516 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006517 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006518 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006519 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006520 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006521 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006522 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006523 }
6524
Christian Pirker9b019ae2014-02-25 13:51:00 +00006525 case llvm::Triple::aarch64_be:
6526 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006527 case llvm::Triple::FreeBSD:
6528 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006529 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006530 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006531 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006532 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006533 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006534 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006535 }
6536
Daniel Dunbar52322032009-08-18 05:47:58 +00006537 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006538 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006539 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006540 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006541
Daniel Dunbar52322032009-08-18 05:47:58 +00006542 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006543 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006544 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006545 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006546 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006547 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006548 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006549 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006550 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006551 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006552 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006553 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006554 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006555 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006556 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006557 case llvm::Triple::Win32:
6558 switch (Triple.getEnvironment()) {
6559 default:
6560 return new ARMleTargetInfo(Triple);
6561 case llvm::Triple::Itanium:
6562 return new ItaniumWindowsARMleTargetInfo(Triple);
6563 case llvm::Triple::MSVC:
6564 return new MicrosoftARMleTargetInfo(Triple);
6565 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006566 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006567 return new ARMleTargetInfo(Triple);
6568 }
6569
6570 case llvm::Triple::armeb:
6571 case llvm::Triple::thumbeb:
6572 if (Triple.isOSDarwin())
6573 return new DarwinARMTargetInfo(Triple);
6574
6575 switch (os) {
6576 case llvm::Triple::Linux:
6577 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6578 case llvm::Triple::FreeBSD:
6579 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6580 case llvm::Triple::NetBSD:
6581 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6582 case llvm::Triple::OpenBSD:
6583 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6584 case llvm::Triple::Bitrig:
6585 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6586 case llvm::Triple::RTEMS:
6587 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6588 case llvm::Triple::NaCl:
6589 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6590 default:
6591 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006592 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006593
Daniel Dunbar52322032009-08-18 05:47:58 +00006594 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006595 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006596
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006597 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006598 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006599 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006600 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006601 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006602 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006603 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006604 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006605 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006606 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006607 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006608 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006609 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006610
6611 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006612 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006613 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006614 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006615 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006616 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006617 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006618 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006619 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006620 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006621 case llvm::Triple::NaCl:
6622 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006623 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006624 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006625 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006626
Akira Hatanakabef17452011-09-20 19:21:49 +00006627 case llvm::Triple::mips64:
6628 switch (os) {
6629 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006630 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006631 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006632 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006633 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006634 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006635 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006636 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006637 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006638 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006639 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006640 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006641 }
6642
6643 case llvm::Triple::mips64el:
6644 switch (os) {
6645 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006646 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006647 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006648 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006649 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006650 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006651 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006652 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006653 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006654 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006655 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006656 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006657 }
6658
Ivan Krasindd7403e2011-08-24 20:22:22 +00006659 case llvm::Triple::le32:
6660 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006661 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006662 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006663 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006664 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006665 }
6666
JF Bastien643817d2014-09-12 17:52:47 +00006667 case llvm::Triple::le64:
6668 return new Le64TargetInfo(Triple);
6669
Daniel Dunbar52322032009-08-18 05:47:58 +00006670 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006671 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006672 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006673 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006674 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006675 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006676 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006677 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006678 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006679 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006680 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006681 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006682 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006683 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006684 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006685 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006686 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006687
6688 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006689 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006690 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006691 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006692 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006693 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006694 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006695 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006696 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006697 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006698 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006699 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006700 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006701 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006702 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006703
Bill Schmidt778d3872013-07-26 01:36:11 +00006704 case llvm::Triple::ppc64le:
6705 switch (os) {
6706 case llvm::Triple::Linux:
6707 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6708 default:
6709 return new PPC64TargetInfo(Triple);
6710 }
6711
Peter Collingbournec947aae2012-05-20 23:28:41 +00006712 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006713 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006714 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006715 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006716
Tom Stellardd8e38a32015-01-06 20:34:47 +00006717 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006718 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006719 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006720
Daniel Dunbar52322032009-08-18 05:47:58 +00006721 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006722 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006723 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006724 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006725 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006726 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006727 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006728 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006729 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006730 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006731 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006732 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006733 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006734 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006735 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006736
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006737 case llvm::Triple::sparcv9:
6738 switch (os) {
6739 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006740 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006741 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006742 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006743 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006744 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006745 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006746 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006747 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006748 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006749 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006750 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006751 }
6752
Ulrich Weigand47445072013-05-06 16:26:41 +00006753 case llvm::Triple::systemz:
6754 switch (os) {
6755 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006756 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006757 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006758 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006759 }
6760
Eli Friedmana9c3d712009-08-19 20:47:07 +00006761 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006762 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006763
Daniel Dunbar52322032009-08-18 05:47:58 +00006764 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006765 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006766 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006767
Daniel Dunbar52322032009-08-18 05:47:58 +00006768 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006769 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006770 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006771 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006772 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006773 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006774 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006775 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006776 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006777 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006778 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006779 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006780 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006781 case llvm::Triple::KFreeBSD:
6782 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006783 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006784 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006785 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006786 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006787 case llvm::Triple::Win32: {
6788 switch (Triple.getEnvironment()) {
6789 default:
6790 return new X86_32TargetInfo(Triple);
6791 case llvm::Triple::Cygnus:
6792 return new CygwinX86_32TargetInfo(Triple);
6793 case llvm::Triple::GNU:
6794 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006795 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006796 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006797 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006798 }
6799 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006800 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006801 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006802 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006803 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006804 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006805 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006806 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006807 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006808 }
6809
6810 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006811 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006812 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006813
Daniel Dunbar52322032009-08-18 05:47:58 +00006814 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006815 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006816 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006817 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006818 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006819 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006820 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006821 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006822 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006823 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006824 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006825 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006826 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006827 case llvm::Triple::KFreeBSD:
6828 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006829 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006830 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006831 case llvm::Triple::Win32: {
6832 switch (Triple.getEnvironment()) {
6833 default:
6834 return new X86_64TargetInfo(Triple);
6835 case llvm::Triple::GNU:
6836 return new MinGWX86_64TargetInfo(Triple);
6837 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006838 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006839 }
6840 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006841 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006842 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006843 case llvm::Triple::PS4:
6844 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006845 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006846 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006847 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006848
6849 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006850 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006851 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006852 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006853 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006854 }
6855 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006856 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006857 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006858 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006859 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006860 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006861 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006862}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006863
6864/// CreateTargetInfo - Return the target info object for the specified target
6865/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006866TargetInfo *
6867TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6868 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006869 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006870
6871 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006872 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006873 if (!Target) {
6874 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006875 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006876 }
Alp Toker80758082014-07-06 05:26:44 +00006877 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006878
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006879 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006880 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6881 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006882 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006883 }
6884
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006885 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006886 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6887 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006888 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006889 }
6890
Rafael Espindolaeb265472013-08-21 21:59:03 +00006891 // Set the fp math unit.
6892 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6893 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006894 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006895 }
6896
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006897 // Compute the default target features, we need the target to handle this
6898 // because features may have dependencies on one another.
6899 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006900 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006901
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006902 // Apply the user specified deltas.
6903 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6904 I < N; ++I) {
6905 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006906 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006907 bool Enabled = Name[0] == '+';
6908 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006909 }
6910
6911 // Add the features to the compile options.
6912 //
6913 // FIXME: If we are completely confident that we have the right set, we only
6914 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006915 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006916 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6917 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006918 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006919 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006920 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006921
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006922 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006923}