blob: f9da2bf678aa2bf258ee462c7f19c843d951967d [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000033using namespace clang;
34
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000036// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
38
Chris Lattner1e1c0b92009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000049 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000050
Chris Lattner1e1c0b92009-03-20 16:06:38 +000051 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056}
57
Benjamin Kramere3b442d2012-01-10 11:50:09 +000058static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
Chris Lattner09d98f52008-10-05 21:50:58 +000066//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000069
Torok Edwinb2b37c62009-06-30 17:10:35 +000070namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000071template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000073protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000074 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000075 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000077 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000078 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000082 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000083
84};
Chris Lattner859c37a2009-08-12 06:24:27 +000085} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000086
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Daniel Dunbard86666f2010-01-26 01:44:04 +000088static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000089 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000090 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000091 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000092 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000097 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000099
John McCall5d36a8c2011-06-16 00:03:19 +0000100 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000103
John McCall31168b02011-06-15 23:02:42 +0000104 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000105 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000109
John McCall31168b02011-06-15 23:02:42 +0000110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000114 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000115
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000118 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000120
121 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000122 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123
Daniel Dunbarecf13562011-04-19 21:40:34 +0000124 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000125 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000132 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000133
Sebastian Pop422377c2012-01-20 22:01:23 +0000134 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000135 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
Evan Cheng31dd9a62014-01-26 23:12:43 +0000142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000178 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000179
Tim Northover157d9112014-01-16 08:48:16 +0000180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
Daniel Dunbarecf13562011-04-19 21:40:34 +0000184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000185}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000186
Chris Lattner30ba6742009-08-10 19:03:04 +0000187namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
Craig Topper3164f332014-03-11 03:39:26 +0000191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000194 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195 }
Mike Stump11289f42009-09-09 15:08:12 +0000196
Torok Edwinb2b37c62009-06-30 17:10:35 +0000197public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000198 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
199 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
200 this->MCountName = "\01mcount";
201 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000202
Craig Topper3164f332014-03-11 03:39:26 +0000203 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000204 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000205 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000206 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000207 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000208 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000209 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000210 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000211
Craig Topper3164f332014-03-11 03:39:26 +0000212 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000213 // FIXME: We should return 0 when building kexts.
214 return "__TEXT,__StaticInit,regular,pure_instructions";
215 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000216
John McCalleed64c72012-01-29 01:20:30 +0000217 /// Darwin does not support protected visibility. Darwin's "default"
218 /// is very similar to ELF's "protected"; Darwin requires a "weak"
219 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000220 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000221 return false;
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223};
224
Chris Lattner30ba6742009-08-10 19:03:04 +0000225
Torok Edwinb2b37c62009-06-30 17:10:35 +0000226// DragonFlyBSD Target
227template<typename Target>
228class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
229protected:
Craig Topper3164f332014-03-11 03:39:26 +0000230 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
231 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000232 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000233 Builder.defineMacro("__DragonFly__");
234 Builder.defineMacro("__DragonFly_cc_version", "100001");
235 Builder.defineMacro("__ELF__");
236 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
237 Builder.defineMacro("__tune_i386__");
238 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000239 }
240public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000241 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
242 : OSTargetInfo<Target>(Triple) {
243 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000244
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000245 switch (Triple.getArch()) {
246 default:
247 case llvm::Triple::x86:
248 case llvm::Triple::x86_64:
249 this->MCountName = ".mcount";
250 break;
251 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253};
254
255// FreeBSD Target
256template<typename Target>
257class FreeBSDTargetInfo : public OSTargetInfo<Target> {
258protected:
Craig Topper3164f332014-03-11 03:39:26 +0000259 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
260 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000261 // FreeBSD defines; list based off of gcc output
262
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000263 unsigned Release = Triple.getOSMajorVersion();
264 if (Release == 0U)
265 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000267 Builder.defineMacro("__FreeBSD__", Twine(Release));
268 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000269 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
270 DefineStd(Builder, "unix", Opts);
271 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000272
273 // On FreeBSD, wchar_t contains the number of the code point as
274 // used by the character set of the locale. These character sets are
275 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000276 //
277 // FIXME: This is wrong; the macro refers to the numerical values
278 // of wchar_t *literals*, which are not locale-dependent. However,
279 // FreeBSD systems apparently depend on us getting this wrong, and
280 // setting this to 1 is conforming even if all the basic source
281 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000282 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000283 }
284public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000285 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
286 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000287
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000288 switch (Triple.getArch()) {
289 default:
290 case llvm::Triple::x86:
291 case llvm::Triple::x86_64:
292 this->MCountName = ".mcount";
293 break;
294 case llvm::Triple::mips:
295 case llvm::Triple::mipsel:
296 case llvm::Triple::ppc:
297 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000298 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000299 this->MCountName = "_mcount";
300 break;
301 case llvm::Triple::arm:
302 this->MCountName = "__mcount";
303 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000304 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000305 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306};
307
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000308// GNU/kFreeBSD Target
309template<typename Target>
310class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
311protected:
Craig Topper3164f332014-03-11 03:39:26 +0000312 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
313 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000314 // GNU/kFreeBSD defines; list based off of gcc output
315
316 DefineStd(Builder, "unix", Opts);
317 Builder.defineMacro("__FreeBSD_kernel__");
318 Builder.defineMacro("__GLIBC__");
319 Builder.defineMacro("__ELF__");
320 if (Opts.POSIXThreads)
321 Builder.defineMacro("_REENTRANT");
322 if (Opts.CPlusPlus)
323 Builder.defineMacro("_GNU_SOURCE");
324 }
325public:
Eric Christopher917e9522014-11-18 22:36:15 +0000326 KFreeBSDTargetInfo(const llvm::Triple &Triple)
327 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000328 this->UserLabelPrefix = "";
329 }
330};
331
Chris Lattner3e2ee142010-07-07 16:01:42 +0000332// Minix Target
333template<typename Target>
334class MinixTargetInfo : public OSTargetInfo<Target> {
335protected:
Craig Topper3164f332014-03-11 03:39:26 +0000336 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
337 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000338 // Minix defines
339
340 Builder.defineMacro("__minix", "3");
341 Builder.defineMacro("_EM_WSIZE", "4");
342 Builder.defineMacro("_EM_PSIZE", "4");
343 Builder.defineMacro("_EM_SSIZE", "2");
344 Builder.defineMacro("_EM_LSIZE", "4");
345 Builder.defineMacro("_EM_FSIZE", "4");
346 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000347 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000348 DefineStd(Builder, "unix", Opts);
349 }
350public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000351 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
352 this->UserLabelPrefix = "";
353 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000354};
355
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356// Linux target
357template<typename Target>
358class LinuxTargetInfo : public OSTargetInfo<Target> {
359protected:
Craig Topper3164f332014-03-11 03:39:26 +0000360 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
361 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000362 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000363 DefineStd(Builder, "unix", Opts);
364 DefineStd(Builder, "linux", Opts);
365 Builder.defineMacro("__gnu_linux__");
366 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000367 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000368 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000369 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000370 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000371 if (Opts.CPlusPlus)
372 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000373 }
374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000375 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000376 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000377 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000378
379 switch (Triple.getArch()) {
380 default:
381 break;
382 case llvm::Triple::ppc:
383 case llvm::Triple::ppc64:
384 case llvm::Triple::ppc64le:
385 this->MCountName = "_mcount";
386 break;
387 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000388 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000389
Craig Topper3164f332014-03-11 03:39:26 +0000390 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000391 return ".text.startup";
392 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000393};
394
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000395// NetBSD Target
396template<typename Target>
397class NetBSDTargetInfo : public OSTargetInfo<Target> {
398protected:
Craig Topper3164f332014-03-11 03:39:26 +0000399 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
400 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000401 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000402 Builder.defineMacro("__NetBSD__");
403 Builder.defineMacro("__unix__");
404 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000405 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000406 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000407
408 switch (Triple.getArch()) {
409 default:
410 break;
411 case llvm::Triple::arm:
412 case llvm::Triple::armeb:
413 case llvm::Triple::thumb:
414 case llvm::Triple::thumbeb:
415 Builder.defineMacro("__ARM_DWARF_EH__");
416 break;
417 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000418 }
419public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000420 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
421 this->UserLabelPrefix = "";
422 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000423};
424
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425// OpenBSD Target
426template<typename Target>
427class OpenBSDTargetInfo : public OSTargetInfo<Target> {
428protected:
Craig Topper3164f332014-03-11 03:39:26 +0000429 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
430 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431 // OpenBSD defines; list based off of gcc output
432
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000433 Builder.defineMacro("__OpenBSD__");
434 DefineStd(Builder, "unix", Opts);
435 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000436 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000437 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438 }
439public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000440 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
441 this->UserLabelPrefix = "";
442 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000443
Eli Friedman3715d1f2011-12-15 02:15:56 +0000444 switch (Triple.getArch()) {
445 default:
446 case llvm::Triple::x86:
447 case llvm::Triple::x86_64:
448 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000449 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000450 this->MCountName = "__mcount";
451 break;
452 case llvm::Triple::mips64:
453 case llvm::Triple::mips64el:
454 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000455 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000456 this->MCountName = "_mcount";
457 break;
458 }
459 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000460};
461
Eli Friedman9fa28852012-08-08 23:57:20 +0000462// Bitrig Target
463template<typename Target>
464class BitrigTargetInfo : public OSTargetInfo<Target> {
465protected:
Craig Topper3164f332014-03-11 03:39:26 +0000466 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
467 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000468 // Bitrig defines; list based off of gcc output
469
470 Builder.defineMacro("__Bitrig__");
471 DefineStd(Builder, "unix", Opts);
472 Builder.defineMacro("__ELF__");
473 if (Opts.POSIXThreads)
474 Builder.defineMacro("_REENTRANT");
475 }
476public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000477 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
478 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000479 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000480 }
481};
482
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000483// PSP Target
484template<typename Target>
485class PSPTargetInfo : public OSTargetInfo<Target> {
486protected:
Craig Topper3164f332014-03-11 03:39:26 +0000487 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
488 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000489 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000490 Builder.defineMacro("PSP");
491 Builder.defineMacro("_PSP");
492 Builder.defineMacro("__psp__");
493 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000494 }
495public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000496 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000497 this->UserLabelPrefix = "";
498 }
499};
500
John Thompsone467e192009-11-19 17:18:50 +0000501// PS3 PPU Target
502template<typename Target>
503class PS3PPUTargetInfo : public OSTargetInfo<Target> {
504protected:
Craig Topper3164f332014-03-11 03:39:26 +0000505 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
506 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000507 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000508 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__PPU__");
510 Builder.defineMacro("__CELLOS_LV2__");
511 Builder.defineMacro("__ELF__");
512 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000513 Builder.defineMacro("_ARCH_PPC64");
514 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000515 }
516public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000518 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000519 this->LongWidth = this->LongAlign = 32;
520 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000521 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000522 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000523 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000524 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000525 }
526};
527
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000528template <typename Target>
529class PS4OSTargetInfo : public OSTargetInfo<Target> {
530protected:
531 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
532 MacroBuilder &Builder) const override {
533 Builder.defineMacro("__FreeBSD__", "9");
534 Builder.defineMacro("__FreeBSD_cc_version", "900001");
535 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
536 DefineStd(Builder, "unix", Opts);
537 Builder.defineMacro("__ELF__");
538 Builder.defineMacro("__PS4__");
539 }
540public:
541 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
542 this->WCharType = this->UnsignedShort;
543
544 this->UserLabelPrefix = "";
545
546 switch (Triple.getArch()) {
547 default:
548 case llvm::Triple::x86_64:
549 this->MCountName = ".mcount";
550 break;
551 }
552 }
553};
554
Torok Edwinb2b37c62009-06-30 17:10:35 +0000555// Solaris target
556template<typename Target>
557class SolarisTargetInfo : public OSTargetInfo<Target> {
558protected:
Craig Topper3164f332014-03-11 03:39:26 +0000559 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
560 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000561 DefineStd(Builder, "sun", Opts);
562 DefineStd(Builder, "unix", Opts);
563 Builder.defineMacro("__ELF__");
564 Builder.defineMacro("__svr4__");
565 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000566 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
567 // newer, but to 500 for everything else. feature_test.h has a check to
568 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000569 // with a new version.
570 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000571 Builder.defineMacro("_XOPEN_SOURCE", "600");
572 else
573 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000574 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000575 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000576 Builder.defineMacro("_LARGEFILE_SOURCE");
577 Builder.defineMacro("_LARGEFILE64_SOURCE");
578 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000579 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000580 }
581public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000582 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000583 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000584 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000585 // FIXME: WIntType should be SignedLong
586 }
587};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000588
589// Windows target
590template<typename Target>
591class WindowsTargetInfo : public OSTargetInfo<Target> {
592protected:
Craig Topper3164f332014-03-11 03:39:26 +0000593 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
594 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000595 Builder.defineMacro("_WIN32");
596 }
597 void getVisualStudioDefines(const LangOptions &Opts,
598 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000599 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000600 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000601 Builder.defineMacro("_CPPRTTI");
602
Reid Kleckner16514352015-01-30 21:42:55 +0000603 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000604 Builder.defineMacro("_CPPUNWIND");
605 }
606
607 if (!Opts.CharIsSigned)
608 Builder.defineMacro("_CHAR_UNSIGNED");
609
610 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
611 // but it works for now.
612 if (Opts.POSIXThreads)
613 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000614
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000615 if (Opts.MSCompatibilityVersion) {
616 Builder.defineMacro("_MSC_VER",
617 Twine(Opts.MSCompatibilityVersion / 100000));
618 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000619 // FIXME We cannot encode the revision information into 32-bits
620 Builder.defineMacro("_MSC_BUILD", Twine(1));
621 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000622
623 if (Opts.MicrosoftExt) {
624 Builder.defineMacro("_MSC_EXTENSIONS");
625
626 if (Opts.CPlusPlus11) {
627 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
628 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
629 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
630 }
631 }
632
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000633 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000634 }
635
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000636public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000637 WindowsTargetInfo(const llvm::Triple &Triple)
638 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639};
640
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000641template <typename Target>
642class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000643protected:
Craig Topper3164f332014-03-11 03:39:26 +0000644 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
645 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000646 if (Opts.POSIXThreads)
647 Builder.defineMacro("_REENTRANT");
648 if (Opts.CPlusPlus)
649 Builder.defineMacro("_GNU_SOURCE");
650
651 DefineStd(Builder, "unix", Opts);
652 Builder.defineMacro("__ELF__");
653 Builder.defineMacro("__native_client__");
654 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000655
656public:
657 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000658 this->UserLabelPrefix = "";
659 this->LongAlign = 32;
660 this->LongWidth = 32;
661 this->PointerAlign = 32;
662 this->PointerWidth = 32;
663 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000664 this->Int64Type = TargetInfo::SignedLongLong;
665 this->DoubleAlign = 64;
666 this->LongDoubleWidth = 64;
667 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000668 this->LongLongWidth = 64;
669 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000670 this->SizeType = TargetInfo::UnsignedInt;
671 this->PtrDiffType = TargetInfo::SignedInt;
672 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000673 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000674 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000675 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000676 this->DescriptionString =
677 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000678 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000679 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000680 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000681 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000682 } else if (Triple.getArch() == llvm::Triple::mipsel) {
683 // Handled on mips' setDescriptionString.
684 } else {
685 assert(Triple.getArch() == llvm::Triple::le32);
686 this->DescriptionString = "e-p:32:32-i64:64";
687 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000688 }
689};
Mike Stump11289f42009-09-09 15:08:12 +0000690} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000691
Chris Lattner09d98f52008-10-05 21:50:58 +0000692//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000693// Specific target implementations.
694//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000695
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000696namespace {
697// PPC abstract base class
698class PPCTargetInfo : public TargetInfo {
699 static const Builtin::Info BuiltinInfo[];
700 static const char * const GCCRegNames[];
701 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000702 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000703
704 // Target cpu features.
705 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000706 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000707
Ulrich Weigand8afad612014-07-28 13:17:52 +0000708protected:
709 std::string ABI;
710
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000711public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000712 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000713 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000714 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000715 LongDoubleWidth = LongDoubleAlign = 128;
716 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
717 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000718
Hal Finkel6b984f02012-07-03 16:51:04 +0000719 /// \brief Flags for architecture specific defines.
720 typedef enum {
721 ArchDefineNone = 0,
722 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
723 ArchDefinePpcgr = 1 << 1,
724 ArchDefinePpcsq = 1 << 2,
725 ArchDefine440 = 1 << 3,
726 ArchDefine603 = 1 << 4,
727 ArchDefine604 = 1 << 5,
728 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000729 ArchDefinePwr5 = 1 << 7,
730 ArchDefinePwr5x = 1 << 8,
731 ArchDefinePwr6 = 1 << 9,
732 ArchDefinePwr6x = 1 << 10,
733 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000734 ArchDefinePwr8 = 1 << 12,
735 ArchDefineA2 = 1 << 13,
736 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000737 } ArchDefineTypes;
738
Bill Schmidt38378a02013-02-01 20:23:10 +0000739 // Note: GCC recognizes the following additional cpus:
740 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
741 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
742 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000743 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000744 bool CPUKnown = llvm::StringSwitch<bool>(Name)
745 .Case("generic", true)
746 .Case("440", true)
747 .Case("450", true)
748 .Case("601", true)
749 .Case("602", true)
750 .Case("603", true)
751 .Case("603e", true)
752 .Case("603ev", true)
753 .Case("604", true)
754 .Case("604e", true)
755 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000756 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000757 .Case("g3", true)
758 .Case("7400", true)
759 .Case("g4", true)
760 .Case("7450", true)
761 .Case("g4+", true)
762 .Case("750", true)
763 .Case("970", true)
764 .Case("g5", true)
765 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000766 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000767 .Case("e500mc", true)
768 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000769 .Case("power3", true)
770 .Case("pwr3", true)
771 .Case("power4", true)
772 .Case("pwr4", true)
773 .Case("power5", true)
774 .Case("pwr5", true)
775 .Case("power5x", true)
776 .Case("pwr5x", true)
777 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000778 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000779 .Case("power6x", true)
780 .Case("pwr6x", true)
781 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000782 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000783 .Case("power8", true)
784 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000785 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000786 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000787 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000788 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000789 .Case("powerpc64le", true)
790 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000791 .Default(false);
792
793 if (CPUKnown)
794 CPU = Name;
795
796 return CPUKnown;
797 }
798
Ulrich Weigand8afad612014-07-28 13:17:52 +0000799
800 StringRef getABI() const override { return ABI; }
801
Craig Topper3164f332014-03-11 03:39:26 +0000802 void getTargetBuiltins(const Builtin::Info *&Records,
803 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000804 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000805 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000806 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000807
Craig Topper3164f332014-03-11 03:39:26 +0000808 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000809
Craig Topper3164f332014-03-11 03:39:26 +0000810 void getTargetDefines(const LangOptions &Opts,
811 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000812
Craig Topper3164f332014-03-11 03:39:26 +0000813 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000814
Craig Topper3164f332014-03-11 03:39:26 +0000815 bool handleTargetFeatures(std::vector<std::string> &Features,
816 DiagnosticsEngine &Diags) override;
817 bool hasFeature(StringRef Feature) const override;
818
819 void getGCCRegNames(const char * const *&Names,
820 unsigned &NumNames) const override;
821 void getGCCRegAliases(const GCCRegAlias *&Aliases,
822 unsigned &NumAliases) const override;
823 bool validateAsmConstraint(const char *&Name,
824 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000825 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000826 default: return false;
827 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000828 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000829 case 'b': // Base register
830 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000831 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000832 break;
833 // FIXME: The following are added to allow parsing.
834 // I just took a guess at what the actions should be.
835 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000836 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000837 case 'v': // Altivec vector register
838 Info.setAllowsRegister();
839 break;
840 case 'w':
841 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000842 case 'd':// VSX vector register to hold vector double data
843 case 'f':// VSX vector register to hold vector float data
844 case 's':// VSX vector register to hold scalar float data
845 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000846 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000847 break;
848 default:
849 return false;
850 }
851 Info.setAllowsRegister();
852 Name++; // Skip over 'w'.
853 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 case 'h': // `MQ', `CTR', or `LINK' register
855 case 'q': // `MQ' register
856 case 'c': // `CTR' register
857 case 'l': // `LINK' register
858 case 'x': // `CR' register (condition register) number 0
859 case 'y': // `CR' register (condition register)
860 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000861 Info.setAllowsRegister();
862 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000863 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000864 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000865 // (use `L' instead for SImode constants)
866 case 'K': // Unsigned 16-bit constant
867 case 'L': // Signed 16-bit constant shifted left 16 bits
868 case 'M': // Constant larger than 31
869 case 'N': // Exact power of 2
870 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000871 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000872 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000873 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000874 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000875 break;
876 case 'm': // Memory operand. Note that on PowerPC targets, m can
877 // include addresses that update the base register. It
878 // is therefore only safe to use `m' in an asm statement
879 // if that asm statement accesses the operand exactly once.
880 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000881 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000882 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000883 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000884 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000885 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
886 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000887 // register to be updated.
888 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000889 if (Name[1] != 's')
890 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000891 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000892 // include any automodification of the base register. Unlike
893 // `m', this constraint can be used in asm statements that
894 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000895 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000896 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000897 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000898 break;
899 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000900 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000901 case 'Z': // Memory operand that is an indexed or indirect from a
902 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000903 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000904 Info.setAllowsMemory();
905 Info.setAllowsRegister();
906 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000907 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000908 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000909 // register (`p' is preferable for asm statements)
910 case 'S': // Constant suitable as a 64-bit mask operand
911 case 'T': // Constant suitable as a 32-bit mask operand
912 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000913 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000914 // instructions
915 case 'W': // Vector constant that does not require memory
916 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000917 break;
918 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000919 }
John Thompson07a61a42010-06-24 22:44:13 +0000920 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000921 }
Craig Topper3164f332014-03-11 03:39:26 +0000922 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000923 std::string R;
924 switch (*Constraint) {
925 case 'e':
926 case 'w':
927 // Two-character constraint; add "^" hint for later parsing.
928 R = std::string("^") + std::string(Constraint, 2);
929 Constraint++;
930 break;
931 default:
932 return TargetInfo::convertConstraint(Constraint);
933 }
934 return R;
935 }
Craig Topper3164f332014-03-11 03:39:26 +0000936 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000937 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000938 }
Craig Topper3164f332014-03-11 03:39:26 +0000939 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000940 if (RegNo == 0) return 3;
941 if (RegNo == 1) return 4;
942 return -1;
943 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000944};
Anders Carlssonf511f642007-11-27 04:11:28 +0000945
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000946const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000947#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000948#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000949 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000950#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000951};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000952
Eric Christopher917e9522014-11-18 22:36:15 +0000953/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000954/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000955bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000956 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000957 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
958 // Ignore disabled features.
959 if (Features[i][0] == '-')
960 continue;
961
962 StringRef Feature = StringRef(Features[i]).substr(1);
963
964 if (Feature == "vsx") {
965 HasVSX = true;
966 continue;
967 }
968
Bill Schmidt59eb7672014-10-10 15:09:43 +0000969 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000970 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000971 continue;
972 }
973
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000974 // TODO: Finish this list and add an assert that we've handled them
975 // all.
976 }
977
978 return true;
979}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000980
Chris Lattnerecd49032009-03-02 22:27:17 +0000981/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
982/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000983void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000984 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000985 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000986 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000987 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000988 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000989 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000990 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000991 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000992 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000993 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000994 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000995 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000996 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000997
Chris Lattnerecd49032009-03-02 22:27:17 +0000998 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000999 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1000 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001001 } else {
1002 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1003 getTriple().getOS() != llvm::Triple::OpenBSD)
1004 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001005 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001006
Ulrich Weigand8afad612014-07-28 13:17:52 +00001007 // ABI options.
1008 if (ABI == "elfv1")
1009 Builder.defineMacro("_CALL_ELF", "1");
1010 if (ABI == "elfv2")
1011 Builder.defineMacro("_CALL_ELF", "2");
1012
Chris Lattnerecd49032009-03-02 22:27:17 +00001013 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001014 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1015 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001016
Chris Lattnerecd49032009-03-02 22:27:17 +00001017 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001018 if (LongDoubleWidth == 128)
1019 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001020
John Thompsone467e192009-11-19 17:18:50 +00001021 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001022 Builder.defineMacro("__VEC__", "10206");
1023 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001024 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001025
1026 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001027 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1028 .Case("440", ArchDefineName)
1029 .Case("450", ArchDefineName | ArchDefine440)
1030 .Case("601", ArchDefineName)
1031 .Case("602", ArchDefineName | ArchDefinePpcgr)
1032 .Case("603", ArchDefineName | ArchDefinePpcgr)
1033 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1034 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1035 .Case("604", ArchDefineName | ArchDefinePpcgr)
1036 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1037 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001038 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001039 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1040 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1041 .Case("750", ArchDefineName | ArchDefinePpcgr)
1042 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1043 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001044 .Case("a2", ArchDefineA2)
1045 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001046 .Case("pwr3", ArchDefinePpcgr)
1047 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1048 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1049 | ArchDefinePpcsq)
1050 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1051 | ArchDefinePpcgr | ArchDefinePpcsq)
1052 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1053 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1054 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1055 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1056 | ArchDefinePpcsq)
1057 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1058 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001059 | ArchDefinePpcgr | ArchDefinePpcsq)
1060 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1061 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1062 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001063 .Case("power3", ArchDefinePpcgr)
1064 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1065 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1066 | ArchDefinePpcsq)
1067 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1068 | ArchDefinePpcgr | ArchDefinePpcsq)
1069 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1070 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1071 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1072 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1073 | ArchDefinePpcsq)
1074 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1075 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001076 | ArchDefinePpcgr | ArchDefinePpcsq)
1077 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1078 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1079 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001080 .Default(ArchDefineNone);
1081
1082 if (defs & ArchDefineName)
1083 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1084 if (defs & ArchDefinePpcgr)
1085 Builder.defineMacro("_ARCH_PPCGR");
1086 if (defs & ArchDefinePpcsq)
1087 Builder.defineMacro("_ARCH_PPCSQ");
1088 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001089 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001090 if (defs & ArchDefine603)
1091 Builder.defineMacro("_ARCH_603");
1092 if (defs & ArchDefine604)
1093 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001094 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001095 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001096 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001097 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001098 if (defs & ArchDefinePwr5x)
1099 Builder.defineMacro("_ARCH_PWR5X");
1100 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001101 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001102 if (defs & ArchDefinePwr6x)
1103 Builder.defineMacro("_ARCH_PWR6X");
1104 if (defs & ArchDefinePwr7)
1105 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001106 if (defs & ArchDefinePwr8)
1107 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001108 if (defs & ArchDefineA2)
1109 Builder.defineMacro("_ARCH_A2");
1110 if (defs & ArchDefineA2q) {
1111 Builder.defineMacro("_ARCH_A2Q");
1112 Builder.defineMacro("_ARCH_QP");
1113 }
1114
1115 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1116 Builder.defineMacro("__bg__");
1117 Builder.defineMacro("__THW_BLUEGENE__");
1118 Builder.defineMacro("__bgq__");
1119 Builder.defineMacro("__TOS_BGQ__");
1120 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001121
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001122 if (HasVSX)
1123 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001124 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001125 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001126
Bill Schmidt38378a02013-02-01 20:23:10 +00001127 // FIXME: The following are not yet generated here by Clang, but are
1128 // generated by GCC:
1129 //
1130 // _SOFT_FLOAT_
1131 // __RECIP_PRECISION__
1132 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001133 // __RECIP__
1134 // __RECIPF__
1135 // __RSQRTE__
1136 // __RSQRTEF__
1137 // _SOFT_DOUBLE_
1138 // __NO_LWSYNC__
1139 // __HAVE_BSWAP__
1140 // __LONGDOUBLE128
1141 // __CMODEL_MEDIUM__
1142 // __CMODEL_LARGE__
1143 // _CALL_SYSV
1144 // _CALL_DARWIN
1145 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001146}
1147
1148void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1149 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1150 .Case("7400", true)
1151 .Case("g4", true)
1152 .Case("7450", true)
1153 .Case("g4+", true)
1154 .Case("970", true)
1155 .Case("g5", true)
1156 .Case("pwr6", true)
1157 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001158 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001159 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001160 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001161 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001162
1163 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001164}
1165
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001166bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001167 return llvm::StringSwitch<bool>(Feature)
1168 .Case("powerpc", true)
1169 .Case("vsx", HasVSX)
1170 .Case("power8-vector", HasP8Vector)
1171 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001172}
Chris Lattner17df24e2008-04-21 18:56:49 +00001173
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001174const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001175 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1176 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1177 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1178 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1179 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1180 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1181 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1182 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001183 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001184 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001185 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001186 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1187 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1188 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1189 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001190 "vrsave", "vscr",
1191 "spe_acc", "spefscr",
1192 "sfp"
1193};
Chris Lattner10a5b382007-01-29 05:24:35 +00001194
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001195void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001196 unsigned &NumNames) const {
1197 Names = GCCRegNames;
1198 NumNames = llvm::array_lengthof(GCCRegNames);
1199}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001200
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001201const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1202 // While some of these aliases do map to different registers
1203 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001204 { { "0" }, "r0" },
1205 { { "1"}, "r1" },
1206 { { "2" }, "r2" },
1207 { { "3" }, "r3" },
1208 { { "4" }, "r4" },
1209 { { "5" }, "r5" },
1210 { { "6" }, "r6" },
1211 { { "7" }, "r7" },
1212 { { "8" }, "r8" },
1213 { { "9" }, "r9" },
1214 { { "10" }, "r10" },
1215 { { "11" }, "r11" },
1216 { { "12" }, "r12" },
1217 { { "13" }, "r13" },
1218 { { "14" }, "r14" },
1219 { { "15" }, "r15" },
1220 { { "16" }, "r16" },
1221 { { "17" }, "r17" },
1222 { { "18" }, "r18" },
1223 { { "19" }, "r19" },
1224 { { "20" }, "r20" },
1225 { { "21" }, "r21" },
1226 { { "22" }, "r22" },
1227 { { "23" }, "r23" },
1228 { { "24" }, "r24" },
1229 { { "25" }, "r25" },
1230 { { "26" }, "r26" },
1231 { { "27" }, "r27" },
1232 { { "28" }, "r28" },
1233 { { "29" }, "r29" },
1234 { { "30" }, "r30" },
1235 { { "31" }, "r31" },
1236 { { "fr0" }, "f0" },
1237 { { "fr1" }, "f1" },
1238 { { "fr2" }, "f2" },
1239 { { "fr3" }, "f3" },
1240 { { "fr4" }, "f4" },
1241 { { "fr5" }, "f5" },
1242 { { "fr6" }, "f6" },
1243 { { "fr7" }, "f7" },
1244 { { "fr8" }, "f8" },
1245 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001246 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001247 { { "fr11" }, "f11" },
1248 { { "fr12" }, "f12" },
1249 { { "fr13" }, "f13" },
1250 { { "fr14" }, "f14" },
1251 { { "fr15" }, "f15" },
1252 { { "fr16" }, "f16" },
1253 { { "fr17" }, "f17" },
1254 { { "fr18" }, "f18" },
1255 { { "fr19" }, "f19" },
1256 { { "fr20" }, "f20" },
1257 { { "fr21" }, "f21" },
1258 { { "fr22" }, "f22" },
1259 { { "fr23" }, "f23" },
1260 { { "fr24" }, "f24" },
1261 { { "fr25" }, "f25" },
1262 { { "fr26" }, "f26" },
1263 { { "fr27" }, "f27" },
1264 { { "fr28" }, "f28" },
1265 { { "fr29" }, "f29" },
1266 { { "fr30" }, "f30" },
1267 { { "fr31" }, "f31" },
1268 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001269};
1270
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001271void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001272 unsigned &NumAliases) const {
1273 Aliases = GCCRegAliases;
1274 NumAliases = llvm::array_lengthof(GCCRegAliases);
1275}
1276} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001277
Chris Lattner5ba61f02006-10-14 07:39:34 +00001278namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001279class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001280public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001281 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001282 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001283
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001284 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001285 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001286 case llvm::Triple::FreeBSD:
1287 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001288 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001289 PtrDiffType = SignedInt;
1290 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001291 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001292 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001293 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001294 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001295
Roman Divacky3ffe7462012-03-13 19:20:17 +00001296 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1297 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001298 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001299 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001300
1301 // PPC32 supports atomics up to 4 bytes.
1302 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001303 }
1304
Craig Topper3164f332014-03-11 03:39:26 +00001305 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001306 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001307 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001308 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001309};
1310} // end anonymous namespace.
1311
Bill Schmidt778d3872013-07-26 01:36:11 +00001312// Note: ABI differences may eventually require us to have a separate
1313// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001314namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001315class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001316public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001317 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001318 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001319 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001320 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001321
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001322 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1323 DescriptionString = "e-m:e-i64:64-n32:64";
1324 ABI = "elfv2";
1325 } else {
1326 DescriptionString = "E-m:e-i64:64-n32:64";
1327 ABI = "elfv1";
1328 }
1329
1330 switch (getTriple().getOS()) {
1331 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001332 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001333 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001334 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001335 case llvm::Triple::NetBSD:
1336 IntMaxType = SignedLongLong;
1337 Int64Type = SignedLongLong;
1338 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001339 default:
1340 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001341 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001342
1343 // PPC64 supports atomics up to 8 bytes.
1344 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001345 }
Craig Topper3164f332014-03-11 03:39:26 +00001346 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001347 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001348 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001349 // PPC64 Linux-specifc ABI options.
1350 bool setABI(const std::string &Name) override {
1351 if (Name == "elfv1" || Name == "elfv2") {
1352 ABI = Name;
1353 return true;
1354 }
1355 return false;
1356 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001357};
1358} // end anonymous namespace.
1359
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001360
1361namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001362class DarwinPPC32TargetInfo :
1363 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001364public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001365 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1366 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001367 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001368 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001369 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001370 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001371 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001372 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001373 }
Craig Topper3164f332014-03-11 03:39:26 +00001374 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001375 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001376 }
1377};
1378
1379class DarwinPPC64TargetInfo :
1380 public DarwinTargetInfo<PPC64TargetInfo> {
1381public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001382 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1383 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001384 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001385 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001386 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001387 }
1388};
1389} // end anonymous namespace.
1390
Chris Lattner5ba61f02006-10-14 07:39:34 +00001391namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001392 static const unsigned NVPTXAddrSpaceMap[] = {
1393 1, // opencl_global
1394 3, // opencl_local
1395 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001396 // FIXME: generic has to be added to the target
1397 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001398 1, // cuda_device
1399 4, // cuda_constant
1400 3, // cuda_shared
1401 };
1402 class NVPTXTargetInfo : public TargetInfo {
1403 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001404 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001405
1406 // The GPU profiles supported by the NVPTX backend
1407 enum GPUKind {
1408 GK_NONE,
1409 GK_SM20,
1410 GK_SM21,
1411 GK_SM30,
1412 GK_SM35,
1413 } GPU;
1414
Peter Collingbournec947aae2012-05-20 23:28:41 +00001415 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001416 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001417 BigEndian = false;
1418 TLSSupported = false;
1419 LongWidth = LongAlign = 64;
1420 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001421 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001422 // Define available target features
1423 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001424 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001425 // Set the default GPU to sm20
1426 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001427 }
Craig Topper3164f332014-03-11 03:39:26 +00001428 void getTargetDefines(const LangOptions &Opts,
1429 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001430 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001431 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001432 if (Opts.CUDAIsDevice) {
1433 // Set __CUDA_ARCH__ for the GPU specified.
1434 std::string CUDAArchCode;
1435 switch (GPU) {
1436 case GK_SM20:
1437 CUDAArchCode = "200";
1438 break;
1439 case GK_SM21:
1440 CUDAArchCode = "210";
1441 break;
1442 case GK_SM30:
1443 CUDAArchCode = "300";
1444 break;
1445 case GK_SM35:
1446 CUDAArchCode = "350";
1447 break;
1448 default:
1449 llvm_unreachable("Unhandled target CPU");
1450 }
1451 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1452 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001453 }
Craig Topper3164f332014-03-11 03:39:26 +00001454 void getTargetBuiltins(const Builtin::Info *&Records,
1455 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001456 Records = BuiltinInfo;
1457 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001458 }
Craig Topper3164f332014-03-11 03:39:26 +00001459 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001460 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001461 }
Craig Topper3164f332014-03-11 03:39:26 +00001462
1463 void getGCCRegNames(const char * const *&Names,
1464 unsigned &NumNames) const override;
1465 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1466 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001467 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001468 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001469 NumAliases = 0;
1470 }
Eric Christopher917e9522014-11-18 22:36:15 +00001471 bool
1472 validateAsmConstraint(const char *&Name,
1473 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001474 switch (*Name) {
1475 default: return false;
1476 case 'c':
1477 case 'h':
1478 case 'r':
1479 case 'l':
1480 case 'f':
1481 case 'd':
1482 Info.setAllowsRegister();
1483 return true;
1484 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001485 }
Craig Topper3164f332014-03-11 03:39:26 +00001486 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001487 // FIXME: Is this really right?
1488 return "";
1489 }
Craig Topper3164f332014-03-11 03:39:26 +00001490 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001491 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001492 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001493 }
Craig Topper3164f332014-03-11 03:39:26 +00001494 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001495 GPU = llvm::StringSwitch<GPUKind>(Name)
1496 .Case("sm_20", GK_SM20)
1497 .Case("sm_21", GK_SM21)
1498 .Case("sm_30", GK_SM30)
1499 .Case("sm_35", GK_SM35)
1500 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001501
Reid Klecknerbbc01782014-12-03 21:53:36 +00001502 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001503 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001504 };
1505
1506 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1507#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1508#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1509 ALL_LANGUAGES },
1510#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001511 };
1512
1513 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1514 "r0"
1515 };
1516
1517 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1518 unsigned &NumNames) const {
1519 Names = GCCRegNames;
1520 NumNames = llvm::array_lengthof(GCCRegNames);
1521 }
1522
1523 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1524 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001525 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001526 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001527 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1528 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001529 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001530 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001531 };
1532
1533 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1534 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001535 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001536 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001537 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1538 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001539 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001540 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001541 };
1542}
1543
1544namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001545
1546static const unsigned R600AddrSpaceMap[] = {
1547 1, // opencl_global
1548 3, // opencl_local
1549 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001550 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001551 1, // cuda_device
1552 2, // cuda_constant
1553 3 // cuda_shared
1554};
1555
Tom Stellarda96344b2014-08-21 13:58:40 +00001556// If you edit the description strings, make sure you update
1557// getPointerWidthV().
1558
Tom Stellardc74b1e02013-03-04 17:40:53 +00001559static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001560 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1561 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001562
1563static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001564 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1565 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001566
1567static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001568 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001569 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1570 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001571
Eli Friedmand13b41e2012-10-12 23:32:00 +00001572class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001573 static const Builtin::Info BuiltinInfo[];
1574
Tom Stellardc74b1e02013-03-04 17:40:53 +00001575 /// \brief The GPU profiles supported by the R600 target.
1576 enum GPUKind {
1577 GK_NONE,
1578 GK_R600,
1579 GK_R600_DOUBLE_OPS,
1580 GK_R700,
1581 GK_R700_DOUBLE_OPS,
1582 GK_EVERGREEN,
1583 GK_EVERGREEN_DOUBLE_OPS,
1584 GK_NORTHERN_ISLANDS,
1585 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001586 GK_SOUTHERN_ISLANDS,
1587 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001588 } GPU;
1589
Eli Friedmand13b41e2012-10-12 23:32:00 +00001590public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001591 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001592 : TargetInfo(Triple) {
1593
1594 if (Triple.getArch() == llvm::Triple::amdgcn) {
1595 DescriptionString = DescriptionStringSI;
1596 GPU = GK_SOUTHERN_ISLANDS;
1597 } else {
1598 DescriptionString = DescriptionStringR600;
1599 GPU = GK_R600;
1600 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001601 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001602 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001603 }
1604
Tom Stellarda96344b2014-08-21 13:58:40 +00001605 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1606 if (GPU <= GK_CAYMAN)
1607 return 32;
1608
1609 switch(AddrSpace) {
1610 default:
1611 return 64;
1612 case 0:
1613 case 3:
1614 case 5:
1615 return 32;
1616 }
1617 }
1618
Craig Topper3164f332014-03-11 03:39:26 +00001619 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001620 return "";
1621 }
1622
Craig Topper3164f332014-03-11 03:39:26 +00001623 void getGCCRegNames(const char * const *&Names,
1624 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001625 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001626 numNames = 0;
1627 }
1628
Craig Topper3164f332014-03-11 03:39:26 +00001629 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1630 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001631 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001632 NumAliases = 0;
1633 }
1634
Craig Topper3164f332014-03-11 03:39:26 +00001635 bool validateAsmConstraint(const char *&Name,
1636 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001637 return true;
1638 }
1639
Craig Topper3164f332014-03-11 03:39:26 +00001640 void getTargetBuiltins(const Builtin::Info *&Records,
1641 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001642 Records = BuiltinInfo;
1643 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001644 }
1645
Craig Topper3164f332014-03-11 03:39:26 +00001646 void getTargetDefines(const LangOptions &Opts,
1647 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001648 Builder.defineMacro("__R600__");
1649 }
1650
Craig Topper3164f332014-03-11 03:39:26 +00001651 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001652 return TargetInfo::CharPtrBuiltinVaList;
1653 }
1654
Craig Topper3164f332014-03-11 03:39:26 +00001655 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001656 GPU = llvm::StringSwitch<GPUKind>(Name)
1657 .Case("r600" , GK_R600)
1658 .Case("rv610", GK_R600)
1659 .Case("rv620", GK_R600)
1660 .Case("rv630", GK_R600)
1661 .Case("rv635", GK_R600)
1662 .Case("rs780", GK_R600)
1663 .Case("rs880", GK_R600)
1664 .Case("rv670", GK_R600_DOUBLE_OPS)
1665 .Case("rv710", GK_R700)
1666 .Case("rv730", GK_R700)
1667 .Case("rv740", GK_R700_DOUBLE_OPS)
1668 .Case("rv770", GK_R700_DOUBLE_OPS)
1669 .Case("palm", GK_EVERGREEN)
1670 .Case("cedar", GK_EVERGREEN)
1671 .Case("sumo", GK_EVERGREEN)
1672 .Case("sumo2", GK_EVERGREEN)
1673 .Case("redwood", GK_EVERGREEN)
1674 .Case("juniper", GK_EVERGREEN)
1675 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1676 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1677 .Case("barts", GK_NORTHERN_ISLANDS)
1678 .Case("turks", GK_NORTHERN_ISLANDS)
1679 .Case("caicos", GK_NORTHERN_ISLANDS)
1680 .Case("cayman", GK_CAYMAN)
1681 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001682 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001683 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1684 .Case("verde", GK_SOUTHERN_ISLANDS)
1685 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001686 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001687 .Case("bonaire", GK_SEA_ISLANDS)
1688 .Case("kabini", GK_SEA_ISLANDS)
1689 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001690 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001691 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001692 .Default(GK_NONE);
1693
1694 if (GPU == GK_NONE) {
1695 return false;
1696 }
1697
1698 // Set the correct data layout
1699 switch (GPU) {
1700 case GK_NONE:
1701 case GK_R600:
1702 case GK_R700:
1703 case GK_EVERGREEN:
1704 case GK_NORTHERN_ISLANDS:
1705 DescriptionString = DescriptionStringR600;
1706 break;
1707 case GK_R600_DOUBLE_OPS:
1708 case GK_R700_DOUBLE_OPS:
1709 case GK_EVERGREEN_DOUBLE_OPS:
1710 case GK_CAYMAN:
1711 DescriptionString = DescriptionStringR600DoubleOps;
1712 break;
1713 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001714 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001715 DescriptionString = DescriptionStringSI;
1716 break;
1717 }
1718
1719 return true;
1720 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001721};
1722
Matt Arsenault56f008d2014-06-24 20:45:01 +00001723const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1724#define BUILTIN(ID, TYPE, ATTRS) \
1725 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1726#include "clang/Basic/BuiltinsR600.def"
1727};
1728
Eli Friedmand13b41e2012-10-12 23:32:00 +00001729} // end anonymous namespace
1730
1731namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001732// Namespace for x86 abstract base class
1733const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001734#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001735#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001736 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001737#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001738};
Eli Friedmanb5366062008-05-20 14:21:01 +00001739
Nuno Lopescfca1f02009-12-23 17:49:57 +00001740static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001741 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1742 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001743 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001744 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1745 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1746 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001747 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001748 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1749 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001750};
1751
Eric Christophercdd36352011-06-21 00:05:20 +00001752const TargetInfo::AddlRegName AddlRegNames[] = {
1753 { { "al", "ah", "eax", "rax" }, 0 },
1754 { { "bl", "bh", "ebx", "rbx" }, 3 },
1755 { { "cl", "ch", "ecx", "rcx" }, 2 },
1756 { { "dl", "dh", "edx", "rdx" }, 1 },
1757 { { "esi", "rsi" }, 4 },
1758 { { "edi", "rdi" }, 5 },
1759 { { "esp", "rsp" }, 7 },
1760 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001761};
1762
1763// X86 target abstract base class; x86-32 and x86-64 are very close, so
1764// most of the implementation can be shared.
1765class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001766 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001767 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001768 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001769 enum MMX3DNowEnum {
1770 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1771 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001772 enum XOPEnum {
1773 NoXOP,
1774 SSE4A,
1775 FMA4,
1776 XOP
1777 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001778
Eric Christophere1ddaf92010-04-02 23:50:19 +00001779 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001780 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001781 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001782 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001783 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001784 bool HasBMI;
1785 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001786 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001787 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001788 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001789 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001790 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001791 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001792 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001793 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001794 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1795 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001796 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001797 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001798
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001799 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1800 ///
1801 /// Each enumeration represents a particular CPU supported by Clang. These
1802 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1803 enum CPUKind {
1804 CK_Generic,
1805
1806 /// \name i386
1807 /// i386-generation processors.
1808 //@{
1809 CK_i386,
1810 //@}
1811
1812 /// \name i486
1813 /// i486-generation processors.
1814 //@{
1815 CK_i486,
1816 CK_WinChipC6,
1817 CK_WinChip2,
1818 CK_C3,
1819 //@}
1820
1821 /// \name i586
1822 /// i586-generation processors, P5 microarchitecture based.
1823 //@{
1824 CK_i586,
1825 CK_Pentium,
1826 CK_PentiumMMX,
1827 //@}
1828
1829 /// \name i686
1830 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1831 //@{
1832 CK_i686,
1833 CK_PentiumPro,
1834 CK_Pentium2,
1835 CK_Pentium3,
1836 CK_Pentium3M,
1837 CK_PentiumM,
1838 CK_C3_2,
1839
1840 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1841 /// Clang however has some logic to suport this.
1842 // FIXME: Warn, deprecate, and potentially remove this.
1843 CK_Yonah,
1844 //@}
1845
1846 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001847 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001848 //@{
1849 CK_Pentium4,
1850 CK_Pentium4M,
1851 CK_Prescott,
1852 CK_Nocona,
1853 //@}
1854
1855 /// \name Core
1856 /// Core microarchitecture based processors.
1857 //@{
1858 CK_Core2,
1859
1860 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1861 /// codename which GCC no longer accepts as an option to -march, but Clang
1862 /// has some logic for recognizing it.
1863 // FIXME: Warn, deprecate, and potentially remove this.
1864 CK_Penryn,
1865 //@}
1866
1867 /// \name Atom
1868 /// Atom processors
1869 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001870 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001871 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001872 //@}
1873
1874 /// \name Nehalem
1875 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001876 CK_Nehalem,
1877
1878 /// \name Westmere
1879 /// Westmere microarchitecture based processors.
1880 CK_Westmere,
1881
1882 /// \name Sandy Bridge
1883 /// Sandy Bridge microarchitecture based processors.
1884 CK_SandyBridge,
1885
1886 /// \name Ivy Bridge
1887 /// Ivy Bridge microarchitecture based processors.
1888 CK_IvyBridge,
1889
1890 /// \name Haswell
1891 /// Haswell microarchitecture based processors.
1892 CK_Haswell,
1893
1894 /// \name Broadwell
1895 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001896 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001897
1898 /// \name Skylake
1899 /// Skylake microarchitecture based processors.
1900 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001901
Craig Topper449314e2013-08-20 07:09:39 +00001902 /// \name Knights Landing
1903 /// Knights Landing processor.
1904 CK_KNL,
1905
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001906 /// \name K6
1907 /// K6 architecture processors.
1908 //@{
1909 CK_K6,
1910 CK_K6_2,
1911 CK_K6_3,
1912 //@}
1913
1914 /// \name K7
1915 /// K7 architecture processors.
1916 //@{
1917 CK_Athlon,
1918 CK_AthlonThunderbird,
1919 CK_Athlon4,
1920 CK_AthlonXP,
1921 CK_AthlonMP,
1922 //@}
1923
1924 /// \name K8
1925 /// K8 architecture processors.
1926 //@{
1927 CK_Athlon64,
1928 CK_Athlon64SSE3,
1929 CK_AthlonFX,
1930 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001931 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001932 CK_Opteron,
1933 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001934 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001935 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001936
Benjamin Kramer569f2152012-01-10 11:50:18 +00001937 /// \name Bobcat
1938 /// Bobcat architecture processors.
1939 //@{
1940 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001941 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001942 //@}
1943
1944 /// \name Bulldozer
1945 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001946 //@{
1947 CK_BDVER1,
1948 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001949 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001950 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001951 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001952
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001953 /// This specification is deprecated and will be removed in the future.
1954 /// Users should prefer \see CK_K8.
1955 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001956 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001957 CK_x86_64,
1958 //@}
1959
1960 /// \name Geode
1961 /// Geode processors.
1962 //@{
1963 CK_Geode
1964 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001965 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001966
Rafael Espindolaeb265472013-08-21 21:59:03 +00001967 enum FPMathKind {
1968 FP_Default,
1969 FP_SSE,
1970 FP_387
1971 } FPMath;
1972
Eli Friedman3fd920a2008-08-20 02:34:37 +00001973public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001974 X86TargetInfo(const llvm::Triple &Triple)
1975 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001976 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001977 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1978 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1979 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1980 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1981 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1982 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001983 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001984 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001985 }
Craig Topper3164f332014-03-11 03:39:26 +00001986 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001987 // X87 evaluates with 80 bits "long double" precision.
1988 return SSELevel == NoSSE ? 2 : 0;
1989 }
Craig Topper3164f332014-03-11 03:39:26 +00001990 void getTargetBuiltins(const Builtin::Info *&Records,
1991 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001992 Records = BuiltinInfo;
1993 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001994 }
Craig Topper3164f332014-03-11 03:39:26 +00001995 void getGCCRegNames(const char * const *&Names,
1996 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001997 Names = GCCRegNames;
1998 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001999 }
Craig Topper3164f332014-03-11 03:39:26 +00002000 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2001 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002002 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002003 NumAliases = 0;
2004 }
Craig Topper3164f332014-03-11 03:39:26 +00002005 void getGCCAddlRegNames(const AddlRegName *&Names,
2006 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002007 Names = AddlRegNames;
2008 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002009 }
Craig Topper3164f332014-03-11 03:39:26 +00002010 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002011 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002012
Akira Hatanaka974131e2014-09-18 18:17:18 +00002013 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2014
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002015 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2016
Akira Hatanaka974131e2014-09-18 18:17:18 +00002017 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2018
Craig Topper3164f332014-03-11 03:39:26 +00002019 std::string convertConstraint(const char *&Constraint) const override;
2020 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002021 return "~{dirflag},~{fpsr},~{flags}";
2022 }
Craig Topper3164f332014-03-11 03:39:26 +00002023 void getTargetDefines(const LangOptions &Opts,
2024 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002025 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2026 bool Enabled);
2027 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2028 bool Enabled);
2029 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2030 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002031 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2032 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002033 setFeatureEnabledImpl(Features, Name, Enabled);
2034 }
2035 // This exists purely to cut down on the number of virtual calls in
2036 // getDefaultFeatures which calls this repeatedly.
2037 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2038 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002039 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2040 bool hasFeature(StringRef Feature) const override;
2041 bool handleTargetFeatures(std::vector<std::string> &Features,
2042 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002043 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002044 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002045 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002046 else if (getTriple().getArch() == llvm::Triple::x86 &&
2047 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002048 return "no-mmx";
2049 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002050 }
Craig Topper3164f332014-03-11 03:39:26 +00002051 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002052 CPU = llvm::StringSwitch<CPUKind>(Name)
2053 .Case("i386", CK_i386)
2054 .Case("i486", CK_i486)
2055 .Case("winchip-c6", CK_WinChipC6)
2056 .Case("winchip2", CK_WinChip2)
2057 .Case("c3", CK_C3)
2058 .Case("i586", CK_i586)
2059 .Case("pentium", CK_Pentium)
2060 .Case("pentium-mmx", CK_PentiumMMX)
2061 .Case("i686", CK_i686)
2062 .Case("pentiumpro", CK_PentiumPro)
2063 .Case("pentium2", CK_Pentium2)
2064 .Case("pentium3", CK_Pentium3)
2065 .Case("pentium3m", CK_Pentium3M)
2066 .Case("pentium-m", CK_PentiumM)
2067 .Case("c3-2", CK_C3_2)
2068 .Case("yonah", CK_Yonah)
2069 .Case("pentium4", CK_Pentium4)
2070 .Case("pentium4m", CK_Pentium4M)
2071 .Case("prescott", CK_Prescott)
2072 .Case("nocona", CK_Nocona)
2073 .Case("core2", CK_Core2)
2074 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002075 .Case("bonnell", CK_Bonnell)
2076 .Case("atom", CK_Bonnell) // Legacy name.
2077 .Case("silvermont", CK_Silvermont)
2078 .Case("slm", CK_Silvermont) // Legacy name.
2079 .Case("nehalem", CK_Nehalem)
2080 .Case("corei7", CK_Nehalem) // Legacy name.
2081 .Case("westmere", CK_Westmere)
2082 .Case("sandybridge", CK_SandyBridge)
2083 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2084 .Case("ivybridge", CK_IvyBridge)
2085 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2086 .Case("haswell", CK_Haswell)
2087 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002088 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002089 .Case("skylake", CK_Skylake)
2090 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002091 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002092 .Case("k6", CK_K6)
2093 .Case("k6-2", CK_K6_2)
2094 .Case("k6-3", CK_K6_3)
2095 .Case("athlon", CK_Athlon)
2096 .Case("athlon-tbird", CK_AthlonThunderbird)
2097 .Case("athlon-4", CK_Athlon4)
2098 .Case("athlon-xp", CK_AthlonXP)
2099 .Case("athlon-mp", CK_AthlonMP)
2100 .Case("athlon64", CK_Athlon64)
2101 .Case("athlon64-sse3", CK_Athlon64SSE3)
2102 .Case("athlon-fx", CK_AthlonFX)
2103 .Case("k8", CK_K8)
2104 .Case("k8-sse3", CK_K8SSE3)
2105 .Case("opteron", CK_Opteron)
2106 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002107 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002108 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002109 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002110 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002111 .Case("bdver1", CK_BDVER1)
2112 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002113 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002114 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002115 .Case("x86-64", CK_x86_64)
2116 .Case("geode", CK_Geode)
2117 .Default(CK_Generic);
2118
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002119 // Perform any per-CPU checks necessary to determine if this CPU is
2120 // acceptable.
2121 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2122 // invalid without explaining *why*.
2123 switch (CPU) {
2124 case CK_Generic:
2125 // No processor selected!
2126 return false;
2127
2128 case CK_i386:
2129 case CK_i486:
2130 case CK_WinChipC6:
2131 case CK_WinChip2:
2132 case CK_C3:
2133 case CK_i586:
2134 case CK_Pentium:
2135 case CK_PentiumMMX:
2136 case CK_i686:
2137 case CK_PentiumPro:
2138 case CK_Pentium2:
2139 case CK_Pentium3:
2140 case CK_Pentium3M:
2141 case CK_PentiumM:
2142 case CK_Yonah:
2143 case CK_C3_2:
2144 case CK_Pentium4:
2145 case CK_Pentium4M:
2146 case CK_Prescott:
2147 case CK_K6:
2148 case CK_K6_2:
2149 case CK_K6_3:
2150 case CK_Athlon:
2151 case CK_AthlonThunderbird:
2152 case CK_Athlon4:
2153 case CK_AthlonXP:
2154 case CK_AthlonMP:
2155 case CK_Geode:
2156 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002157 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002158 return false;
2159
2160 // Fallthrough
2161 case CK_Nocona:
2162 case CK_Core2:
2163 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002164 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002165 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002166 case CK_Nehalem:
2167 case CK_Westmere:
2168 case CK_SandyBridge:
2169 case CK_IvyBridge:
2170 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002171 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002172 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002173 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002174 case CK_Athlon64:
2175 case CK_Athlon64SSE3:
2176 case CK_AthlonFX:
2177 case CK_K8:
2178 case CK_K8SSE3:
2179 case CK_Opteron:
2180 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002181 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002182 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002183 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002184 case CK_BDVER1:
2185 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002186 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002187 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002188 case CK_x86_64:
2189 return true;
2190 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002191 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002192 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002193
Craig Topper3164f332014-03-11 03:39:26 +00002194 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002195
Craig Topper3164f332014-03-11 03:39:26 +00002196 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002197 // We accept all non-ARM calling conventions
2198 return (CC == CC_X86ThisCall ||
2199 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002200 CC == CC_X86StdCall ||
2201 CC == CC_X86VectorCall ||
2202 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002203 CC == CC_X86Pascal ||
2204 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002205 }
2206
Craig Topper3164f332014-03-11 03:39:26 +00002207 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002208 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002209 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002210};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002211
Rafael Espindolaeb265472013-08-21 21:59:03 +00002212bool X86TargetInfo::setFPMath(StringRef Name) {
2213 if (Name == "387") {
2214 FPMath = FP_387;
2215 return true;
2216 }
2217 if (Name == "sse") {
2218 FPMath = FP_SSE;
2219 return true;
2220 }
2221 return false;
2222}
2223
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002224void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002225 // FIXME: This *really* should not be here.
2226
2227 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002228 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002229 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002230
Chandler Carruth212334f2011-09-28 08:55:37 +00002231 switch (CPU) {
2232 case CK_Generic:
2233 case CK_i386:
2234 case CK_i486:
2235 case CK_i586:
2236 case CK_Pentium:
2237 case CK_i686:
2238 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002239 break;
2240 case CK_PentiumMMX:
2241 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002242 case CK_K6:
2243 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002244 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002245 break;
2246 case CK_Pentium3:
2247 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002248 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002249 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002250 break;
2251 case CK_PentiumM:
2252 case CK_Pentium4:
2253 case CK_Pentium4M:
2254 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002255 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002256 break;
2257 case CK_Yonah:
2258 case CK_Prescott:
2259 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002260 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002261 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002262 break;
2263 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002264 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002265 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002266 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002267 break;
2268 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002269 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002270 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002271 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002272 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002273 setFeatureEnabledImpl(Features, "avx512f", true);
2274 setFeatureEnabledImpl(Features, "avx512cd", true);
2275 setFeatureEnabledImpl(Features, "avx512dq", true);
2276 setFeatureEnabledImpl(Features, "avx512bw", true);
2277 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002278 // FALLTHROUGH
2279 case CK_Broadwell:
2280 setFeatureEnabledImpl(Features, "rdseed", true);
2281 setFeatureEnabledImpl(Features, "adx", true);
2282 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002283 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002284 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002285 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002286 setFeatureEnabledImpl(Features, "bmi", true);
2287 setFeatureEnabledImpl(Features, "bmi2", true);
2288 setFeatureEnabledImpl(Features, "rtm", true);
2289 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002290 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002291 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002292 setFeatureEnabledImpl(Features, "rdrnd", true);
2293 setFeatureEnabledImpl(Features, "f16c", true);
2294 setFeatureEnabledImpl(Features, "fsgsbase", true);
2295 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002296 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002297 setFeatureEnabledImpl(Features, "avx", true);
2298 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002299 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002300 case CK_Silvermont:
2301 setFeatureEnabledImpl(Features, "aes", true);
2302 setFeatureEnabledImpl(Features, "pclmul", true);
2303 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002304 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002305 setFeatureEnabledImpl(Features, "sse4.2", true);
2306 setFeatureEnabledImpl(Features, "cx16", true);
2307 break;
2308 case CK_KNL:
2309 setFeatureEnabledImpl(Features, "avx512f", true);
2310 setFeatureEnabledImpl(Features, "avx512cd", true);
2311 setFeatureEnabledImpl(Features, "avx512er", true);
2312 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002313 setFeatureEnabledImpl(Features, "rdseed", true);
2314 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002315 setFeatureEnabledImpl(Features, "lzcnt", true);
2316 setFeatureEnabledImpl(Features, "bmi", true);
2317 setFeatureEnabledImpl(Features, "bmi2", true);
2318 setFeatureEnabledImpl(Features, "rtm", true);
2319 setFeatureEnabledImpl(Features, "fma", true);
2320 setFeatureEnabledImpl(Features, "rdrnd", true);
2321 setFeatureEnabledImpl(Features, "f16c", true);
2322 setFeatureEnabledImpl(Features, "fsgsbase", true);
2323 setFeatureEnabledImpl(Features, "aes", true);
2324 setFeatureEnabledImpl(Features, "pclmul", true);
2325 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002326 break;
2327 case CK_K6_2:
2328 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002329 case CK_WinChip2:
2330 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002331 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002332 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002333 case CK_Athlon:
2334 case CK_AthlonThunderbird:
2335 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002336 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002337 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002338 case CK_Athlon4:
2339 case CK_AthlonXP:
2340 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002341 setFeatureEnabledImpl(Features, "sse", true);
2342 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002343 break;
2344 case CK_K8:
2345 case CK_Opteron:
2346 case CK_Athlon64:
2347 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002348 setFeatureEnabledImpl(Features, "sse2", true);
2349 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002350 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002351 case CK_AMDFAM10:
2352 setFeatureEnabledImpl(Features, "sse4a", true);
2353 setFeatureEnabledImpl(Features, "lzcnt", true);
2354 setFeatureEnabledImpl(Features, "popcnt", true);
2355 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002356 case CK_K8SSE3:
2357 case CK_OpteronSSE3:
2358 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002359 setFeatureEnabledImpl(Features, "sse3", true);
2360 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002361 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002362 case CK_BTVER2:
2363 setFeatureEnabledImpl(Features, "avx", true);
2364 setFeatureEnabledImpl(Features, "aes", true);
2365 setFeatureEnabledImpl(Features, "pclmul", true);
2366 setFeatureEnabledImpl(Features, "bmi", true);
2367 setFeatureEnabledImpl(Features, "f16c", true);
2368 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002369 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002370 setFeatureEnabledImpl(Features, "ssse3", true);
2371 setFeatureEnabledImpl(Features, "sse4a", true);
2372 setFeatureEnabledImpl(Features, "lzcnt", true);
2373 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002374 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002375 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002376 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002377 case CK_BDVER4:
2378 setFeatureEnabledImpl(Features, "avx2", true);
2379 setFeatureEnabledImpl(Features, "bmi2", true);
2380 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002381 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002382 setFeatureEnabledImpl(Features, "fsgsbase", true);
2383 // FALLTHROUGH
2384 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002385 setFeatureEnabledImpl(Features, "bmi", true);
2386 setFeatureEnabledImpl(Features, "fma", true);
2387 setFeatureEnabledImpl(Features, "f16c", true);
2388 setFeatureEnabledImpl(Features, "tbm", true);
2389 // FALLTHROUGH
2390 case CK_BDVER1:
2391 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002392 setFeatureEnabledImpl(Features, "xop", true);
2393 setFeatureEnabledImpl(Features, "lzcnt", true);
2394 setFeatureEnabledImpl(Features, "aes", true);
2395 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002396 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002397 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002398 break;
Eli Friedman33465822011-07-08 23:31:17 +00002399 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002400}
2401
Rafael Espindolae62e2792013-08-20 13:44:29 +00002402void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002403 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002404 if (Enabled) {
2405 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002406 case AVX512F:
2407 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002408 case AVX2:
2409 Features["avx2"] = true;
2410 case AVX:
2411 Features["avx"] = true;
2412 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002413 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002414 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002415 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002416 case SSSE3:
2417 Features["ssse3"] = true;
2418 case SSE3:
2419 Features["sse3"] = true;
2420 case SSE2:
2421 Features["sse2"] = true;
2422 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002423 Features["sse"] = true;
2424 case NoSSE:
2425 break;
2426 }
2427 return;
2428 }
2429
2430 switch (Level) {
2431 case NoSSE:
2432 case SSE1:
2433 Features["sse"] = false;
2434 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002435 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2436 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002437 case SSE3:
2438 Features["sse3"] = false;
2439 setXOPLevel(Features, NoXOP, false);
2440 case SSSE3:
2441 Features["ssse3"] = false;
2442 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002443 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002444 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002445 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002446 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002447 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002448 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002449 case AVX2:
2450 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002451 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002452 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002453 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2454 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002455 }
2456}
2457
2458void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002459 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002460 if (Enabled) {
2461 switch (Level) {
2462 case AMD3DNowAthlon:
2463 Features["3dnowa"] = true;
2464 case AMD3DNow:
2465 Features["3dnow"] = true;
2466 case MMX:
2467 Features["mmx"] = true;
2468 case NoMMX3DNow:
2469 break;
2470 }
2471 return;
2472 }
2473
2474 switch (Level) {
2475 case NoMMX3DNow:
2476 case MMX:
2477 Features["mmx"] = false;
2478 case AMD3DNow:
2479 Features["3dnow"] = false;
2480 case AMD3DNowAthlon:
2481 Features["3dnowa"] = false;
2482 }
2483}
2484
2485void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002486 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002487 if (Enabled) {
2488 switch (Level) {
2489 case XOP:
2490 Features["xop"] = true;
2491 case FMA4:
2492 Features["fma4"] = true;
2493 setSSELevel(Features, AVX, true);
2494 case SSE4A:
2495 Features["sse4a"] = true;
2496 setSSELevel(Features, SSE3, true);
2497 case NoXOP:
2498 break;
2499 }
2500 return;
2501 }
2502
2503 switch (Level) {
2504 case NoXOP:
2505 case SSE4A:
2506 Features["sse4a"] = false;
2507 case FMA4:
2508 Features["fma4"] = false;
2509 case XOP:
2510 Features["xop"] = false;
2511 }
2512}
2513
Craig Topper86d79ef2013-09-17 04:51:29 +00002514void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2515 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002516 // FIXME: This *really* should not be here. We need some way of translating
2517 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002518 if (Name == "sse4")
2519 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002520
Rafael Espindolae62e2792013-08-20 13:44:29 +00002521 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002522
Craig Topper29561122013-09-19 01:13:07 +00002523 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002524 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002525 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002526 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002527 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002528 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002529 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002530 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002531 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002532 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002533 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002534 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002535 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002536 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002537 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002538 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002539 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002540 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002541 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002542 if (Enabled)
2543 setSSELevel(Features, SSE2, Enabled);
2544 } else if (Name == "pclmul") {
2545 if (Enabled)
2546 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002547 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002548 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002549 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002550 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002551 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002552 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002553 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2554 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002555 if (Enabled)
2556 setSSELevel(Features, AVX512F, Enabled);
2557 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002558 if (Enabled)
2559 setSSELevel(Features, AVX, Enabled);
2560 } else if (Name == "fma4") {
2561 setXOPLevel(Features, FMA4, Enabled);
2562 } else if (Name == "xop") {
2563 setXOPLevel(Features, XOP, Enabled);
2564 } else if (Name == "sse4a") {
2565 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002566 } else if (Name == "f16c") {
2567 if (Enabled)
2568 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002569 } else if (Name == "sha") {
2570 if (Enabled)
2571 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002572 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002573}
2574
Eric Christopher3ff21b32013-10-16 21:26:26 +00002575/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002576/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002577bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002578 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002579 // Remember the maximum enabled sselevel.
2580 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2581 // Ignore disabled features.
2582 if (Features[i][0] == '-')
2583 continue;
2584
Benjamin Kramer27402c62012-03-05 15:10:44 +00002585 StringRef Feature = StringRef(Features[i]).substr(1);
2586
2587 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002588 HasAES = true;
2589 continue;
2590 }
2591
Craig Topper3f122a72012-05-31 05:18:48 +00002592 if (Feature == "pclmul") {
2593 HasPCLMUL = true;
2594 continue;
2595 }
2596
Benjamin Kramer27402c62012-03-05 15:10:44 +00002597 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002598 HasLZCNT = true;
2599 continue;
2600 }
2601
Rafael Espindola89049822013-08-23 20:21:37 +00002602 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002603 HasRDRND = true;
2604 continue;
2605 }
2606
Craig Topper8c7f2512014-11-03 06:51:41 +00002607 if (Feature == "fsgsbase") {
2608 HasFSGSBASE = true;
2609 continue;
2610 }
2611
Benjamin Kramer27402c62012-03-05 15:10:44 +00002612 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002613 HasBMI = true;
2614 continue;
2615 }
2616
Benjamin Kramer27402c62012-03-05 15:10:44 +00002617 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002618 HasBMI2 = true;
2619 continue;
2620 }
2621
Benjamin Kramer27402c62012-03-05 15:10:44 +00002622 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002623 HasPOPCNT = true;
2624 continue;
2625 }
2626
Michael Liao625a8752012-11-10 05:17:46 +00002627 if (Feature == "rtm") {
2628 HasRTM = true;
2629 continue;
2630 }
2631
Michael Liao74f4eaf2013-03-26 17:52:08 +00002632 if (Feature == "prfchw") {
2633 HasPRFCHW = true;
2634 continue;
2635 }
2636
Michael Liaoffaae352013-03-29 05:17:55 +00002637 if (Feature == "rdseed") {
2638 HasRDSEED = true;
2639 continue;
2640 }
2641
Robert Khasanov50e6f582014-09-19 09:53:48 +00002642 if (Feature == "adx") {
2643 HasADX = true;
2644 continue;
2645 }
2646
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002647 if (Feature == "tbm") {
2648 HasTBM = true;
2649 continue;
2650 }
2651
Craig Topperbba778b2012-06-03 21:46:30 +00002652 if (Feature == "fma") {
2653 HasFMA = true;
2654 continue;
2655 }
2656
Manman Rena45358c2012-10-11 00:59:55 +00002657 if (Feature == "f16c") {
2658 HasF16C = true;
2659 continue;
2660 }
2661
Craig Topper679b53a2013-08-21 05:29:10 +00002662 if (Feature == "avx512cd") {
2663 HasAVX512CD = true;
2664 continue;
2665 }
2666
2667 if (Feature == "avx512er") {
2668 HasAVX512ER = true;
2669 continue;
2670 }
2671
2672 if (Feature == "avx512pf") {
2673 HasAVX512PF = true;
2674 continue;
2675 }
2676
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002677 if (Feature == "avx512dq") {
2678 HasAVX512DQ = true;
2679 continue;
2680 }
2681
2682 if (Feature == "avx512bw") {
2683 HasAVX512BW = true;
2684 continue;
2685 }
2686
2687 if (Feature == "avx512vl") {
2688 HasAVX512VL = true;
2689 continue;
2690 }
2691
Ben Langmuir58078d02013-09-19 13:22:04 +00002692 if (Feature == "sha") {
2693 HasSHA = true;
2694 continue;
2695 }
2696
Nick Lewycky50e8f482013-10-05 20:14:27 +00002697 if (Feature == "cx16") {
2698 HasCX16 = true;
2699 continue;
2700 }
2701
Daniel Dunbar979586e2009-11-11 09:38:56 +00002702 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002703 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002704 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002705 .Case("avx2", AVX2)
2706 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002707 .Case("sse4.2", SSE42)
2708 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002709 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002710 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002711 .Case("sse2", SSE2)
2712 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002713 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002714 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002715
Eli Friedman33465822011-07-08 23:31:17 +00002716 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002717 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002718 .Case("3dnowa", AMD3DNowAthlon)
2719 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002720 .Case("mmx", MMX)
2721 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002722 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002723
2724 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2725 .Case("xop", XOP)
2726 .Case("fma4", FMA4)
2727 .Case("sse4a", SSE4A)
2728 .Default(NoXOP);
2729 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002730 }
Eli Friedman33465822011-07-08 23:31:17 +00002731
Craig Topper7481d8a2013-09-10 06:55:47 +00002732 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2733 // Can't do this earlier because we need to be able to explicitly enable
2734 // popcnt and still disable sse4.2.
2735 if (!HasPOPCNT && SSELevel >= SSE42 &&
2736 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2737 HasPOPCNT = true;
2738 Features.push_back("+popcnt");
2739 }
2740
Yunzhong Gao61089362013-10-16 19:07:02 +00002741 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2742 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2743 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2744 HasPRFCHW = true;
2745 Features.push_back("+prfchw");
2746 }
2747
Rafael Espindolaeb265472013-08-21 21:59:03 +00002748 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2749 // matches the selected sse level.
2750 if (FPMath == FP_SSE && SSELevel < SSE1) {
2751 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2752 return false;
2753 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2754 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2755 return false;
2756 }
2757
Eli Friedman33465822011-07-08 23:31:17 +00002758 // Don't tell the backend if we're turning off mmx; it will end up disabling
2759 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002760 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2761 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002762 std::vector<std::string>::iterator it;
2763 it = std::find(Features.begin(), Features.end(), "-mmx");
2764 if (it != Features.end())
2765 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002766 else if (SSELevel > NoSSE)
2767 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002768 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002769}
Chris Lattnerecd49032009-03-02 22:27:17 +00002770
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002771/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2772/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002773void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002774 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002775 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002776 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002777 Builder.defineMacro("__amd64__");
2778 Builder.defineMacro("__amd64");
2779 Builder.defineMacro("__x86_64");
2780 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002781 if (getTriple().getArchName() == "x86_64h") {
2782 Builder.defineMacro("__x86_64h");
2783 Builder.defineMacro("__x86_64h__");
2784 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002785 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002786 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002787 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002788
Chris Lattnerecd49032009-03-02 22:27:17 +00002789 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002790 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2791 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002792 switch (CPU) {
2793 case CK_Generic:
2794 break;
2795 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002796 // The rest are coming from the i386 define above.
2797 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002798 break;
2799 case CK_i486:
2800 case CK_WinChipC6:
2801 case CK_WinChip2:
2802 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002803 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002804 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002805 case CK_PentiumMMX:
2806 Builder.defineMacro("__pentium_mmx__");
2807 Builder.defineMacro("__tune_pentium_mmx__");
2808 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002809 case CK_i586:
2810 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002811 defineCPUMacros(Builder, "i586");
2812 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002813 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002814 case CK_Pentium3:
2815 case CK_Pentium3M:
2816 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002817 Builder.defineMacro("__tune_pentium3__");
2818 // Fallthrough
2819 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002820 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002821 Builder.defineMacro("__tune_pentium2__");
2822 // Fallthrough
2823 case CK_PentiumPro:
2824 Builder.defineMacro("__tune_i686__");
2825 Builder.defineMacro("__tune_pentiumpro__");
2826 // Fallthrough
2827 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002828 Builder.defineMacro("__i686");
2829 Builder.defineMacro("__i686__");
2830 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2831 Builder.defineMacro("__pentiumpro");
2832 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002833 break;
2834 case CK_Pentium4:
2835 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002836 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002837 break;
2838 case CK_Yonah:
2839 case CK_Prescott:
2840 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002841 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002842 break;
2843 case CK_Core2:
2844 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002845 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002846 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002847 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002848 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002849 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002850 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002851 defineCPUMacros(Builder, "slm");
2852 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002853 case CK_Nehalem:
2854 case CK_Westmere:
2855 case CK_SandyBridge:
2856 case CK_IvyBridge:
2857 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002858 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002859 // FIXME: Historically, we defined this legacy name, it would be nice to
2860 // remove it at some point. We've never exposed fine-grained names for
2861 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002862 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002863 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002864 case CK_Skylake:
2865 // FIXME: Historically, we defined this legacy name, it would be nice to
2866 // remove it at some point. This is the only fine-grained CPU macro in the
2867 // main intel CPU line, and it would be better to not have these and force
2868 // people to use ISA macros.
2869 defineCPUMacros(Builder, "skx");
2870 break;
Craig Topper449314e2013-08-20 07:09:39 +00002871 case CK_KNL:
2872 defineCPUMacros(Builder, "knl");
2873 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002874 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002875 Builder.defineMacro("__k6_2__");
2876 Builder.defineMacro("__tune_k6_2__");
2877 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002878 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002879 if (CPU != CK_K6_2) { // In case of fallthrough
2880 // FIXME: GCC may be enabling these in cases where some other k6
2881 // architecture is specified but -m3dnow is explicitly provided. The
2882 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002883 Builder.defineMacro("__k6_3__");
2884 Builder.defineMacro("__tune_k6_3__");
2885 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002886 // Fallthrough
2887 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002888 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002889 break;
2890 case CK_Athlon:
2891 case CK_AthlonThunderbird:
2892 case CK_Athlon4:
2893 case CK_AthlonXP:
2894 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002895 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002896 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002897 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002898 Builder.defineMacro("__tune_athlon_sse__");
2899 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002900 break;
2901 case CK_K8:
2902 case CK_K8SSE3:
2903 case CK_x86_64:
2904 case CK_Opteron:
2905 case CK_OpteronSSE3:
2906 case CK_Athlon64:
2907 case CK_Athlon64SSE3:
2908 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002909 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002910 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002911 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002912 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002913 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002914 case CK_BTVER1:
2915 defineCPUMacros(Builder, "btver1");
2916 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002917 case CK_BTVER2:
2918 defineCPUMacros(Builder, "btver2");
2919 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002920 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002921 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002922 break;
2923 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002924 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002925 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002926 case CK_BDVER3:
2927 defineCPUMacros(Builder, "bdver3");
2928 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002929 case CK_BDVER4:
2930 defineCPUMacros(Builder, "bdver4");
2931 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002932 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002933 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002934 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002935 }
Chris Lattner96e43572009-03-02 22:40:39 +00002936
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002937 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002938 Builder.defineMacro("__REGISTER_PREFIX__", "");
2939
Chris Lattner6df41af2009-04-19 17:32:33 +00002940 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2941 // functions in glibc header files that use FP Stack inline asm which the
2942 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002943 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002944
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002945 if (HasAES)
2946 Builder.defineMacro("__AES__");
2947
Craig Topper3f122a72012-05-31 05:18:48 +00002948 if (HasPCLMUL)
2949 Builder.defineMacro("__PCLMUL__");
2950
Craig Topper22967d42011-12-25 05:06:45 +00002951 if (HasLZCNT)
2952 Builder.defineMacro("__LZCNT__");
2953
Benjamin Kramer1e250392012-07-07 09:39:18 +00002954 if (HasRDRND)
2955 Builder.defineMacro("__RDRND__");
2956
Craig Topper8c7f2512014-11-03 06:51:41 +00002957 if (HasFSGSBASE)
2958 Builder.defineMacro("__FSGSBASE__");
2959
Craig Topper22967d42011-12-25 05:06:45 +00002960 if (HasBMI)
2961 Builder.defineMacro("__BMI__");
2962
2963 if (HasBMI2)
2964 Builder.defineMacro("__BMI2__");
2965
Craig Topper1de83482011-12-29 16:10:46 +00002966 if (HasPOPCNT)
2967 Builder.defineMacro("__POPCNT__");
2968
Michael Liao625a8752012-11-10 05:17:46 +00002969 if (HasRTM)
2970 Builder.defineMacro("__RTM__");
2971
Michael Liao74f4eaf2013-03-26 17:52:08 +00002972 if (HasPRFCHW)
2973 Builder.defineMacro("__PRFCHW__");
2974
Michael Liaoffaae352013-03-29 05:17:55 +00002975 if (HasRDSEED)
2976 Builder.defineMacro("__RDSEED__");
2977
Robert Khasanov50e6f582014-09-19 09:53:48 +00002978 if (HasADX)
2979 Builder.defineMacro("__ADX__");
2980
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002981 if (HasTBM)
2982 Builder.defineMacro("__TBM__");
2983
Rafael Espindolae62e2792013-08-20 13:44:29 +00002984 switch (XOPLevel) {
2985 case XOP:
2986 Builder.defineMacro("__XOP__");
2987 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002988 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002989 case SSE4A:
2990 Builder.defineMacro("__SSE4A__");
2991 case NoXOP:
2992 break;
2993 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002994
Craig Topperbba778b2012-06-03 21:46:30 +00002995 if (HasFMA)
2996 Builder.defineMacro("__FMA__");
2997
Manman Rena45358c2012-10-11 00:59:55 +00002998 if (HasF16C)
2999 Builder.defineMacro("__F16C__");
3000
Craig Topper679b53a2013-08-21 05:29:10 +00003001 if (HasAVX512CD)
3002 Builder.defineMacro("__AVX512CD__");
3003 if (HasAVX512ER)
3004 Builder.defineMacro("__AVX512ER__");
3005 if (HasAVX512PF)
3006 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003007 if (HasAVX512DQ)
3008 Builder.defineMacro("__AVX512DQ__");
3009 if (HasAVX512BW)
3010 Builder.defineMacro("__AVX512BW__");
3011 if (HasAVX512VL)
3012 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003013
Ben Langmuir58078d02013-09-19 13:22:04 +00003014 if (HasSHA)
3015 Builder.defineMacro("__SHA__");
3016
Nick Lewycky50e8f482013-10-05 20:14:27 +00003017 if (HasCX16)
3018 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3019
Chris Lattner96e43572009-03-02 22:40:39 +00003020 // Each case falls through to the previous one here.
3021 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003022 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003023 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003024 case AVX2:
3025 Builder.defineMacro("__AVX2__");
3026 case AVX:
3027 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003028 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003029 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003030 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003031 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003032 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003033 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003034 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003035 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003036 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003037 Builder.defineMacro("__SSE2__");
3038 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003039 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003040 Builder.defineMacro("__SSE__");
3041 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003042 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003043 break;
3044 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003045
Derek Schuffc7dd7222012-10-11 15:52:22 +00003046 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003047 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003048 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003049 case AVX2:
3050 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003051 case SSE42:
3052 case SSE41:
3053 case SSSE3:
3054 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003055 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003056 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003057 break;
3058 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003059 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003060 break;
3061 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003062 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003063 }
3064 }
3065
Anders Carlssone437c682010-01-27 03:47:49 +00003066 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003067 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003068 case AMD3DNowAthlon:
3069 Builder.defineMacro("__3dNOW_A__");
3070 case AMD3DNow:
3071 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003072 case MMX:
3073 Builder.defineMacro("__MMX__");
3074 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003075 break;
3076 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003077
3078 if (CPU >= CK_i486) {
3079 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3080 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3081 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3082 }
3083 if (CPU >= CK_i586)
3084 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003085}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003086
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003087bool X86TargetInfo::hasFeature(StringRef Feature) const {
3088 return llvm::StringSwitch<bool>(Feature)
3089 .Case("aes", HasAES)
3090 .Case("avx", SSELevel >= AVX)
3091 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003092 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003093 .Case("avx512cd", HasAVX512CD)
3094 .Case("avx512er", HasAVX512ER)
3095 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003096 .Case("avx512dq", HasAVX512DQ)
3097 .Case("avx512bw", HasAVX512BW)
3098 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003099 .Case("bmi", HasBMI)
3100 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003101 .Case("cx16", HasCX16)
3102 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003103 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003104 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003105 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003106 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003107 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3108 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3109 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003110 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003111 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003112 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003113 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003114 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003115 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003116 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003117 .Case("sse", SSELevel >= SSE1)
3118 .Case("sse2", SSELevel >= SSE2)
3119 .Case("sse3", SSELevel >= SSE3)
3120 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003121 .Case("sse4.1", SSELevel >= SSE41)
3122 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003123 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003124 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003125 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003126 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3127 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003128 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003129 .Default(false);
3130}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003131
Eli Friedman3fd920a2008-08-20 02:34:37 +00003132bool
Anders Carlsson58436352009-02-28 17:11:49 +00003133X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003134 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003135 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003136 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003137 case 'I':
3138 Info.setRequiresImmediate(0, 31);
3139 return true;
3140 case 'J':
3141 Info.setRequiresImmediate(0, 63);
3142 return true;
3143 case 'K':
3144 Info.setRequiresImmediate(-128, 127);
3145 return true;
3146 case 'L':
3147 // FIXME: properly analyze this constraint:
3148 // must be one of 0xff, 0xffff, or 0xffffffff
3149 return true;
3150 case 'M':
3151 Info.setRequiresImmediate(0, 3);
3152 return true;
3153 case 'N':
3154 Info.setRequiresImmediate(0, 255);
3155 return true;
3156 case 'O':
3157 Info.setRequiresImmediate(0, 127);
3158 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003159 case 'Y': // first letter of a pair:
3160 switch (*(Name+1)) {
3161 default: return false;
3162 case '0': // First SSE register.
3163 case 't': // Any SSE register, when SSE2 is enabled.
3164 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3165 case 'm': // any MMX register, when inter-unit moves enabled.
3166 break; // falls through to setAllowsRegister.
3167 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003168 case 'f': // any x87 floating point stack register.
3169 // Constraint 'f' cannot be used for output operands.
3170 if (Info.ConstraintStr[0] == '=')
3171 return false;
3172
3173 Info.setAllowsRegister();
3174 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003175 case 'a': // eax.
3176 case 'b': // ebx.
3177 case 'c': // ecx.
3178 case 'd': // edx.
3179 case 'S': // esi.
3180 case 'D': // edi.
3181 case 'A': // edx:eax.
3182 case 't': // top of floating point stack.
3183 case 'u': // second from top of floating point stack.
3184 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003185 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003186 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003187 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003188 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3189 case 'l': // "Index" registers: any general register that can be used as an
3190 // index in a base+index memory access.
3191 Info.setAllowsRegister();
3192 return true;
3193 case 'C': // SSE floating point constant.
3194 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003195 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003196 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003197 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003198 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003199 return true;
3200 }
3201}
3202
Akira Hatanaka974131e2014-09-18 18:17:18 +00003203bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3204 unsigned Size) const {
3205 // Strip off constraint modifiers.
3206 while (Constraint[0] == '=' ||
3207 Constraint[0] == '+' ||
3208 Constraint[0] == '&')
3209 Constraint = Constraint.substr(1);
3210
3211 return validateOperandSize(Constraint, Size);
3212}
3213
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003214bool X86TargetInfo::validateInputSize(StringRef Constraint,
3215 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003216 return validateOperandSize(Constraint, Size);
3217}
3218
3219bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3220 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003221 switch (Constraint[0]) {
3222 default: break;
3223 case 'y':
3224 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003225 case 'f':
3226 case 't':
3227 case 'u':
3228 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003229 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003230 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003231 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003232 }
3233
3234 return true;
3235}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003236
Eli Friedman3fd920a2008-08-20 02:34:37 +00003237std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003238X86TargetInfo::convertConstraint(const char *&Constraint) const {
3239 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003240 case 'a': return std::string("{ax}");
3241 case 'b': return std::string("{bx}");
3242 case 'c': return std::string("{cx}");
3243 case 'd': return std::string("{dx}");
3244 case 'S': return std::string("{si}");
3245 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003246 case 'p': // address
3247 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003248 case 't': // top of floating point stack.
3249 return std::string("{st}");
3250 case 'u': // second from top of floating point stack.
3251 return std::string("{st(1)}"); // second from top of floating point stack.
3252 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003253 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003254 }
3255}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003256} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003257
3258namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003259// X86-32 generic target
3260class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003262 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003263 DoubleAlign = LongLongAlign = 32;
3264 LongDoubleWidth = 96;
3265 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003266 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003267 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003268 SizeType = UnsignedInt;
3269 PtrDiffType = SignedInt;
3270 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003271 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003272
3273 // Use fpret for all types.
3274 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3275 (1 << TargetInfo::Double) |
3276 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003277
3278 // x86-32 has atomics up to 8 bytes
3279 // FIXME: Check that we actually have cmpxchg8b before setting
3280 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3281 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003282 }
Craig Topper3164f332014-03-11 03:39:26 +00003283 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003284 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003285 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003286
Craig Topper3164f332014-03-11 03:39:26 +00003287 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003288 if (RegNo == 0) return 0;
3289 if (RegNo == 1) return 2;
3290 return -1;
3291 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003292 bool validateOperandSize(StringRef Constraint,
3293 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003294 switch (Constraint[0]) {
3295 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003296 case 'R':
3297 case 'q':
3298 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003299 case 'a':
3300 case 'b':
3301 case 'c':
3302 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003303 case 'S':
3304 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003305 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003306 case 'A':
3307 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003308 }
3309
Akira Hatanaka974131e2014-09-18 18:17:18 +00003310 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003311 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003312};
3313} // end anonymous namespace
3314
3315namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003316class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3317public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003318 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3319 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003320
Craig Topper3164f332014-03-11 03:39:26 +00003321 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003322 unsigned Major, Minor, Micro;
3323 getTriple().getOSVersion(Major, Minor, Micro);
3324 // New NetBSD uses the default rounding mode.
3325 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3326 return X86_32TargetInfo::getFloatEvalMethod();
3327 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003328 return 1;
3329 }
3330};
3331} // end anonymous namespace
3332
3333namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003334class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3335public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003336 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3337 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003338 SizeType = UnsignedLong;
3339 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003340 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003341 }
3342};
3343} // end anonymous namespace
3344
3345namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003346class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3347public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003348 BitrigI386TargetInfo(const llvm::Triple &Triple)
3349 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003350 SizeType = UnsignedLong;
3351 IntPtrType = SignedLong;
3352 PtrDiffType = SignedLong;
3353 }
3354};
3355} // end anonymous namespace
3356
3357namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003358class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003359public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003360 DarwinI386TargetInfo(const llvm::Triple &Triple)
3361 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003362 LongDoubleWidth = 128;
3363 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003364 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003365 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003366 SizeType = UnsignedLong;
3367 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003368 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003369 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003370 }
3371
Eli Friedman3fd920a2008-08-20 02:34:37 +00003372};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003373} // end anonymous namespace
3374
3375namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003376// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003377class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003378public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003379 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3380 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003381 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003382 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003383 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003384 }
Craig Topper3164f332014-03-11 03:39:26 +00003385 void getTargetDefines(const LangOptions &Opts,
3386 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003387 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3388 }
3389};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003390
3391// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003392class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003393public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003394 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003395 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003396 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003397 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3398 }
Craig Topper3164f332014-03-11 03:39:26 +00003399 void getTargetDefines(const LangOptions &Opts,
3400 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003401 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3402 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3403 // The value of the following reflects processor type.
3404 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3405 // We lost the original triple, so we use the default.
3406 Builder.defineMacro("_M_IX86", "600");
3407 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003408};
3409} // end anonymous namespace
3410
Reid Kleckner47606832014-04-21 20:58:00 +00003411static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3412 Builder.defineMacro("__MSVCRT__");
3413 Builder.defineMacro("__MINGW32__");
3414
3415 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3416 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3417 // macro anyway for pre-processor compatibility.
3418 if (Opts.MicrosoftExt)
3419 Builder.defineMacro("__declspec", "__declspec");
3420 else
3421 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3422
3423 if (!Opts.MicrosoftExt) {
3424 // Provide macros for all the calling convention keywords. Provide both
3425 // single and double underscore prefixed variants. These are available on
3426 // x64 as well as x86, even though they have no effect.
3427 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3428 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003429 std::string GCCSpelling = "__attribute__((__";
3430 GCCSpelling += CC;
3431 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003432 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3433 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3434 }
3435 }
3436}
3437
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003438namespace {
3439// x86-32 MinGW target
3440class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3441public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003442 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3443 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003444 void getTargetDefines(const LangOptions &Opts,
3445 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003446 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003447 DefineStd(Builder, "WIN32", Opts);
3448 DefineStd(Builder, "WINNT", Opts);
3449 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003450 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003451 }
3452};
3453} // end anonymous namespace
3454
3455namespace {
3456// x86-32 Cygwin target
3457class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3458public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003459 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3460 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003461 TLSSupported = false;
3462 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003463 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003464 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003465 }
Craig Topper3164f332014-03-11 03:39:26 +00003466 void getTargetDefines(const LangOptions &Opts,
3467 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003468 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003469 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003470 Builder.defineMacro("__CYGWIN__");
3471 Builder.defineMacro("__CYGWIN32__");
3472 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003473 if (Opts.CPlusPlus)
3474 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003475 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003476};
3477} // end anonymous namespace
3478
3479namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003480// x86-32 Haiku target
3481class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3482public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003483 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003484 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003485 IntPtrType = SignedLong;
3486 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003487 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003488 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003489 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003490 }
Craig Topper3164f332014-03-11 03:39:26 +00003491 void getTargetDefines(const LangOptions &Opts,
3492 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003493 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3494 Builder.defineMacro("__INTEL__");
3495 Builder.defineMacro("__HAIKU__");
3496 }
3497};
3498} // end anonymous namespace
3499
Douglas Gregor9fabd852011-07-01 22:41:14 +00003500// RTEMS Target
3501template<typename Target>
3502class RTEMSTargetInfo : public OSTargetInfo<Target> {
3503protected:
Craig Topper3164f332014-03-11 03:39:26 +00003504 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3505 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003506 // RTEMS defines; list based off of gcc output
3507
Douglas Gregor9fabd852011-07-01 22:41:14 +00003508 Builder.defineMacro("__rtems__");
3509 Builder.defineMacro("__ELF__");
3510 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003511
Douglas Gregor9fabd852011-07-01 22:41:14 +00003512public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003513 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3514 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003515
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003516 switch (Triple.getArch()) {
3517 default:
3518 case llvm::Triple::x86:
3519 // this->MCountName = ".mcount";
3520 break;
3521 case llvm::Triple::mips:
3522 case llvm::Triple::mipsel:
3523 case llvm::Triple::ppc:
3524 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003525 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003526 // this->MCountName = "_mcount";
3527 break;
3528 case llvm::Triple::arm:
3529 // this->MCountName = "__mcount";
3530 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003531 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003532 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003533};
3534
3535namespace {
3536// x86-32 RTEMS target
3537class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3538public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003539 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003540 SizeType = UnsignedLong;
3541 IntPtrType = SignedLong;
3542 PtrDiffType = SignedLong;
3543 this->UserLabelPrefix = "";
3544 }
Craig Topper3164f332014-03-11 03:39:26 +00003545 void getTargetDefines(const LangOptions &Opts,
3546 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003547 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3548 Builder.defineMacro("__INTEL__");
3549 Builder.defineMacro("__rtems__");
3550 }
3551};
3552} // end anonymous namespace
3553
Chris Lattnerb986aba2010-04-11 19:29:39 +00003554namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003555// x86-64 generic target
3556class X86_64TargetInfo : public X86TargetInfo {
3557public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003558 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003559 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003560 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003561 LongDoubleWidth = 128;
3562 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003563 LargeArrayMinWidth = 128;
3564 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003565 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003566 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3567 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3568 IntPtrType = IsX32 ? SignedInt : SignedLong;
3569 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003570 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003571 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003572
Eric Christopher917e9522014-11-18 22:36:15 +00003573 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003574 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003575 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3576 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003577
3578 // Use fpret only for long double.
3579 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003580
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003581 // Use fp2ret for _Complex long double.
3582 ComplexLongDoubleUsesFP2Ret = true;
3583
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003584 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003585 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003586 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003587 }
Craig Topper3164f332014-03-11 03:39:26 +00003588 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003589 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003590 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003591
Craig Topper3164f332014-03-11 03:39:26 +00003592 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003593 if (RegNo == 0) return 0;
3594 if (RegNo == 1) return 1;
3595 return -1;
3596 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003597
Craig Topper3164f332014-03-11 03:39:26 +00003598 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003599 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003600 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003601 CC == CC_IntelOclBicc ||
3602 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003603 }
3604
Craig Topper3164f332014-03-11 03:39:26 +00003605 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003606 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003607 }
3608
Pavel Chupinfd223e12014-08-04 12:39:43 +00003609 // for x32 we need it here explicitly
3610 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003611};
3612} // end anonymous namespace
3613
3614namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003615// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003616class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003617public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003618 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3619 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003620 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003621 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003622 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003623 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003624 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003625 SizeType = UnsignedLongLong;
3626 PtrDiffType = SignedLongLong;
3627 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003628 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003629 }
Craig Topper3164f332014-03-11 03:39:26 +00003630 void getTargetDefines(const LangOptions &Opts,
3631 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003632 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003633 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003634 }
Craig Topper3164f332014-03-11 03:39:26 +00003635 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003636 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003637 }
Craig Topper3164f332014-03-11 03:39:26 +00003638 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003639 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003640 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003641 CC == CC_IntelOclBicc ||
3642 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3643 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003644};
3645} // end anonymous namespace
3646
3647namespace {
3648// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003649class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003650public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003651 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003652 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003653 LongDoubleWidth = LongDoubleAlign = 64;
3654 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003655 }
Craig Topper3164f332014-03-11 03:39:26 +00003656 void getTargetDefines(const LangOptions &Opts,
3657 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003658 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3659 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003660 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003661 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003662 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003663};
3664} // end anonymous namespace
3665
3666namespace {
3667// x86-64 MinGW target
3668class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3669public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003670 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3671 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003672 void getTargetDefines(const LangOptions &Opts,
3673 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003674 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003675 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003676 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003677 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003678
3679 // GCC defines this macro when it is using __gxx_personality_seh0.
3680 if (!Opts.SjLjExceptions)
3681 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003682 }
3683};
3684} // end anonymous namespace
3685
3686namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003687class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3688public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003689 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3690 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003691 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003692 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003693 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3694 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003695 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003696 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003697 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003698 }
3699};
3700} // end anonymous namespace
3701
3702namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003703class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3704public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003705 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3706 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003707 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003708 Int64Type = SignedLongLong;
3709 }
3710};
3711} // end anonymous namespace
3712
3713namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003714class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3715public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003716 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3717 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3718 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003719 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003720 }
3721};
Tim Northover9bb857a2013-01-31 12:13:10 +00003722}
3723
Eli Friedman9fa28852012-08-08 23:57:20 +00003724
3725namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003726class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003727 // Possible FPU choices.
3728 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003729 VFP2FPU = (1 << 0),
3730 VFP3FPU = (1 << 1),
3731 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003732 NeonFPU = (1 << 3),
3733 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003734 };
3735
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003736 // Possible HWDiv features.
3737 enum HWDivMode {
3738 HWDivThumb = (1 << 0),
3739 HWDivARM = (1 << 1)
3740 };
3741
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003742 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003743 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003744 }
3745
3746 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3747 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003748
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003749 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003750
Rafael Espindolaeb265472013-08-21 21:59:03 +00003751 enum {
3752 FP_Default,
3753 FP_VFP,
3754 FP_Neon
3755 } FPMath;
3756
Bernard Ogdenda13af32013-10-24 18:32:51 +00003757 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003758
Logan Chien57086ce2012-10-10 06:56:20 +00003759 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003760 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003761 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003762
3763 // Initialized via features.
3764 unsigned SoftFloat : 1;
3765 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003766
Bernard Ogden18b57012013-10-29 09:47:51 +00003767 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003768 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003769
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003770 // ACLE 6.5.1 Hardware floating point
3771 enum {
3772 HW_FP_HP = (1 << 1), /// half (16-bit)
3773 HW_FP_SP = (1 << 2), /// single (32-bit)
3774 HW_FP_DP = (1 << 3), /// double (64-bit)
3775 };
3776 uint32_t HW_FP;
3777
Chris Lattner5cc15e02010-03-03 19:03:45 +00003778 static const Builtin::Info BuiltinInfo[];
3779
Rafael Espindola101d5b92013-05-13 20:09:47 +00003780 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003781 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003782 if (T.getArch() == llvm::Triple::arm ||
3783 T.getArch() == llvm::Triple::armeb) {
3784 StringRef VersionStr;
3785 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003786 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003787 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003788 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003789 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003790 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003791 unsigned Version;
3792 if (VersionStr.getAsInteger(10, Version))
3793 return false;
3794 return Version >= 6;
3795 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003796 assert(T.getArch() == llvm::Triple::thumb ||
3797 T.getArch() == llvm::Triple::thumbeb);
3798 StringRef VersionStr;
3799 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003800 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003801 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003802 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003803 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003804 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003805 unsigned Version;
3806 if (VersionStr.getAsInteger(10, Version))
3807 return false;
3808 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003809 }
3810
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003811 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003812 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003813
3814 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003815 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003816
Tim Northover00853e52014-08-05 11:07:26 +00003817 // size_t is unsigned long on MachO-derived environments and NetBSD.
3818 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003819 SizeType = UnsignedLong;
3820 else
3821 SizeType = UnsignedInt;
3822
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003823 switch (T.getOS()) {
3824 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003825 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003826 break;
3827 case llvm::Triple::Win32:
3828 WCharType = UnsignedShort;
3829 break;
3830 case llvm::Triple::Linux:
3831 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003832 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3833 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003834 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003835 }
3836
3837 UseBitFieldTypeAlignment = true;
3838
3839 ZeroLengthBitfieldBoundary = 0;
3840
Tim Northover147cd2f2014-10-14 22:12:21 +00003841 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3842 // so set preferred for small types to 32.
3843 if (T.isOSBinFormatMachO()) {
3844 DescriptionString =
3845 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3846 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3847 } else if (T.isOSWindows()) {
3848 // FIXME: this is invalid for WindowsCE
3849 assert(!BigEndian && "Windows on ARM does not support big endian");
3850 DescriptionString = "e"
3851 "-m:e"
3852 "-p:32:32"
3853 "-i64:64"
3854 "-v128:64:128"
3855 "-a:0:32"
3856 "-n32"
3857 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003858 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003859 DescriptionString =
3860 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3861 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003862 }
3863
3864 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003865 }
3866
3867 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003868 const llvm::Triple &T = getTriple();
3869
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003870 IsAAPCS = false;
3871
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003872 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003873
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003874 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003875 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003876 SizeType = UnsignedInt;
3877 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003878 SizeType = UnsignedLong;
3879
3880 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3881 WCharType = SignedInt;
3882
3883 // Do not respect the alignment of bit-field types when laying out
3884 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3885 UseBitFieldTypeAlignment = false;
3886
3887 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3888 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3889 /// gcc.
3890 ZeroLengthBitfieldBoundary = 32;
3891
Tim Northover147cd2f2014-10-14 22:12:21 +00003892 if (T.isOSBinFormatMachO())
3893 DescriptionString =
3894 BigEndian
3895 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3896 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3897 else
3898 DescriptionString =
3899 BigEndian
3900 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3901 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003902
3903 // FIXME: Override "preferred align" for double and long long.
3904 }
3905
Chris Lattner17df24e2008-04-21 18:56:49 +00003906public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003907 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003908 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003909 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003910 BigEndian = IsBigEndian;
3911
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003912 switch (getTriple().getOS()) {
3913 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003914 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003915 break;
3916 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003917 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003918 break;
3919 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003920
Chris Lattner1a8f3942010-04-23 16:29:58 +00003921 // {} in inline assembly are neon specifiers, not assembly variant
3922 // specifiers.
3923 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003924
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003925 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003926 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003927
Eric Christopher0e261882014-12-05 01:06:59 +00003928 // FIXME: This duplicates code from the driver that sets the -target-abi
3929 // option - this code is used if -target-abi isn't passed and should
3930 // be unified in some way.
3931 if (Triple.isOSBinFormatMachO()) {
3932 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3933 // the frontend matches that.
3934 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3935 Triple.getOS() == llvm::Triple::UnknownOS ||
3936 StringRef(CPU).startswith("cortex-m")) {
3937 setABI("aapcs");
3938 } else {
3939 setABI("apcs-gnu");
3940 }
3941 } else if (Triple.isOSWindows()) {
3942 // FIXME: this is invalid for WindowsCE
3943 setABI("aapcs");
3944 } else {
3945 // Select the default based on the platform.
3946 switch (Triple.getEnvironment()) {
3947 case llvm::Triple::Android:
3948 case llvm::Triple::GNUEABI:
3949 case llvm::Triple::GNUEABIHF:
3950 setABI("aapcs-linux");
3951 break;
3952 case llvm::Triple::EABIHF:
3953 case llvm::Triple::EABI:
3954 setABI("aapcs");
3955 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00003956 case llvm::Triple::GNU:
3957 setABI("apcs-gnu");
3958 break;
Eric Christopher0e261882014-12-05 01:06:59 +00003959 default:
3960 if (Triple.getOS() == llvm::Triple::NetBSD)
3961 setABI("apcs-gnu");
3962 else
3963 setABI("aapcs");
3964 break;
3965 }
3966 }
John McCall86353412010-08-21 22:46:04 +00003967
3968 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003969 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003970
3971 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003972 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003973 if (shouldUseInlineAtomic(getTriple()))
3974 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003975
3976 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00003977 // the alignment of the zero-length bitfield is greater than the member
3978 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00003979 // zero length bitfield.
3980 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003981 }
Alp Toker4925ba72014-06-07 23:30:42 +00003982 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003983 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003984 ABI = Name;
3985
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003986 // The defaults (above) are for AAPCS, check if we need to change them.
3987 //
3988 // FIXME: We need support for -meabi... we could just mangle it into the
3989 // name.
3990 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003991 setABIAPCS();
3992 return true;
3993 }
3994 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3995 setABIAAPCS();
3996 return true;
3997 }
3998 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003999 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004000
Craig Topper3164f332014-03-11 03:39:26 +00004001 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004002 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004003 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4004 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004005 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004006 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004007 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004008 }
4009 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004010 Features["vfp4"] = true;
4011 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004012 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4013 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004014 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004015 Features["vfp4"] = true;
4016 Features["neon"] = true;
4017 Features["hwdiv"] = true;
4018 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004019 } else if (CPU == "cyclone") {
4020 Features["v8fp"] = true;
4021 Features["neon"] = true;
4022 Features["hwdiv"] = true;
4023 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004024 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004025 Features["fp-armv8"] = true;
4026 Features["neon"] = true;
4027 Features["hwdiv"] = true;
4028 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004029 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004030 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004031 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004032 // Enable the hwdiv extension for all v8a AArch32 cores by
4033 // default.
4034 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004035 ArchName == "armebv8a" || ArchName == "armebv8" ||
4036 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4037 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004038 Features["hwdiv"] = true;
4039 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004040 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
4041 CPU == "sc300") {
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")
Bradley Smithd86d6702015-02-18 10:34:48 +00004139 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004140 .Case("swift", "7S")
4141 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004142 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004143 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004144 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004145 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004146 .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")
Renato Golin84545d72015-02-04 13:31:56 +00004153 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004154 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4155 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
4156 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004157 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004158 }
Craig Topper3164f332014-03-11 03:39:26 +00004159 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004160 if (!getCPUDefineSuffix(Name))
4161 return false;
4162
Tim Northovere8c37212014-07-09 09:24:43 +00004163 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4164 StringRef Profile = getCPUProfile(Name);
4165 if (Profile == "M" && MaxAtomicInlineWidth) {
4166 MaxAtomicPromoteWidth = 32;
4167 MaxAtomicInlineWidth = 32;
4168 }
4169
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004170 CPU = Name;
4171 return true;
4172 }
Craig Topper3164f332014-03-11 03:39:26 +00004173 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004174 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4175 unsigned CPUArchVer) const {
4176 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4177 (CPUArch.find('M') != StringRef::npos);
4178 }
4179 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4180 unsigned CPUArchVer) const {
4181 // We check both CPUArchVer and ArchName because when only triple is
4182 // specified, the default CPU is arm1136j-s.
4183 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4184 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4185 }
Craig Topper3164f332014-03-11 03:39:26 +00004186 void getTargetDefines(const LangOptions &Opts,
4187 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004188 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004189 Builder.defineMacro("__arm");
4190 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004191
Chris Lattnerecd49032009-03-02 22:27:17 +00004192 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004193 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004194
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004195 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004196 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004197 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004198 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004199 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004200
4201 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004202 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004203 StringRef ArchName = getTriple().getArchName();
4204
4205 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4206 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004207 if (CPUArch[0] >= '8') {
4208 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4209 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004210 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004211
4212 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4213 // is not defined for the M-profile.
4214 // NOTE that the deffault profile is assumed to be 'A'
4215 if (CPUProfile.empty() || CPUProfile != "M")
4216 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4217
4218 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4219 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4220 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4221 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4222 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4223 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4224 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4225
4226 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4227 // instruction set such as ARM or Thumb.
4228 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4229
4230 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4231
4232 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004233 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004234 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004235
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004236 // ACLE 6.5.1 Hardware Floating Point
4237 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004238 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004239
Yi Konga44c4d72014-06-27 21:25:42 +00004240 // ACLE predefines.
4241 Builder.defineMacro("__ARM_ACLE", "200");
4242
Mike Stump9d54bd72009-04-08 02:07:04 +00004243 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004244
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004245 // FIXME: It's more complicated than this and we don't really support
4246 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004247 // Windows on ARM does not "support" interworking
4248 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004249 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004250
David Tweed8f676532012-10-25 13:33:01 +00004251 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004252 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004253 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4254 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004255 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004256 Builder.defineMacro("__ARM_PCS", "1");
4257
David Tweed8f676532012-10-25 13:33:01 +00004258 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004259 Builder.defineMacro("__ARM_PCS_VFP", "1");
4260 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004261
Daniel Dunbar893d4752009-12-19 04:15:38 +00004262 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004263 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004264
4265 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004266 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004267
4268 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004269 Builder.defineMacro("__THUMBEL__");
4270 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004271 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004272 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004273 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004274 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4275 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004276
4277 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004278 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004279
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004280 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004281 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004282 if (FPU & VFP2FPU)
4283 Builder.defineMacro("__ARM_VFPV2__");
4284 if (FPU & VFP3FPU)
4285 Builder.defineMacro("__ARM_VFPV3__");
4286 if (FPU & VFP4FPU)
4287 Builder.defineMacro("__ARM_VFPV4__");
4288 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004289
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004290 // This only gets set when Neon instructions are actually available, unlike
4291 // the VFP define, hence the soft float and arch check. This is subtly
4292 // different from gcc, we follow the intent which was that it should be set
4293 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004294 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4295 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004296 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004297 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004298
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004299 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4300 Opts.ShortWChar ? "2" : "4");
4301
4302 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4303 Opts.ShortEnums ? "1" : "4");
4304
Bernard Ogden18b57012013-10-29 09:47:51 +00004305 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004306 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004307
Tim Northover02e38602014-02-03 17:28:04 +00004308 if (Crypto)
4309 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4310
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004311 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004312 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4313 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4314 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4315 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4316 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004317
4318 bool is5EOrAbove = (CPUArchVer >= 6 ||
4319 (CPUArchVer == 5 &&
4320 CPUArch.find('E') != StringRef::npos));
4321 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4322 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4323 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004324 }
Craig Topper3164f332014-03-11 03:39:26 +00004325 void getTargetBuiltins(const Builtin::Info *&Records,
4326 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004327 Records = BuiltinInfo;
4328 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004329 }
Craig Topper3164f332014-03-11 03:39:26 +00004330 bool isCLZForZeroUndef() const override { return false; }
4331 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004332 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004333 }
Craig Topper3164f332014-03-11 03:39:26 +00004334 void getGCCRegNames(const char * const *&Names,
4335 unsigned &NumNames) const override;
4336 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4337 unsigned &NumAliases) const override;
4338 bool validateAsmConstraint(const char *&Name,
4339 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004340 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004341 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004342 case 'l': // r0-r7
4343 case 'h': // r8-r15
4344 case 'w': // VFP Floating point register single precision
4345 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004346 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004347 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004348 case 'I':
4349 case 'J':
4350 case 'K':
4351 case 'L':
4352 case 'M':
4353 // FIXME
4354 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004355 case 'Q': // A memory address that is a single base register.
4356 Info.setAllowsMemory();
4357 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004358 case 'U': // a memory reference...
4359 switch (Name[1]) {
4360 case 'q': // ...ARMV4 ldrsb
4361 case 'v': // ...VFP load/store (reg+constant offset)
4362 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004363 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004364 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004365 case 'n': // valid address for Neon doubleword vector load/store
4366 case 'm': // valid address for Neon element and structure load/store
4367 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004368 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004369 Info.setAllowsMemory();
4370 Name++;
4371 return true;
4372 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004373 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004374 return false;
4375 }
Craig Topper3164f332014-03-11 03:39:26 +00004376 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004377 std::string R;
4378 switch (*Constraint) {
4379 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004380 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004381 Constraint++;
4382 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004383 case 'p': // 'p' should be translated to 'r' by default.
4384 R = std::string("r");
4385 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004386 default:
4387 return std::string(1, *Constraint);
4388 }
4389 return R;
4390 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004391 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004392 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004393 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004394 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004395 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004396
Bill Wendling9d1ee112012-10-25 23:28:48 +00004397 // Strip off constraint modifiers.
4398 while (Constraint[0] == '=' ||
4399 Constraint[0] == '+' ||
4400 Constraint[0] == '&')
4401 Constraint = Constraint.substr(1);
4402
4403 switch (Constraint[0]) {
4404 default: break;
4405 case 'r': {
4406 switch (Modifier) {
4407 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004408 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004409 case 'q':
4410 // A register of size 32 cannot fit a vector type.
4411 return false;
4412 }
4413 }
4414 }
4415
4416 return true;
4417 }
Craig Topper3164f332014-03-11 03:39:26 +00004418 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004419 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004420 return "";
4421 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004422
Craig Topper3164f332014-03-11 03:39:26 +00004423 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004424 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4425 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004426
Craig Topper3164f332014-03-11 03:39:26 +00004427 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004428 if (RegNo == 0) return 0;
4429 if (RegNo == 1) return 1;
4430 return -1;
4431 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004432};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004433
Rafael Espindolaeb265472013-08-21 21:59:03 +00004434bool ARMTargetInfo::setFPMath(StringRef Name) {
4435 if (Name == "neon") {
4436 FPMath = FP_Neon;
4437 return true;
4438 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4439 Name == "vfp4") {
4440 FPMath = FP_VFP;
4441 return true;
4442 }
4443 return false;
4444}
4445
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004446const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004447 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004448 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004449 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4450
4451 // Float registers
4452 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4453 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4454 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004455 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004456
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004457 // Double registers
4458 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4459 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004460 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4461 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004462
4463 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004464 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4465 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004466};
4467
4468void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004469 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004470 Names = GCCRegNames;
4471 NumNames = llvm::array_lengthof(GCCRegNames);
4472}
4473
4474const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004475 { { "a1" }, "r0" },
4476 { { "a2" }, "r1" },
4477 { { "a3" }, "r2" },
4478 { { "a4" }, "r3" },
4479 { { "v1" }, "r4" },
4480 { { "v2" }, "r5" },
4481 { { "v3" }, "r6" },
4482 { { "v4" }, "r7" },
4483 { { "v5" }, "r8" },
4484 { { "v6", "rfp" }, "r9" },
4485 { { "sl" }, "r10" },
4486 { { "fp" }, "r11" },
4487 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004488 { { "r13" }, "sp" },
4489 { { "r14" }, "lr" },
4490 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004491 // The S, D and Q registers overlap, but aren't really aliases; we
4492 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004493};
4494
4495void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4496 unsigned &NumAliases) const {
4497 Aliases = GCCRegAliases;
4498 NumAliases = llvm::array_lengthof(GCCRegAliases);
4499}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004500
4501const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004502#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004503#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004504 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004505#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004506
4507#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004508#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004509#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4510 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004511#include "clang/Basic/BuiltinsARM.def"
4512};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004513
4514class ARMleTargetInfo : public ARMTargetInfo {
4515public:
4516 ARMleTargetInfo(const llvm::Triple &Triple)
4517 : ARMTargetInfo(Triple, false) { }
4518 virtual void getTargetDefines(const LangOptions &Opts,
4519 MacroBuilder &Builder) const {
4520 Builder.defineMacro("__ARMEL__");
4521 ARMTargetInfo::getTargetDefines(Opts, Builder);
4522 }
4523};
4524
4525class ARMbeTargetInfo : public ARMTargetInfo {
4526public:
4527 ARMbeTargetInfo(const llvm::Triple &Triple)
4528 : ARMTargetInfo(Triple, true) { }
4529 virtual void getTargetDefines(const LangOptions &Opts,
4530 MacroBuilder &Builder) const {
4531 Builder.defineMacro("__ARMEB__");
4532 Builder.defineMacro("__ARM_BIG_ENDIAN");
4533 ARMTargetInfo::getTargetDefines(Opts, Builder);
4534 }
4535};
Chris Lattner17df24e2008-04-21 18:56:49 +00004536} // end anonymous namespace.
4537
Eli Friedmanf05b7722008-08-20 07:44:10 +00004538namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004539class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4540 const llvm::Triple Triple;
4541public:
4542 WindowsARMTargetInfo(const llvm::Triple &Triple)
4543 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4544 TLSSupported = false;
4545 WCharType = UnsignedShort;
4546 SizeType = UnsignedInt;
4547 UserLabelPrefix = "";
4548 }
4549 void getVisualStudioDefines(const LangOptions &Opts,
4550 MacroBuilder &Builder) const {
4551 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4552
4553 // FIXME: this is invalid for WindowsCE
4554 Builder.defineMacro("_M_ARM_NT", "1");
4555 Builder.defineMacro("_M_ARMT", "_M_ARM");
4556 Builder.defineMacro("_M_THUMB", "_M_ARM");
4557
4558 assert((Triple.getArch() == llvm::Triple::arm ||
4559 Triple.getArch() == llvm::Triple::thumb) &&
4560 "invalid architecture for Windows ARM target info");
4561 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4562 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4563
4564 // TODO map the complete set of values
4565 // 31: VFPv3 40: VFPv4
4566 Builder.defineMacro("_M_ARM_FP", "31");
4567 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004568 BuiltinVaListKind getBuiltinVaListKind() const override {
4569 return TargetInfo::CharPtrBuiltinVaList;
4570 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004571};
4572
4573// Windows ARM + Itanium C++ ABI Target
4574class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4575public:
4576 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4577 : WindowsARMTargetInfo(Triple) {
4578 TheCXXABI.set(TargetCXXABI::GenericARM);
4579 }
4580
4581 void getTargetDefines(const LangOptions &Opts,
4582 MacroBuilder &Builder) const override {
4583 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4584
4585 if (Opts.MSVCCompat)
4586 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4587 }
4588};
4589
4590// Windows ARM, MS (C++) ABI
4591class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4592public:
4593 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4594 : WindowsARMTargetInfo(Triple) {
4595 TheCXXABI.set(TargetCXXABI::Microsoft);
4596 }
4597
4598 void getTargetDefines(const LangOptions &Opts,
4599 MacroBuilder &Builder) const override {
4600 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4601 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4602 }
4603};
4604}
4605
4606
4607namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004608class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004609 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004610protected:
Craig Topper3164f332014-03-11 03:39:26 +00004611 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4612 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004613 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004614 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004615
Torok Edwinb2b37c62009-06-30 17:10:35 +00004616public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004617 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004618 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004619 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004620 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004621 // FIXME: This should be based off of the target features in
4622 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004623 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004624
4625 // Darwin on iOS uses a variant of the ARM C++ ABI.
4626 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004627 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004628};
4629} // end anonymous namespace.
4630
Tony Linthicum76329bf2011-12-12 21:14:55 +00004631
4632namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004633class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004634 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004635 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4636 static const char *const GCCRegNames[];
4637
James Molloy75f5f9e2014-04-16 15:33:48 +00004638 enum FPUModeEnum {
4639 FPUMode,
4640 NeonMode
4641 };
4642
4643 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004644 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004645 unsigned Crypto;
4646
Tim Northovera2ee4332014-03-29 15:09:45 +00004647 static const Builtin::Info BuiltinInfo[];
4648
4649 std::string ABI;
4650
4651public:
Tim Northover573cbee2014-05-24 12:52:07 +00004652 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004653 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004654
4655 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4656 WCharType = SignedInt;
4657
4658 // NetBSD apparently prefers consistency across ARM targets to consistency
4659 // across 64-bit targets.
4660 Int64Type = SignedLongLong;
4661 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004662 } else {
4663 WCharType = UnsignedInt;
4664 Int64Type = SignedLong;
4665 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004666 }
4667
Tim Northovera2ee4332014-03-29 15:09:45 +00004668 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004669 MaxVectorAlign = 128;
4670 RegParmMax = 8;
4671 MaxAtomicInlineWidth = 128;
4672 MaxAtomicPromoteWidth = 128;
4673
Tim Northovera6a19f12015-02-06 01:25:07 +00004674 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004675 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4676
Tim Northovera2ee4332014-03-29 15:09:45 +00004677 // {} in inline assembly are neon specifiers, not assembly variant
4678 // specifiers.
4679 NoAsmVariants = true;
4680
Tim Northover7ad87af2015-01-16 18:44:04 +00004681 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4682 // contributes to the alignment of the containing aggregate in the same way
4683 // a plain (non bit-field) member of that type would, without exception for
4684 // zero-sized or anonymous bit-fields."
4685 UseBitFieldTypeAlignment = true;
4686 UseZeroLengthBitfieldAlignment = true;
4687
Tim Northover573cbee2014-05-24 12:52:07 +00004688 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004689 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4690 }
4691
Alp Toker4925ba72014-06-07 23:30:42 +00004692 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004693 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004694 if (Name != "aapcs" && Name != "darwinpcs")
4695 return false;
4696
4697 ABI = Name;
4698 return true;
4699 }
4700
David Blaikie1cbb9712014-11-14 19:09:44 +00004701 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004702 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004703 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004704 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004705 .Case("cyclone", true)
4706 .Default(false);
4707 return CPUKnown;
4708 }
4709
4710 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004711 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004712 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004713 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004714
4715 // Target properties.
4716 Builder.defineMacro("_LP64");
4717 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004718
4719 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4720 Builder.defineMacro("__ARM_ACLE", "200");
4721 Builder.defineMacro("__ARM_ARCH", "8");
4722 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4723
4724 Builder.defineMacro("__ARM_64BIT_STATE");
4725 Builder.defineMacro("__ARM_PCS_AAPCS64");
4726 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4727
4728 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4729 Builder.defineMacro("__ARM_FEATURE_CLZ");
4730 Builder.defineMacro("__ARM_FEATURE_FMA");
4731 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004732 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4733 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4734 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4735 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004736
4737 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4738
4739 // 0xe implies support for half, single and double precision operations.
4740 Builder.defineMacro("__ARM_FP", "0xe");
4741
4742 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4743 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4744 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4745
4746 if (Opts.FastMath || Opts.FiniteMathOnly)
4747 Builder.defineMacro("__ARM_FP_FAST");
4748
Richard Smithab506ad2014-10-20 23:26:58 +00004749 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004750 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4751
4752 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4753
4754 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4755 Opts.ShortEnums ? "1" : "4");
4756
James Molloy75f5f9e2014-04-16 15:33:48 +00004757 if (FPU == NeonMode) {
4758 Builder.defineMacro("__ARM_NEON");
4759 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004760 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004761 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004762
Bradley Smith418c5932014-05-02 15:17:51 +00004763 if (CRC)
4764 Builder.defineMacro("__ARM_FEATURE_CRC32");
4765
James Molloy75f5f9e2014-04-16 15:33:48 +00004766 if (Crypto)
4767 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004768 }
4769
4770 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004771 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004772 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004773 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004774 }
4775
David Blaikie1cbb9712014-11-14 19:09:44 +00004776 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004777 return Feature == "aarch64" ||
4778 Feature == "arm64" ||
4779 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004780 }
4781
James Molloy5e73df52014-04-16 15:06:20 +00004782 bool handleTargetFeatures(std::vector<std::string> &Features,
4783 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004784 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004785 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004786 Crypto = 0;
4787 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4788 if (Features[i] == "+neon")
4789 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004790 if (Features[i] == "+crc")
4791 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004792 if (Features[i] == "+crypto")
4793 Crypto = 1;
4794 }
4795
James Molloy5e73df52014-04-16 15:06:20 +00004796 setDescriptionString();
4797
4798 return true;
4799 }
4800
David Blaikie1cbb9712014-11-14 19:09:44 +00004801 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004802
David Blaikie1cbb9712014-11-14 19:09:44 +00004803 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004804 return TargetInfo::AArch64ABIBuiltinVaList;
4805 }
4806
4807 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004808 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004809 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004810 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004811
Eric Christopher917e9522014-11-18 22:36:15 +00004812 virtual bool
4813 validateAsmConstraint(const char *&Name,
4814 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004815 switch (*Name) {
4816 default:
4817 return false;
4818 case 'w': // Floating point and SIMD registers (V0-V31)
4819 Info.setAllowsRegister();
4820 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004821 case 'I': // Constant that can be used with an ADD instruction
4822 case 'J': // Constant that can be used with a SUB instruction
4823 case 'K': // Constant that can be used with a 32-bit logical instruction
4824 case 'L': // Constant that can be used with a 64-bit logical instruction
4825 case 'M': // Constant that can be used as a 32-bit MOV immediate
4826 case 'N': // Constant that can be used as a 64-bit MOV immediate
4827 case 'Y': // Floating point constant zero
4828 case 'Z': // Integer constant zero
4829 return true;
4830 case 'Q': // A memory reference with base register and no offset
4831 Info.setAllowsMemory();
4832 return true;
4833 case 'S': // A symbolic address
4834 Info.setAllowsRegister();
4835 return true;
4836 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004837 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4838 // Utf: A memory address suitable for ldp/stp in TF mode.
4839 // Usa: An absolute symbolic address.
4840 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4841 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004842 case 'z': // Zero register, wzr or xzr
4843 Info.setAllowsRegister();
4844 return true;
4845 case 'x': // Floating point and SIMD registers (V0-V15)
4846 Info.setAllowsRegister();
4847 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004848 }
4849 return false;
4850 }
4851
Akira Hatanaka987f1862014-08-22 06:05:21 +00004852 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004853 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004854 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004855 // Strip off constraint modifiers.
4856 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4857 Constraint = Constraint.substr(1);
4858
4859 switch (Constraint[0]) {
4860 default:
4861 return true;
4862 case 'z':
4863 case 'r': {
4864 switch (Modifier) {
4865 case 'x':
4866 case 'w':
4867 // For now assume that the person knows what they're
4868 // doing with the modifier.
4869 return true;
4870 default:
4871 // By default an 'r' constraint will be in the 'x'
4872 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004873 if (Size == 64)
4874 return true;
4875
4876 SuggestedModifier = "w";
4877 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004878 }
4879 }
4880 }
4881 }
4882
David Blaikie1cbb9712014-11-14 19:09:44 +00004883 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004884
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004885 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004886 if (RegNo == 0)
4887 return 0;
4888 if (RegNo == 1)
4889 return 1;
4890 return -1;
4891 }
4892};
4893
Tim Northover573cbee2014-05-24 12:52:07 +00004894const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004895 // 32-bit Integer registers
4896 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4897 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4898 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4899
4900 // 64-bit Integer registers
4901 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4902 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4903 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4904
4905 // 32-bit floating point regsisters
4906 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4907 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4908 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4909
4910 // 64-bit floating point regsisters
4911 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4912 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4913 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4914
4915 // Vector registers
4916 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4917 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4918 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4919};
4920
Tim Northover573cbee2014-05-24 12:52:07 +00004921void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004922 unsigned &NumNames) const {
4923 Names = GCCRegNames;
4924 NumNames = llvm::array_lengthof(GCCRegNames);
4925}
4926
Tim Northover573cbee2014-05-24 12:52:07 +00004927const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004928 { { "w31" }, "wsp" },
4929 { { "x29" }, "fp" },
4930 { { "x30" }, "lr" },
4931 { { "x31" }, "sp" },
4932 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4933 // don't want to substitute one of these for a different-sized one.
4934};
4935
Tim Northover573cbee2014-05-24 12:52:07 +00004936void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004937 unsigned &NumAliases) const {
4938 Aliases = GCCRegAliases;
4939 NumAliases = llvm::array_lengthof(GCCRegAliases);
4940}
4941
Tim Northover573cbee2014-05-24 12:52:07 +00004942const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004943#define BUILTIN(ID, TYPE, ATTRS) \
4944 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4945#include "clang/Basic/BuiltinsNEON.def"
4946
4947#define BUILTIN(ID, TYPE, ATTRS) \
4948 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004949#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004950};
James Molloy5e73df52014-04-16 15:06:20 +00004951
Tim Northover573cbee2014-05-24 12:52:07 +00004952class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004953 void setDescriptionString() override {
4954 if (getTriple().isOSBinFormatMachO())
4955 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4956 else
4957 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4958 }
4959
4960public:
Tim Northover573cbee2014-05-24 12:52:07 +00004961 AArch64leTargetInfo(const llvm::Triple &Triple)
4962 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004963 BigEndian = false;
4964 }
4965 void getTargetDefines(const LangOptions &Opts,
4966 MacroBuilder &Builder) const override {
4967 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004968 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004969 }
4970};
4971
Tim Northover573cbee2014-05-24 12:52:07 +00004972class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004973 void setDescriptionString() override {
4974 assert(!getTriple().isOSBinFormatMachO());
4975 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4976 }
4977
4978public:
Tim Northover573cbee2014-05-24 12:52:07 +00004979 AArch64beTargetInfo(const llvm::Triple &Triple)
4980 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004981 void getTargetDefines(const LangOptions &Opts,
4982 MacroBuilder &Builder) const override {
4983 Builder.defineMacro("__AARCH64EB__");
4984 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4985 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004986 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004987 }
4988};
Tim Northovera2ee4332014-03-29 15:09:45 +00004989} // end anonymous namespace.
4990
4991namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004992class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004993protected:
4994 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4995 MacroBuilder &Builder) const override {
4996 Builder.defineMacro("__AARCH64_SIMD__");
4997 Builder.defineMacro("__ARM64_ARCH_8__");
4998 Builder.defineMacro("__ARM_NEON__");
4999 Builder.defineMacro("__LITTLE_ENDIAN__");
5000 Builder.defineMacro("__REGISTER_PREFIX__", "");
5001 Builder.defineMacro("__arm64", "1");
5002 Builder.defineMacro("__arm64__", "1");
5003
5004 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5005 }
5006
Tim Northovera2ee4332014-03-29 15:09:45 +00005007public:
Tim Northover573cbee2014-05-24 12:52:07 +00005008 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5009 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005010 Int64Type = SignedLongLong;
5011 WCharType = SignedInt;
5012 UseSignedCharForObjCBool = false;
5013
Tim Northovera6a19f12015-02-06 01:25:07 +00005014 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005015 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5016
5017 TheCXXABI.set(TargetCXXABI::iOS64);
5018 }
5019
David Blaikie1cbb9712014-11-14 19:09:44 +00005020 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005021 return TargetInfo::CharPtrBuiltinVaList;
5022 }
5023};
5024} // end anonymous namespace
5025
5026namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005027// Hexagon abstract base class
5028class HexagonTargetInfo : public TargetInfo {
5029 static const Builtin::Info BuiltinInfo[];
5030 static const char * const GCCRegNames[];
5031 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5032 std::string CPU;
5033public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005034 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005035 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005036 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005037
5038 // {} in inline assembly are packet specifiers, not assembly variant
5039 // specifiers.
5040 NoAsmVariants = true;
5041 }
5042
Craig Topper3164f332014-03-11 03:39:26 +00005043 void getTargetBuiltins(const Builtin::Info *&Records,
5044 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005045 Records = BuiltinInfo;
5046 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5047 }
5048
Craig Topper3164f332014-03-11 03:39:26 +00005049 bool validateAsmConstraint(const char *&Name,
5050 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005051 return true;
5052 }
5053
Craig Topper3164f332014-03-11 03:39:26 +00005054 void getTargetDefines(const LangOptions &Opts,
5055 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005056
Craig Topper3164f332014-03-11 03:39:26 +00005057 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005058 return Feature == "hexagon";
5059 }
Craig Topper3164f332014-03-11 03:39:26 +00005060
5061 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005062 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005063 }
Craig Topper3164f332014-03-11 03:39:26 +00005064 void getGCCRegNames(const char * const *&Names,
5065 unsigned &NumNames) const override;
5066 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5067 unsigned &NumAliases) const override;
5068 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005069 return "";
5070 }
Sebastian Pop86500282012-01-13 20:37:10 +00005071
5072 static const char *getHexagonCPUSuffix(StringRef Name) {
5073 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005074 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005075 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005076 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005077 }
5078
Craig Topper3164f332014-03-11 03:39:26 +00005079 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005080 if (!getHexagonCPUSuffix(Name))
5081 return false;
5082
Tony Linthicum76329bf2011-12-12 21:14:55 +00005083 CPU = Name;
5084 return true;
5085 }
5086};
5087
5088void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5089 MacroBuilder &Builder) const {
5090 Builder.defineMacro("qdsp6");
5091 Builder.defineMacro("__qdsp6", "1");
5092 Builder.defineMacro("__qdsp6__", "1");
5093
5094 Builder.defineMacro("hexagon");
5095 Builder.defineMacro("__hexagon", "1");
5096 Builder.defineMacro("__hexagon__", "1");
5097
5098 if(CPU == "hexagonv1") {
5099 Builder.defineMacro("__HEXAGON_V1__");
5100 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5101 if(Opts.HexagonQdsp6Compat) {
5102 Builder.defineMacro("__QDSP6_V1__");
5103 Builder.defineMacro("__QDSP6_ARCH__", "1");
5104 }
5105 }
5106 else if(CPU == "hexagonv2") {
5107 Builder.defineMacro("__HEXAGON_V2__");
5108 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5109 if(Opts.HexagonQdsp6Compat) {
5110 Builder.defineMacro("__QDSP6_V2__");
5111 Builder.defineMacro("__QDSP6_ARCH__", "2");
5112 }
5113 }
5114 else if(CPU == "hexagonv3") {
5115 Builder.defineMacro("__HEXAGON_V3__");
5116 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5117 if(Opts.HexagonQdsp6Compat) {
5118 Builder.defineMacro("__QDSP6_V3__");
5119 Builder.defineMacro("__QDSP6_ARCH__", "3");
5120 }
5121 }
5122 else if(CPU == "hexagonv4") {
5123 Builder.defineMacro("__HEXAGON_V4__");
5124 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5125 if(Opts.HexagonQdsp6Compat) {
5126 Builder.defineMacro("__QDSP6_V4__");
5127 Builder.defineMacro("__QDSP6_ARCH__", "4");
5128 }
5129 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005130 else if(CPU == "hexagonv5") {
5131 Builder.defineMacro("__HEXAGON_V5__");
5132 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5133 if(Opts.HexagonQdsp6Compat) {
5134 Builder.defineMacro("__QDSP6_V5__");
5135 Builder.defineMacro("__QDSP6_ARCH__", "5");
5136 }
5137 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005138}
5139
5140const char * const HexagonTargetInfo::GCCRegNames[] = {
5141 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5142 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5143 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5144 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5145 "p0", "p1", "p2", "p3",
5146 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5147};
5148
5149void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5150 unsigned &NumNames) const {
5151 Names = GCCRegNames;
5152 NumNames = llvm::array_lengthof(GCCRegNames);
5153}
5154
5155
5156const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5157 { { "sp" }, "r29" },
5158 { { "fp" }, "r30" },
5159 { { "lr" }, "r31" },
5160 };
5161
5162void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5163 unsigned &NumAliases) const {
5164 Aliases = GCCRegAliases;
5165 NumAliases = llvm::array_lengthof(GCCRegAliases);
5166}
5167
5168
5169const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5170#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5171#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5172 ALL_LANGUAGES },
5173#include "clang/Basic/BuiltinsHexagon.def"
5174};
5175}
5176
5177
Chris Lattner5ba61f02006-10-14 07:39:34 +00005178namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005179// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5180class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005181 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5182 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005183 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005184public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005185 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005186
Craig Topper3164f332014-03-11 03:39:26 +00005187 bool handleTargetFeatures(std::vector<std::string> &Features,
5188 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005189 SoftFloat = false;
5190 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5191 if (Features[i] == "+soft-float")
5192 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005193 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005194 }
Craig Topper3164f332014-03-11 03:39:26 +00005195 void getTargetDefines(const LangOptions &Opts,
5196 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005197 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005198 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005199
5200 if (SoftFloat)
5201 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005202 }
Craig Topper3164f332014-03-11 03:39:26 +00005203
5204 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005205 return llvm::StringSwitch<bool>(Feature)
5206 .Case("softfloat", SoftFloat)
5207 .Case("sparc", true)
5208 .Default(false);
5209 }
Craig Topper3164f332014-03-11 03:39:26 +00005210
5211 void getTargetBuiltins(const Builtin::Info *&Records,
5212 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005213 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005214 }
Craig Topper3164f332014-03-11 03:39:26 +00005215 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005216 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005217 }
Craig Topper3164f332014-03-11 03:39:26 +00005218 void getGCCRegNames(const char * const *&Names,
5219 unsigned &NumNames) const override;
5220 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5221 unsigned &NumAliases) const override;
5222 bool validateAsmConstraint(const char *&Name,
5223 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005224 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005225 switch (*Name) {
5226 case 'I': // Signed 13-bit constant
5227 case 'J': // Zero
5228 case 'K': // 32-bit constant with the low 12 bits clear
5229 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5230 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5231 case 'N': // Same as 'K' but zext (required for SIMode)
5232 case 'O': // The constant 4096
5233 return true;
5234 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005235 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005236 }
Craig Topper3164f332014-03-11 03:39:26 +00005237 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005238 // FIXME: Implement!
5239 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005240 }
5241};
5242
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005243const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005244 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5245 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5246 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5247 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5248};
5249
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005250void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5251 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005252 Names = GCCRegNames;
5253 NumNames = llvm::array_lengthof(GCCRegNames);
5254}
5255
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005256const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005257 { { "g0" }, "r0" },
5258 { { "g1" }, "r1" },
5259 { { "g2" }, "r2" },
5260 { { "g3" }, "r3" },
5261 { { "g4" }, "r4" },
5262 { { "g5" }, "r5" },
5263 { { "g6" }, "r6" },
5264 { { "g7" }, "r7" },
5265 { { "o0" }, "r8" },
5266 { { "o1" }, "r9" },
5267 { { "o2" }, "r10" },
5268 { { "o3" }, "r11" },
5269 { { "o4" }, "r12" },
5270 { { "o5" }, "r13" },
5271 { { "o6", "sp" }, "r14" },
5272 { { "o7" }, "r15" },
5273 { { "l0" }, "r16" },
5274 { { "l1" }, "r17" },
5275 { { "l2" }, "r18" },
5276 { { "l3" }, "r19" },
5277 { { "l4" }, "r20" },
5278 { { "l5" }, "r21" },
5279 { { "l6" }, "r22" },
5280 { { "l7" }, "r23" },
5281 { { "i0" }, "r24" },
5282 { { "i1" }, "r25" },
5283 { { "i2" }, "r26" },
5284 { { "i3" }, "r27" },
5285 { { "i4" }, "r28" },
5286 { { "i5" }, "r29" },
5287 { { "i6", "fp" }, "r30" },
5288 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005289};
5290
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005291void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5292 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005293 Aliases = GCCRegAliases;
5294 NumAliases = llvm::array_lengthof(GCCRegAliases);
5295}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005296
5297// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5298class SparcV8TargetInfo : public SparcTargetInfo {
5299public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005300 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005301 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005302 }
5303
Craig Topper3164f332014-03-11 03:39:26 +00005304 void getTargetDefines(const LangOptions &Opts,
5305 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005306 SparcTargetInfo::getTargetDefines(Opts, Builder);
5307 Builder.defineMacro("__sparcv8");
5308 }
5309};
5310
5311// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5312class SparcV9TargetInfo : public SparcTargetInfo {
5313public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005314 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005315 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005316 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005317 // This is an LP64 platform.
5318 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005319
5320 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005321 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005322 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005323 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005324 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005325 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005326
5327 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5328 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5329 LongDoubleWidth = 128;
5330 LongDoubleAlign = 128;
5331 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005332 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005333 }
5334
Craig Topper3164f332014-03-11 03:39:26 +00005335 void getTargetDefines(const LangOptions &Opts,
5336 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005337 SparcTargetInfo::getTargetDefines(Opts, Builder);
5338 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005339 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005340 // Solaris doesn't need these variants, but the BSDs do.
5341 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005342 Builder.defineMacro("__sparc64__");
5343 Builder.defineMacro("__sparc_v9__");
5344 Builder.defineMacro("__sparcv9__");
5345 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005346 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005347
Craig Topper3164f332014-03-11 03:39:26 +00005348 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005349 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5350 .Case("v9", true)
5351 .Case("ultrasparc", true)
5352 .Case("ultrasparc3", true)
5353 .Case("niagara", true)
5354 .Case("niagara2", true)
5355 .Case("niagara3", true)
5356 .Case("niagara4", true)
5357 .Default(false);
5358
5359 // No need to store the CPU yet. There aren't any CPU-specific
5360 // macros to define.
5361 return CPUKnown;
5362 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005363};
5364
Gabor Greif49991682008-02-21 16:29:08 +00005365} // end anonymous namespace.
5366
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005367namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005368class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005369public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005370 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5371 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005372 SizeType = UnsignedInt;
5373 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005374 }
5375};
5376} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005377
Chris Lattnerb781dc792008-05-08 05:58:21 +00005378namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005379class SystemZTargetInfo : public TargetInfo {
5380 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005381
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005382public:
5383 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5384 TLSSupported = true;
5385 IntWidth = IntAlign = 32;
5386 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5387 PointerWidth = PointerAlign = 64;
5388 LongDoubleWidth = 128;
5389 LongDoubleAlign = 64;
5390 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5391 MinGlobalAlign = 16;
5392 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5393 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5394 }
5395 void getTargetDefines(const LangOptions &Opts,
5396 MacroBuilder &Builder) const override {
5397 Builder.defineMacro("__s390__");
5398 Builder.defineMacro("__s390x__");
5399 Builder.defineMacro("__zarch__");
5400 Builder.defineMacro("__LONG_DOUBLE_128__");
5401 }
5402 void getTargetBuiltins(const Builtin::Info *&Records,
5403 unsigned &NumRecords) const override {
5404 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005405 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005406 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005407 }
5408
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005409 void getGCCRegNames(const char *const *&Names,
5410 unsigned &NumNames) const override;
5411 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5412 unsigned &NumAliases) const override {
5413 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005414 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005415 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005416 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005417 bool validateAsmConstraint(const char *&Name,
5418 TargetInfo::ConstraintInfo &info) const override;
5419 const char *getClobbers() const override {
5420 // FIXME: Is this really right?
5421 return "";
5422 }
5423 BuiltinVaListKind getBuiltinVaListKind() const override {
5424 return TargetInfo::SystemZBuiltinVaList;
5425 }
5426 bool setCPU(const std::string &Name) override {
5427 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5428 .Case("z10", true)
5429 .Case("z196", true)
5430 .Case("zEC12", true)
5431 .Default(false);
5432
5433 // No need to store the CPU yet. There aren't any CPU-specific
5434 // macros to define.
5435 return CPUKnown;
5436 }
5437};
5438
5439const char *const SystemZTargetInfo::GCCRegNames[] = {
5440 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5441 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5442 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5443 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5444};
5445
5446void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5447 unsigned &NumNames) const {
5448 Names = GCCRegNames;
5449 NumNames = llvm::array_lengthof(GCCRegNames);
5450}
5451
5452bool SystemZTargetInfo::
5453validateAsmConstraint(const char *&Name,
5454 TargetInfo::ConstraintInfo &Info) const {
5455 switch (*Name) {
5456 default:
5457 return false;
5458
5459 case 'a': // Address register
5460 case 'd': // Data register (equivalent to 'r')
5461 case 'f': // Floating-point register
5462 Info.setAllowsRegister();
5463 return true;
5464
5465 case 'I': // Unsigned 8-bit constant
5466 case 'J': // Unsigned 12-bit constant
5467 case 'K': // Signed 16-bit constant
5468 case 'L': // Signed 20-bit displacement (on all targets we support)
5469 case 'M': // 0x7fffffff
5470 return true;
5471
5472 case 'Q': // Memory with base and unsigned 12-bit displacement
5473 case 'R': // Likewise, plus an index
5474 case 'S': // Memory with base and signed 20-bit displacement
5475 case 'T': // Likewise, plus an index
5476 Info.setAllowsMemory();
5477 return true;
5478 }
5479}
Ulrich Weigand47445072013-05-06 16:26:41 +00005480}
5481
5482namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005483 class MSP430TargetInfo : public TargetInfo {
5484 static const char * const GCCRegNames[];
5485 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005486 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005487 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005488 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005489 IntWidth = 16; IntAlign = 16;
5490 LongWidth = 32; LongLongWidth = 64;
5491 LongAlign = LongLongAlign = 16;
5492 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005493 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005494 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005495 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005496 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005497 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005498 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005499 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005500 }
5501 void getTargetDefines(const LangOptions &Opts,
5502 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005503 Builder.defineMacro("MSP430");
5504 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005505 // FIXME: defines for different 'flavours' of MCU
5506 }
Craig Topper3164f332014-03-11 03:39:26 +00005507 void getTargetBuiltins(const Builtin::Info *&Records,
5508 unsigned &NumRecords) const override {
5509 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005510 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005511 NumRecords = 0;
5512 }
Craig Topper3164f332014-03-11 03:39:26 +00005513 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005514 return Feature == "msp430";
5515 }
Craig Topper3164f332014-03-11 03:39:26 +00005516 void getGCCRegNames(const char * const *&Names,
5517 unsigned &NumNames) const override;
5518 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5519 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005520 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005521 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005522 NumAliases = 0;
5523 }
Eric Christopher917e9522014-11-18 22:36:15 +00005524 bool
5525 validateAsmConstraint(const char *&Name,
5526 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005527 // FIXME: implement
5528 switch (*Name) {
5529 case 'K': // the constant 1
5530 case 'L': // constant -1^20 .. 1^19
5531 case 'M': // constant 1-4:
5532 return true;
5533 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005534 // No target constraints for now.
5535 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005536 }
Craig Topper3164f332014-03-11 03:39:26 +00005537 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005538 // FIXME: Is this really right?
5539 return "";
5540 }
Craig Topper3164f332014-03-11 03:39:26 +00005541 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005542 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005543 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005544 }
5545 };
5546
5547 const char * const MSP430TargetInfo::GCCRegNames[] = {
5548 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5549 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5550 };
5551
5552 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5553 unsigned &NumNames) const {
5554 Names = GCCRegNames;
5555 NumNames = llvm::array_lengthof(GCCRegNames);
5556 }
5557}
5558
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005559namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005560
Mike Stump11289f42009-09-09 15:08:12 +00005561 // LLVM and Clang cannot be used directly to output native binaries for
5562 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005563 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005564 //
5565 // TCE uses the llvm bitcode as input and uses it for generating customized
5566 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005567 // publicly available in http://tce.cs.tut.fi
5568
Eli Friedman1f191002011-10-07 19:51:42 +00005569 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5570 3, // opencl_global
5571 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005572 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005573 // FIXME: generic has to be added to the target
5574 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005575 0, // cuda_device
5576 0, // cuda_constant
5577 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005578 };
5579
Eli Friedmana9c3d712009-08-19 20:47:07 +00005580 class TCETargetInfo : public TargetInfo{
5581 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005582 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005583 TLSSupported = false;
5584 IntWidth = 32;
5585 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005586 PointerWidth = 32;
5587 IntAlign = 32;
5588 LongAlign = LongLongAlign = 32;
5589 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005590 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005591 SizeType = UnsignedInt;
5592 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005593 IntPtrType = SignedInt;
5594 PtrDiffType = SignedInt;
5595 FloatWidth = 32;
5596 FloatAlign = 32;
5597 DoubleWidth = 32;
5598 DoubleAlign = 32;
5599 LongDoubleWidth = 32;
5600 LongDoubleAlign = 32;
5601 FloatFormat = &llvm::APFloat::IEEEsingle;
5602 DoubleFormat = &llvm::APFloat::IEEEsingle;
5603 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005604 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5605 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005606 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005607 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005608 }
5609
Craig Topper3164f332014-03-11 03:39:26 +00005610 void getTargetDefines(const LangOptions &Opts,
5611 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005612 DefineStd(Builder, "tce", Opts);
5613 Builder.defineMacro("__TCE__");
5614 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005615 }
Craig Topper3164f332014-03-11 03:39:26 +00005616 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005617 return Feature == "tce";
5618 }
Craig Topper3164f332014-03-11 03:39:26 +00005619
5620 void getTargetBuiltins(const Builtin::Info *&Records,
5621 unsigned &NumRecords) const override {}
5622 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005623 return "";
5624 }
Craig Topper3164f332014-03-11 03:39:26 +00005625 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005626 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005627 }
Craig Topper3164f332014-03-11 03:39:26 +00005628 void getGCCRegNames(const char * const *&Names,
5629 unsigned &NumNames) const override {}
5630 bool validateAsmConstraint(const char *&Name,
5631 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005632 return true;
5633 }
Craig Topper3164f332014-03-11 03:39:26 +00005634 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5635 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005636 };
5637}
5638
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005639namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005640class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005641 virtual void setDescriptionString() = 0;
5642
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005643 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005644 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005645 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005646 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005647 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005648 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005649 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005650 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005651 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005652 enum DspRevEnum {
5653 NoDSP, DSP1, DSP2
5654 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005655 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005656
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005657protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005658 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005659 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005660
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005661public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005662 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5663 const std::string &CPUStr)
5664 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005665 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005666 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5667 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5668 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005669
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005670 bool isNaN2008Default() const {
5671 return CPU == "mips32r6" || CPU == "mips64r6";
5672 }
5673
5674 bool isFP64Default() const {
5675 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5676 }
5677
Alp Toker4925ba72014-06-07 23:30:42 +00005678 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005679 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005680 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5681 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005682 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005683 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005684 .Case("mips1", IsMips32)
5685 .Case("mips2", IsMips32)
5686 .Case("mips3", true)
5687 .Case("mips4", true)
5688 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005689 .Case("mips32", IsMips32)
5690 .Case("mips32r2", IsMips32)
5691 .Case("mips32r6", IsMips32)
5692 .Case("mips64", true)
5693 .Case("mips64r2", true)
5694 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005695 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005696 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005697 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005698 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005699 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005700 if (CPU == "octeon")
5701 Features["mips64r2"] = Features["cnmips"] = true;
5702 else
5703 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005704 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005705
Craig Topper3164f332014-03-11 03:39:26 +00005706 void getTargetDefines(const LangOptions &Opts,
5707 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005708 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005709 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005710 if (Opts.GNUMode)
5711 Builder.defineMacro("mips");
5712
Simon Atanasyan683535b2012-08-29 19:14:58 +00005713 Builder.defineMacro("__REGISTER_PREFIX__", "");
5714
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005715 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005716 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005717 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005718 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005719 case SoftFloat:
5720 Builder.defineMacro("__mips_soft_float", Twine(1));
5721 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005722 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005723
Simon Atanasyan16071912013-04-14 14:07:30 +00005724 if (IsSingleFloat)
5725 Builder.defineMacro("__mips_single_float", Twine(1));
5726
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005727 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5728 Builder.defineMacro("_MIPS_FPSET",
5729 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5730
Simon Atanasyan72244b62012-07-05 16:06:06 +00005731 if (IsMips16)
5732 Builder.defineMacro("__mips16", Twine(1));
5733
Simon Atanasyan60777612013-04-14 14:07:51 +00005734 if (IsMicromips)
5735 Builder.defineMacro("__mips_micromips", Twine(1));
5736
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005737 if (IsNan2008)
5738 Builder.defineMacro("__mips_nan2008", Twine(1));
5739
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005740 switch (DspRev) {
5741 default:
5742 break;
5743 case DSP1:
5744 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5745 Builder.defineMacro("__mips_dsp", Twine(1));
5746 break;
5747 case DSP2:
5748 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5749 Builder.defineMacro("__mips_dspr2", Twine(1));
5750 Builder.defineMacro("__mips_dsp", Twine(1));
5751 break;
5752 }
5753
Jack Carter44ff1e52013-08-12 17:20:29 +00005754 if (HasMSA)
5755 Builder.defineMacro("__mips_msa", Twine(1));
5756
Simon Atanasyan26f19672012-04-05 19:28:31 +00005757 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5758 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5759 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005760
5761 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5762 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005763 }
5764
Craig Topper3164f332014-03-11 03:39:26 +00005765 void getTargetBuiltins(const Builtin::Info *&Records,
5766 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005767 Records = BuiltinInfo;
5768 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005769 }
Craig Topper3164f332014-03-11 03:39:26 +00005770 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005771 return llvm::StringSwitch<bool>(Feature)
5772 .Case("mips", true)
5773 .Case("fp64", HasFP64)
5774 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005775 }
Craig Topper3164f332014-03-11 03:39:26 +00005776 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005777 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005778 }
Craig Topper3164f332014-03-11 03:39:26 +00005779 void getGCCRegNames(const char * const *&Names,
5780 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005781 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005782 // CPU register names
5783 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005784 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5785 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5786 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005787 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5788 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005789 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5790 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5791 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5792 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005793 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005794 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005795 "$fcc5","$fcc6","$fcc7",
5796 // MSA register names
5797 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5798 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5799 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5800 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5801 // MSA control register names
5802 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5803 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005804 };
5805 Names = GCCRegNames;
5806 NumNames = llvm::array_lengthof(GCCRegNames);
5807 }
Craig Topper3164f332014-03-11 03:39:26 +00005808 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5809 unsigned &NumAliases) const override = 0;
5810 bool validateAsmConstraint(const char *&Name,
5811 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005812 switch (*Name) {
5813 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005814 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005815 case 'r': // CPU registers.
5816 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005817 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005818 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005819 case 'c': // $25 for indirect jumps
5820 case 'l': // lo register
5821 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005822 Info.setAllowsRegister();
5823 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005824 case 'I': // Signed 16-bit constant
5825 case 'J': // Integer 0
5826 case 'K': // Unsigned 16-bit constant
5827 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5828 case 'M': // Constants not loadable via lui, addiu, or ori
5829 case 'N': // Constant -1 to -65535
5830 case 'O': // A signed 15-bit constant
5831 case 'P': // A constant between 1 go 65535
5832 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005833 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005834 Info.setAllowsMemory();
5835 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005836 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005837 }
5838
Craig Topper3164f332014-03-11 03:39:26 +00005839 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005840 // In GCC, $1 is not widely used in generated code (it's used only in a few
5841 // specific situations), so there is no real need for users to add it to
5842 // the clobbers list if they want to use it in their inline assembly code.
5843 //
5844 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5845 // code generation, so using it in inline assembly without adding it to the
5846 // clobbers list can cause conflicts between the inline assembly code and
5847 // the surrounding generated code.
5848 //
5849 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5850 // operands, which will conflict with the ".set at" assembler option (which
5851 // we use only for inline assembly, in order to maintain compatibility with
5852 // GCC) and will also conflict with the user's usage of $1.
5853 //
5854 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5855 // register for generated code is to automatically clobber $1 for all inline
5856 // assembly code.
5857 //
5858 // FIXME: We should automatically clobber $1 only for inline assembly code
5859 // which actually uses it. This would allow LLVM to use $1 for inline
5860 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005861 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005862 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005863
Craig Topper3164f332014-03-11 03:39:26 +00005864 bool handleTargetFeatures(std::vector<std::string> &Features,
5865 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005866 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005867 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005868 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005869 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005870 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005871 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005872 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005873
5874 for (std::vector<std::string>::iterator it = Features.begin(),
5875 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005876 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005877 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005878 else if (*it == "+soft-float")
5879 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005880 else if (*it == "+mips16")
5881 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005882 else if (*it == "+micromips")
5883 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005884 else if (*it == "+dsp")
5885 DspRev = std::max(DspRev, DSP1);
5886 else if (*it == "+dspr2")
5887 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005888 else if (*it == "+msa")
5889 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005890 else if (*it == "+fp64")
5891 HasFP64 = true;
5892 else if (*it == "-fp64")
5893 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005894 else if (*it == "+nan2008")
5895 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005896 else if (*it == "-nan2008")
5897 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005898 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005899
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005900 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005901 std::vector<std::string>::iterator it =
5902 std::find(Features.begin(), Features.end(), "+soft-float");
5903 if (it != Features.end())
5904 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005905
Akira Hatanaka9064e362013-10-29 18:30:33 +00005906 setDescriptionString();
5907
Rafael Espindolaeb265472013-08-21 21:59:03 +00005908 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005909 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005910
Craig Topper3164f332014-03-11 03:39:26 +00005911 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005912 if (RegNo == 0) return 4;
5913 if (RegNo == 1) return 5;
5914 return -1;
5915 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005916
5917 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005918};
5919
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005920const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5921#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5922#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5923 ALL_LANGUAGES },
5924#include "clang/Basic/BuiltinsMips.def"
5925};
5926
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005927class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005928public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005929 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005930 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005931 SizeType = UnsignedInt;
5932 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00005933 Int64Type = SignedLongLong;
5934 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005935 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005936 }
Craig Topper3164f332014-03-11 03:39:26 +00005937 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005938 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005939 ABI = Name;
5940 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005941 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005942 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005943 }
Craig Topper3164f332014-03-11 03:39:26 +00005944 void getTargetDefines(const LangOptions &Opts,
5945 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005946 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005947
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005948 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005949 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5950
5951 const std::string& CPUStr = getCPU();
5952 if (CPUStr == "mips32")
5953 Builder.defineMacro("__mips_isa_rev", "1");
5954 else if (CPUStr == "mips32r2")
5955 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00005956 else if (CPUStr == "mips32r6")
5957 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005958
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005959 if (ABI == "o32") {
5960 Builder.defineMacro("__mips_o32");
5961 Builder.defineMacro("_ABIO32", "1");
5962 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5963 }
5964 else if (ABI == "eabi")
5965 Builder.defineMacro("__mips_eabi");
5966 else
David Blaikie83d382b2011-09-23 05:06:16 +00005967 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005968 }
Craig Topper3164f332014-03-11 03:39:26 +00005969 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5970 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005971 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5972 { { "at" }, "$1" },
5973 { { "v0" }, "$2" },
5974 { { "v1" }, "$3" },
5975 { { "a0" }, "$4" },
5976 { { "a1" }, "$5" },
5977 { { "a2" }, "$6" },
5978 { { "a3" }, "$7" },
5979 { { "t0" }, "$8" },
5980 { { "t1" }, "$9" },
5981 { { "t2" }, "$10" },
5982 { { "t3" }, "$11" },
5983 { { "t4" }, "$12" },
5984 { { "t5" }, "$13" },
5985 { { "t6" }, "$14" },
5986 { { "t7" }, "$15" },
5987 { { "s0" }, "$16" },
5988 { { "s1" }, "$17" },
5989 { { "s2" }, "$18" },
5990 { { "s3" }, "$19" },
5991 { { "s4" }, "$20" },
5992 { { "s5" }, "$21" },
5993 { { "s6" }, "$22" },
5994 { { "s7" }, "$23" },
5995 { { "t8" }, "$24" },
5996 { { "t9" }, "$25" },
5997 { { "k0" }, "$26" },
5998 { { "k1" }, "$27" },
5999 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006000 { { "sp","$sp" }, "$29" },
6001 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006002 { { "ra" }, "$31" }
6003 };
6004 Aliases = GCCRegAliases;
6005 NumAliases = llvm::array_lengthof(GCCRegAliases);
6006 }
6007};
6008
6009class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006010 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006011 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006012 }
6013
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006014public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006015 Mips32EBTargetInfo(const llvm::Triple &Triple)
6016 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006017 }
Craig Topper3164f332014-03-11 03:39:26 +00006018 void getTargetDefines(const LangOptions &Opts,
6019 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006020 DefineStd(Builder, "MIPSEB", Opts);
6021 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006022 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006023 }
6024};
6025
6026class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006027 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006028 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006029 }
6030
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006031public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006032 Mips32ELTargetInfo(const llvm::Triple &Triple)
6033 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006034 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006035 }
Craig Topper3164f332014-03-11 03:39:26 +00006036 void getTargetDefines(const LangOptions &Opts,
6037 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006038 DefineStd(Builder, "MIPSEL", Opts);
6039 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006040 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006041 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006042};
Akira Hatanakabef17452011-09-20 19:21:49 +00006043
6044class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006045public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006046 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006047 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006048 LongDoubleWidth = LongDoubleAlign = 128;
6049 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006050 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6051 LongDoubleWidth = LongDoubleAlign = 64;
6052 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6053 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006054 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006055 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006056 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006057 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006058
6059 void setN64ABITypes() {
6060 LongWidth = LongAlign = 64;
6061 PointerWidth = PointerAlign = 64;
6062 SizeType = UnsignedLong;
6063 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006064 Int64Type = SignedLong;
6065 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006066 }
6067
6068 void setN32ABITypes() {
6069 LongWidth = LongAlign = 32;
6070 PointerWidth = PointerAlign = 32;
6071 SizeType = UnsignedInt;
6072 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006073 Int64Type = SignedLongLong;
6074 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006075 }
6076
Craig Topper3164f332014-03-11 03:39:26 +00006077 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006078 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006079 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006080 ABI = Name;
6081 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006082 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006083 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006084 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006085 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006086 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006087 }
6088 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006089 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006090
Craig Topper3164f332014-03-11 03:39:26 +00006091 void getTargetDefines(const LangOptions &Opts,
6092 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006093 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006094
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006095 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006096 Builder.defineMacro("__mips64");
6097 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006098 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6099
6100 const std::string& CPUStr = getCPU();
6101 if (CPUStr == "mips64")
6102 Builder.defineMacro("__mips_isa_rev", "1");
6103 else if (CPUStr == "mips64r2")
6104 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006105 else if (CPUStr == "mips64r6")
6106 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006107
Akira Hatanakabef17452011-09-20 19:21:49 +00006108 if (ABI == "n32") {
6109 Builder.defineMacro("__mips_n32");
6110 Builder.defineMacro("_ABIN32", "2");
6111 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6112 }
6113 else if (ABI == "n64") {
6114 Builder.defineMacro("__mips_n64");
6115 Builder.defineMacro("_ABI64", "3");
6116 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6117 }
6118 else
David Blaikie83d382b2011-09-23 05:06:16 +00006119 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006120 }
Craig Topper3164f332014-03-11 03:39:26 +00006121 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6122 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006123 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6124 { { "at" }, "$1" },
6125 { { "v0" }, "$2" },
6126 { { "v1" }, "$3" },
6127 { { "a0" }, "$4" },
6128 { { "a1" }, "$5" },
6129 { { "a2" }, "$6" },
6130 { { "a3" }, "$7" },
6131 { { "a4" }, "$8" },
6132 { { "a5" }, "$9" },
6133 { { "a6" }, "$10" },
6134 { { "a7" }, "$11" },
6135 { { "t0" }, "$12" },
6136 { { "t1" }, "$13" },
6137 { { "t2" }, "$14" },
6138 { { "t3" }, "$15" },
6139 { { "s0" }, "$16" },
6140 { { "s1" }, "$17" },
6141 { { "s2" }, "$18" },
6142 { { "s3" }, "$19" },
6143 { { "s4" }, "$20" },
6144 { { "s5" }, "$21" },
6145 { { "s6" }, "$22" },
6146 { { "s7" }, "$23" },
6147 { { "t8" }, "$24" },
6148 { { "t9" }, "$25" },
6149 { { "k0" }, "$26" },
6150 { { "k1" }, "$27" },
6151 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006152 { { "sp","$sp" }, "$29" },
6153 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006154 { { "ra" }, "$31" }
6155 };
6156 Aliases = GCCRegAliases;
6157 NumAliases = llvm::array_lengthof(GCCRegAliases);
6158 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006159
6160 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006161};
6162
6163class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006164 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006165 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006166 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 +00006167 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006168 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006169
Akira Hatanakabef17452011-09-20 19:21:49 +00006170 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006171
Akira Hatanakabef17452011-09-20 19:21:49 +00006172public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006173 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006174 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006175 void getTargetDefines(const LangOptions &Opts,
6176 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006177 DefineStd(Builder, "MIPSEB", Opts);
6178 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006179 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006180 }
6181};
6182
6183class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006184 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006185 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006186 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 +00006187 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006188 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006189 }
6190public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006191 Mips64ELTargetInfo(const llvm::Triple &Triple)
6192 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006193 // Default ABI is n64.
6194 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006195 }
Craig Topper3164f332014-03-11 03:39:26 +00006196 void getTargetDefines(const LangOptions &Opts,
6197 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006198 DefineStd(Builder, "MIPSEL", Opts);
6199 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006200 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006201 }
6202};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006203} // end anonymous namespace.
6204
Ivan Krasindd7403e2011-08-24 20:22:22 +00006205namespace {
6206class PNaClTargetInfo : public TargetInfo {
6207public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006208 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006209 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006210 this->UserLabelPrefix = "";
6211 this->LongAlign = 32;
6212 this->LongWidth = 32;
6213 this->PointerAlign = 32;
6214 this->PointerWidth = 32;
6215 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006216 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006217 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006218 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006219 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006220 this->SizeType = TargetInfo::UnsignedInt;
6221 this->PtrDiffType = TargetInfo::SignedInt;
6222 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006223 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006224 }
6225
Craig Topper3164f332014-03-11 03:39:26 +00006226 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006227 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006228 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006229 Builder.defineMacro("__le32__");
6230 Builder.defineMacro("__pnacl__");
6231 }
Craig Topper3164f332014-03-11 03:39:26 +00006232 void getTargetDefines(const LangOptions &Opts,
6233 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006234 getArchDefines(Opts, Builder);
6235 }
Craig Topper3164f332014-03-11 03:39:26 +00006236 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006237 return Feature == "pnacl";
6238 }
Craig Topper3164f332014-03-11 03:39:26 +00006239 void getTargetBuiltins(const Builtin::Info *&Records,
6240 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006241 }
Craig Topper3164f332014-03-11 03:39:26 +00006242 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006243 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006244 }
Craig Topper3164f332014-03-11 03:39:26 +00006245 void getGCCRegNames(const char * const *&Names,
6246 unsigned &NumNames) const override;
6247 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6248 unsigned &NumAliases) const override;
6249 bool validateAsmConstraint(const char *&Name,
6250 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006251 return false;
6252 }
6253
Craig Topper3164f332014-03-11 03:39:26 +00006254 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006255 return "";
6256 }
6257};
6258
6259void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6260 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006261 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006262 NumNames = 0;
6263}
6264
6265void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6266 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006267 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006268 NumAliases = 0;
6269}
6270} // end anonymous namespace.
6271
Guy Benyeib798fc92012-12-11 21:38:14 +00006272namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006273class Le64TargetInfo : public TargetInfo {
6274 static const Builtin::Info BuiltinInfo[];
6275
6276public:
6277 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6278 BigEndian = false;
6279 NoAsmVariants = true;
6280 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6281 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6282 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006283 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006284 }
6285
6286 void getTargetDefines(const LangOptions &Opts,
6287 MacroBuilder &Builder) const override {
6288 DefineStd(Builder, "unix", Opts);
6289 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6290 Builder.defineMacro("__ELF__");
6291 }
6292 void getTargetBuiltins(const Builtin::Info *&Records,
6293 unsigned &NumRecords) const override {
6294 Records = BuiltinInfo;
6295 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6296 }
6297 BuiltinVaListKind getBuiltinVaListKind() const override {
6298 return TargetInfo::PNaClABIBuiltinVaList;
6299 }
6300 const char *getClobbers() const override { return ""; }
6301 void getGCCRegNames(const char *const *&Names,
6302 unsigned &NumNames) const override {
6303 Names = nullptr;
6304 NumNames = 0;
6305 }
6306 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6307 unsigned &NumAliases) const override {
6308 Aliases = nullptr;
6309 NumAliases = 0;
6310 }
6311 bool validateAsmConstraint(const char *&Name,
6312 TargetInfo::ConstraintInfo &Info) const override {
6313 return false;
6314 }
6315
6316 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006317};
6318} // end anonymous namespace.
6319
6320const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6321#define BUILTIN(ID, TYPE, ATTRS) \
6322 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6323#include "clang/Basic/BuiltinsLe64.def"
6324};
6325
6326namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006327 static const unsigned SPIRAddrSpaceMap[] = {
6328 1, // opencl_global
6329 3, // opencl_local
6330 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006331 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006332 0, // cuda_device
6333 0, // cuda_constant
6334 0 // cuda_shared
6335 };
6336 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006337 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006338 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006339 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6340 "SPIR target must use unknown OS");
6341 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6342 "SPIR target must use unknown environment type");
6343 BigEndian = false;
6344 TLSSupported = false;
6345 LongWidth = LongAlign = 64;
6346 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006347 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006348 // Define available target features
6349 // These must be defined in sorted order!
6350 NoAsmVariants = true;
6351 }
Craig Topper3164f332014-03-11 03:39:26 +00006352 void getTargetDefines(const LangOptions &Opts,
6353 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006354 DefineStd(Builder, "SPIR", Opts);
6355 }
Craig Topper3164f332014-03-11 03:39:26 +00006356 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006357 return Feature == "spir";
6358 }
Craig Topper3164f332014-03-11 03:39:26 +00006359
6360 void getTargetBuiltins(const Builtin::Info *&Records,
6361 unsigned &NumRecords) const override {}
6362 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006363 return "";
6364 }
Craig Topper3164f332014-03-11 03:39:26 +00006365 void getGCCRegNames(const char * const *&Names,
6366 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006367 bool
6368 validateAsmConstraint(const char *&Name,
6369 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006370 return true;
6371 }
Craig Topper3164f332014-03-11 03:39:26 +00006372 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6373 unsigned &NumAliases) const override {}
6374 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006375 return TargetInfo::VoidPtrBuiltinVaList;
6376 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006377
6378 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6379 return (CC == CC_SpirFunction ||
6380 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6381 }
6382
6383 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6384 return CC_SpirFunction;
6385 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006386 };
6387
6388
6389 class SPIR32TargetInfo : public SPIRTargetInfo {
6390 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006391 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006392 PointerWidth = PointerAlign = 32;
6393 SizeType = TargetInfo::UnsignedInt;
6394 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6395 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006396 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6397 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006398 }
Craig Topper3164f332014-03-11 03:39:26 +00006399 void getTargetDefines(const LangOptions &Opts,
6400 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006401 DefineStd(Builder, "SPIR32", Opts);
6402 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006403 };
6404
6405 class SPIR64TargetInfo : public SPIRTargetInfo {
6406 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006407 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006408 PointerWidth = PointerAlign = 64;
6409 SizeType = TargetInfo::UnsignedLong;
6410 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006411 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6412 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006413 }
Craig Topper3164f332014-03-11 03:39:26 +00006414 void getTargetDefines(const LangOptions &Opts,
6415 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006416 DefineStd(Builder, "SPIR64", Opts);
6417 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006418 };
6419}
6420
Robert Lytton0e076492013-08-13 09:43:10 +00006421namespace {
6422class XCoreTargetInfo : public TargetInfo {
6423 static const Builtin::Info BuiltinInfo[];
6424public:
6425 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6426 BigEndian = false;
6427 NoAsmVariants = true;
6428 LongLongAlign = 32;
6429 SuitableAlign = 32;
6430 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006431 SizeType = UnsignedInt;
6432 PtrDiffType = SignedInt;
6433 IntPtrType = SignedInt;
6434 WCharType = UnsignedChar;
6435 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006436 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006437 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 +00006438 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006439 }
Craig Topper3164f332014-03-11 03:39:26 +00006440 void getTargetDefines(const LangOptions &Opts,
6441 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006442 Builder.defineMacro("__XS1B__");
6443 }
Craig Topper3164f332014-03-11 03:39:26 +00006444 void getTargetBuiltins(const Builtin::Info *&Records,
6445 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006446 Records = BuiltinInfo;
6447 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6448 }
Craig Topper3164f332014-03-11 03:39:26 +00006449 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006450 return TargetInfo::VoidPtrBuiltinVaList;
6451 }
Craig Topper3164f332014-03-11 03:39:26 +00006452 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006453 return "";
6454 }
Craig Topper3164f332014-03-11 03:39:26 +00006455 void getGCCRegNames(const char * const *&Names,
6456 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006457 static const char * const GCCRegNames[] = {
6458 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6459 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6460 };
6461 Names = GCCRegNames;
6462 NumNames = llvm::array_lengthof(GCCRegNames);
6463 }
Craig Topper3164f332014-03-11 03:39:26 +00006464 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6465 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006466 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006467 NumAliases = 0;
6468 }
Craig Topper3164f332014-03-11 03:39:26 +00006469 bool validateAsmConstraint(const char *&Name,
6470 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006471 return false;
6472 }
Craig Topper3164f332014-03-11 03:39:26 +00006473 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006474 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6475 return (RegNo < 2)? RegNo : -1;
6476 }
Robert Lytton0e076492013-08-13 09:43:10 +00006477};
6478
6479const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6480#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6481#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6482 ALL_LANGUAGES },
6483#include "clang/Basic/BuiltinsXCore.def"
6484};
6485} // end anonymous namespace.
6486
Ivan Krasindd7403e2011-08-24 20:22:22 +00006487
Chris Lattner5ba61f02006-10-14 07:39:34 +00006488//===----------------------------------------------------------------------===//
6489// Driver code
6490//===----------------------------------------------------------------------===//
6491
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006492static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006493 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006494
Daniel Dunbar52322032009-08-18 05:47:58 +00006495 switch (Triple.getArch()) {
6496 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006497 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006498
Tim Northover2a0783d2014-05-30 14:14:07 +00006499 case llvm::Triple::xcore:
6500 return new XCoreTargetInfo(Triple);
6501
6502 case llvm::Triple::hexagon:
6503 return new HexagonTargetInfo(Triple);
6504
6505 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006506 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006507 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006508
6509 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006510 case llvm::Triple::FreeBSD:
6511 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006512 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006513 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006514 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006515 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006516 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006517 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006518 }
6519
Christian Pirker9b019ae2014-02-25 13:51:00 +00006520 case llvm::Triple::aarch64_be:
6521 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006522 case llvm::Triple::FreeBSD:
6523 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006524 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006525 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006526 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006527 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006528 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006529 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006530 }
6531
Daniel Dunbar52322032009-08-18 05:47:58 +00006532 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006533 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006534 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006535 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006536
Daniel Dunbar52322032009-08-18 05:47:58 +00006537 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006538 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006539 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006540 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006541 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006542 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006543 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006544 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006545 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006546 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006547 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006548 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006549 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006550 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006551 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006552 case llvm::Triple::Win32:
6553 switch (Triple.getEnvironment()) {
6554 default:
6555 return new ARMleTargetInfo(Triple);
6556 case llvm::Triple::Itanium:
6557 return new ItaniumWindowsARMleTargetInfo(Triple);
6558 case llvm::Triple::MSVC:
6559 return new MicrosoftARMleTargetInfo(Triple);
6560 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006561 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006562 return new ARMleTargetInfo(Triple);
6563 }
6564
6565 case llvm::Triple::armeb:
6566 case llvm::Triple::thumbeb:
6567 if (Triple.isOSDarwin())
6568 return new DarwinARMTargetInfo(Triple);
6569
6570 switch (os) {
6571 case llvm::Triple::Linux:
6572 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6573 case llvm::Triple::FreeBSD:
6574 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6575 case llvm::Triple::NetBSD:
6576 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6577 case llvm::Triple::OpenBSD:
6578 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6579 case llvm::Triple::Bitrig:
6580 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6581 case llvm::Triple::RTEMS:
6582 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6583 case llvm::Triple::NaCl:
6584 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6585 default:
6586 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006587 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006588
Daniel Dunbar52322032009-08-18 05:47:58 +00006589 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006590 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006591
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006592 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006593 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006594 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006595 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006596 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006597 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006598 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006599 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006600 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006601 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006602 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006603 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006604 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006605
6606 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006607 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006608 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006609 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006610 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006611 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006612 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006613 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006614 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006615 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006616 case llvm::Triple::NaCl:
6617 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006618 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006619 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006620 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006621
Akira Hatanakabef17452011-09-20 19:21:49 +00006622 case llvm::Triple::mips64:
6623 switch (os) {
6624 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006625 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006626 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006627 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006628 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006629 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006630 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006631 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006632 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006633 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006634 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006635 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006636 }
6637
6638 case llvm::Triple::mips64el:
6639 switch (os) {
6640 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006641 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006642 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006643 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006644 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006645 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006646 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006647 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006648 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006649 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006650 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006651 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006652 }
6653
Ivan Krasindd7403e2011-08-24 20:22:22 +00006654 case llvm::Triple::le32:
6655 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006656 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006657 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006658 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006659 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006660 }
6661
JF Bastien643817d2014-09-12 17:52:47 +00006662 case llvm::Triple::le64:
6663 return new Le64TargetInfo(Triple);
6664
Daniel Dunbar52322032009-08-18 05:47:58 +00006665 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006666 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006667 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006668 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006669 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006670 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006671 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006672 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006673 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006674 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006675 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006676 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006677 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006678 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006679 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006680 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006681 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006682
6683 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006684 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006685 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006686 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006687 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006688 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006689 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006690 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006691 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006692 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006693 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006694 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006695 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006696 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006697 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006698
Bill Schmidt778d3872013-07-26 01:36:11 +00006699 case llvm::Triple::ppc64le:
6700 switch (os) {
6701 case llvm::Triple::Linux:
6702 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6703 default:
6704 return new PPC64TargetInfo(Triple);
6705 }
6706
Peter Collingbournec947aae2012-05-20 23:28:41 +00006707 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006708 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006709 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006710 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006711
Tom Stellardd8e38a32015-01-06 20:34:47 +00006712 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006713 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006714 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006715
Daniel Dunbar52322032009-08-18 05:47:58 +00006716 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006717 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006718 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006719 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006720 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006721 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006722 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006723 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006724 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006725 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006726 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006727 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006728 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006729 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006730 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006731
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006732 case llvm::Triple::sparcv9:
6733 switch (os) {
6734 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006735 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006736 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006737 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006738 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006739 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006740 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006741 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006742 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006743 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006744 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006745 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006746 }
6747
Ulrich Weigand47445072013-05-06 16:26:41 +00006748 case llvm::Triple::systemz:
6749 switch (os) {
6750 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006751 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006752 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006753 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006754 }
6755
Eli Friedmana9c3d712009-08-19 20:47:07 +00006756 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006757 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006758
Daniel Dunbar52322032009-08-18 05:47:58 +00006759 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006760 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006761 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006762
Daniel Dunbar52322032009-08-18 05:47:58 +00006763 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006764 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006765 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006766 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006767 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006768 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006769 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006770 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006771 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006772 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006773 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006774 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006775 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006776 case llvm::Triple::KFreeBSD:
6777 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006778 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006779 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006780 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006781 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006782 case llvm::Triple::Win32: {
6783 switch (Triple.getEnvironment()) {
6784 default:
6785 return new X86_32TargetInfo(Triple);
6786 case llvm::Triple::Cygnus:
6787 return new CygwinX86_32TargetInfo(Triple);
6788 case llvm::Triple::GNU:
6789 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006790 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006791 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006792 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006793 }
6794 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006795 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006796 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006797 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006798 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006799 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006800 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006801 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006802 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006803 }
6804
6805 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006806 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006807 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006808
Daniel Dunbar52322032009-08-18 05:47:58 +00006809 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006810 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006811 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006812 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006813 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006814 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006815 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006816 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006817 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006818 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006819 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006820 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006821 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006822 case llvm::Triple::KFreeBSD:
6823 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006824 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006825 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006826 case llvm::Triple::Win32: {
6827 switch (Triple.getEnvironment()) {
6828 default:
6829 return new X86_64TargetInfo(Triple);
6830 case llvm::Triple::GNU:
6831 return new MinGWX86_64TargetInfo(Triple);
6832 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006833 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006834 }
6835 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006836 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006837 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006838 case llvm::Triple::PS4:
6839 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006840 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006841 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006842 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006843
6844 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006845 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006846 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006847 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006848 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006849 }
6850 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006851 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006852 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006853 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006854 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006855 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006856 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006857}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006858
6859/// CreateTargetInfo - Return the target info object for the specified target
6860/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006861TargetInfo *
6862TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6863 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006864 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006865
6866 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006867 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006868 if (!Target) {
6869 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006870 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006871 }
Alp Toker80758082014-07-06 05:26:44 +00006872 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006873
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006874 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006875 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6876 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006877 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006878 }
6879
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006880 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006881 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6882 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006883 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006884 }
6885
Rafael Espindolaeb265472013-08-21 21:59:03 +00006886 // Set the fp math unit.
6887 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6888 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006889 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006890 }
6891
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006892 // Compute the default target features, we need the target to handle this
6893 // because features may have dependencies on one another.
6894 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006895 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006896
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006897 // Apply the user specified deltas.
6898 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6899 I < N; ++I) {
6900 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006901 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006902 bool Enabled = Name[0] == '+';
6903 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006904 }
6905
6906 // Add the features to the compile options.
6907 //
6908 // FIXME: If we are completely confident that we have the right set, we only
6909 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006910 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006911 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6912 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006913 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006914 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006915 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006916
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006917 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006918}