blob: b63eac907ebd643d5721971703257386b20a2a99 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
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
Saleem Abdulrasool10a49722016-04-08 16:52:00 +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"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.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"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Justin Lebar76945b22016-04-29 23:05:19 +000068static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
69 const TargetOptions &Opts);
70
Chris Lattner09d98f52008-10-05 21:50:58 +000071//===----------------------------------------------------------------------===//
72// Defines specific to certain operating systems.
73//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000074
Torok Edwinb2b37c62009-06-30 17:10:35 +000075namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076template<typename TgtInfo>
77class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000078protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000079 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000082 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
83 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000084 void getTargetDefines(const LangOptions &Opts,
85 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000086 TgtInfo::getTargetDefines(Opts, Builder);
87 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000088 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000089
90};
Chris Lattner30ba6742009-08-10 19:03:04 +000091
Eric Christopher7d0c7252015-09-24 21:17:04 +000092// CloudABI Target
93template <typename Target>
94class CloudABITargetInfo : public OSTargetInfo<Target> {
95protected:
96 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
97 MacroBuilder &Builder) const override {
98 Builder.defineMacro("__CloudABI__");
99 Builder.defineMacro("__ELF__");
100
101 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
102 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
103 Builder.defineMacro("__STDC_UTF_16__");
104 Builder.defineMacro("__STDC_UTF_32__");
105 }
106
107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000108 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
109 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000110};
111
Daniel Dunbard86666f2010-01-26 01:44:04 +0000112static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000114 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000116 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000119 // AddressSanitizer doesn't play well with source fortification, which is on
120 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000121 if (Opts.Sanitize.has(SanitizerKind::Address))
122 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000123
John McCall460ce582015-10-22 18:38:17 +0000124 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
125 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000126 // __weak is always defined, for use in blocks and with objc pointers.
127 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000128 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000129 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000130 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000131
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000136
137 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 if (Triple.isMacOSX()) {
143 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000146 Triple.getOSVersion(Maj, Min, Rev);
147 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000148 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000149
Sebastian Pop422377c2012-01-20 22:01:23 +0000150 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000151 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000152 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153 if (PlatformName == "win32") {
154 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
155 return;
156 }
157
Evan Cheng31dd9a62014-01-26 23:12:43 +0000158 // Set the appropriate OS version define.
159 if (Triple.isiOS()) {
160 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
161 char Str[6];
162 Str[0] = '0' + Maj;
163 Str[1] = '0' + (Min / 10);
164 Str[2] = '0' + (Min % 10);
165 Str[3] = '0' + (Rev / 10);
166 Str[4] = '0' + (Rev % 10);
167 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000168 if (Triple.isTvOS())
169 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
170 else
171 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
172 Str);
173
174 } else if (Triple.isWatchOS()) {
175 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
176 char Str[6];
177 Str[0] = '0' + Maj;
178 Str[1] = '0' + (Min / 10);
179 Str[2] = '0' + (Min % 10);
180 Str[3] = '0' + (Rev / 10);
181 Str[4] = '0' + (Rev % 10);
182 Str[5] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000184 } else if (Triple.isMacOSX()) {
185 // Note that the Driver allows versions which aren't representable in the
186 // define (because we only get a single digit for the minor and micro
187 // revision numbers). So, we limit them to the maximum representable
188 // version.
189 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000190 char Str[7];
191 if (Maj < 10 || (Maj == 10 && Min < 10)) {
192 Str[0] = '0' + (Maj / 10);
193 Str[1] = '0' + (Maj % 10);
194 Str[2] = '0' + std::min(Min, 9U);
195 Str[3] = '0' + std::min(Rev, 9U);
196 Str[4] = '\0';
197 } else {
198 // Handle versions > 10.9.
199 Str[0] = '0' + (Maj / 10);
200 Str[1] = '0' + (Maj % 10);
201 Str[2] = '0' + (Min / 10);
202 Str[3] = '0' + (Min % 10);
203 Str[4] = '0' + (Rev / 10);
204 Str[5] = '0' + (Rev % 10);
205 Str[6] = '\0';
206 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000207 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000208 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210 // Tell users about the kernel if there is one.
211 if (Triple.isOSDarwin())
212 Builder.defineMacro("__MACH__");
213
Chris Bieneman46977b62016-04-29 17:53:00 +0000214 // The Watch ABI uses Dwarf EH.
215 if(Triple.isWatchABI())
216 Builder.defineMacro("__ARM_DWARF_EH__");
217
Daniel Dunbarecf13562011-04-19 21:40:34 +0000218 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000219}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000220
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221template<typename Target>
222class DarwinTargetInfo : public OSTargetInfo<Target> {
223protected:
Craig Topper3164f332014-03-11 03:39:26 +0000224 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
225 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000226 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000227 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228 }
Mike Stump11289f42009-09-09 15:08:12 +0000229
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000231 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
232 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000233 // By default, no TLS, and we whitelist permitted architecture/OS
234 // combinations.
235 this->TLSSupported = false;
236
237 if (Triple.isMacOSX())
238 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
239 else if (Triple.isiOS()) {
240 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
241 if (Triple.getArch() == llvm::Triple::x86_64 ||
242 Triple.getArch() == llvm::Triple::aarch64)
243 this->TLSSupported = !Triple.isOSVersionLT(8);
244 else if (Triple.getArch() == llvm::Triple::x86 ||
245 Triple.getArch() == llvm::Triple::arm ||
246 Triple.getArch() == llvm::Triple::thumb)
247 this->TLSSupported = !Triple.isOSVersionLT(9);
248 } else if (Triple.isWatchOS())
249 this->TLSSupported = !Triple.isOSVersionLT(2);
250
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000251 this->MCountName = "\01mcount";
252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000255 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000256 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000257 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000258 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000259 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000260 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000261 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000262
Craig Topper3164f332014-03-11 03:39:26 +0000263 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000264 // FIXME: We should return 0 when building kexts.
265 return "__TEXT,__StaticInit,regular,pure_instructions";
266 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000267
John McCalleed64c72012-01-29 01:20:30 +0000268 /// Darwin does not support protected visibility. Darwin's "default"
269 /// is very similar to ELF's "protected"; Darwin requires a "weak"
270 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000271 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000272 return false;
273 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000274
275 unsigned getExnObjectAlignment() const override {
276 // The alignment of an exception object is 8-bytes for darwin since
277 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
278 // and therefore doesn't guarantee 16-byte alignment.
279 return 64;
280 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281};
282
Chris Lattner30ba6742009-08-10 19:03:04 +0000283
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284// DragonFlyBSD Target
285template<typename Target>
286class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
287protected:
Craig Topper3164f332014-03-11 03:39:26 +0000288 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__DragonFly__");
292 Builder.defineMacro("__DragonFly_cc_version", "100001");
293 Builder.defineMacro("__ELF__");
294 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
295 Builder.defineMacro("__tune_i386__");
296 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297 }
298public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000299 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
300 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000301 switch (Triple.getArch()) {
302 default:
303 case llvm::Triple::x86:
304 case llvm::Triple::x86_64:
305 this->MCountName = ".mcount";
306 break;
307 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000308 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000309};
310
311// FreeBSD Target
312template<typename Target>
313class FreeBSDTargetInfo : public OSTargetInfo<Target> {
314protected:
Craig Topper3164f332014-03-11 03:39:26 +0000315 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
316 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000317 // FreeBSD defines; list based off of gcc output
318
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000319 unsigned Release = Triple.getOSMajorVersion();
320 if (Release == 0U)
321 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000323 Builder.defineMacro("__FreeBSD__", Twine(Release));
324 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000325 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
326 DefineStd(Builder, "unix", Opts);
327 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000328
329 // On FreeBSD, wchar_t contains the number of the code point as
330 // used by the character set of the locale. These character sets are
331 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000332 //
333 // FIXME: This is wrong; the macro refers to the numerical values
334 // of wchar_t *literals*, which are not locale-dependent. However,
335 // FreeBSD systems apparently depend on us getting this wrong, and
336 // setting this to 1 is conforming even if all the basic source
337 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000338 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000339 }
340public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000341 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
342 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000343 switch (Triple.getArch()) {
344 default:
345 case llvm::Triple::x86:
346 case llvm::Triple::x86_64:
347 this->MCountName = ".mcount";
348 break;
349 case llvm::Triple::mips:
350 case llvm::Triple::mipsel:
351 case llvm::Triple::ppc:
352 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000353 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000354 this->MCountName = "_mcount";
355 break;
356 case llvm::Triple::arm:
357 this->MCountName = "__mcount";
358 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000359 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000360 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000361};
362
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000363// GNU/kFreeBSD Target
364template<typename Target>
365class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
366protected:
Craig Topper3164f332014-03-11 03:39:26 +0000367 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
368 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000369 // GNU/kFreeBSD defines; list based off of gcc output
370
371 DefineStd(Builder, "unix", Opts);
372 Builder.defineMacro("__FreeBSD_kernel__");
373 Builder.defineMacro("__GLIBC__");
374 Builder.defineMacro("__ELF__");
375 if (Opts.POSIXThreads)
376 Builder.defineMacro("_REENTRANT");
377 if (Opts.CPlusPlus)
378 Builder.defineMacro("_GNU_SOURCE");
379 }
380public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000381 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
382 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383};
384
Reid Kleckner330fb172016-05-11 16:19:05 +0000385// Haiku Target
386template<typename Target>
387class HaikuTargetInfo : public OSTargetInfo<Target> {
388protected:
389 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
390 MacroBuilder &Builder) const override {
391 // Haiku defines; list based off of gcc output
392 Builder.defineMacro("__HAIKU__");
393 Builder.defineMacro("__ELF__");
394 DefineStd(Builder, "unix", Opts);
395 }
396public:
397 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
398 : OSTargetInfo<Target>(Triple, Opts) {
399 this->SizeType = TargetInfo::UnsignedLong;
400 this->IntPtrType = TargetInfo::SignedLong;
401 this->PtrDiffType = TargetInfo::SignedLong;
402 this->ProcessIDType = TargetInfo::SignedLong;
403 this->TLSSupported = false;
404
405 }
406};
407
Chris Lattner3e2ee142010-07-07 16:01:42 +0000408// Minix Target
409template<typename Target>
410class MinixTargetInfo : public OSTargetInfo<Target> {
411protected:
Craig Topper3164f332014-03-11 03:39:26 +0000412 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
413 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000414 // Minix defines
415
416 Builder.defineMacro("__minix", "3");
417 Builder.defineMacro("_EM_WSIZE", "4");
418 Builder.defineMacro("_EM_PSIZE", "4");
419 Builder.defineMacro("_EM_SSIZE", "2");
420 Builder.defineMacro("_EM_LSIZE", "4");
421 Builder.defineMacro("_EM_FSIZE", "4");
422 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000423 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000424 DefineStd(Builder, "unix", Opts);
425 }
426public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000427 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
428 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000429};
430
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431// Linux target
432template<typename Target>
433class LinuxTargetInfo : public OSTargetInfo<Target> {
434protected:
Craig Topper3164f332014-03-11 03:39:26 +0000435 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
436 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000437 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000438 DefineStd(Builder, "unix", Opts);
439 DefineStd(Builder, "linux", Opts);
440 Builder.defineMacro("__gnu_linux__");
441 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000442 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000443 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000444 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000445 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000446 this->PlatformName = "android";
447 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
448 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000449 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000450 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000451 if (Opts.CPlusPlus)
452 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000453 if (this->HasFloat128)
454 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000455 }
456public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000457 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
458 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000459 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000460
461 switch (Triple.getArch()) {
462 default:
463 break;
464 case llvm::Triple::ppc:
465 case llvm::Triple::ppc64:
466 case llvm::Triple::ppc64le:
467 this->MCountName = "_mcount";
468 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000469 case llvm::Triple::x86:
470 case llvm::Triple::x86_64:
471 case llvm::Triple::systemz:
472 this->HasFloat128 = true;
473 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000474 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000476
Craig Topper3164f332014-03-11 03:39:26 +0000477 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000478 return ".text.startup";
479 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000480};
481
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000482// NetBSD Target
483template<typename Target>
484class NetBSDTargetInfo : public OSTargetInfo<Target> {
485protected:
Craig Topper3164f332014-03-11 03:39:26 +0000486 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
487 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000488 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000489 Builder.defineMacro("__NetBSD__");
490 Builder.defineMacro("__unix__");
491 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000492 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000493 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000494
495 switch (Triple.getArch()) {
496 default:
497 break;
498 case llvm::Triple::arm:
499 case llvm::Triple::armeb:
500 case llvm::Triple::thumb:
501 case llvm::Triple::thumbeb:
502 Builder.defineMacro("__ARM_DWARF_EH__");
503 break;
504 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000505 }
506public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000507 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
508 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000509 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000510 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000511};
512
Torok Edwinb2b37c62009-06-30 17:10:35 +0000513// OpenBSD Target
514template<typename Target>
515class OpenBSDTargetInfo : public OSTargetInfo<Target> {
516protected:
Craig Topper3164f332014-03-11 03:39:26 +0000517 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
518 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000519 // OpenBSD defines; list based off of gcc output
520
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000521 Builder.defineMacro("__OpenBSD__");
522 DefineStd(Builder, "unix", Opts);
523 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000524 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000525 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000526 }
527public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000528 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
529 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000531
Eli Friedman3715d1f2011-12-15 02:15:56 +0000532 switch (Triple.getArch()) {
533 default:
534 case llvm::Triple::x86:
535 case llvm::Triple::x86_64:
536 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000537 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000538 this->MCountName = "__mcount";
539 break;
540 case llvm::Triple::mips64:
541 case llvm::Triple::mips64el:
542 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000543 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000544 this->MCountName = "_mcount";
545 break;
546 }
547 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000548};
549
Eli Friedman9fa28852012-08-08 23:57:20 +0000550// Bitrig Target
551template<typename Target>
552class BitrigTargetInfo : public OSTargetInfo<Target> {
553protected:
Craig Topper3164f332014-03-11 03:39:26 +0000554 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
555 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000556 // Bitrig defines; list based off of gcc output
557
558 Builder.defineMacro("__Bitrig__");
559 DefineStd(Builder, "unix", Opts);
560 Builder.defineMacro("__ELF__");
561 if (Opts.POSIXThreads)
562 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000563
564 switch (Triple.getArch()) {
565 default:
566 break;
567 case llvm::Triple::arm:
568 case llvm::Triple::armeb:
569 case llvm::Triple::thumb:
570 case llvm::Triple::thumbeb:
571 Builder.defineMacro("__ARM_DWARF_EH__");
572 break;
573 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000574 }
575public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000576 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
577 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000578 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000579 }
580};
581
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000582// PSP Target
583template<typename Target>
584class PSPTargetInfo : public OSTargetInfo<Target> {
585protected:
Craig Topper3164f332014-03-11 03:39:26 +0000586 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
587 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000588 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000589 Builder.defineMacro("PSP");
590 Builder.defineMacro("_PSP");
591 Builder.defineMacro("__psp__");
592 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000593 }
594public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000595 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000596};
597
John Thompsone467e192009-11-19 17:18:50 +0000598// PS3 PPU Target
599template<typename Target>
600class PS3PPUTargetInfo : public OSTargetInfo<Target> {
601protected:
Craig Topper3164f332014-03-11 03:39:26 +0000602 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
603 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000604 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000605 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000606 Builder.defineMacro("__PPU__");
607 Builder.defineMacro("__CELLOS_LV2__");
608 Builder.defineMacro("__ELF__");
609 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000610 Builder.defineMacro("_ARCH_PPC64");
611 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000612 }
613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000614 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
615 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000616 this->LongWidth = this->LongAlign = 32;
617 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000618 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000619 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000620 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000621 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000622 }
623};
624
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000625template <typename Target>
626class PS4OSTargetInfo : public OSTargetInfo<Target> {
627protected:
628 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
629 MacroBuilder &Builder) const override {
630 Builder.defineMacro("__FreeBSD__", "9");
631 Builder.defineMacro("__FreeBSD_cc_version", "900001");
632 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
633 DefineStd(Builder, "unix", Opts);
634 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000635 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000636 }
637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000638 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
639 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000640 this->WCharType = this->UnsignedShort;
641
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000642 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
643 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000644
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000645 // On PS4, do not honor explicit bit field alignment,
646 // as in "__attribute__((aligned(2))) int b : 1;".
647 this->UseExplicitBitFieldAlignment = false;
648
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000649 switch (Triple.getArch()) {
650 default:
651 case llvm::Triple::x86_64:
652 this->MCountName = ".mcount";
653 break;
654 }
655 }
656};
657
Torok Edwinb2b37c62009-06-30 17:10:35 +0000658// Solaris target
659template<typename Target>
660class SolarisTargetInfo : public OSTargetInfo<Target> {
661protected:
Craig Topper3164f332014-03-11 03:39:26 +0000662 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
663 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000664 DefineStd(Builder, "sun", Opts);
665 DefineStd(Builder, "unix", Opts);
666 Builder.defineMacro("__ELF__");
667 Builder.defineMacro("__svr4__");
668 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000669 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
670 // newer, but to 500 for everything else. feature_test.h has a check to
671 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000672 // with a new version.
673 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000674 Builder.defineMacro("_XOPEN_SOURCE", "600");
675 else
676 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000677 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000678 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000679 Builder.defineMacro("_LARGEFILE_SOURCE");
680 Builder.defineMacro("_LARGEFILE64_SOURCE");
681 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000682 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000683 }
684public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000685 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
686 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000687 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000688 // FIXME: WIntType should be SignedLong
689 }
690};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000691
692// Windows target
693template<typename Target>
694class WindowsTargetInfo : public OSTargetInfo<Target> {
695protected:
Craig Topper3164f332014-03-11 03:39:26 +0000696 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
697 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000698 Builder.defineMacro("_WIN32");
699 }
700 void getVisualStudioDefines(const LangOptions &Opts,
701 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000702 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000703 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000704 Builder.defineMacro("_CPPRTTI");
705
Reid Kleckner16514352015-01-30 21:42:55 +0000706 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000707 Builder.defineMacro("_CPPUNWIND");
708 }
709
David Majnemer6a658902015-07-22 22:36:26 +0000710 if (Opts.Bool)
711 Builder.defineMacro("__BOOL_DEFINED");
712
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000713 if (!Opts.CharIsSigned)
714 Builder.defineMacro("_CHAR_UNSIGNED");
715
716 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
717 // but it works for now.
718 if (Opts.POSIXThreads)
719 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000720
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000721 if (Opts.MSCompatibilityVersion) {
722 Builder.defineMacro("_MSC_VER",
723 Twine(Opts.MSCompatibilityVersion / 100000));
724 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000725 // FIXME We cannot encode the revision information into 32-bits
726 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000727
David Majnemerb710a932015-05-11 03:57:49 +0000728 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000729 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000730 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000731
732 if (Opts.MicrosoftExt) {
733 Builder.defineMacro("_MSC_EXTENSIONS");
734
735 if (Opts.CPlusPlus11) {
736 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
737 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
738 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
739 }
740 }
741
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000742 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000743 }
744
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000745public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000746 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
747 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000748};
749
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000750template <typename Target>
751class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000752protected:
Craig Topper3164f332014-03-11 03:39:26 +0000753 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
754 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000755 if (Opts.POSIXThreads)
756 Builder.defineMacro("_REENTRANT");
757 if (Opts.CPlusPlus)
758 Builder.defineMacro("_GNU_SOURCE");
759
760 DefineStd(Builder, "unix", Opts);
761 Builder.defineMacro("__ELF__");
762 Builder.defineMacro("__native_client__");
763 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000764
765public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000766 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
767 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000768 this->LongAlign = 32;
769 this->LongWidth = 32;
770 this->PointerAlign = 32;
771 this->PointerWidth = 32;
772 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000773 this->Int64Type = TargetInfo::SignedLongLong;
774 this->DoubleAlign = 64;
775 this->LongDoubleWidth = 64;
776 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000777 this->LongLongWidth = 64;
778 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000779 this->SizeType = TargetInfo::UnsignedInt;
780 this->PtrDiffType = TargetInfo::SignedInt;
781 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000782 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000783 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000784 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000785 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000786 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000787 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000788 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000789 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000790 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000791 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000792 } else {
793 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000794 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000795 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000796 }
797};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000798
Dan Gohmanc2853072015-09-03 22:51:53 +0000799// WebAssembly target
800template <typename Target>
801class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
802 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000803 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000804 // A common platform macro.
805 if (Opts.POSIXThreads)
806 Builder.defineMacro("_REENTRANT");
807 // Follow g++ convention and predefine _GNU_SOURCE for C++.
808 if (Opts.CPlusPlus)
809 Builder.defineMacro("_GNU_SOURCE");
810 }
811
812 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000813 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000814 return ".text.__startup";
815 }
816
817public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000818 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
819 const TargetOptions &Opts)
820 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000821 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000822 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
823 }
824};
Dan Gohmanc2853072015-09-03 22:51:53 +0000825
Chris Lattner09d98f52008-10-05 21:50:58 +0000826//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000827// Specific target implementations.
828//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000829
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000830// PPC abstract base class
831class PPCTargetInfo : public TargetInfo {
832 static const Builtin::Info BuiltinInfo[];
833 static const char * const GCCRegNames[];
834 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000835 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000836
837 // Target cpu features.
838 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000839 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000840 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000841 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000842 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000843 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000844 bool HasBPERMD;
845 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000846
Ulrich Weigand8afad612014-07-28 13:17:52 +0000847protected:
848 std::string ABI;
849
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000850public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000851 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000852 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
853 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000854 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000855 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000856 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000857 LongDoubleWidth = LongDoubleAlign = 128;
858 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
859 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000860
Hal Finkel6b984f02012-07-03 16:51:04 +0000861 /// \brief Flags for architecture specific defines.
862 typedef enum {
863 ArchDefineNone = 0,
864 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
865 ArchDefinePpcgr = 1 << 1,
866 ArchDefinePpcsq = 1 << 2,
867 ArchDefine440 = 1 << 3,
868 ArchDefine603 = 1 << 4,
869 ArchDefine604 = 1 << 5,
870 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000871 ArchDefinePwr5 = 1 << 7,
872 ArchDefinePwr5x = 1 << 8,
873 ArchDefinePwr6 = 1 << 9,
874 ArchDefinePwr6x = 1 << 10,
875 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000876 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000877 ArchDefinePwr9 = 1 << 13,
878 ArchDefineA2 = 1 << 14,
879 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000880 } ArchDefineTypes;
881
Bill Schmidt38378a02013-02-01 20:23:10 +0000882 // Note: GCC recognizes the following additional cpus:
883 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
884 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
885 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000886 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000887 bool CPUKnown = llvm::StringSwitch<bool>(Name)
888 .Case("generic", true)
889 .Case("440", true)
890 .Case("450", true)
891 .Case("601", true)
892 .Case("602", true)
893 .Case("603", true)
894 .Case("603e", true)
895 .Case("603ev", true)
896 .Case("604", true)
897 .Case("604e", true)
898 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000899 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000900 .Case("g3", true)
901 .Case("7400", true)
902 .Case("g4", true)
903 .Case("7450", true)
904 .Case("g4+", true)
905 .Case("750", true)
906 .Case("970", true)
907 .Case("g5", true)
908 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000909 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000910 .Case("e500mc", true)
911 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000912 .Case("power3", true)
913 .Case("pwr3", true)
914 .Case("power4", true)
915 .Case("pwr4", true)
916 .Case("power5", true)
917 .Case("pwr5", true)
918 .Case("power5x", true)
919 .Case("pwr5x", true)
920 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000921 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000922 .Case("power6x", true)
923 .Case("pwr6x", true)
924 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000925 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000926 .Case("power8", true)
927 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000928 .Case("power9", true)
929 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000930 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000931 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000932 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000933 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000934 .Case("powerpc64le", true)
935 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000936 .Default(false);
937
938 if (CPUKnown)
939 CPU = Name;
940
941 return CPUKnown;
942 }
943
Ulrich Weigand8afad612014-07-28 13:17:52 +0000944
945 StringRef getABI() const override { return ABI; }
946
Craig Topper6c03a542015-10-19 04:51:35 +0000947 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
948 return llvm::makeArrayRef(BuiltinInfo,
949 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000950 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000951
Craig Topper3164f332014-03-11 03:39:26 +0000952 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000953
Craig Topper3164f332014-03-11 03:39:26 +0000954 void getTargetDefines(const LangOptions &Opts,
955 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000956
Eric Christopher8c47b422015-10-09 18:39:55 +0000957 bool
958 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
959 StringRef CPU,
960 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000961
Craig Topper3164f332014-03-11 03:39:26 +0000962 bool handleTargetFeatures(std::vector<std::string> &Features,
963 DiagnosticsEngine &Diags) override;
964 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000965 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
966 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000967
Craig Topperf054e3a2015-10-19 03:52:27 +0000968 ArrayRef<const char *> getGCCRegNames() const override;
969 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000970 bool validateAsmConstraint(const char *&Name,
971 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000972 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000973 default: return false;
974 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000975 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000976 case 'b': // Base register
977 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000978 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000979 break;
980 // FIXME: The following are added to allow parsing.
981 // I just took a guess at what the actions should be.
982 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000983 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000984 case 'v': // Altivec vector register
985 Info.setAllowsRegister();
986 break;
987 case 'w':
988 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000989 case 'd':// VSX vector register to hold vector double data
990 case 'f':// VSX vector register to hold vector float data
991 case 's':// VSX vector register to hold scalar float data
992 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000993 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000994 break;
995 default:
996 return false;
997 }
998 Info.setAllowsRegister();
999 Name++; // Skip over 'w'.
1000 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 case 'h': // `MQ', `CTR', or `LINK' register
1002 case 'q': // `MQ' register
1003 case 'c': // `CTR' register
1004 case 'l': // `LINK' register
1005 case 'x': // `CR' register (condition register) number 0
1006 case 'y': // `CR' register (condition register)
1007 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001008 Info.setAllowsRegister();
1009 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001011 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001012 // (use `L' instead for SImode constants)
1013 case 'K': // Unsigned 16-bit constant
1014 case 'L': // Signed 16-bit constant shifted left 16 bits
1015 case 'M': // Constant larger than 31
1016 case 'N': // Exact power of 2
1017 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001018 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001019 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001020 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001021 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001022 break;
1023 case 'm': // Memory operand. Note that on PowerPC targets, m can
1024 // include addresses that update the base register. It
1025 // is therefore only safe to use `m' in an asm statement
1026 // if that asm statement accesses the operand exactly once.
1027 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001028 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001029 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001030 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001031 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001032 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1033 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001034 // register to be updated.
1035 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001036 if (Name[1] != 's')
1037 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001038 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001039 // include any automodification of the base register. Unlike
1040 // `m', this constraint can be used in asm statements that
1041 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001042 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001043 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001044 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001045 break;
1046 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001047 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001048 case 'Z': // Memory operand that is an indexed or indirect from a
1049 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001050 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001051 Info.setAllowsMemory();
1052 Info.setAllowsRegister();
1053 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001054 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001055 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001056 // register (`p' is preferable for asm statements)
1057 case 'S': // Constant suitable as a 64-bit mask operand
1058 case 'T': // Constant suitable as a 32-bit mask operand
1059 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001060 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // instructions
1062 case 'W': // Vector constant that does not require memory
1063 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001064 break;
1065 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001066 }
John Thompson07a61a42010-06-24 22:44:13 +00001067 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001068 }
Craig Topper3164f332014-03-11 03:39:26 +00001069 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001070 std::string R;
1071 switch (*Constraint) {
1072 case 'e':
1073 case 'w':
1074 // Two-character constraint; add "^" hint for later parsing.
1075 R = std::string("^") + std::string(Constraint, 2);
1076 Constraint++;
1077 break;
1078 default:
1079 return TargetInfo::convertConstraint(Constraint);
1080 }
1081 return R;
1082 }
Craig Topper3164f332014-03-11 03:39:26 +00001083 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001084 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001085 }
Craig Topper3164f332014-03-11 03:39:26 +00001086 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001087 if (RegNo == 0) return 3;
1088 if (RegNo == 1) return 4;
1089 return -1;
1090 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001091
1092 bool hasSjLjLowering() const override {
1093 return true;
1094 }
David Majnemer2617ea62015-06-09 18:05:33 +00001095
1096 bool useFloat128ManglingForLongDouble() const override {
1097 return LongDoubleWidth == 128 &&
1098 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1099 getTriple().isOSBinFormatELF();
1100 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001101};
Anders Carlssonf511f642007-11-27 04:11:28 +00001102
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001103const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001104#define BUILTIN(ID, TYPE, ATTRS) \
1105 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1106#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1107 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001108#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001109};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001110
Eric Christopher917e9522014-11-18 22:36:15 +00001111/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001112/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001113bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001114 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001115 for (const auto &Feature : Features) {
1116 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001117 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001118 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001119 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001120 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001121 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001122 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001123 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001124 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001125 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001126 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001127 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001128 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001129 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001130 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001131 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001132 } else if (Feature == "+float128") {
1133 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001134 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001135 // TODO: Finish this list and add an assert that we've handled them
1136 // all.
1137 }
Eric Christopher02c33352015-08-25 00:59:11 +00001138
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001139 return true;
1140}
1141
Chris Lattnerecd49032009-03-02 22:27:17 +00001142/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1143/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001144void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001145 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001146 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001147 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001148 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001149 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001150 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001151 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001152 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001153 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001154 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001155 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001156 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001157 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001158
Chris Lattnerecd49032009-03-02 22:27:17 +00001159 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001160 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1161 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001162 } else {
1163 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1164 getTriple().getOS() != llvm::Triple::OpenBSD)
1165 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001166 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001167
Ulrich Weigand8afad612014-07-28 13:17:52 +00001168 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001169 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001170 Builder.defineMacro("_CALL_ELF", "1");
1171 if (ABI == "elfv2")
1172 Builder.defineMacro("_CALL_ELF", "2");
1173
Chris Lattnerecd49032009-03-02 22:27:17 +00001174 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001175 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1176 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001177
Chris Lattnerecd49032009-03-02 22:27:17 +00001178 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001179 if (LongDoubleWidth == 128)
1180 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001181
John Thompsone467e192009-11-19 17:18:50 +00001182 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001183 Builder.defineMacro("__VEC__", "10206");
1184 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001185 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001186
1187 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001188 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1189 .Case("440", ArchDefineName)
1190 .Case("450", ArchDefineName | ArchDefine440)
1191 .Case("601", ArchDefineName)
1192 .Case("602", ArchDefineName | ArchDefinePpcgr)
1193 .Case("603", ArchDefineName | ArchDefinePpcgr)
1194 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1195 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1196 .Case("604", ArchDefineName | ArchDefinePpcgr)
1197 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1198 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001199 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001200 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1201 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1202 .Case("750", ArchDefineName | ArchDefinePpcgr)
1203 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1204 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001205 .Case("a2", ArchDefineA2)
1206 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001207 .Case("pwr3", ArchDefinePpcgr)
1208 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1209 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1210 | ArchDefinePpcsq)
1211 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1212 | ArchDefinePpcgr | ArchDefinePpcsq)
1213 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1214 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1215 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1216 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1217 | ArchDefinePpcsq)
1218 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1219 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001220 | ArchDefinePpcgr | ArchDefinePpcsq)
1221 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1222 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1223 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001224 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1225 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1226 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1227 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 .Case("power3", ArchDefinePpcgr)
1229 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1230 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1231 | ArchDefinePpcsq)
1232 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1233 | ArchDefinePpcgr | ArchDefinePpcsq)
1234 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1235 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1236 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1237 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1238 | ArchDefinePpcsq)
1239 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1240 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001241 | ArchDefinePpcgr | ArchDefinePpcsq)
1242 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1243 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1244 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001245 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1246 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1247 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1248 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001249 .Default(ArchDefineNone);
1250
1251 if (defs & ArchDefineName)
1252 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1253 if (defs & ArchDefinePpcgr)
1254 Builder.defineMacro("_ARCH_PPCGR");
1255 if (defs & ArchDefinePpcsq)
1256 Builder.defineMacro("_ARCH_PPCSQ");
1257 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001258 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001259 if (defs & ArchDefine603)
1260 Builder.defineMacro("_ARCH_603");
1261 if (defs & ArchDefine604)
1262 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001263 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001264 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001265 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001266 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001267 if (defs & ArchDefinePwr5x)
1268 Builder.defineMacro("_ARCH_PWR5X");
1269 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001270 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001271 if (defs & ArchDefinePwr6x)
1272 Builder.defineMacro("_ARCH_PWR6X");
1273 if (defs & ArchDefinePwr7)
1274 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001275 if (defs & ArchDefinePwr8)
1276 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001277 if (defs & ArchDefinePwr9)
1278 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001279 if (defs & ArchDefineA2)
1280 Builder.defineMacro("_ARCH_A2");
1281 if (defs & ArchDefineA2q) {
1282 Builder.defineMacro("_ARCH_A2Q");
1283 Builder.defineMacro("_ARCH_QP");
1284 }
1285
1286 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1287 Builder.defineMacro("__bg__");
1288 Builder.defineMacro("__THW_BLUEGENE__");
1289 Builder.defineMacro("__bgq__");
1290 Builder.defineMacro("__TOS_BGQ__");
1291 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001292
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001293 if (HasVSX)
1294 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001295 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001296 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001297 if (HasP8Crypto)
1298 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001299 if (HasHTM)
1300 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001301 if (HasFloat128)
1302 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001303
1304 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1305 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1306 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1307 if (PointerWidth == 64)
1308 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001309
Bill Schmidt38378a02013-02-01 20:23:10 +00001310 // FIXME: The following are not yet generated here by Clang, but are
1311 // generated by GCC:
1312 //
1313 // _SOFT_FLOAT_
1314 // __RECIP_PRECISION__
1315 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 // __RECIP__
1317 // __RECIPF__
1318 // __RSQRTE__
1319 // __RSQRTEF__
1320 // _SOFT_DOUBLE_
1321 // __NO_LWSYNC__
1322 // __HAVE_BSWAP__
1323 // __LONGDOUBLE128
1324 // __CMODEL_MEDIUM__
1325 // __CMODEL_LARGE__
1326 // _CALL_SYSV
1327 // _CALL_DARWIN
1328 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001329}
1330
Eric Christophera8a14c32015-08-31 18:39:16 +00001331// Handle explicit options being passed to the compiler here: if we've
1332// explicitly turned off vsx and turned on power8-vector or direct-move then
1333// go ahead and error since the customer has expressed a somewhat incompatible
1334// set of options.
1335static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001336 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001337
1338 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1339 FeaturesVec.end()) {
1340 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1341 FeaturesVec.end()) {
1342 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1343 << "-mno-vsx";
1344 return false;
1345 }
1346
1347 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1348 FeaturesVec.end()) {
1349 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1350 << "-mno-vsx";
1351 return false;
1352 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001353
1354 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1355 FeaturesVec.end()) {
1356 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1357 << "-mno-vsx";
1358 return false;
1359 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001360 }
1361
1362 return true;
1363}
1364
Eric Christopher8c47b422015-10-09 18:39:55 +00001365bool PPCTargetInfo::initFeatureMap(
1366 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1367 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001368 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1369 .Case("7400", true)
1370 .Case("g4", true)
1371 .Case("7450", true)
1372 .Case("g4+", true)
1373 .Case("970", true)
1374 .Case("g5", true)
1375 .Case("pwr6", true)
1376 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001377 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001378 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001379 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001380 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001381 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001382
1383 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001384 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1385 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001386 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001387 .Case("pwr8", true)
1388 .Default(false);
1389 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1390 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001391 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001392 .Case("pwr8", true)
1393 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001394 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1395 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001396 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001397 .Case("pwr8", true)
1398 .Case("pwr7", true)
1399 .Default(false);
1400 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1401 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001402 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001403 .Case("pwr8", true)
1404 .Case("pwr7", true)
1405 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001406 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1407 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001408 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001409 .Case("pwr8", true)
1410 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001411 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1412 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001413 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001414 .Case("pwr8", true)
1415 .Case("pwr7", true)
1416 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001417
Eric Christophera8a14c32015-08-31 18:39:16 +00001418 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1419 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001420
Eric Christopher007b0a02015-08-28 22:32:01 +00001421 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001422}
1423
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001424bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001425 return llvm::StringSwitch<bool>(Feature)
1426 .Case("powerpc", true)
1427 .Case("vsx", HasVSX)
1428 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001429 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001430 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001431 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001432 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001433 .Case("bpermd", HasBPERMD)
1434 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001435 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001436 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001437}
Chris Lattner17df24e2008-04-21 18:56:49 +00001438
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001439void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1440 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001441 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1442 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1443 // incompatible options.
1444 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001445 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001446 Features[Name] = Features["vsx"] = true;
1447 } else if (Name == "power8-vector") {
1448 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001449 } else if (Name == "float128") {
1450 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001451 } else {
1452 Features[Name] = true;
1453 }
1454 } else {
1455 if (Name == "vsx") {
1456 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001457 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001458 } else {
1459 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001460 }
1461 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001462}
1463
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001464const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001465 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1466 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1467 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1468 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1469 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1470 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1471 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1472 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001473 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001474 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001475 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001476 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1477 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1478 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1479 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001480 "vrsave", "vscr",
1481 "spe_acc", "spefscr",
1482 "sfp"
1483};
Chris Lattner10a5b382007-01-29 05:24:35 +00001484
Craig Topperf054e3a2015-10-19 03:52:27 +00001485ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1486 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001487}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001488
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001489const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1490 // While some of these aliases do map to different registers
1491 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001492 { { "0" }, "r0" },
1493 { { "1"}, "r1" },
1494 { { "2" }, "r2" },
1495 { { "3" }, "r3" },
1496 { { "4" }, "r4" },
1497 { { "5" }, "r5" },
1498 { { "6" }, "r6" },
1499 { { "7" }, "r7" },
1500 { { "8" }, "r8" },
1501 { { "9" }, "r9" },
1502 { { "10" }, "r10" },
1503 { { "11" }, "r11" },
1504 { { "12" }, "r12" },
1505 { { "13" }, "r13" },
1506 { { "14" }, "r14" },
1507 { { "15" }, "r15" },
1508 { { "16" }, "r16" },
1509 { { "17" }, "r17" },
1510 { { "18" }, "r18" },
1511 { { "19" }, "r19" },
1512 { { "20" }, "r20" },
1513 { { "21" }, "r21" },
1514 { { "22" }, "r22" },
1515 { { "23" }, "r23" },
1516 { { "24" }, "r24" },
1517 { { "25" }, "r25" },
1518 { { "26" }, "r26" },
1519 { { "27" }, "r27" },
1520 { { "28" }, "r28" },
1521 { { "29" }, "r29" },
1522 { { "30" }, "r30" },
1523 { { "31" }, "r31" },
1524 { { "fr0" }, "f0" },
1525 { { "fr1" }, "f1" },
1526 { { "fr2" }, "f2" },
1527 { { "fr3" }, "f3" },
1528 { { "fr4" }, "f4" },
1529 { { "fr5" }, "f5" },
1530 { { "fr6" }, "f6" },
1531 { { "fr7" }, "f7" },
1532 { { "fr8" }, "f8" },
1533 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001534 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001535 { { "fr11" }, "f11" },
1536 { { "fr12" }, "f12" },
1537 { { "fr13" }, "f13" },
1538 { { "fr14" }, "f14" },
1539 { { "fr15" }, "f15" },
1540 { { "fr16" }, "f16" },
1541 { { "fr17" }, "f17" },
1542 { { "fr18" }, "f18" },
1543 { { "fr19" }, "f19" },
1544 { { "fr20" }, "f20" },
1545 { { "fr21" }, "f21" },
1546 { { "fr22" }, "f22" },
1547 { { "fr23" }, "f23" },
1548 { { "fr24" }, "f24" },
1549 { { "fr25" }, "f25" },
1550 { { "fr26" }, "f26" },
1551 { { "fr27" }, "f27" },
1552 { { "fr28" }, "f28" },
1553 { { "fr29" }, "f29" },
1554 { { "fr30" }, "f30" },
1555 { { "fr31" }, "f31" },
1556 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557};
1558
Craig Topperf054e3a2015-10-19 03:52:27 +00001559ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1560 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001561}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001562
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001563class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001564public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001565 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1566 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001567 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001568
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001569 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001570 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001571 case llvm::Triple::FreeBSD:
1572 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001573 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001574 PtrDiffType = SignedInt;
1575 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001576 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001577 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001578 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001579 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001580
Roman Divacky3ffe7462012-03-13 19:20:17 +00001581 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1582 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001583 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001584 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001585
1586 // PPC32 supports atomics up to 4 bytes.
1587 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001588 }
1589
Craig Topper3164f332014-03-11 03:39:26 +00001590 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001591 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001592 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001593 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001594};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001595
Bill Schmidt778d3872013-07-26 01:36:11 +00001596// Note: ABI differences may eventually require us to have a separate
1597// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001598class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001599public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001600 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1601 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001602 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001603 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001604 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001605
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001606 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001607 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001608 ABI = "elfv2";
1609 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001610 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001611 ABI = "elfv1";
1612 }
1613
1614 switch (getTriple().getOS()) {
1615 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001616 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001617 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001618 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001619 case llvm::Triple::NetBSD:
1620 IntMaxType = SignedLongLong;
1621 Int64Type = SignedLongLong;
1622 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001623 default:
1624 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001625 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001626
1627 // PPC64 supports atomics up to 8 bytes.
1628 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001629 }
Craig Topper3164f332014-03-11 03:39:26 +00001630 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001631 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001632 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001633 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001634 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001635 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001636 ABI = Name;
1637 return true;
1638 }
1639 return false;
1640 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001641};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001642
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001643class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001644public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001645 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1646 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001647 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001648 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001649 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001650 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001651 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001652 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001653 }
Craig Topper3164f332014-03-11 03:39:26 +00001654 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001655 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001656 }
1657};
1658
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001659class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001660public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001661 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1662 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001663 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001664 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001665 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001666 }
1667};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001668
Eric Christopherc48497a2015-09-18 21:26:24 +00001669static const unsigned NVPTXAddrSpaceMap[] = {
1670 1, // opencl_global
1671 3, // opencl_local
1672 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001673 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001674 0, // opencl_generic
1675 1, // cuda_device
1676 4, // cuda_constant
1677 3, // cuda_shared
1678};
1679
1680class NVPTXTargetInfo : public TargetInfo {
1681 static const char *const GCCRegNames[];
1682 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001683
1684 // The GPU profiles supported by the NVPTX backend
1685 enum GPUKind {
1686 GK_NONE,
1687 GK_SM20,
1688 GK_SM21,
1689 GK_SM30,
1690 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001691 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001692 } GPU;
1693
Eric Christopherc48497a2015-09-18 21:26:24 +00001694public:
Justin Lebar76945b22016-04-29 23:05:19 +00001695 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001696 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001697 BigEndian = false;
1698 TLSSupported = false;
1699 LongWidth = LongAlign = 64;
1700 AddrSpaceMap = &NVPTXAddrSpaceMap;
1701 UseAddrSpaceMapMangling = true;
1702 // Define available target features
1703 // These must be defined in sorted order!
1704 NoAsmVariants = true;
1705 // Set the default GPU to sm20
1706 GPU = GK_SM20;
Justin Lebar76945b22016-04-29 23:05:19 +00001707
1708 // If possible, get a TargetInfo for our host triple, so we can match its
1709 // types.
1710 llvm::Triple HostTriple(Opts.HostTriple);
1711 if (HostTriple.isNVPTX())
1712 return;
1713 std::unique_ptr<TargetInfo> HostTarget(
1714 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1715 if (!HostTarget) {
1716 return;
1717 }
1718
1719 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1720 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1721 BoolWidth = HostTarget->getBoolWidth();
1722 BoolAlign = HostTarget->getBoolAlign();
1723 IntWidth = HostTarget->getIntWidth();
1724 IntAlign = HostTarget->getIntAlign();
1725 HalfWidth = HostTarget->getHalfWidth();
1726 HalfAlign = HostTarget->getHalfAlign();
1727 FloatWidth = HostTarget->getFloatWidth();
1728 FloatAlign = HostTarget->getFloatAlign();
1729 DoubleWidth = HostTarget->getDoubleWidth();
1730 DoubleAlign = HostTarget->getDoubleAlign();
1731 LongWidth = HostTarget->getLongWidth();
1732 LongAlign = HostTarget->getLongAlign();
1733 LongLongWidth = HostTarget->getLongLongWidth();
1734 LongLongAlign = HostTarget->getLongLongAlign();
1735 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1736 DefaultAlignForAttributeAligned =
1737 HostTarget->getDefaultAlignForAttributeAligned();
1738 SizeType = HostTarget->getSizeType();
1739 IntMaxType = HostTarget->getIntMaxType();
1740 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1741 IntPtrType = HostTarget->getIntPtrType();
1742 WCharType = HostTarget->getWCharType();
1743 WIntType = HostTarget->getWIntType();
1744 Char16Type = HostTarget->getChar16Type();
1745 Char32Type = HostTarget->getChar32Type();
1746 Int64Type = HostTarget->getInt64Type();
1747 SigAtomicType = HostTarget->getSigAtomicType();
1748 ProcessIDType = HostTarget->getProcessIDType();
1749
1750 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1751 UseZeroLengthBitfieldAlignment =
1752 HostTarget->useZeroLengthBitfieldAlignment();
1753 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1754 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1755
1756 // Properties intentionally not copied from host:
1757 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1758 // host/device boundary.
1759 // - SuitableAlign: Not visible across the host/device boundary, and may
1760 // correctly be different on host/device, e.g. if host has wider vector
1761 // types than device.
1762 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1763 // as its double type, but that's not necessarily true on the host.
1764 // TODO: nvcc emits a warning when using long double on device; we should
1765 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001766 }
1767 void getTargetDefines(const LangOptions &Opts,
1768 MacroBuilder &Builder) const override {
1769 Builder.defineMacro("__PTX__");
1770 Builder.defineMacro("__NVPTX__");
1771 if (Opts.CUDAIsDevice) {
1772 // Set __CUDA_ARCH__ for the GPU specified.
1773 std::string CUDAArchCode;
1774 switch (GPU) {
1775 case GK_SM20:
1776 CUDAArchCode = "200";
1777 break;
1778 case GK_SM21:
1779 CUDAArchCode = "210";
1780 break;
1781 case GK_SM30:
1782 CUDAArchCode = "300";
1783 break;
1784 case GK_SM35:
1785 CUDAArchCode = "350";
1786 break;
1787 case GK_SM37:
1788 CUDAArchCode = "370";
1789 break;
1790 default:
1791 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001792 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001793 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001794 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001795 }
Craig Topper6c03a542015-10-19 04:51:35 +00001796 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1797 return llvm::makeArrayRef(BuiltinInfo,
1798 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001799 }
1800 bool hasFeature(StringRef Feature) const override {
1801 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001802 }
1803
Craig Topperf054e3a2015-10-19 03:52:27 +00001804 ArrayRef<const char *> getGCCRegNames() const override;
1805 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001806 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001807 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001808 }
1809 bool validateAsmConstraint(const char *&Name,
1810 TargetInfo::ConstraintInfo &Info) const override {
1811 switch (*Name) {
1812 default:
1813 return false;
1814 case 'c':
1815 case 'h':
1816 case 'r':
1817 case 'l':
1818 case 'f':
1819 case 'd':
1820 Info.setAllowsRegister();
1821 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001822 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001823 }
1824 const char *getClobbers() const override {
1825 // FIXME: Is this really right?
1826 return "";
1827 }
1828 BuiltinVaListKind getBuiltinVaListKind() const override {
1829 // FIXME: implement
1830 return TargetInfo::CharPtrBuiltinVaList;
1831 }
1832 bool setCPU(const std::string &Name) override {
1833 GPU = llvm::StringSwitch<GPUKind>(Name)
1834 .Case("sm_20", GK_SM20)
1835 .Case("sm_21", GK_SM21)
1836 .Case("sm_30", GK_SM30)
1837 .Case("sm_35", GK_SM35)
1838 .Case("sm_37", GK_SM37)
1839 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001840
Eric Christopherc48497a2015-09-18 21:26:24 +00001841 return GPU != GK_NONE;
1842 }
1843};
1844
1845const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1846#define BUILTIN(ID, TYPE, ATTRS) \
1847 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1848#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1849 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1850#include "clang/Basic/BuiltinsNVPTX.def"
1851};
1852
1853const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1854
Craig Topperf054e3a2015-10-19 03:52:27 +00001855ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1856 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001857}
1858
1859class NVPTX32TargetInfo : public NVPTXTargetInfo {
1860public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001861 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1862 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001863 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001864 PointerWidth = PointerAlign = 32;
1865 SizeType = TargetInfo::UnsignedInt;
1866 PtrDiffType = TargetInfo::SignedInt;
1867 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001868 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001869 }
1870};
1871
1872class NVPTX64TargetInfo : public NVPTXTargetInfo {
1873public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001874 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1875 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001876 PointerWidth = PointerAlign = 64;
1877 SizeType = TargetInfo::UnsignedLong;
1878 PtrDiffType = TargetInfo::SignedLong;
1879 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001880 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001881 }
1882};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001883
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001884static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001885 1, // opencl_global
1886 3, // opencl_local
1887 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001888 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001889 1, // cuda_device
1890 2, // cuda_constant
1891 3 // cuda_shared
1892};
1893
Tom Stellarda96344b2014-08-21 13:58:40 +00001894// If you edit the description strings, make sure you update
1895// getPointerWidthV().
1896
Craig Topper273dbc62015-10-18 05:29:26 +00001897static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001898 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1899 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001900
Craig Topper273dbc62015-10-18 05:29:26 +00001901static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001902 "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 +00001903 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1904 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001905
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001906class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001907 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001908 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001909
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001910 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001911 enum GPUKind {
1912 GK_NONE,
1913 GK_R600,
1914 GK_R600_DOUBLE_OPS,
1915 GK_R700,
1916 GK_R700_DOUBLE_OPS,
1917 GK_EVERGREEN,
1918 GK_EVERGREEN_DOUBLE_OPS,
1919 GK_NORTHERN_ISLANDS,
1920 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001921 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001922 GK_SEA_ISLANDS,
1923 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001924 } GPU;
1925
Jan Veselyeebeaea2015-05-04 19:53:36 +00001926 bool hasFP64:1;
1927 bool hasFMAF:1;
1928 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001929
Eli Friedmand13b41e2012-10-12 23:32:00 +00001930public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001931 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
1932 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001933 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001934 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001935 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001936 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001937 hasFMAF = true;
1938 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001939 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001940 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001941 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001942 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001943 hasFMAF = false;
1944 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001945 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001946 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001947 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001948 }
1949
Tom Stellarda96344b2014-08-21 13:58:40 +00001950 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1951 if (GPU <= GK_CAYMAN)
1952 return 32;
1953
1954 switch(AddrSpace) {
1955 default:
1956 return 64;
1957 case 0:
1958 case 3:
1959 case 5:
1960 return 32;
1961 }
1962 }
1963
Craig Topper3164f332014-03-11 03:39:26 +00001964 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001965 return "";
1966 }
1967
Craig Topperf054e3a2015-10-19 03:52:27 +00001968 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001969
Craig Topperf054e3a2015-10-19 03:52:27 +00001970 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1971 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001972 }
1973
Craig Topper3164f332014-03-11 03:39:26 +00001974 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001975 TargetInfo::ConstraintInfo &Info) const override {
1976 switch (*Name) {
1977 default: break;
1978 case 'v': // vgpr
1979 case 's': // sgpr
1980 Info.setAllowsRegister();
1981 return true;
1982 }
1983 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001984 }
1985
Craig Topper6c03a542015-10-19 04:51:35 +00001986 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1987 return llvm::makeArrayRef(BuiltinInfo,
1988 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001989 }
1990
Craig Topper3164f332014-03-11 03:39:26 +00001991 void getTargetDefines(const LangOptions &Opts,
1992 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001993 if (getTriple().getArch() == llvm::Triple::amdgcn)
1994 Builder.defineMacro("__AMDGCN__");
1995 else
1996 Builder.defineMacro("__R600__");
1997
Jan Veselyeebeaea2015-05-04 19:53:36 +00001998 if (hasFMAF)
1999 Builder.defineMacro("__HAS_FMAF__");
2000 if (hasLDEXPF)
2001 Builder.defineMacro("__HAS_LDEXPF__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002002 }
2003
Craig Topper3164f332014-03-11 03:39:26 +00002004 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002005 return TargetInfo::CharPtrBuiltinVaList;
2006 }
2007
Craig Topper3164f332014-03-11 03:39:26 +00002008 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00002009 GPU = llvm::StringSwitch<GPUKind>(Name)
2010 .Case("r600" , GK_R600)
2011 .Case("rv610", GK_R600)
2012 .Case("rv620", GK_R600)
2013 .Case("rv630", GK_R600)
2014 .Case("rv635", GK_R600)
2015 .Case("rs780", GK_R600)
2016 .Case("rs880", GK_R600)
2017 .Case("rv670", GK_R600_DOUBLE_OPS)
2018 .Case("rv710", GK_R700)
2019 .Case("rv730", GK_R700)
2020 .Case("rv740", GK_R700_DOUBLE_OPS)
2021 .Case("rv770", GK_R700_DOUBLE_OPS)
2022 .Case("palm", GK_EVERGREEN)
2023 .Case("cedar", GK_EVERGREEN)
2024 .Case("sumo", GK_EVERGREEN)
2025 .Case("sumo2", GK_EVERGREEN)
2026 .Case("redwood", GK_EVERGREEN)
2027 .Case("juniper", GK_EVERGREEN)
2028 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2029 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2030 .Case("barts", GK_NORTHERN_ISLANDS)
2031 .Case("turks", GK_NORTHERN_ISLANDS)
2032 .Case("caicos", GK_NORTHERN_ISLANDS)
2033 .Case("cayman", GK_CAYMAN)
2034 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00002035 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002036 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2037 .Case("verde", GK_SOUTHERN_ISLANDS)
2038 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002039 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002040 .Case("bonaire", GK_SEA_ISLANDS)
2041 .Case("kabini", GK_SEA_ISLANDS)
2042 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002043 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002044 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002045 .Case("tonga", GK_VOLCANIC_ISLANDS)
2046 .Case("iceland", GK_VOLCANIC_ISLANDS)
2047 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002048 .Case("fiji", GK_VOLCANIC_ISLANDS)
2049 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002050 .Default(GK_NONE);
2051
2052 if (GPU == GK_NONE) {
2053 return false;
2054 }
2055
2056 // Set the correct data layout
2057 switch (GPU) {
2058 case GK_NONE:
2059 case GK_R600:
2060 case GK_R700:
2061 case GK_EVERGREEN:
2062 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002063 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002064 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002065 hasFMAF = false;
2066 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002067 break;
2068 case GK_R600_DOUBLE_OPS:
2069 case GK_R700_DOUBLE_OPS:
2070 case GK_EVERGREEN_DOUBLE_OPS:
2071 case GK_CAYMAN:
Matt Arsenaultedc7c6b2016-03-30 21:32:37 +00002072 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002073 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002074 hasFMAF = true;
2075 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002076 break;
2077 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00002078 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00002079 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002080 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002081 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002082 hasFMAF = true;
2083 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002084 break;
2085 }
2086
2087 return true;
2088 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002089
2090 void setSupportedOpenCLOpts() override {
2091 auto &Opts = getSupportedOpenCLOpts();
2092 Opts.cl_clang_storage_class_specifiers = 1;
2093 Opts.cl_khr_gl_sharing = 1;
2094 Opts.cl_khr_gl_event = 1;
2095 Opts.cl_khr_d3d10_sharing = 1;
2096 Opts.cl_khr_subgroups = 1;
2097
2098 if (hasFP64)
2099 Opts.cl_khr_fp64 = 1;
2100 if (GPU >= GK_NORTHERN_ISLANDS) {
2101 Opts.cl_khr_byte_addressable_store = 1;
2102 Opts.cl_khr_global_int32_base_atomics = 1;
2103 Opts.cl_khr_global_int32_extended_atomics = 1;
2104 Opts.cl_khr_local_int32_base_atomics = 1;
2105 Opts.cl_khr_local_int32_extended_atomics = 1;
2106 }
2107 if (GPU >= GK_SOUTHERN_ISLANDS)
2108 Opts.cl_khr_fp16 = 1;
2109 Opts.cl_khr_int64_base_atomics = 1;
2110 Opts.cl_khr_int64_extended_atomics = 1;
2111 Opts.cl_khr_3d_image_writes = 1;
2112 Opts.cl_khr_gl_msaa_sharing = 1;
2113 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002114};
2115
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002116const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002117#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002118 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002119#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002120};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002121const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002122 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2123 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2124 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2125 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2126 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2127 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2128 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2129 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2130 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2131 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2132 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2133 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2134 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2135 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2136 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2137 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2138 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2139 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2140 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2141 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2142 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2143 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2144 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2145 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2146 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2147 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2148 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2149 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2150 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2151 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2152 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2153 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2154 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2155 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2156 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2157 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2158 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2159 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2160 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2161 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2162 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2163 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2164 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2165 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2166 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2167 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2168 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002169 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002170 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2171 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002172};
2173
Craig Topperf054e3a2015-10-19 03:52:27 +00002174ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2175 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002176}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002177
Eli Friedman3fd920a2008-08-20 02:34:37 +00002178// Namespace for x86 abstract base class
2179const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002180#define BUILTIN(ID, TYPE, ATTRS) \
2181 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002182#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002183 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002184#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002185 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002186#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002187};
Eli Friedmanb5366062008-05-20 14:21:01 +00002188
Nuno Lopescfca1f02009-12-23 17:49:57 +00002189static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002190 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2191 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002192 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002193 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2194 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2195 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002196 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002197 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2198 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002199 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2200 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2201 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2202 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2203 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2204 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2205 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2206 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002207};
2208
Eric Christophercdd36352011-06-21 00:05:20 +00002209const TargetInfo::AddlRegName AddlRegNames[] = {
2210 { { "al", "ah", "eax", "rax" }, 0 },
2211 { { "bl", "bh", "ebx", "rbx" }, 3 },
2212 { { "cl", "ch", "ecx", "rcx" }, 2 },
2213 { { "dl", "dh", "edx", "rdx" }, 1 },
2214 { { "esi", "rsi" }, 4 },
2215 { { "edi", "rdi" }, 5 },
2216 { { "esp", "rsp" }, 7 },
2217 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002218 { { "r8d", "r8w", "r8b" }, 38 },
2219 { { "r9d", "r9w", "r9b" }, 39 },
2220 { { "r10d", "r10w", "r10b" }, 40 },
2221 { { "r11d", "r11w", "r11b" }, 41 },
2222 { { "r12d", "r12w", "r12b" }, 42 },
2223 { { "r13d", "r13w", "r13b" }, 43 },
2224 { { "r14d", "r14w", "r14b" }, 44 },
2225 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002226};
2227
2228// X86 target abstract base class; x86-32 and x86-64 are very close, so
2229// most of the implementation can be shared.
2230class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002231 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002232 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002233 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002234 enum MMX3DNowEnum {
2235 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002236 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002237 enum XOPEnum {
2238 NoXOP,
2239 SSE4A,
2240 FMA4,
2241 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002242 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002243
Craig Topper543f3bd2015-10-14 23:47:57 +00002244 bool HasAES = false;
2245 bool HasPCLMUL = false;
2246 bool HasLZCNT = false;
2247 bool HasRDRND = false;
2248 bool HasFSGSBASE = false;
2249 bool HasBMI = false;
2250 bool HasBMI2 = false;
2251 bool HasPOPCNT = false;
2252 bool HasRTM = false;
2253 bool HasPRFCHW = false;
2254 bool HasRDSEED = false;
2255 bool HasADX = false;
2256 bool HasTBM = false;
2257 bool HasFMA = false;
2258 bool HasF16C = false;
2259 bool HasAVX512CD = false;
2260 bool HasAVX512ER = false;
2261 bool HasAVX512PF = false;
2262 bool HasAVX512DQ = false;
2263 bool HasAVX512BW = false;
2264 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002265 bool HasAVX512VBMI = false;
2266 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002267 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002268 bool HasMPX = false;
2269 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002270 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002271 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002272 bool HasXSAVE = false;
2273 bool HasXSAVEOPT = false;
2274 bool HasXSAVEC = false;
2275 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002276 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002277 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002278 bool HasCLFLUSHOPT = false;
2279 bool HasPCOMMIT = false;
2280 bool HasCLWB = false;
2281 bool HasUMIP = false;
2282 bool HasMOVBE = false;
2283 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002284
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002285 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2286 ///
2287 /// Each enumeration represents a particular CPU supported by Clang. These
2288 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2289 enum CPUKind {
2290 CK_Generic,
2291
2292 /// \name i386
2293 /// i386-generation processors.
2294 //@{
2295 CK_i386,
2296 //@}
2297
2298 /// \name i486
2299 /// i486-generation processors.
2300 //@{
2301 CK_i486,
2302 CK_WinChipC6,
2303 CK_WinChip2,
2304 CK_C3,
2305 //@}
2306
2307 /// \name i586
2308 /// i586-generation processors, P5 microarchitecture based.
2309 //@{
2310 CK_i586,
2311 CK_Pentium,
2312 CK_PentiumMMX,
2313 //@}
2314
2315 /// \name i686
2316 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2317 //@{
2318 CK_i686,
2319 CK_PentiumPro,
2320 CK_Pentium2,
2321 CK_Pentium3,
2322 CK_Pentium3M,
2323 CK_PentiumM,
2324 CK_C3_2,
2325
2326 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2327 /// Clang however has some logic to suport this.
2328 // FIXME: Warn, deprecate, and potentially remove this.
2329 CK_Yonah,
2330 //@}
2331
2332 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002333 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002334 //@{
2335 CK_Pentium4,
2336 CK_Pentium4M,
2337 CK_Prescott,
2338 CK_Nocona,
2339 //@}
2340
2341 /// \name Core
2342 /// Core microarchitecture based processors.
2343 //@{
2344 CK_Core2,
2345
2346 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2347 /// codename which GCC no longer accepts as an option to -march, but Clang
2348 /// has some logic for recognizing it.
2349 // FIXME: Warn, deprecate, and potentially remove this.
2350 CK_Penryn,
2351 //@}
2352
2353 /// \name Atom
2354 /// Atom processors
2355 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002356 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002357 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002358 //@}
2359
2360 /// \name Nehalem
2361 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002362 CK_Nehalem,
2363
2364 /// \name Westmere
2365 /// Westmere microarchitecture based processors.
2366 CK_Westmere,
2367
2368 /// \name Sandy Bridge
2369 /// Sandy Bridge microarchitecture based processors.
2370 CK_SandyBridge,
2371
2372 /// \name Ivy Bridge
2373 /// Ivy Bridge microarchitecture based processors.
2374 CK_IvyBridge,
2375
2376 /// \name Haswell
2377 /// Haswell microarchitecture based processors.
2378 CK_Haswell,
2379
2380 /// \name Broadwell
2381 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002382 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002383
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002384 /// \name Skylake Client
2385 /// Skylake client microarchitecture based processors.
2386 CK_SkylakeClient,
2387
2388 /// \name Skylake Server
2389 /// Skylake server microarchitecture based processors.
2390 CK_SkylakeServer,
2391
2392 /// \name Cannonlake Client
2393 /// Cannonlake client microarchitecture based processors.
2394 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002395
Craig Topper449314e2013-08-20 07:09:39 +00002396 /// \name Knights Landing
2397 /// Knights Landing processor.
2398 CK_KNL,
2399
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002400 /// \name Lakemont
2401 /// Lakemont microarchitecture based processors.
2402 CK_Lakemont,
2403
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002404 /// \name K6
2405 /// K6 architecture processors.
2406 //@{
2407 CK_K6,
2408 CK_K6_2,
2409 CK_K6_3,
2410 //@}
2411
2412 /// \name K7
2413 /// K7 architecture processors.
2414 //@{
2415 CK_Athlon,
2416 CK_AthlonThunderbird,
2417 CK_Athlon4,
2418 CK_AthlonXP,
2419 CK_AthlonMP,
2420 //@}
2421
2422 /// \name K8
2423 /// K8 architecture processors.
2424 //@{
2425 CK_Athlon64,
2426 CK_Athlon64SSE3,
2427 CK_AthlonFX,
2428 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002429 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002430 CK_Opteron,
2431 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002432 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002433 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002434
Benjamin Kramer569f2152012-01-10 11:50:18 +00002435 /// \name Bobcat
2436 /// Bobcat architecture processors.
2437 //@{
2438 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002439 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002440 //@}
2441
2442 /// \name Bulldozer
2443 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002444 //@{
2445 CK_BDVER1,
2446 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002447 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002448 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002449 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002450
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002451 /// This specification is deprecated and will be removed in the future.
2452 /// Users should prefer \see CK_K8.
2453 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002454 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002455 CK_x86_64,
2456 //@}
2457
2458 /// \name Geode
2459 /// Geode processors.
2460 //@{
2461 CK_Geode
2462 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002463 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002464
Eric Christopherc50738f2015-08-27 00:05:50 +00002465 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002466 return llvm::StringSwitch<CPUKind>(CPU)
2467 .Case("i386", CK_i386)
2468 .Case("i486", CK_i486)
2469 .Case("winchip-c6", CK_WinChipC6)
2470 .Case("winchip2", CK_WinChip2)
2471 .Case("c3", CK_C3)
2472 .Case("i586", CK_i586)
2473 .Case("pentium", CK_Pentium)
2474 .Case("pentium-mmx", CK_PentiumMMX)
2475 .Case("i686", CK_i686)
2476 .Case("pentiumpro", CK_PentiumPro)
2477 .Case("pentium2", CK_Pentium2)
2478 .Case("pentium3", CK_Pentium3)
2479 .Case("pentium3m", CK_Pentium3M)
2480 .Case("pentium-m", CK_PentiumM)
2481 .Case("c3-2", CK_C3_2)
2482 .Case("yonah", CK_Yonah)
2483 .Case("pentium4", CK_Pentium4)
2484 .Case("pentium4m", CK_Pentium4M)
2485 .Case("prescott", CK_Prescott)
2486 .Case("nocona", CK_Nocona)
2487 .Case("core2", CK_Core2)
2488 .Case("penryn", CK_Penryn)
2489 .Case("bonnell", CK_Bonnell)
2490 .Case("atom", CK_Bonnell) // Legacy name.
2491 .Case("silvermont", CK_Silvermont)
2492 .Case("slm", CK_Silvermont) // Legacy name.
2493 .Case("nehalem", CK_Nehalem)
2494 .Case("corei7", CK_Nehalem) // Legacy name.
2495 .Case("westmere", CK_Westmere)
2496 .Case("sandybridge", CK_SandyBridge)
2497 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2498 .Case("ivybridge", CK_IvyBridge)
2499 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2500 .Case("haswell", CK_Haswell)
2501 .Case("core-avx2", CK_Haswell) // Legacy name.
2502 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002503 .Case("skylake", CK_SkylakeClient)
2504 .Case("skylake-avx512", CK_SkylakeServer)
2505 .Case("skx", CK_SkylakeServer) // Legacy name.
2506 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002507 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002508 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002509 .Case("k6", CK_K6)
2510 .Case("k6-2", CK_K6_2)
2511 .Case("k6-3", CK_K6_3)
2512 .Case("athlon", CK_Athlon)
2513 .Case("athlon-tbird", CK_AthlonThunderbird)
2514 .Case("athlon-4", CK_Athlon4)
2515 .Case("athlon-xp", CK_AthlonXP)
2516 .Case("athlon-mp", CK_AthlonMP)
2517 .Case("athlon64", CK_Athlon64)
2518 .Case("athlon64-sse3", CK_Athlon64SSE3)
2519 .Case("athlon-fx", CK_AthlonFX)
2520 .Case("k8", CK_K8)
2521 .Case("k8-sse3", CK_K8SSE3)
2522 .Case("opteron", CK_Opteron)
2523 .Case("opteron-sse3", CK_OpteronSSE3)
2524 .Case("barcelona", CK_AMDFAM10)
2525 .Case("amdfam10", CK_AMDFAM10)
2526 .Case("btver1", CK_BTVER1)
2527 .Case("btver2", CK_BTVER2)
2528 .Case("bdver1", CK_BDVER1)
2529 .Case("bdver2", CK_BDVER2)
2530 .Case("bdver3", CK_BDVER3)
2531 .Case("bdver4", CK_BDVER4)
2532 .Case("x86-64", CK_x86_64)
2533 .Case("geode", CK_Geode)
2534 .Default(CK_Generic);
2535 }
2536
Rafael Espindolaeb265472013-08-21 21:59:03 +00002537 enum FPMathKind {
2538 FP_Default,
2539 FP_SSE,
2540 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002541 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002542
Eli Friedman3fd920a2008-08-20 02:34:37 +00002543public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002544 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2545 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002546 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002547 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002548 }
Craig Topper3164f332014-03-11 03:39:26 +00002549 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002550 // X87 evaluates with 80 bits "long double" precision.
2551 return SSELevel == NoSSE ? 2 : 0;
2552 }
Craig Topper6c03a542015-10-19 04:51:35 +00002553 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2554 return llvm::makeArrayRef(BuiltinInfo,
2555 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002556 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002557 ArrayRef<const char *> getGCCRegNames() const override {
2558 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002559 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002560 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2561 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002562 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002563 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2564 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002565 }
Eric Christopherd9832702015-06-29 21:00:05 +00002566 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002567 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002568 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002569
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002570 bool validateGlobalRegisterVariable(StringRef RegName,
2571 unsigned RegSize,
2572 bool &HasSizeMismatch) const override {
2573 // esp and ebp are the only 32-bit registers the x86 backend can currently
2574 // handle.
2575 if (RegName.equals("esp") || RegName.equals("ebp")) {
2576 // Check that the register size is 32-bit.
2577 HasSizeMismatch = RegSize != 32;
2578 return true;
2579 }
2580
2581 return false;
2582 }
2583
Akira Hatanaka974131e2014-09-18 18:17:18 +00002584 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2585
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002586 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2587
Akira Hatanaka974131e2014-09-18 18:17:18 +00002588 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2589
Craig Topper3164f332014-03-11 03:39:26 +00002590 std::string convertConstraint(const char *&Constraint) const override;
2591 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002592 return "~{dirflag},~{fpsr},~{flags}";
2593 }
Craig Topper3164f332014-03-11 03:39:26 +00002594 void getTargetDefines(const LangOptions &Opts,
2595 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002596 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2597 bool Enabled);
2598 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2599 bool Enabled);
2600 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2601 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002602 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2603 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002604 setFeatureEnabledImpl(Features, Name, Enabled);
2605 }
2606 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002607 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002608 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2609 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002610 bool
2611 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2612 StringRef CPU,
2613 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002614 bool hasFeature(StringRef Feature) const override;
2615 bool handleTargetFeatures(std::vector<std::string> &Features,
2616 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002617 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002618 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2619 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002620 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002621 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002622 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002623 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002624 return "no-mmx";
2625 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002626 }
Craig Topper3164f332014-03-11 03:39:26 +00002627 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002628 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002629
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002630 // Perform any per-CPU checks necessary to determine if this CPU is
2631 // acceptable.
2632 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2633 // invalid without explaining *why*.
2634 switch (CPU) {
2635 case CK_Generic:
2636 // No processor selected!
2637 return false;
2638
2639 case CK_i386:
2640 case CK_i486:
2641 case CK_WinChipC6:
2642 case CK_WinChip2:
2643 case CK_C3:
2644 case CK_i586:
2645 case CK_Pentium:
2646 case CK_PentiumMMX:
2647 case CK_i686:
2648 case CK_PentiumPro:
2649 case CK_Pentium2:
2650 case CK_Pentium3:
2651 case CK_Pentium3M:
2652 case CK_PentiumM:
2653 case CK_Yonah:
2654 case CK_C3_2:
2655 case CK_Pentium4:
2656 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002657 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002658 case CK_Prescott:
2659 case CK_K6:
2660 case CK_K6_2:
2661 case CK_K6_3:
2662 case CK_Athlon:
2663 case CK_AthlonThunderbird:
2664 case CK_Athlon4:
2665 case CK_AthlonXP:
2666 case CK_AthlonMP:
2667 case CK_Geode:
2668 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002669 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002670 return false;
2671
2672 // Fallthrough
2673 case CK_Nocona:
2674 case CK_Core2:
2675 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002676 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002677 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002678 case CK_Nehalem:
2679 case CK_Westmere:
2680 case CK_SandyBridge:
2681 case CK_IvyBridge:
2682 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002683 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002684 case CK_SkylakeClient:
2685 case CK_SkylakeServer:
2686 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002687 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002688 case CK_Athlon64:
2689 case CK_Athlon64SSE3:
2690 case CK_AthlonFX:
2691 case CK_K8:
2692 case CK_K8SSE3:
2693 case CK_Opteron:
2694 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002695 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002696 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002697 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002698 case CK_BDVER1:
2699 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002700 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002701 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002702 case CK_x86_64:
2703 return true;
2704 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002705 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002706 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002707
Craig Topper3164f332014-03-11 03:39:26 +00002708 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002709
Craig Topper3164f332014-03-11 03:39:26 +00002710 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002711 // Most of the non-ARM calling conventions are i386 conventions.
2712 switch (CC) {
2713 case CC_X86ThisCall:
2714 case CC_X86FastCall:
2715 case CC_X86StdCall:
2716 case CC_X86VectorCall:
2717 case CC_C:
2718 case CC_Swift:
2719 case CC_X86Pascal:
2720 case CC_IntelOclBicc:
2721 return CCCR_OK;
2722 default:
2723 return CCCR_Warning;
2724 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002725 }
2726
Craig Topper3164f332014-03-11 03:39:26 +00002727 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002728 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002729 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002730
2731 bool hasSjLjLowering() const override {
2732 return true;
2733 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002734
2735 void setSupportedOpenCLOpts() override {
2736 getSupportedOpenCLOpts().setAll();
2737 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002738};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002739
Rafael Espindolaeb265472013-08-21 21:59:03 +00002740bool X86TargetInfo::setFPMath(StringRef Name) {
2741 if (Name == "387") {
2742 FPMath = FP_387;
2743 return true;
2744 }
2745 if (Name == "sse") {
2746 FPMath = FP_SSE;
2747 return true;
2748 }
2749 return false;
2750}
2751
Eric Christopher007b0a02015-08-28 22:32:01 +00002752bool X86TargetInfo::initFeatureMap(
2753 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002754 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002755 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002756 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002757 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002758 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002759
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002760 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002761
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002762 // Enable X87 for all X86 processors but Lakemont.
2763 if (Kind != CK_Lakemont)
2764 setFeatureEnabledImpl(Features, "x87", true);
2765
2766 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002767 case CK_Generic:
2768 case CK_i386:
2769 case CK_i486:
2770 case CK_i586:
2771 case CK_Pentium:
2772 case CK_i686:
2773 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002774 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002775 break;
2776 case CK_PentiumMMX:
2777 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002778 case CK_K6:
2779 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002780 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002781 break;
2782 case CK_Pentium3:
2783 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002784 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002785 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002786 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002787 break;
2788 case CK_PentiumM:
2789 case CK_Pentium4:
2790 case CK_Pentium4M:
2791 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002792 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002793 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002794 break;
2795 case CK_Yonah:
2796 case CK_Prescott:
2797 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002798 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002799 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002800 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002801 break;
2802 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002803 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002804 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002805 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002806 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002807 break;
2808 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002809 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002810 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002811 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002812 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002813 case CK_Cannonlake:
2814 setFeatureEnabledImpl(Features, "avx512ifma", true);
2815 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2816 setFeatureEnabledImpl(Features, "sha", true);
2817 setFeatureEnabledImpl(Features, "umip", true);
2818 // FALLTHROUGH
2819 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002820 setFeatureEnabledImpl(Features, "avx512f", true);
2821 setFeatureEnabledImpl(Features, "avx512cd", true);
2822 setFeatureEnabledImpl(Features, "avx512dq", true);
2823 setFeatureEnabledImpl(Features, "avx512bw", true);
2824 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002825 setFeatureEnabledImpl(Features, "pku", true);
2826 setFeatureEnabledImpl(Features, "pcommit", true);
2827 setFeatureEnabledImpl(Features, "clwb", true);
2828 // FALLTHROUGH
2829 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002830 setFeatureEnabledImpl(Features, "xsavec", true);
2831 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002832 setFeatureEnabledImpl(Features, "mpx", true);
2833 setFeatureEnabledImpl(Features, "sgx", true);
2834 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002835 // FALLTHROUGH
2836 case CK_Broadwell:
2837 setFeatureEnabledImpl(Features, "rdseed", true);
2838 setFeatureEnabledImpl(Features, "adx", true);
2839 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002840 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002841 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002842 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002843 setFeatureEnabledImpl(Features, "bmi", true);
2844 setFeatureEnabledImpl(Features, "bmi2", true);
2845 setFeatureEnabledImpl(Features, "rtm", true);
2846 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002847 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002848 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002849 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002850 setFeatureEnabledImpl(Features, "rdrnd", true);
2851 setFeatureEnabledImpl(Features, "f16c", true);
2852 setFeatureEnabledImpl(Features, "fsgsbase", true);
2853 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002854 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002855 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002856 setFeatureEnabledImpl(Features, "xsave", true);
2857 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002858 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002859 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002860 case CK_Silvermont:
2861 setFeatureEnabledImpl(Features, "aes", true);
2862 setFeatureEnabledImpl(Features, "pclmul", true);
2863 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002864 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002865 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002866 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002867 setFeatureEnabledImpl(Features, "cx16", true);
2868 break;
2869 case CK_KNL:
2870 setFeatureEnabledImpl(Features, "avx512f", true);
2871 setFeatureEnabledImpl(Features, "avx512cd", true);
2872 setFeatureEnabledImpl(Features, "avx512er", true);
2873 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002874 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002875 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002876 setFeatureEnabledImpl(Features, "rdseed", true);
2877 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002878 setFeatureEnabledImpl(Features, "lzcnt", true);
2879 setFeatureEnabledImpl(Features, "bmi", true);
2880 setFeatureEnabledImpl(Features, "bmi2", true);
2881 setFeatureEnabledImpl(Features, "rtm", true);
2882 setFeatureEnabledImpl(Features, "fma", true);
2883 setFeatureEnabledImpl(Features, "rdrnd", true);
2884 setFeatureEnabledImpl(Features, "f16c", true);
2885 setFeatureEnabledImpl(Features, "fsgsbase", true);
2886 setFeatureEnabledImpl(Features, "aes", true);
2887 setFeatureEnabledImpl(Features, "pclmul", true);
2888 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002889 setFeatureEnabledImpl(Features, "xsaveopt", true);
2890 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002891 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002892 break;
2893 case CK_K6_2:
2894 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002895 case CK_WinChip2:
2896 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002897 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002898 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002899 case CK_Athlon:
2900 case CK_AthlonThunderbird:
2901 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002902 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002903 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002904 case CK_Athlon4:
2905 case CK_AthlonXP:
2906 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002907 setFeatureEnabledImpl(Features, "sse", true);
2908 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002909 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002910 break;
2911 case CK_K8:
2912 case CK_Opteron:
2913 case CK_Athlon64:
2914 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002915 setFeatureEnabledImpl(Features, "sse2", true);
2916 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002917 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002918 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002919 case CK_AMDFAM10:
2920 setFeatureEnabledImpl(Features, "sse4a", true);
2921 setFeatureEnabledImpl(Features, "lzcnt", true);
2922 setFeatureEnabledImpl(Features, "popcnt", true);
2923 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002924 case CK_K8SSE3:
2925 case CK_OpteronSSE3:
2926 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002927 setFeatureEnabledImpl(Features, "sse3", true);
2928 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002929 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002930 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002931 case CK_BTVER2:
2932 setFeatureEnabledImpl(Features, "avx", true);
2933 setFeatureEnabledImpl(Features, "aes", true);
2934 setFeatureEnabledImpl(Features, "pclmul", true);
2935 setFeatureEnabledImpl(Features, "bmi", true);
2936 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002937 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002938 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002939 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002940 setFeatureEnabledImpl(Features, "ssse3", true);
2941 setFeatureEnabledImpl(Features, "sse4a", true);
2942 setFeatureEnabledImpl(Features, "lzcnt", true);
2943 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002944 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002945 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002946 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002947 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002948 case CK_BDVER4:
2949 setFeatureEnabledImpl(Features, "avx2", true);
2950 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002951 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00002952 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002953 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002954 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002955 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002956 // FALLTHROUGH
2957 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002958 setFeatureEnabledImpl(Features, "bmi", true);
2959 setFeatureEnabledImpl(Features, "fma", true);
2960 setFeatureEnabledImpl(Features, "f16c", true);
2961 setFeatureEnabledImpl(Features, "tbm", true);
2962 // FALLTHROUGH
2963 case CK_BDVER1:
2964 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002965 setFeatureEnabledImpl(Features, "xop", true);
2966 setFeatureEnabledImpl(Features, "lzcnt", true);
2967 setFeatureEnabledImpl(Features, "aes", true);
2968 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002969 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002970 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002971 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002972 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002973 break;
Eli Friedman33465822011-07-08 23:31:17 +00002974 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002975 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2976 return false;
2977
2978 // Can't do this earlier because we need to be able to explicitly enable
2979 // or disable these features and the things that they depend upon.
2980
2981 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2982 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002983 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002984 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2985 FeaturesVec.end())
2986 Features["popcnt"] = true;
2987
2988 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2989 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002990 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002991 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2992 FeaturesVec.end())
2993 Features["prfchw"] = true;
2994
Eric Christophera7260af2015-10-08 20:10:18 +00002995 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2996 // then enable MMX.
2997 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002998 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002999 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3000 FeaturesVec.end())
3001 Features["mmx"] = true;
3002
Eric Christopherbbd746d2015-10-08 20:10:14 +00003003 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003004}
3005
Rafael Espindolae62e2792013-08-20 13:44:29 +00003006void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003007 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003008 if (Enabled) {
3009 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003010 case AVX512F:
3011 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003012 case AVX2:
3013 Features["avx2"] = true;
3014 case AVX:
3015 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003016 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003017 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003018 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003019 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003020 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003021 case SSSE3:
3022 Features["ssse3"] = true;
3023 case SSE3:
3024 Features["sse3"] = true;
3025 case SSE2:
3026 Features["sse2"] = true;
3027 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003028 Features["sse"] = true;
3029 case NoSSE:
3030 break;
3031 }
3032 return;
3033 }
3034
3035 switch (Level) {
3036 case NoSSE:
3037 case SSE1:
3038 Features["sse"] = false;
3039 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003040 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3041 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003042 case SSE3:
3043 Features["sse3"] = false;
3044 setXOPLevel(Features, NoXOP, false);
3045 case SSSE3:
3046 Features["ssse3"] = false;
3047 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003048 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003049 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003050 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003051 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003052 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3053 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003054 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003055 case AVX2:
3056 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003057 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003058 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003059 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003060 Features["avx512vl"] = Features["avx512vbmi"] =
3061 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003062 }
3063}
3064
3065void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003066 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003067 if (Enabled) {
3068 switch (Level) {
3069 case AMD3DNowAthlon:
3070 Features["3dnowa"] = true;
3071 case AMD3DNow:
3072 Features["3dnow"] = true;
3073 case MMX:
3074 Features["mmx"] = true;
3075 case NoMMX3DNow:
3076 break;
3077 }
3078 return;
3079 }
3080
3081 switch (Level) {
3082 case NoMMX3DNow:
3083 case MMX:
3084 Features["mmx"] = false;
3085 case AMD3DNow:
3086 Features["3dnow"] = false;
3087 case AMD3DNowAthlon:
3088 Features["3dnowa"] = false;
3089 }
3090}
3091
3092void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003093 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003094 if (Enabled) {
3095 switch (Level) {
3096 case XOP:
3097 Features["xop"] = true;
3098 case FMA4:
3099 Features["fma4"] = true;
3100 setSSELevel(Features, AVX, true);
3101 case SSE4A:
3102 Features["sse4a"] = true;
3103 setSSELevel(Features, SSE3, true);
3104 case NoXOP:
3105 break;
3106 }
3107 return;
3108 }
3109
3110 switch (Level) {
3111 case NoXOP:
3112 case SSE4A:
3113 Features["sse4a"] = false;
3114 case FMA4:
3115 Features["fma4"] = false;
3116 case XOP:
3117 Features["xop"] = false;
3118 }
3119}
3120
Craig Topper86d79ef2013-09-17 04:51:29 +00003121void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3122 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003123 // This is a bit of a hack to deal with the sse4 target feature when used
3124 // as part of the target attribute. We handle sse4 correctly everywhere
3125 // else. See below for more information on how we handle the sse4 options.
3126 if (Name != "sse4")
3127 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003128
Craig Topper29561122013-09-19 01:13:07 +00003129 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003130 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003131 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003132 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003133 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003134 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003135 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003136 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003137 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003138 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003139 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003140 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003141 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003142 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003143 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003144 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003145 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003146 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003147 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003148 if (Enabled)
3149 setSSELevel(Features, SSE2, Enabled);
3150 } else if (Name == "pclmul") {
3151 if (Enabled)
3152 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003153 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003154 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003155 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003156 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003157 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003158 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003159 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3160 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3161 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003162 if (Enabled)
3163 setSSELevel(Features, AVX512F, Enabled);
3164 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003165 if (Enabled)
3166 setSSELevel(Features, AVX, Enabled);
3167 } else if (Name == "fma4") {
3168 setXOPLevel(Features, FMA4, Enabled);
3169 } else if (Name == "xop") {
3170 setXOPLevel(Features, XOP, Enabled);
3171 } else if (Name == "sse4a") {
3172 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003173 } else if (Name == "f16c") {
3174 if (Enabled)
3175 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003176 } else if (Name == "sha") {
3177 if (Enabled)
3178 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003179 } else if (Name == "sse4") {
3180 // We can get here via the __target__ attribute since that's not controlled
3181 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3182 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3183 // disabled.
3184 if (Enabled)
3185 setSSELevel(Features, SSE42, Enabled);
3186 else
3187 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003188 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003189 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003190 Features["xsaveopt"] = false;
3191 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003192 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003193 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003194 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003195}
3196
Eric Christopher3ff21b32013-10-16 21:26:26 +00003197/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003198/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003199bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003200 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003201 for (const auto &Feature : Features) {
3202 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003203 continue;
3204
Eric Christopher610fe112015-08-26 08:21:55 +00003205 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003206 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003207 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003208 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003209 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003210 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003211 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003212 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003213 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003214 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003215 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003216 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003217 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003218 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003219 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003220 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003221 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003222 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003223 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003224 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003225 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003226 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003227 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003228 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003229 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003230 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003231 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003232 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003233 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003234 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003235 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003236 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003237 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003238 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003239 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003240 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003241 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003242 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003243 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003244 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003245 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003246 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003247 } else if (Feature == "+avx512vbmi") {
3248 HasAVX512VBMI = true;
3249 } else if (Feature == "+avx512ifma") {
3250 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003251 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003252 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003253 } else if (Feature == "+mpx") {
3254 HasMPX = true;
3255 } else if (Feature == "+movbe") {
3256 HasMOVBE = true;
3257 } else if (Feature == "+sgx") {
3258 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003259 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003260 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003261 } else if (Feature == "+fxsr") {
3262 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003263 } else if (Feature == "+xsave") {
3264 HasXSAVE = true;
3265 } else if (Feature == "+xsaveopt") {
3266 HasXSAVEOPT = true;
3267 } else if (Feature == "+xsavec") {
3268 HasXSAVEC = true;
3269 } else if (Feature == "+xsaves") {
3270 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003271 } else if (Feature == "+mwaitx") {
3272 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003273 } else if (Feature == "+pku") {
3274 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003275 } else if (Feature == "+clflushopt") {
3276 HasCLFLUSHOPT = true;
3277 } else if (Feature == "+pcommit") {
3278 HasPCOMMIT = true;
3279 } else if (Feature == "+clwb") {
3280 HasCLWB = true;
3281 } else if (Feature == "+umip") {
3282 HasUMIP = true;
3283 } else if (Feature == "+prefetchwt1") {
3284 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003285 }
3286
Benjamin Kramer27402c62012-03-05 15:10:44 +00003287 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003288 .Case("+avx512f", AVX512F)
3289 .Case("+avx2", AVX2)
3290 .Case("+avx", AVX)
3291 .Case("+sse4.2", SSE42)
3292 .Case("+sse4.1", SSE41)
3293 .Case("+ssse3", SSSE3)
3294 .Case("+sse3", SSE3)
3295 .Case("+sse2", SSE2)
3296 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003297 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003298 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003299
Eli Friedman33465822011-07-08 23:31:17 +00003300 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003301 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003302 .Case("+3dnowa", AMD3DNowAthlon)
3303 .Case("+3dnow", AMD3DNow)
3304 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003305 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003306 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003307
3308 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003309 .Case("+xop", XOP)
3310 .Case("+fma4", FMA4)
3311 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003312 .Default(NoXOP);
3313 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003314 }
Eli Friedman33465822011-07-08 23:31:17 +00003315
Rafael Espindolaeb265472013-08-21 21:59:03 +00003316 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3317 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003318 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3319 (FPMath == FP_387 && SSELevel >= SSE1)) {
3320 Diags.Report(diag::err_target_unsupported_fpmath) <<
3321 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003322 return false;
3323 }
3324
Alexey Bataev00396512015-07-02 03:40:19 +00003325 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003326 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003327 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003328}
Chris Lattnerecd49032009-03-02 22:27:17 +00003329
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003330/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3331/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003332void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003333 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003334 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003335 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003336 Builder.defineMacro("__amd64__");
3337 Builder.defineMacro("__amd64");
3338 Builder.defineMacro("__x86_64");
3339 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003340 if (getTriple().getArchName() == "x86_64h") {
3341 Builder.defineMacro("__x86_64h");
3342 Builder.defineMacro("__x86_64h__");
3343 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003344 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003345 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003346 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003347
Chris Lattnerecd49032009-03-02 22:27:17 +00003348 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003349 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3350 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003351 switch (CPU) {
3352 case CK_Generic:
3353 break;
3354 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003355 // The rest are coming from the i386 define above.
3356 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003357 break;
3358 case CK_i486:
3359 case CK_WinChipC6:
3360 case CK_WinChip2:
3361 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003362 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003363 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003364 case CK_PentiumMMX:
3365 Builder.defineMacro("__pentium_mmx__");
3366 Builder.defineMacro("__tune_pentium_mmx__");
3367 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003368 case CK_i586:
3369 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003370 defineCPUMacros(Builder, "i586");
3371 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003372 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003373 case CK_Pentium3:
3374 case CK_Pentium3M:
3375 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003376 Builder.defineMacro("__tune_pentium3__");
3377 // Fallthrough
3378 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003379 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003380 Builder.defineMacro("__tune_pentium2__");
3381 // Fallthrough
3382 case CK_PentiumPro:
3383 Builder.defineMacro("__tune_i686__");
3384 Builder.defineMacro("__tune_pentiumpro__");
3385 // Fallthrough
3386 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003387 Builder.defineMacro("__i686");
3388 Builder.defineMacro("__i686__");
3389 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3390 Builder.defineMacro("__pentiumpro");
3391 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003392 break;
3393 case CK_Pentium4:
3394 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003395 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003396 break;
3397 case CK_Yonah:
3398 case CK_Prescott:
3399 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003400 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003401 break;
3402 case CK_Core2:
3403 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003404 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003405 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003406 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003407 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003408 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003409 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003410 defineCPUMacros(Builder, "slm");
3411 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003412 case CK_Nehalem:
3413 case CK_Westmere:
3414 case CK_SandyBridge:
3415 case CK_IvyBridge:
3416 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003417 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003418 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003419 // FIXME: Historically, we defined this legacy name, it would be nice to
3420 // remove it at some point. We've never exposed fine-grained names for
3421 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003422 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003423 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003424 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003425 defineCPUMacros(Builder, "skx");
3426 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003427 case CK_Cannonlake:
3428 break;
Craig Topper449314e2013-08-20 07:09:39 +00003429 case CK_KNL:
3430 defineCPUMacros(Builder, "knl");
3431 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003432 case CK_Lakemont:
3433 Builder.defineMacro("__tune_lakemont__");
3434 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003435 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003436 Builder.defineMacro("__k6_2__");
3437 Builder.defineMacro("__tune_k6_2__");
3438 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003439 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003440 if (CPU != CK_K6_2) { // In case of fallthrough
3441 // FIXME: GCC may be enabling these in cases where some other k6
3442 // architecture is specified but -m3dnow is explicitly provided. The
3443 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003444 Builder.defineMacro("__k6_3__");
3445 Builder.defineMacro("__tune_k6_3__");
3446 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003447 // Fallthrough
3448 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003449 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003450 break;
3451 case CK_Athlon:
3452 case CK_AthlonThunderbird:
3453 case CK_Athlon4:
3454 case CK_AthlonXP:
3455 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003456 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003457 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003458 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003459 Builder.defineMacro("__tune_athlon_sse__");
3460 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003461 break;
3462 case CK_K8:
3463 case CK_K8SSE3:
3464 case CK_x86_64:
3465 case CK_Opteron:
3466 case CK_OpteronSSE3:
3467 case CK_Athlon64:
3468 case CK_Athlon64SSE3:
3469 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003470 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003471 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003472 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003473 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003474 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003475 case CK_BTVER1:
3476 defineCPUMacros(Builder, "btver1");
3477 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003478 case CK_BTVER2:
3479 defineCPUMacros(Builder, "btver2");
3480 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003481 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003482 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003483 break;
3484 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003485 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003486 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003487 case CK_BDVER3:
3488 defineCPUMacros(Builder, "bdver3");
3489 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003490 case CK_BDVER4:
3491 defineCPUMacros(Builder, "bdver4");
3492 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003493 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003494 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003495 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003496 }
Chris Lattner96e43572009-03-02 22:40:39 +00003497
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003498 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003499 Builder.defineMacro("__REGISTER_PREFIX__", "");
3500
Chris Lattner6df41af2009-04-19 17:32:33 +00003501 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3502 // functions in glibc header files that use FP Stack inline asm which the
3503 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003504 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003505
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003506 if (HasAES)
3507 Builder.defineMacro("__AES__");
3508
Craig Topper3f122a72012-05-31 05:18:48 +00003509 if (HasPCLMUL)
3510 Builder.defineMacro("__PCLMUL__");
3511
Craig Topper22967d42011-12-25 05:06:45 +00003512 if (HasLZCNT)
3513 Builder.defineMacro("__LZCNT__");
3514
Benjamin Kramer1e250392012-07-07 09:39:18 +00003515 if (HasRDRND)
3516 Builder.defineMacro("__RDRND__");
3517
Craig Topper8c7f2512014-11-03 06:51:41 +00003518 if (HasFSGSBASE)
3519 Builder.defineMacro("__FSGSBASE__");
3520
Craig Topper22967d42011-12-25 05:06:45 +00003521 if (HasBMI)
3522 Builder.defineMacro("__BMI__");
3523
3524 if (HasBMI2)
3525 Builder.defineMacro("__BMI2__");
3526
Craig Topper1de83482011-12-29 16:10:46 +00003527 if (HasPOPCNT)
3528 Builder.defineMacro("__POPCNT__");
3529
Michael Liao625a8752012-11-10 05:17:46 +00003530 if (HasRTM)
3531 Builder.defineMacro("__RTM__");
3532
Michael Liao74f4eaf2013-03-26 17:52:08 +00003533 if (HasPRFCHW)
3534 Builder.defineMacro("__PRFCHW__");
3535
Michael Liaoffaae352013-03-29 05:17:55 +00003536 if (HasRDSEED)
3537 Builder.defineMacro("__RDSEED__");
3538
Robert Khasanov50e6f582014-09-19 09:53:48 +00003539 if (HasADX)
3540 Builder.defineMacro("__ADX__");
3541
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003542 if (HasTBM)
3543 Builder.defineMacro("__TBM__");
3544
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003545 if (HasMWAITX)
3546 Builder.defineMacro("__MWAITX__");
3547
Rafael Espindolae62e2792013-08-20 13:44:29 +00003548 switch (XOPLevel) {
3549 case XOP:
3550 Builder.defineMacro("__XOP__");
3551 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003552 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003553 case SSE4A:
3554 Builder.defineMacro("__SSE4A__");
3555 case NoXOP:
3556 break;
3557 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003558
Craig Topperbba778b2012-06-03 21:46:30 +00003559 if (HasFMA)
3560 Builder.defineMacro("__FMA__");
3561
Manman Rena45358c2012-10-11 00:59:55 +00003562 if (HasF16C)
3563 Builder.defineMacro("__F16C__");
3564
Craig Topper679b53a2013-08-21 05:29:10 +00003565 if (HasAVX512CD)
3566 Builder.defineMacro("__AVX512CD__");
3567 if (HasAVX512ER)
3568 Builder.defineMacro("__AVX512ER__");
3569 if (HasAVX512PF)
3570 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003571 if (HasAVX512DQ)
3572 Builder.defineMacro("__AVX512DQ__");
3573 if (HasAVX512BW)
3574 Builder.defineMacro("__AVX512BW__");
3575 if (HasAVX512VL)
3576 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003577 if (HasAVX512VBMI)
3578 Builder.defineMacro("__AVX512VBMI__");
3579 if (HasAVX512IFMA)
3580 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003581
Ben Langmuir58078d02013-09-19 13:22:04 +00003582 if (HasSHA)
3583 Builder.defineMacro("__SHA__");
3584
Craig Toppere33f51f2015-10-16 06:22:36 +00003585 if (HasFXSR)
3586 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003587 if (HasXSAVE)
3588 Builder.defineMacro("__XSAVE__");
3589 if (HasXSAVEOPT)
3590 Builder.defineMacro("__XSAVEOPT__");
3591 if (HasXSAVEC)
3592 Builder.defineMacro("__XSAVEC__");
3593 if (HasXSAVES)
3594 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003595 if (HasPKU)
3596 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003597 if (HasCX16)
3598 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3599
Chris Lattner96e43572009-03-02 22:40:39 +00003600 // Each case falls through to the previous one here.
3601 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003602 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003603 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003604 case AVX2:
3605 Builder.defineMacro("__AVX2__");
3606 case AVX:
3607 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003608 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003609 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003610 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003611 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003612 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003613 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003614 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003615 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003616 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003617 Builder.defineMacro("__SSE2__");
3618 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003619 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003620 Builder.defineMacro("__SSE__");
3621 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003622 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003623 break;
3624 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003625
Derek Schuffc7dd7222012-10-11 15:52:22 +00003626 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003627 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003628 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003629 case AVX2:
3630 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003631 case SSE42:
3632 case SSE41:
3633 case SSSE3:
3634 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003635 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003636 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003637 break;
3638 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003639 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003640 break;
3641 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003642 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003643 }
3644 }
3645
Anders Carlssone437c682010-01-27 03:47:49 +00003646 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003647 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003648 case AMD3DNowAthlon:
3649 Builder.defineMacro("__3dNOW_A__");
3650 case AMD3DNow:
3651 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003652 case MMX:
3653 Builder.defineMacro("__MMX__");
3654 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003655 break;
3656 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003657
3658 if (CPU >= CK_i486) {
3659 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3660 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3661 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3662 }
3663 if (CPU >= CK_i586)
3664 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003665}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003666
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003667bool X86TargetInfo::hasFeature(StringRef Feature) const {
3668 return llvm::StringSwitch<bool>(Feature)
3669 .Case("aes", HasAES)
3670 .Case("avx", SSELevel >= AVX)
3671 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003672 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003673 .Case("avx512cd", HasAVX512CD)
3674 .Case("avx512er", HasAVX512ER)
3675 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003676 .Case("avx512dq", HasAVX512DQ)
3677 .Case("avx512bw", HasAVX512BW)
3678 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003679 .Case("avx512vbmi", HasAVX512VBMI)
3680 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003681 .Case("bmi", HasBMI)
3682 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003683 .Case("clflushopt", HasCLFLUSHOPT)
3684 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003685 .Case("cx16", HasCX16)
3686 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003687 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003688 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003689 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003690 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003691 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003692 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3693 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3694 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003695 .Case("movbe", HasMOVBE)
3696 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003697 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003698 .Case("pcommit", HasPCOMMIT)
3699 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003700 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003701 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003702 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003703 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003704 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003705 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003706 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003707 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003708 .Case("sse", SSELevel >= SSE1)
3709 .Case("sse2", SSELevel >= SSE2)
3710 .Case("sse3", SSELevel >= SSE3)
3711 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003712 .Case("sse4.1", SSELevel >= SSE41)
3713 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003714 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003715 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003716 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003717 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003718 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3719 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003720 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003721 .Case("xsave", HasXSAVE)
3722 .Case("xsavec", HasXSAVEC)
3723 .Case("xsaves", HasXSAVES)
3724 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003725 .Default(false);
3726}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003727
Eric Christopherd9832702015-06-29 21:00:05 +00003728// We can't use a generic validation scheme for the features accepted here
3729// versus subtarget features accepted in the target attribute because the
3730// bitfield structure that's initialized in the runtime only supports the
3731// below currently rather than the full range of subtarget features. (See
3732// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3733bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3734 return llvm::StringSwitch<bool>(FeatureStr)
3735 .Case("cmov", true)
3736 .Case("mmx", true)
3737 .Case("popcnt", true)
3738 .Case("sse", true)
3739 .Case("sse2", true)
3740 .Case("sse3", true)
3741 .Case("sse4.1", true)
3742 .Case("sse4.2", true)
3743 .Case("avx", true)
3744 .Case("avx2", true)
3745 .Case("sse4a", true)
3746 .Case("fma4", true)
3747 .Case("xop", true)
3748 .Case("fma", true)
3749 .Case("avx512f", true)
3750 .Case("bmi", true)
3751 .Case("bmi2", true)
3752 .Default(false);
3753}
3754
Eli Friedman3fd920a2008-08-20 02:34:37 +00003755bool
Anders Carlsson58436352009-02-28 17:11:49 +00003756X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003757 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003758 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003759 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003760 // Constant constraints.
3761 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3762 // instructions.
3763 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3764 // x86_64 instructions.
3765 case 's':
3766 Info.setRequiresImmediate();
3767 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003768 case 'I':
3769 Info.setRequiresImmediate(0, 31);
3770 return true;
3771 case 'J':
3772 Info.setRequiresImmediate(0, 63);
3773 return true;
3774 case 'K':
3775 Info.setRequiresImmediate(-128, 127);
3776 return true;
3777 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003778 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003779 return true;
3780 case 'M':
3781 Info.setRequiresImmediate(0, 3);
3782 return true;
3783 case 'N':
3784 Info.setRequiresImmediate(0, 255);
3785 return true;
3786 case 'O':
3787 Info.setRequiresImmediate(0, 127);
3788 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003789 // Register constraints.
3790 case 'Y': // 'Y' is the first character for several 2-character constraints.
3791 // Shift the pointer to the second character of the constraint.
3792 Name++;
3793 switch (*Name) {
3794 default:
3795 return false;
3796 case '0': // First SSE register.
3797 case 't': // Any SSE register, when SSE2 is enabled.
3798 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3799 case 'm': // Any MMX register, when inter-unit moves enabled.
3800 Info.setAllowsRegister();
3801 return true;
3802 }
3803 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003804 // Constraint 'f' cannot be used for output operands.
3805 if (Info.ConstraintStr[0] == '=')
3806 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003807 Info.setAllowsRegister();
3808 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003809 case 'a': // eax.
3810 case 'b': // ebx.
3811 case 'c': // ecx.
3812 case 'd': // edx.
3813 case 'S': // esi.
3814 case 'D': // edi.
3815 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003816 case 't': // Top of floating point stack.
3817 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003818 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003819 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003820 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003821 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003822 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3823 case 'l': // "Index" registers: any general register that can be used as an
3824 // index in a base+index memory access.
3825 Info.setAllowsRegister();
3826 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003827 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003828 case 'C': // SSE floating point constant.
3829 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003830 return true;
3831 }
3832}
3833
Akira Hatanaka974131e2014-09-18 18:17:18 +00003834bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3835 unsigned Size) const {
3836 // Strip off constraint modifiers.
3837 while (Constraint[0] == '=' ||
3838 Constraint[0] == '+' ||
3839 Constraint[0] == '&')
3840 Constraint = Constraint.substr(1);
3841
3842 return validateOperandSize(Constraint, Size);
3843}
3844
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003845bool X86TargetInfo::validateInputSize(StringRef Constraint,
3846 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003847 return validateOperandSize(Constraint, Size);
3848}
3849
3850bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3851 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003852 switch (Constraint[0]) {
3853 default: break;
3854 case 'y':
3855 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003856 case 'f':
3857 case 't':
3858 case 'u':
3859 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003860 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003861 if (SSELevel >= AVX512F)
3862 // 512-bit zmm registers can be used if target supports AVX512F.
3863 return Size <= 512U;
3864 else if (SSELevel >= AVX)
3865 // 256-bit ymm registers can be used if target supports AVX.
3866 return Size <= 256U;
3867 return Size <= 128U;
3868 case 'Y':
3869 // 'Y' is the first character for several 2-character constraints.
3870 switch (Constraint[1]) {
3871 default: break;
3872 case 'm':
3873 // 'Ym' is synonymous with 'y'.
3874 return Size <= 64;
3875 case 'i':
3876 case 't':
3877 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3878 if (SSELevel >= AVX512F)
3879 return Size <= 512U;
3880 else if (SSELevel >= AVX)
3881 return Size <= 256U;
3882 return SSELevel >= SSE2 && Size <= 128U;
3883 }
3884
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003885 }
3886
3887 return true;
3888}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003889
Eli Friedman3fd920a2008-08-20 02:34:37 +00003890std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003891X86TargetInfo::convertConstraint(const char *&Constraint) const {
3892 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003893 case 'a': return std::string("{ax}");
3894 case 'b': return std::string("{bx}");
3895 case 'c': return std::string("{cx}");
3896 case 'd': return std::string("{dx}");
3897 case 'S': return std::string("{si}");
3898 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003899 case 'p': // address
3900 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003901 case 't': // top of floating point stack.
3902 return std::string("{st}");
3903 case 'u': // second from top of floating point stack.
3904 return std::string("{st(1)}"); // second from top of floating point stack.
3905 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003906 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003907 }
3908}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003909
Eli Friedman3fd920a2008-08-20 02:34:37 +00003910// X86-32 generic target
3911class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003912public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003913 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3914 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003915 DoubleAlign = LongLongAlign = 32;
3916 LongDoubleWidth = 96;
3917 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003918 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003919 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003920 SizeType = UnsignedInt;
3921 PtrDiffType = SignedInt;
3922 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003923 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003924
3925 // Use fpret for all types.
3926 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3927 (1 << TargetInfo::Double) |
3928 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003929
3930 // x86-32 has atomics up to 8 bytes
3931 // FIXME: Check that we actually have cmpxchg8b before setting
3932 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3933 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003934 }
Craig Topper3164f332014-03-11 03:39:26 +00003935 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003936 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003937 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003938
Craig Topper3164f332014-03-11 03:39:26 +00003939 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003940 if (RegNo == 0) return 0;
3941 if (RegNo == 1) return 2;
3942 return -1;
3943 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003944 bool validateOperandSize(StringRef Constraint,
3945 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003946 switch (Constraint[0]) {
3947 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003948 case 'R':
3949 case 'q':
3950 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003951 case 'a':
3952 case 'b':
3953 case 'c':
3954 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003955 case 'S':
3956 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003957 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003958 case 'A':
3959 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003960 }
3961
Akira Hatanaka974131e2014-09-18 18:17:18 +00003962 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003963 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003964};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003965
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003966class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3967public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003968 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3969 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003970
Craig Topper3164f332014-03-11 03:39:26 +00003971 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003972 unsigned Major, Minor, Micro;
3973 getTriple().getOSVersion(Major, Minor, Micro);
3974 // New NetBSD uses the default rounding mode.
3975 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3976 return X86_32TargetInfo::getFloatEvalMethod();
3977 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003978 return 1;
3979 }
3980};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003981
Eli Friedmane3aa4542009-07-05 18:47:56 +00003982class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3983public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003984 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3985 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003986 SizeType = UnsignedLong;
3987 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003988 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003989 }
3990};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003991
Eli Friedman9fa28852012-08-08 23:57:20 +00003992class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3993public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003994 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3995 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003996 SizeType = UnsignedLong;
3997 IntPtrType = SignedLong;
3998 PtrDiffType = SignedLong;
3999 }
4000};
Eli Friedman9fa28852012-08-08 23:57:20 +00004001
Torok Edwinb2b37c62009-06-30 17:10:35 +00004002class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004003public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004004 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4005 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004006 LongDoubleWidth = 128;
4007 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004008 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004009 MaxVectorAlign = 256;
4010 // The watchOS simulator uses the builtin bool type for Objective-C.
4011 llvm::Triple T = llvm::Triple(Triple);
4012 if (T.isWatchOS())
4013 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004014 SizeType = UnsignedLong;
4015 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004016 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004017 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004018 }
4019
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004020 bool handleTargetFeatures(std::vector<std::string> &Features,
4021 DiagnosticsEngine &Diags) override {
4022 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4023 Diags))
4024 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004025 // We now know the features we have: we can decide how to align vectors.
4026 MaxVectorAlign =
4027 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004028 return true;
4029 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004030};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004031
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004032// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004033class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004034public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004035 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4036 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004037 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004038 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004039 bool IsWinCOFF =
4040 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004041 resetDataLayout(IsWinCOFF
4042 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4043 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004044 }
Craig Topper3164f332014-03-11 03:39:26 +00004045 void getTargetDefines(const LangOptions &Opts,
4046 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004047 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4048 }
4049};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004050
4051// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004052class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004053public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004054 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4055 const TargetOptions &Opts)
4056 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004057 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004058 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4059 }
Craig Topper3164f332014-03-11 03:39:26 +00004060 void getTargetDefines(const LangOptions &Opts,
4061 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004062 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4063 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4064 // The value of the following reflects processor type.
4065 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4066 // We lost the original triple, so we use the default.
4067 Builder.defineMacro("_M_IX86", "600");
4068 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004069};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004070
David Majnemerae1ed0e2015-05-28 04:36:18 +00004071static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004072 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4073 // supports __declspec natively under -fms-extensions, but we define a no-op
4074 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004075 if (Opts.MicrosoftExt)
4076 Builder.defineMacro("__declspec", "__declspec");
4077 else
4078 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4079
4080 if (!Opts.MicrosoftExt) {
4081 // Provide macros for all the calling convention keywords. Provide both
4082 // single and double underscore prefixed variants. These are available on
4083 // x64 as well as x86, even though they have no effect.
4084 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4085 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004086 std::string GCCSpelling = "__attribute__((__";
4087 GCCSpelling += CC;
4088 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004089 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4090 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4091 }
4092 }
4093}
4094
David Majnemerae1ed0e2015-05-28 04:36:18 +00004095static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4096 Builder.defineMacro("__MSVCRT__");
4097 Builder.defineMacro("__MINGW32__");
4098 addCygMingDefines(Opts, Builder);
4099}
4100
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004101// x86-32 MinGW target
4102class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4103public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004104 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4105 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004106 void getTargetDefines(const LangOptions &Opts,
4107 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004108 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004109 DefineStd(Builder, "WIN32", Opts);
4110 DefineStd(Builder, "WINNT", Opts);
4111 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004112 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004113 }
4114};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004115
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004116// x86-32 Cygwin target
4117class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4118public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004119 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4120 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004121 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004122 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004123 resetDataLayout("e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004124 }
Craig Topper3164f332014-03-11 03:39:26 +00004125 void getTargetDefines(const LangOptions &Opts,
4126 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004127 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004128 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004129 Builder.defineMacro("__CYGWIN__");
4130 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004131 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004132 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004133 if (Opts.CPlusPlus)
4134 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004135 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004136};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004137
Chris Lattnerb986aba2010-04-11 19:29:39 +00004138// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004139class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004140public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004141 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004142 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004143 }
Craig Topper3164f332014-03-11 03:39:26 +00004144 void getTargetDefines(const LangOptions &Opts,
4145 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004146 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004147 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004148 }
4149};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004150
Alexey Bataevc99b0492015-11-25 09:24:26 +00004151// X86-32 MCU target
4152class MCUX86_32TargetInfo : public X86_32TargetInfo {
4153public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004154 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4155 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004156 LongDoubleWidth = 64;
4157 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004158 resetDataLayout("e-m:e-p:32:32-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32");
Andrey Bokhanko6e34c1d2016-02-04 11:54:45 +00004159 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004160 }
4161
4162 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4163 // On MCU we support only C calling convention.
4164 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4165 }
4166
4167 void getTargetDefines(const LangOptions &Opts,
4168 MacroBuilder &Builder) const override {
4169 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4170 Builder.defineMacro("__iamcu");
4171 Builder.defineMacro("__iamcu__");
4172 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004173
4174 bool allowsLargerPreferedTypeAlignment() const override {
4175 return false;
4176 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004177};
4178
Douglas Gregor9fabd852011-07-01 22:41:14 +00004179// RTEMS Target
4180template<typename Target>
4181class RTEMSTargetInfo : public OSTargetInfo<Target> {
4182protected:
Craig Topper3164f332014-03-11 03:39:26 +00004183 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4184 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004185 // RTEMS defines; list based off of gcc output
4186
Douglas Gregor9fabd852011-07-01 22:41:14 +00004187 Builder.defineMacro("__rtems__");
4188 Builder.defineMacro("__ELF__");
4189 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004190
Douglas Gregor9fabd852011-07-01 22:41:14 +00004191public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004192 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4193 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004194 switch (Triple.getArch()) {
4195 default:
4196 case llvm::Triple::x86:
4197 // this->MCountName = ".mcount";
4198 break;
4199 case llvm::Triple::mips:
4200 case llvm::Triple::mipsel:
4201 case llvm::Triple::ppc:
4202 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004203 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004204 // this->MCountName = "_mcount";
4205 break;
4206 case llvm::Triple::arm:
4207 // this->MCountName = "__mcount";
4208 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004209 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004210 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004211};
4212
Douglas Gregor9fabd852011-07-01 22:41:14 +00004213// x86-32 RTEMS target
4214class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4215public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004216 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4217 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004218 SizeType = UnsignedLong;
4219 IntPtrType = SignedLong;
4220 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004221 }
Craig Topper3164f332014-03-11 03:39:26 +00004222 void getTargetDefines(const LangOptions &Opts,
4223 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004224 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4225 Builder.defineMacro("__INTEL__");
4226 Builder.defineMacro("__rtems__");
4227 }
4228};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004229
Eli Friedman3fd920a2008-08-20 02:34:37 +00004230// x86-64 generic target
4231class X86_64TargetInfo : public X86TargetInfo {
4232public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004233 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4234 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004235 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004236 bool IsWinCOFF =
4237 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004238 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004239 LongDoubleWidth = 128;
4240 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004241 LargeArrayMinWidth = 128;
4242 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004243 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004244 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4245 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4246 IntPtrType = IsX32 ? SignedInt : SignedLong;
4247 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004248 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004249 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004250
Eric Christopher917e9522014-11-18 22:36:15 +00004251 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004252 resetDataLayout(IsX32
4253 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4254 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4255 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004256
4257 // Use fpret only for long double.
4258 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004259
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004260 // Use fp2ret for _Complex long double.
4261 ComplexLongDoubleUsesFP2Ret = true;
4262
Charles Davisc7d5c942015-09-17 20:55:33 +00004263 // Make __builtin_ms_va_list available.
4264 HasBuiltinMSVaList = true;
4265
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004266 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004267 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004268 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004269 }
Craig Topper3164f332014-03-11 03:39:26 +00004270 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004271 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004272 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004273
Craig Topper3164f332014-03-11 03:39:26 +00004274 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004275 if (RegNo == 0) return 0;
4276 if (RegNo == 1) return 1;
4277 return -1;
4278 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004279
Craig Topper3164f332014-03-11 03:39:26 +00004280 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004281 switch (CC) {
4282 case CC_C:
4283 case CC_Swift:
4284 case CC_X86VectorCall:
4285 case CC_IntelOclBicc:
4286 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004287 case CC_PreserveMost:
4288 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004289 return CCCR_OK;
4290 default:
4291 return CCCR_Warning;
4292 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004293 }
4294
Craig Topper3164f332014-03-11 03:39:26 +00004295 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004296 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004297 }
4298
Pavel Chupinfd223e12014-08-04 12:39:43 +00004299 // for x32 we need it here explicitly
4300 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004301 unsigned getUnwindWordWidth() const override { return 64; }
4302 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004303
4304 bool validateGlobalRegisterVariable(StringRef RegName,
4305 unsigned RegSize,
4306 bool &HasSizeMismatch) const override {
4307 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4308 // handle.
4309 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4310 // Check that the register size is 64-bit.
4311 HasSizeMismatch = RegSize != 64;
4312 return true;
4313 }
4314
4315 // Check if the register is a 32-bit register the backend can handle.
4316 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4317 HasSizeMismatch);
4318 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004319};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004320
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004321// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004322class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004323public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004324 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4325 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004326 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004327 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004328 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004329 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004330 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004331 SizeType = UnsignedLongLong;
4332 PtrDiffType = SignedLongLong;
4333 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004334 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004335
Craig Topper3164f332014-03-11 03:39:26 +00004336 void getTargetDefines(const LangOptions &Opts,
4337 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004338 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004339 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004340 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004341
Craig Topper3164f332014-03-11 03:39:26 +00004342 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004343 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004344 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004345
Craig Topper3164f332014-03-11 03:39:26 +00004346 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004347 switch (CC) {
4348 case CC_X86StdCall:
4349 case CC_X86ThisCall:
4350 case CC_X86FastCall:
4351 return CCCR_Ignore;
4352 case CC_C:
4353 case CC_X86VectorCall:
4354 case CC_IntelOclBicc:
4355 case CC_X86_64SysV:
4356 return CCCR_OK;
4357 default:
4358 return CCCR_Warning;
4359 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004360 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004361};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004362
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004363// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004364class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004365public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004366 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4367 const TargetOptions &Opts)
4368 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004369 LongDoubleWidth = LongDoubleAlign = 64;
4370 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004371 }
Craig Topper3164f332014-03-11 03:39:26 +00004372 void getTargetDefines(const LangOptions &Opts,
4373 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004374 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4375 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004376 Builder.defineMacro("_M_X64", "100");
4377 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004378 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004379};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004380
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004381// x86-64 MinGW target
4382class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4383public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004384 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4385 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004386 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4387 // with x86 FP ops. Weird.
4388 LongDoubleWidth = LongDoubleAlign = 128;
4389 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4390 }
4391
Craig Topper3164f332014-03-11 03:39:26 +00004392 void getTargetDefines(const LangOptions &Opts,
4393 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004394 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004395 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004396 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004397 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004398
4399 // GCC defines this macro when it is using __gxx_personality_seh0.
4400 if (!Opts.SjLjExceptions)
4401 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004402 }
4403};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004404
Yaron Kerend030d112015-07-22 17:38:19 +00004405// x86-64 Cygwin target
4406class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4407public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004408 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4409 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004410 TLSSupported = false;
4411 WCharType = UnsignedShort;
4412 }
4413 void getTargetDefines(const LangOptions &Opts,
4414 MacroBuilder &Builder) const override {
4415 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4416 Builder.defineMacro("__x86_64__");
4417 Builder.defineMacro("__CYGWIN__");
4418 Builder.defineMacro("__CYGWIN64__");
4419 addCygMingDefines(Opts, Builder);
4420 DefineStd(Builder, "unix", Opts);
4421 if (Opts.CPlusPlus)
4422 Builder.defineMacro("_GNU_SOURCE");
4423
4424 // GCC defines this macro when it is using __gxx_personality_seh0.
4425 if (!Opts.SjLjExceptions)
4426 Builder.defineMacro("__SEH__");
4427 }
4428};
4429
Eli Friedman2857ccb2009-07-01 03:36:11 +00004430class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4431public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004432 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4433 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004434 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004435 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4436 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004437 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004438 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004439 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004440 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004441
4442 bool handleTargetFeatures(std::vector<std::string> &Features,
4443 DiagnosticsEngine &Diags) override {
4444 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4445 Diags))
4446 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004447 // We now know the features we have: we can decide how to align vectors.
4448 MaxVectorAlign =
4449 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004450 return true;
4451 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004452};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004453
Eli Friedman245f2292009-07-05 22:31:18 +00004454class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4455public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004456 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4457 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004458 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004459 Int64Type = SignedLongLong;
4460 }
4461};
Eli Friedman245f2292009-07-05 22:31:18 +00004462
Eli Friedman9fa28852012-08-08 23:57:20 +00004463class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4464public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004465 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4466 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004467 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004468 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004469 }
4470};
Tim Northover9bb857a2013-01-31 12:13:10 +00004471
Eli Friedmanf05b7722008-08-20 07:44:10 +00004472class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004473 // Possible FPU choices.
4474 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004475 VFP2FPU = (1 << 0),
4476 VFP3FPU = (1 << 1),
4477 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004478 NeonFPU = (1 << 3),
4479 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004480 };
4481
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004482 // Possible HWDiv features.
4483 enum HWDivMode {
4484 HWDivThumb = (1 << 0),
4485 HWDivARM = (1 << 1)
4486 };
4487
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004488 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004489 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004490 }
4491
4492 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4493 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004494
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004495 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004496
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004497 StringRef CPUProfile;
4498 StringRef CPUAttr;
4499
Rafael Espindolaeb265472013-08-21 21:59:03 +00004500 enum {
4501 FP_Default,
4502 FP_VFP,
4503 FP_Neon
4504 } FPMath;
4505
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004506 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004507 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004508 unsigned ArchProfile;
4509 unsigned ArchVersion;
4510
Bernard Ogdenda13af32013-10-24 18:32:51 +00004511 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004512
Logan Chien57086ce2012-10-10 06:56:20 +00004513 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004514 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004515
4516 // Initialized via features.
4517 unsigned SoftFloat : 1;
4518 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004519
Bernard Ogden18b57012013-10-29 09:47:51 +00004520 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004521 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004522 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004523 unsigned Unaligned : 1;
4524
4525 enum {
4526 LDREX_B = (1 << 0), /// byte (8-bit)
4527 LDREX_H = (1 << 1), /// half (16-bit)
4528 LDREX_W = (1 << 2), /// word (32-bit)
4529 LDREX_D = (1 << 3), /// double (64-bit)
4530 };
4531
4532 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004533
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004534 // ACLE 6.5.1 Hardware floating point
4535 enum {
4536 HW_FP_HP = (1 << 1), /// half (16-bit)
4537 HW_FP_SP = (1 << 2), /// single (32-bit)
4538 HW_FP_DP = (1 << 3), /// double (64-bit)
4539 };
4540 uint32_t HW_FP;
4541
Chris Lattner5cc15e02010-03-03 19:03:45 +00004542 static const Builtin::Info BuiltinInfo[];
4543
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004544 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004545 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004546
4547 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004548 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004549
Renato Golin9ba39232015-02-27 16:35:48 +00004550 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4551 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4552 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004553 SizeType = UnsignedLong;
4554 else
4555 SizeType = UnsignedInt;
4556
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004557 switch (T.getOS()) {
4558 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004559 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004560 break;
4561 case llvm::Triple::Win32:
4562 WCharType = UnsignedShort;
4563 break;
4564 case llvm::Triple::Linux:
4565 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004566 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4567 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004568 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004569 }
4570
4571 UseBitFieldTypeAlignment = true;
4572
4573 ZeroLengthBitfieldBoundary = 0;
4574
Tim Northover147cd2f2014-10-14 22:12:21 +00004575 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4576 // so set preferred for small types to 32.
4577 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004578 resetDataLayout(BigEndian
4579 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4580 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004581 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004582 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004583 resetDataLayout("e"
4584 "-m:w"
4585 "-p:32:32"
4586 "-i64:64"
4587 "-v128:64:128"
4588 "-a:0:32"
4589 "-n32"
4590 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004591 } else if (T.isOSNaCl()) {
4592 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004593 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004594 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004595 resetDataLayout(BigEndian
4596 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4597 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004598 }
4599
4600 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004601 }
4602
Tim Northover5627d392015-10-30 16:30:45 +00004603 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004604 const llvm::Triple &T = getTriple();
4605
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004606 IsAAPCS = false;
4607
Tim Northover5627d392015-10-30 16:30:45 +00004608 if (IsAAPCS16)
4609 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4610 else
4611 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004612
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004613 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004614 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004615 SizeType = UnsignedInt;
4616 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004617 SizeType = UnsignedLong;
4618
4619 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4620 WCharType = SignedInt;
4621
4622 // Do not respect the alignment of bit-field types when laying out
4623 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4624 UseBitFieldTypeAlignment = false;
4625
4626 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4627 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4628 /// gcc.
4629 ZeroLengthBitfieldBoundary = 32;
4630
Tim Northover5627d392015-10-30 16:30:45 +00004631 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4632 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004633 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004634 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004635 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004636 BigEndian
4637 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
James Y Knightb214cbc2016-03-04 19:00:41 +00004638 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
Tim Northover147cd2f2014-10-14 22:12:21 +00004639 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004640 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004641 BigEndian
4642 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
James Y Knightb214cbc2016-03-04 19:00:41 +00004643 : "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 +00004644
4645 // FIXME: Override "preferred align" for double and long long.
4646 }
4647
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004648 void setArchInfo() {
4649 StringRef ArchName = getTriple().getArchName();
4650
Renato Goline84b0002015-10-08 16:43:26 +00004651 ArchISA = llvm::ARM::parseArchISA(ArchName);
4652 CPU = llvm::ARM::getDefaultCPU(ArchName);
4653 unsigned AK = llvm::ARM::parseArch(ArchName);
4654 if (AK != llvm::ARM::AK_INVALID)
4655 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004656 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004657 }
4658
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004659 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004660 StringRef SubArch;
4661
4662 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004663 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004664 SubArch = llvm::ARM::getSubArch(ArchKind);
4665 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4666 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004667
4668 // cache CPU related strings
4669 CPUAttr = getCPUAttr();
4670 CPUProfile = getCPUProfile();
4671 }
4672
4673 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004674 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004675 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004676 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004677 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4678 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004679 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004680 if (ArchProfile == llvm::ARM::PK_M) {
4681 MaxAtomicPromoteWidth = 32;
4682 if (ShouldUseInlineAtomic)
4683 MaxAtomicInlineWidth = 32;
4684 }
4685 else {
4686 MaxAtomicPromoteWidth = 64;
4687 if (ShouldUseInlineAtomic)
4688 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004689 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004690 }
4691
4692 bool isThumb() const {
4693 return (ArchISA == llvm::ARM::IK_THUMB);
4694 }
4695
4696 bool supportsThumb() const {
4697 return CPUAttr.count('T') || ArchVersion >= 6;
4698 }
4699
4700 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004701 return CPUAttr.equals("6T2") ||
4702 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004703 }
4704
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004705 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004706 // For most sub-arches, the build attribute CPU name is enough.
4707 // For Cortex variants, it's slightly different.
4708 switch(ArchKind) {
4709 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004710 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004711 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004712 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004713 case llvm::ARM::AK_ARMV7S:
4714 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004715 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004716 return "7A";
4717 case llvm::ARM::AK_ARMV7R:
4718 return "7R";
4719 case llvm::ARM::AK_ARMV7M:
4720 return "7M";
4721 case llvm::ARM::AK_ARMV7EM:
4722 return "7EM";
4723 case llvm::ARM::AK_ARMV8A:
4724 return "8A";
4725 case llvm::ARM::AK_ARMV8_1A:
4726 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004727 case llvm::ARM::AK_ARMV8_2A:
4728 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004729 case llvm::ARM::AK_ARMV8MBaseline:
4730 return "8M_BASE";
4731 case llvm::ARM::AK_ARMV8MMainline:
4732 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004733 }
4734 }
4735
4736 StringRef getCPUProfile() const {
4737 switch(ArchProfile) {
4738 case llvm::ARM::PK_A:
4739 return "A";
4740 case llvm::ARM::PK_R:
4741 return "R";
4742 case llvm::ARM::PK_M:
4743 return "M";
4744 default:
4745 return "";
4746 }
4747 }
4748
Chris Lattner17df24e2008-04-21 18:56:49 +00004749public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004750 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4751 bool IsBigEndian)
4752 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4753 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004754 BigEndian = IsBigEndian;
4755
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004756 switch (getTriple().getOS()) {
4757 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004758 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004759 break;
4760 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004761 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004762 break;
4763 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004764
Renato Goline84b0002015-10-08 16:43:26 +00004765 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004766 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004767
Chris Lattner1a8f3942010-04-23 16:29:58 +00004768 // {} in inline assembly are neon specifiers, not assembly variant
4769 // specifiers.
4770 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004771
Eric Christopher0e261882014-12-05 01:06:59 +00004772 // FIXME: This duplicates code from the driver that sets the -target-abi
4773 // option - this code is used if -target-abi isn't passed and should
4774 // be unified in some way.
4775 if (Triple.isOSBinFormatMachO()) {
4776 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4777 // the frontend matches that.
4778 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4779 Triple.getOS() == llvm::Triple::UnknownOS ||
4780 StringRef(CPU).startswith("cortex-m")) {
4781 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004782 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004783 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004784 } else {
4785 setABI("apcs-gnu");
4786 }
4787 } else if (Triple.isOSWindows()) {
4788 // FIXME: this is invalid for WindowsCE
4789 setABI("aapcs");
4790 } else {
4791 // Select the default based on the platform.
4792 switch (Triple.getEnvironment()) {
4793 case llvm::Triple::Android:
4794 case llvm::Triple::GNUEABI:
4795 case llvm::Triple::GNUEABIHF:
4796 setABI("aapcs-linux");
4797 break;
4798 case llvm::Triple::EABIHF:
4799 case llvm::Triple::EABI:
4800 setABI("aapcs");
4801 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004802 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004803 setABI("apcs-gnu");
4804 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004805 default:
4806 if (Triple.getOS() == llvm::Triple::NetBSD)
4807 setABI("apcs-gnu");
4808 else
4809 setABI("aapcs");
4810 break;
4811 }
4812 }
John McCall86353412010-08-21 22:46:04 +00004813
4814 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004815 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004816
Renato Golin15b86152015-07-03 16:41:13 +00004817 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004818 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004819
James Molloya7139222012-03-12 09:14:10 +00004820 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004821 // the alignment of the zero-length bitfield is greater than the member
4822 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004823 // zero length bitfield.
4824 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004825
4826 if (Triple.getOS() == llvm::Triple::Linux ||
4827 Triple.getOS() == llvm::Triple::UnknownOS)
4828 this->MCountName =
4829 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004830 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004831
Alp Toker4925ba72014-06-07 23:30:42 +00004832 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004833
Craig Topper3164f332014-03-11 03:39:26 +00004834 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004835 ABI = Name;
4836
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004837 // The defaults (above) are for AAPCS, check if we need to change them.
4838 //
4839 // FIXME: We need support for -meabi... we could just mangle it into the
4840 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004841 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004842 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004843 return true;
4844 }
4845 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4846 setABIAAPCS();
4847 return true;
4848 }
4849 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004850 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004851
Renato Golinf5c4dec2015-05-27 13:33:00 +00004852 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004853 bool
4854 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4855 StringRef CPU,
4856 const std::vector<std::string> &FeaturesVec) const override {
4857
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004858 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004859 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004860
4861 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004862 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004863 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4864
4865 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004866 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004867 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4868
4869 for (const char *Feature : TargetFeatures)
4870 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004871 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004872
Eric Christopher007b0a02015-08-28 22:32:01 +00004873 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004874 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004875
Craig Topper3164f332014-03-11 03:39:26 +00004876 bool handleTargetFeatures(std::vector<std::string> &Features,
4877 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004878 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004879 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004880 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004881 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004882 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004883 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004884 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004885
Ranjeet Singhac08e532015-06-24 23:39:25 +00004886 // This does not diagnose illegal cases like having both
4887 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4888 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004889 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004890 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004891 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004892 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004893 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004894 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004895 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004896 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004897 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004898 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004899 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004900 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004901 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004902 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004903 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004904 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004905 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004906 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004907 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004908 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004909 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004910 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004911 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004912 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004913 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004914 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004915 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004916 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004917 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004918 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004919 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004920 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004921 } else if (Feature == "+strict-align") {
4922 Unaligned = 0;
4923 } else if (Feature == "+fp16") {
4924 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004925 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004926 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004927 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004928
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004929 switch (ArchVersion) {
4930 case 6:
4931 if (ArchProfile == llvm::ARM::PK_M)
4932 LDREX = 0;
4933 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4934 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4935 else
4936 LDREX = LDREX_W;
4937 break;
4938 case 7:
4939 if (ArchProfile == llvm::ARM::PK_M)
4940 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4941 else
4942 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4943 break;
4944 case 8:
4945 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4946 }
4947
Rafael Espindolaeb265472013-08-21 21:59:03 +00004948 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4949 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4950 return false;
4951 }
4952
4953 if (FPMath == FP_Neon)
4954 Features.push_back("+neonfp");
4955 else if (FPMath == FP_VFP)
4956 Features.push_back("-neonfp");
4957
Daniel Dunbar893d4752009-12-19 04:15:38 +00004958 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004959 auto Feature =
4960 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4961 if (Feature != Features.end())
4962 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004963
Rafael Espindolaeb265472013-08-21 21:59:03 +00004964 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004965 }
4966
Craig Topper3164f332014-03-11 03:39:26 +00004967 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004968 return llvm::StringSwitch<bool>(Feature)
4969 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004970 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004971 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004972 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004973 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004974 .Case("hwdiv", HWDiv & HWDivThumb)
4975 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004976 .Default(false);
4977 }
Renato Golin15b86152015-07-03 16:41:13 +00004978
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004979 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004980 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004981 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004982
Renato Golin15b86152015-07-03 16:41:13 +00004983 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004984 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004985 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004986 CPU = Name;
4987 return true;
4988 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004989
Craig Topper3164f332014-03-11 03:39:26 +00004990 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004991
Craig Topper3164f332014-03-11 03:39:26 +00004992 void getTargetDefines(const LangOptions &Opts,
4993 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004994 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004995 Builder.defineMacro("__arm");
4996 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00004997 // For bare-metal none-eabi.
4998 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
4999 getTriple().getEnvironment() == llvm::Triple::EABI)
5000 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005001
Chris Lattnerecd49032009-03-02 22:27:17 +00005002 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005003 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005004
5005 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5006 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005007 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005008 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5009
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005010 if (!CPUAttr.empty())
5011 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005012
5013 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005014 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005015 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005016
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005017 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005018 // ACLE 6.5.7 Crypto Extension
5019 if (Crypto)
5020 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5021 // ACLE 6.5.8 CRC32 Extension
5022 if (CRC)
5023 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5024 // ACLE 6.5.10 Numeric Maximum and Minimum
5025 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5026 // ACLE 6.5.9 Directed Rounding
5027 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005028 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005029
5030 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5031 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005032 // NOTE that the default profile is assumed to be 'A'
5033 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005034 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5035
Bradley Smithf4affc12016-03-03 13:52:22 +00005036 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5037 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5038 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5039 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005040 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005041 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005042 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005043 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5044
5045 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5046 // instruction set such as ARM or Thumb.
5047 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5048
5049 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5050
5051 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005052 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005053 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005054
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005055 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005056 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005057 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005058
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005059 // ACLE 6.4.4 LDREX/STREX
5060 if (LDREX)
5061 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5062
5063 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005064 if (ArchVersion == 5 ||
5065 (ArchVersion == 6 && CPUProfile != "M") ||
5066 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005067 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5068
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005069 // ACLE 6.5.1 Hardware Floating Point
5070 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005071 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005072
Yi Konga44c4d72014-06-27 21:25:42 +00005073 // ACLE predefines.
5074 Builder.defineMacro("__ARM_ACLE", "200");
5075
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005076 // FP16 support (we currently only support IEEE format).
5077 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5078 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5079
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005080 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005081 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005082 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5083
Mike Stump9d54bd72009-04-08 02:07:04 +00005084 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005085
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005086 // FIXME: It's more complicated than this and we don't really support
5087 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005088 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005089 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005090 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005091
David Tweed8f676532012-10-25 13:33:01 +00005092 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005093 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005094 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005095 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005096 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005097 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005098 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005099
Tim Northover28fc0e12016-04-28 13:59:55 +00005100 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5101 ABI == "aapcs16")
5102 Builder.defineMacro("__ARM_PCS_VFP", "1");
5103
Daniel Dunbar893d4752009-12-19 04:15:38 +00005104 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005105 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005106
5107 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005108 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005109
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005110 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005111 Builder.defineMacro("__THUMBEL__");
5112 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005113 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005114 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005115 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005116
5117 // ACLE 6.4.9 32-bit SIMD instructions
5118 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5119 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5120
5121 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005122 if (((HWDiv & HWDivThumb) && isThumb()) ||
5123 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005124 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005125 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005126 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005127
5128 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005129 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005130
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005131 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005132 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005133 if (FPU & VFP2FPU)
5134 Builder.defineMacro("__ARM_VFPV2__");
5135 if (FPU & VFP3FPU)
5136 Builder.defineMacro("__ARM_VFPV3__");
5137 if (FPU & VFP4FPU)
5138 Builder.defineMacro("__ARM_VFPV4__");
5139 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005140
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005141 // This only gets set when Neon instructions are actually available, unlike
5142 // the VFP define, hence the soft float and arch check. This is subtly
5143 // different from gcc, we follow the intent which was that it should be set
5144 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005145 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005146 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005147 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005148 // current AArch32 NEON implementations do not support double-precision
5149 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005150 Builder.defineMacro("__ARM_NEON_FP",
5151 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005152 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005153
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005154 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5155 Opts.ShortWChar ? "2" : "4");
5156
5157 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5158 Opts.ShortEnums ? "1" : "4");
5159
Bradley Smithf4affc12016-03-03 13:52:22 +00005160 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005161 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5162 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5163 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5164 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5165 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005166
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005167 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005168 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005169 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005170 }
5171
5172 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005173 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005174 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5175 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005176 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005177 }
5178
5179 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005180 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005181 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005182
5183 if (Opts.UnsafeFPMath)
5184 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005185
5186 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5187 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005188 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005189
Craig Topper6c03a542015-10-19 04:51:35 +00005190 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5191 return llvm::makeArrayRef(BuiltinInfo,
5192 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005193 }
Craig Topper3164f332014-03-11 03:39:26 +00005194 bool isCLZForZeroUndef() const override { return false; }
5195 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005196 return IsAAPCS
5197 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005198 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5199 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005200 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005201 ArrayRef<const char *> getGCCRegNames() const override;
5202 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005203 bool validateAsmConstraint(const char *&Name,
5204 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005205 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005206 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005207 case 'l': // r0-r7
5208 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005209 case 't': // VFP Floating point register single precision
5210 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005211 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005212 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005213 case 'I':
5214 case 'J':
5215 case 'K':
5216 case 'L':
5217 case 'M':
5218 // FIXME
5219 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005220 case 'Q': // A memory address that is a single base register.
5221 Info.setAllowsMemory();
5222 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005223 case 'U': // a memory reference...
5224 switch (Name[1]) {
5225 case 'q': // ...ARMV4 ldrsb
5226 case 'v': // ...VFP load/store (reg+constant offset)
5227 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005228 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005229 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005230 case 'n': // valid address for Neon doubleword vector load/store
5231 case 'm': // valid address for Neon element and structure load/store
5232 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005233 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005234 Info.setAllowsMemory();
5235 Name++;
5236 return true;
5237 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005238 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005239 return false;
5240 }
Craig Topper3164f332014-03-11 03:39:26 +00005241 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005242 std::string R;
5243 switch (*Constraint) {
5244 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005245 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005246 Constraint++;
5247 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005248 case 'p': // 'p' should be translated to 'r' by default.
5249 R = std::string("r");
5250 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005251 default:
5252 return std::string(1, *Constraint);
5253 }
5254 return R;
5255 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005256 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005257 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005258 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005259 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005260 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005261
Bill Wendling9d1ee112012-10-25 23:28:48 +00005262 // Strip off constraint modifiers.
5263 while (Constraint[0] == '=' ||
5264 Constraint[0] == '+' ||
5265 Constraint[0] == '&')
5266 Constraint = Constraint.substr(1);
5267
5268 switch (Constraint[0]) {
5269 default: break;
5270 case 'r': {
5271 switch (Modifier) {
5272 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005273 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005274 case 'q':
5275 // A register of size 32 cannot fit a vector type.
5276 return false;
5277 }
5278 }
5279 }
5280
5281 return true;
5282 }
Craig Topper3164f332014-03-11 03:39:26 +00005283 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005284 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005285 return "";
5286 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005287
Craig Topper3164f332014-03-11 03:39:26 +00005288 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005289 switch (CC) {
5290 case CC_AAPCS:
5291 case CC_AAPCS_VFP:
5292 case CC_Swift:
5293 return CCCR_OK;
5294 default:
5295 return CCCR_Warning;
5296 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005297 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005298
Craig Topper3164f332014-03-11 03:39:26 +00005299 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005300 if (RegNo == 0) return 0;
5301 if (RegNo == 1) return 1;
5302 return -1;
5303 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005304
5305 bool hasSjLjLowering() const override {
5306 return true;
5307 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005308};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005309
Rafael Espindolaeb265472013-08-21 21:59:03 +00005310bool ARMTargetInfo::setFPMath(StringRef Name) {
5311 if (Name == "neon") {
5312 FPMath = FP_Neon;
5313 return true;
5314 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5315 Name == "vfp4") {
5316 FPMath = FP_VFP;
5317 return true;
5318 }
5319 return false;
5320}
5321
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005322const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005323 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005324 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005325 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5326
5327 // Float registers
5328 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5329 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5330 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005331 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005332
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005333 // Double registers
5334 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5335 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005336 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5337 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005338
5339 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005340 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5341 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005342};
5343
Craig Topperf054e3a2015-10-19 03:52:27 +00005344ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5345 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005346}
5347
5348const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005349 { { "a1" }, "r0" },
5350 { { "a2" }, "r1" },
5351 { { "a3" }, "r2" },
5352 { { "a4" }, "r3" },
5353 { { "v1" }, "r4" },
5354 { { "v2" }, "r5" },
5355 { { "v3" }, "r6" },
5356 { { "v4" }, "r7" },
5357 { { "v5" }, "r8" },
5358 { { "v6", "rfp" }, "r9" },
5359 { { "sl" }, "r10" },
5360 { { "fp" }, "r11" },
5361 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005362 { { "r13" }, "sp" },
5363 { { "r14" }, "lr" },
5364 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005365 // The S, D and Q registers overlap, but aren't really aliases; we
5366 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005367};
5368
Craig Topperf054e3a2015-10-19 03:52:27 +00005369ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5370 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005371}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005372
5373const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005374#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005375 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005376#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5377 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005378#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005379
Craig Topper07d3b622015-08-07 05:14:44 +00005380#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005381 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005382#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005383 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005384#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5385 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005386#include "clang/Basic/BuiltinsARM.def"
5387};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005388
5389class ARMleTargetInfo : public ARMTargetInfo {
5390public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005391 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5392 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005393 void getTargetDefines(const LangOptions &Opts,
5394 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005395 Builder.defineMacro("__ARMEL__");
5396 ARMTargetInfo::getTargetDefines(Opts, Builder);
5397 }
5398};
5399
5400class ARMbeTargetInfo : public ARMTargetInfo {
5401public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005402 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5403 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005404 void getTargetDefines(const LangOptions &Opts,
5405 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005406 Builder.defineMacro("__ARMEB__");
5407 Builder.defineMacro("__ARM_BIG_ENDIAN");
5408 ARMTargetInfo::getTargetDefines(Opts, Builder);
5409 }
5410};
Chris Lattner17df24e2008-04-21 18:56:49 +00005411
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005412class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5413 const llvm::Triple Triple;
5414public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005415 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5416 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005417 WCharType = UnsignedShort;
5418 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005419 }
5420 void getVisualStudioDefines(const LangOptions &Opts,
5421 MacroBuilder &Builder) const {
5422 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5423
5424 // FIXME: this is invalid for WindowsCE
5425 Builder.defineMacro("_M_ARM_NT", "1");
5426 Builder.defineMacro("_M_ARMT", "_M_ARM");
5427 Builder.defineMacro("_M_THUMB", "_M_ARM");
5428
5429 assert((Triple.getArch() == llvm::Triple::arm ||
5430 Triple.getArch() == llvm::Triple::thumb) &&
5431 "invalid architecture for Windows ARM target info");
5432 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5433 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5434
5435 // TODO map the complete set of values
5436 // 31: VFPv3 40: VFPv4
5437 Builder.defineMacro("_M_ARM_FP", "31");
5438 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005439 BuiltinVaListKind getBuiltinVaListKind() const override {
5440 return TargetInfo::CharPtrBuiltinVaList;
5441 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005442 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5443 switch (CC) {
5444 case CC_X86StdCall:
5445 case CC_X86ThisCall:
5446 case CC_X86FastCall:
5447 case CC_X86VectorCall:
5448 return CCCR_Ignore;
5449 case CC_C:
5450 return CCCR_OK;
5451 default:
5452 return CCCR_Warning;
5453 }
5454 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005455};
5456
5457// Windows ARM + Itanium C++ ABI Target
5458class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5459public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005460 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5461 const TargetOptions &Opts)
5462 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005463 TheCXXABI.set(TargetCXXABI::GenericARM);
5464 }
5465
5466 void getTargetDefines(const LangOptions &Opts,
5467 MacroBuilder &Builder) const override {
5468 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5469
5470 if (Opts.MSVCCompat)
5471 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5472 }
5473};
5474
5475// Windows ARM, MS (C++) ABI
5476class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5477public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005478 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5479 const TargetOptions &Opts)
5480 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005481 TheCXXABI.set(TargetCXXABI::Microsoft);
5482 }
5483
5484 void getTargetDefines(const LangOptions &Opts,
5485 MacroBuilder &Builder) const override {
5486 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5487 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5488 }
5489};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005490
Yaron Keren321249c2015-07-15 13:32:23 +00005491// ARM MinGW target
5492class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5493public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005494 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5495 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005496 TheCXXABI.set(TargetCXXABI::GenericARM);
5497 }
5498
5499 void getTargetDefines(const LangOptions &Opts,
5500 MacroBuilder &Builder) const override {
5501 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5502 DefineStd(Builder, "WIN32", Opts);
5503 DefineStd(Builder, "WINNT", Opts);
5504 Builder.defineMacro("_ARM_");
5505 addMinGWDefines(Opts, Builder);
5506 }
5507};
5508
5509// ARM Cygwin target
5510class CygwinARMTargetInfo : public ARMleTargetInfo {
5511public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005512 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5513 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005514 TLSSupported = false;
5515 WCharType = UnsignedShort;
5516 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005517 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005518 }
5519 void getTargetDefines(const LangOptions &Opts,
5520 MacroBuilder &Builder) const override {
5521 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5522 Builder.defineMacro("_ARM_");
5523 Builder.defineMacro("__CYGWIN__");
5524 Builder.defineMacro("__CYGWIN32__");
5525 DefineStd(Builder, "unix", Opts);
5526 if (Opts.CPlusPlus)
5527 Builder.defineMacro("_GNU_SOURCE");
5528 }
5529};
5530
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005531class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005532protected:
Craig Topper3164f332014-03-11 03:39:26 +00005533 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5534 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005535 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005536 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005537
Torok Edwinb2b37c62009-06-30 17:10:35 +00005538public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005539 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5540 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005541 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005542 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005543 // FIXME: This should be based off of the target features in
5544 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005545 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005546
Tim Northoverd88ecb32016-01-27 19:32:40 +00005547 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005548 // Darwin on iOS uses a variant of the ARM C++ ABI.
5549 TheCXXABI.set(TargetCXXABI::WatchOS);
5550
5551 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5552 // size_t is long, it's a bit weird for it to be int.
5553 PtrDiffType = SignedLong;
5554
5555 // BOOL should be a real boolean on the new ABI
5556 UseSignedCharForObjCBool = false;
5557 } else
5558 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005559 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005560};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005561
Tim Northover573cbee2014-05-24 12:52:07 +00005562class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005563 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005564 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5565 static const char *const GCCRegNames[];
5566
James Molloy75f5f9e2014-04-16 15:33:48 +00005567 enum FPUModeEnum {
5568 FPUMode,
5569 NeonMode
5570 };
5571
5572 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005573 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005574 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005575 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005576 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005577
Tim Northovera2ee4332014-03-29 15:09:45 +00005578 static const Builtin::Info BuiltinInfo[];
5579
5580 std::string ABI;
5581
5582public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005583 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005584 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005585 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5586 WCharType = SignedInt;
5587
5588 // NetBSD apparently prefers consistency across ARM targets to consistency
5589 // across 64-bit targets.
5590 Int64Type = SignedLongLong;
5591 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005592 } else {
5593 WCharType = UnsignedInt;
5594 Int64Type = SignedLong;
5595 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005596 }
5597
Tim Northovera2ee4332014-03-29 15:09:45 +00005598 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005599 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005600 MaxAtomicInlineWidth = 128;
5601 MaxAtomicPromoteWidth = 128;
5602
Tim Northovera6a19f12015-02-06 01:25:07 +00005603 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005604 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5605
Tim Northovera2ee4332014-03-29 15:09:45 +00005606 // {} in inline assembly are neon specifiers, not assembly variant
5607 // specifiers.
5608 NoAsmVariants = true;
5609
Tim Northover7ad87af2015-01-16 18:44:04 +00005610 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5611 // contributes to the alignment of the containing aggregate in the same way
5612 // a plain (non bit-field) member of that type would, without exception for
5613 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005614 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005615 UseZeroLengthBitfieldAlignment = true;
5616
Tim Northover573cbee2014-05-24 12:52:07 +00005617 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005618 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005619
5620 if (Triple.getOS() == llvm::Triple::Linux ||
5621 Triple.getOS() == llvm::Triple::UnknownOS)
5622 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005623 }
5624
Alp Toker4925ba72014-06-07 23:30:42 +00005625 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005626 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005627 if (Name != "aapcs" && Name != "darwinpcs")
5628 return false;
5629
5630 ABI = Name;
5631 return true;
5632 }
5633
David Blaikie1cbb9712014-11-14 19:09:44 +00005634 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005635 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005636 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005637 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5638 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005639 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005640 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005641 .Default(false);
5642 return CPUKnown;
5643 }
5644
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005645 void getTargetDefines(const LangOptions &Opts,
5646 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005647 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005648 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005649
5650 // Target properties.
5651 Builder.defineMacro("_LP64");
5652 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005653
5654 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5655 Builder.defineMacro("__ARM_ACLE", "200");
5656 Builder.defineMacro("__ARM_ARCH", "8");
5657 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5658
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005659 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005660 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005661 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005662
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005663 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5664 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5665 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5666 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005667 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005668 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5669 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005670
5671 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5672
5673 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005674 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005675
5676 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5677 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005678 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5679 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005680
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005681 if (Opts.UnsafeFPMath)
5682 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005683
5684 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5685
5686 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5687 Opts.ShortEnums ? "1" : "4");
5688
James Molloy75f5f9e2014-04-16 15:33:48 +00005689 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005690 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005691 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005692 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005693 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005694
Bradley Smith418c5932014-05-02 15:17:51 +00005695 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005696 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005697
James Molloy75f5f9e2014-04-16 15:33:48 +00005698 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005699 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5700
5701 if (Unaligned)
5702 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005703
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005704 if (V8_1A)
5705 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5706
Reid Klecknerd167d422015-05-06 15:31:46 +00005707 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5708 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5709 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5710 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5711 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005712 }
5713
Craig Topper6c03a542015-10-19 04:51:35 +00005714 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5715 return llvm::makeArrayRef(BuiltinInfo,
5716 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005717 }
5718
David Blaikie1cbb9712014-11-14 19:09:44 +00005719 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005720 return Feature == "aarch64" ||
5721 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005722 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005723 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005724 }
5725
James Molloy5e73df52014-04-16 15:06:20 +00005726 bool handleTargetFeatures(std::vector<std::string> &Features,
5727 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005728 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005729 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005730 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005731 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005732 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005733
Eric Christopher610fe112015-08-26 08:21:55 +00005734 for (const auto &Feature : Features) {
5735 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005736 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005737 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005738 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005739 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005740 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005741 if (Feature == "+strict-align")
5742 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005743 if (Feature == "+v8.1a")
5744 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005745 }
5746
James Y Knightb214cbc2016-03-04 19:00:41 +00005747 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005748
5749 return true;
5750 }
5751
John McCall477f2bb2016-03-03 06:39:32 +00005752 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5753 switch (CC) {
5754 case CC_C:
5755 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005756 case CC_PreserveMost:
5757 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005758 return CCCR_OK;
5759 default:
5760 return CCCR_Warning;
5761 }
5762 }
5763
David Blaikie1cbb9712014-11-14 19:09:44 +00005764 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005765
David Blaikie1cbb9712014-11-14 19:09:44 +00005766 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005767 return TargetInfo::AArch64ABIBuiltinVaList;
5768 }
5769
Craig Topperf054e3a2015-10-19 03:52:27 +00005770 ArrayRef<const char *> getGCCRegNames() const override;
5771 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005772
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005773 bool validateAsmConstraint(const char *&Name,
5774 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005775 switch (*Name) {
5776 default:
5777 return false;
5778 case 'w': // Floating point and SIMD registers (V0-V31)
5779 Info.setAllowsRegister();
5780 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005781 case 'I': // Constant that can be used with an ADD instruction
5782 case 'J': // Constant that can be used with a SUB instruction
5783 case 'K': // Constant that can be used with a 32-bit logical instruction
5784 case 'L': // Constant that can be used with a 64-bit logical instruction
5785 case 'M': // Constant that can be used as a 32-bit MOV immediate
5786 case 'N': // Constant that can be used as a 64-bit MOV immediate
5787 case 'Y': // Floating point constant zero
5788 case 'Z': // Integer constant zero
5789 return true;
5790 case 'Q': // A memory reference with base register and no offset
5791 Info.setAllowsMemory();
5792 return true;
5793 case 'S': // A symbolic address
5794 Info.setAllowsRegister();
5795 return true;
5796 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005797 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5798 // Utf: A memory address suitable for ldp/stp in TF mode.
5799 // Usa: An absolute symbolic address.
5800 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5801 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005802 case 'z': // Zero register, wzr or xzr
5803 Info.setAllowsRegister();
5804 return true;
5805 case 'x': // Floating point and SIMD registers (V0-V15)
5806 Info.setAllowsRegister();
5807 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005808 }
5809 return false;
5810 }
5811
Akira Hatanaka987f1862014-08-22 06:05:21 +00005812 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005813 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005814 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005815 // Strip off constraint modifiers.
5816 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5817 Constraint = Constraint.substr(1);
5818
5819 switch (Constraint[0]) {
5820 default:
5821 return true;
5822 case 'z':
5823 case 'r': {
5824 switch (Modifier) {
5825 case 'x':
5826 case 'w':
5827 // For now assume that the person knows what they're
5828 // doing with the modifier.
5829 return true;
5830 default:
5831 // By default an 'r' constraint will be in the 'x'
5832 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005833 if (Size == 64)
5834 return true;
5835
5836 SuggestedModifier = "w";
5837 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005838 }
5839 }
5840 }
5841 }
5842
David Blaikie1cbb9712014-11-14 19:09:44 +00005843 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005844
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005845 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005846 if (RegNo == 0)
5847 return 0;
5848 if (RegNo == 1)
5849 return 1;
5850 return -1;
5851 }
5852};
5853
Tim Northover573cbee2014-05-24 12:52:07 +00005854const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005855 // 32-bit Integer registers
5856 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5857 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5858 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5859
5860 // 64-bit Integer registers
5861 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5862 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5863 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5864
5865 // 32-bit floating point regsisters
5866 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5867 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5868 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5869
5870 // 64-bit floating point regsisters
5871 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5872 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5873 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5874
5875 // Vector registers
5876 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5877 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5878 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5879};
5880
Craig Topperf054e3a2015-10-19 03:52:27 +00005881ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5882 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005883}
5884
Tim Northover573cbee2014-05-24 12:52:07 +00005885const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005886 { { "w31" }, "wsp" },
5887 { { "x29" }, "fp" },
5888 { { "x30" }, "lr" },
5889 { { "x31" }, "sp" },
5890 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5891 // don't want to substitute one of these for a different-sized one.
5892};
5893
Craig Topperf054e3a2015-10-19 03:52:27 +00005894ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5895 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005896}
5897
Tim Northover573cbee2014-05-24 12:52:07 +00005898const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005899#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005900 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005901#include "clang/Basic/BuiltinsNEON.def"
5902
5903#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005904 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005905#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005906};
James Molloy5e73df52014-04-16 15:06:20 +00005907
Tim Northover573cbee2014-05-24 12:52:07 +00005908class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005909 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005910 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005911 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005912 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005913 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005914 }
5915
5916public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005917 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5918 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00005919 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005920 }
James Molloy5e73df52014-04-16 15:06:20 +00005921 void getTargetDefines(const LangOptions &Opts,
5922 MacroBuilder &Builder) const override {
5923 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005924 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005925 }
5926};
5927
Tim Northover573cbee2014-05-24 12:52:07 +00005928class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005929 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005930 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005931 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005932 }
5933
5934public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005935 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5936 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00005937 void getTargetDefines(const LangOptions &Opts,
5938 MacroBuilder &Builder) const override {
5939 Builder.defineMacro("__AARCH64EB__");
5940 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5941 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005942 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005943 }
5944};
Tim Northovera2ee4332014-03-29 15:09:45 +00005945
Tim Northover573cbee2014-05-24 12:52:07 +00005946class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005947protected:
5948 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5949 MacroBuilder &Builder) const override {
5950 Builder.defineMacro("__AARCH64_SIMD__");
5951 Builder.defineMacro("__ARM64_ARCH_8__");
5952 Builder.defineMacro("__ARM_NEON__");
5953 Builder.defineMacro("__LITTLE_ENDIAN__");
5954 Builder.defineMacro("__REGISTER_PREFIX__", "");
5955 Builder.defineMacro("__arm64", "1");
5956 Builder.defineMacro("__arm64__", "1");
5957
5958 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5959 }
5960
Tim Northovera2ee4332014-03-29 15:09:45 +00005961public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005962 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5963 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005964 Int64Type = SignedLongLong;
5965 WCharType = SignedInt;
5966 UseSignedCharForObjCBool = false;
5967
Tim Northovera6a19f12015-02-06 01:25:07 +00005968 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005969 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5970
5971 TheCXXABI.set(TargetCXXABI::iOS64);
5972 }
5973
David Blaikie1cbb9712014-11-14 19:09:44 +00005974 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005975 return TargetInfo::CharPtrBuiltinVaList;
5976 }
5977};
Tim Northovera2ee4332014-03-29 15:09:45 +00005978
Tony Linthicum76329bf2011-12-12 21:14:55 +00005979// Hexagon abstract base class
5980class HexagonTargetInfo : public TargetInfo {
5981 static const Builtin::Info BuiltinInfo[];
5982 static const char * const GCCRegNames[];
5983 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5984 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005985 bool HasHVX, HasHVXDouble;
5986
Tony Linthicum76329bf2011-12-12 21:14:55 +00005987public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005988 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
5989 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005990 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005991 // Specify the vector alignment explicitly. For v512x1, the calculated
5992 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5993 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005994 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005995 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-"
James Y Knightb214cbc2016-03-04 19:00:41 +00005996 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005997 SizeType = UnsignedInt;
5998 PtrDiffType = SignedInt;
5999 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006000
6001 // {} in inline assembly are packet specifiers, not assembly variant
6002 // specifiers.
6003 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006004
6005 LargeArrayMinWidth = 64;
6006 LargeArrayAlign = 64;
6007 UseBitFieldTypeAlignment = true;
6008 ZeroLengthBitfieldBoundary = 32;
6009 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006010 }
6011
Craig Topper6c03a542015-10-19 04:51:35 +00006012 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6013 return llvm::makeArrayRef(BuiltinInfo,
6014 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006015 }
6016
Craig Topper3164f332014-03-11 03:39:26 +00006017 bool validateAsmConstraint(const char *&Name,
6018 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006019 switch (*Name) {
6020 case 'v':
6021 case 'q':
6022 if (HasHVX) {
6023 Info.setAllowsRegister();
6024 return true;
6025 }
6026 break;
6027 }
6028 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006029 }
6030
Craig Topper3164f332014-03-11 03:39:26 +00006031 void getTargetDefines(const LangOptions &Opts,
6032 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006033
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006034 bool isCLZForZeroUndef() const override { return false; }
6035
Craig Topper3164f332014-03-11 03:39:26 +00006036 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006037 return llvm::StringSwitch<bool>(Feature)
6038 .Case("hexagon", true)
6039 .Case("hvx", HasHVX)
6040 .Case("hvx-double", HasHVXDouble)
6041 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006042 }
Craig Topper3164f332014-03-11 03:39:26 +00006043
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006044 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6045 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6046 const override;
6047
6048 bool handleTargetFeatures(std::vector<std::string> &Features,
6049 DiagnosticsEngine &Diags) override;
6050
Craig Topper3164f332014-03-11 03:39:26 +00006051 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006052 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006053 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006054 ArrayRef<const char *> getGCCRegNames() const override;
6055 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006056 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006057 return "";
6058 }
Sebastian Pop86500282012-01-13 20:37:10 +00006059
6060 static const char *getHexagonCPUSuffix(StringRef Name) {
6061 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006062 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006063 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006064 .Case("hexagonv55", "55")
6065 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006066 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006067 }
6068
Craig Topper3164f332014-03-11 03:39:26 +00006069 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006070 if (!getHexagonCPUSuffix(Name))
6071 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006072 CPU = Name;
6073 return true;
6074 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006075
6076 int getEHDataRegisterNumber(unsigned RegNo) const override {
6077 return RegNo < 2 ? RegNo : -1;
6078 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006079};
6080
6081void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006082 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006083 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006084 Builder.defineMacro("__hexagon__", "1");
6085
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006086 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006087 Builder.defineMacro("__HEXAGON_V4__");
6088 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006089 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006090 Builder.defineMacro("__QDSP6_V4__");
6091 Builder.defineMacro("__QDSP6_ARCH__", "4");
6092 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006093 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006094 Builder.defineMacro("__HEXAGON_V5__");
6095 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6096 if(Opts.HexagonQdsp6Compat) {
6097 Builder.defineMacro("__QDSP6_V5__");
6098 Builder.defineMacro("__QDSP6_ARCH__", "5");
6099 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006100 } else if (CPU == "hexagonv55") {
6101 Builder.defineMacro("__HEXAGON_V55__");
6102 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6103 Builder.defineMacro("__QDSP6_V55__");
6104 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006105 } else if (CPU == "hexagonv60") {
6106 Builder.defineMacro("__HEXAGON_V60__");
6107 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6108 Builder.defineMacro("__QDSP6_V60__");
6109 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006110 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006111
6112 if (hasFeature("hvx")) {
6113 Builder.defineMacro("__HVX__");
6114 if (hasFeature("hvx-double"))
6115 Builder.defineMacro("__HVXDBL__");
6116 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006117}
6118
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006119bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6120 DiagnosticsEngine &Diags) {
6121 for (auto &F : Features) {
6122 if (F == "+hvx")
6123 HasHVX = true;
6124 else if (F == "-hvx")
6125 HasHVX = HasHVXDouble = false;
6126 else if (F == "+hvx-double")
6127 HasHVX = HasHVXDouble = true;
6128 else if (F == "-hvx-double")
6129 HasHVXDouble = false;
6130 }
6131 return true;
6132}
6133
6134bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6135 DiagnosticsEngine &Diags, StringRef CPU,
6136 const std::vector<std::string> &FeaturesVec) const {
6137 // Default for v60: -hvx, -hvx-double.
6138 Features["hvx"] = false;
6139 Features["hvx-double"] = false;
6140
6141 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6142}
6143
6144
6145const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006146 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6147 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6148 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6149 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6150 "p0", "p1", "p2", "p3",
6151 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6152};
6153
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006154ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006155 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006156}
6157
Tony Linthicum76329bf2011-12-12 21:14:55 +00006158const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6159 { { "sp" }, "r29" },
6160 { { "fp" }, "r30" },
6161 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006162};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006163
Craig Topperf054e3a2015-10-19 03:52:27 +00006164ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6165 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006166}
6167
6168
6169const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006170#define BUILTIN(ID, TYPE, ATTRS) \
6171 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6172#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6173 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006174#include "clang/Basic/BuiltinsHexagon.def"
6175};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006176
Jacques Pienaard964cc22016-03-28 21:02:54 +00006177class LanaiTargetInfo : public TargetInfo {
6178 // Class for Lanai (32-bit).
6179 // The CPU profiles supported by the Lanai backend
6180 enum CPUKind {
6181 CK_NONE,
6182 CK_V11,
6183 } CPU;
6184
6185 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6186 static const char *const GCCRegNames[];
6187
6188public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006189 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6190 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006191 // Description string has to be kept in sync with backend.
6192 resetDataLayout("E" // Big endian
6193 "-m:e" // ELF name manging
6194 "-p:32:32" // 32 bit pointers, 32 bit aligned
6195 "-i64:64" // 64 bit integers, 64 bit aligned
6196 "-a:0:32" // 32 bit alignment of objects of aggregate type
6197 "-n32" // 32 bit native integer width
6198 "-S64" // 64 bit natural stack alignment
6199 );
6200
6201 // Setting RegParmMax equal to what mregparm was set to in the old
6202 // toolchain
6203 RegParmMax = 4;
6204
6205 // Set the default CPU to V11
6206 CPU = CK_V11;
6207
6208 // Temporary approach to make everything at least word-aligned and allow for
6209 // safely casting between pointers with different alignment requirements.
6210 // TODO: Remove this when there are no more cast align warnings on the
6211 // firmware.
6212 MinGlobalAlign = 32;
6213 }
6214
6215 void getTargetDefines(const LangOptions &Opts,
6216 MacroBuilder &Builder) const override {
6217 // Define __lanai__ when building for target lanai.
6218 Builder.defineMacro("__lanai__");
6219
6220 // Set define for the CPU specified.
6221 switch (CPU) {
6222 case CK_V11:
6223 Builder.defineMacro("__LANAI_V11__");
6224 break;
6225 case CK_NONE:
6226 llvm_unreachable("Unhandled target CPU");
6227 }
6228 }
6229
6230 bool setCPU(const std::string &Name) override {
6231 CPU = llvm::StringSwitch<CPUKind>(Name)
6232 .Case("v11", CK_V11)
6233 .Default(CK_NONE);
6234
6235 return CPU != CK_NONE;
6236 }
6237
6238 bool hasFeature(StringRef Feature) const override {
6239 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6240 }
6241
6242 ArrayRef<const char *> getGCCRegNames() const override;
6243
6244 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6245
6246 BuiltinVaListKind getBuiltinVaListKind() const override {
6247 return TargetInfo::VoidPtrBuiltinVaList;
6248 }
6249
6250 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6251
6252 bool validateAsmConstraint(const char *&Name,
6253 TargetInfo::ConstraintInfo &info) const override {
6254 return false;
6255 }
6256
6257 const char *getClobbers() const override { return ""; }
6258};
6259
6260const char *const LanaiTargetInfo::GCCRegNames[] = {
6261 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6262 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6263 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6264
6265ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6266 return llvm::makeArrayRef(GCCRegNames);
6267}
6268
6269const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6270 {{"pc"}, "r2"},
6271 {{"sp"}, "r4"},
6272 {{"fp"}, "r5"},
6273 {{"rv"}, "r8"},
6274 {{"rr1"}, "r10"},
6275 {{"rr2"}, "r11"},
6276 {{"rca"}, "r15"},
6277};
6278
6279ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6280 return llvm::makeArrayRef(GCCRegAliases);
6281}
6282
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006283// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6284class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006285 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6286 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006287 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006288public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006289 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006290 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006291
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006292 int getEHDataRegisterNumber(unsigned RegNo) const override {
6293 if (RegNo == 0) return 24;
6294 if (RegNo == 1) return 25;
6295 return -1;
6296 }
6297
Craig Topper3164f332014-03-11 03:39:26 +00006298 bool handleTargetFeatures(std::vector<std::string> &Features,
6299 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006300 // The backend doesn't actually handle soft float yet, but in case someone
6301 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006302 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6303 if (Feature != Features.end()) {
6304 SoftFloat = true;
6305 Features.erase(Feature);
6306 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006307 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006308 }
Craig Topper3164f332014-03-11 03:39:26 +00006309 void getTargetDefines(const LangOptions &Opts,
6310 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006311 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006312 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006313
6314 if (SoftFloat)
6315 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006316 }
Craig Topper3164f332014-03-11 03:39:26 +00006317
6318 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006319 return llvm::StringSwitch<bool>(Feature)
6320 .Case("softfloat", SoftFloat)
6321 .Case("sparc", true)
6322 .Default(false);
6323 }
Craig Topper3164f332014-03-11 03:39:26 +00006324
Craig Topper6c03a542015-10-19 04:51:35 +00006325 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006326 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006327 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006328 }
Craig Topper3164f332014-03-11 03:39:26 +00006329 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006330 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006331 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006332 ArrayRef<const char *> getGCCRegNames() const override;
6333 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006334 bool validateAsmConstraint(const char *&Name,
6335 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006336 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006337 switch (*Name) {
6338 case 'I': // Signed 13-bit constant
6339 case 'J': // Zero
6340 case 'K': // 32-bit constant with the low 12 bits clear
6341 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6342 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6343 case 'N': // Same as 'K' but zext (required for SIMode)
6344 case 'O': // The constant 4096
6345 return true;
6346 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006347 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006348 }
Craig Topper3164f332014-03-11 03:39:26 +00006349 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006350 // FIXME: Implement!
6351 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006352 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006353
6354 // No Sparc V7 for now, the backend doesn't support it anyway.
6355 enum CPUKind {
6356 CK_GENERIC,
6357 CK_V8,
6358 CK_SUPERSPARC,
6359 CK_SPARCLITE,
6360 CK_F934,
6361 CK_HYPERSPARC,
6362 CK_SPARCLITE86X,
6363 CK_SPARCLET,
6364 CK_TSC701,
6365 CK_V9,
6366 CK_ULTRASPARC,
6367 CK_ULTRASPARC3,
6368 CK_NIAGARA,
6369 CK_NIAGARA2,
6370 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006371 CK_NIAGARA4,
6372 CK_MYRIAD2_1,
6373 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006374 } CPU = CK_GENERIC;
6375
6376 enum CPUGeneration {
6377 CG_V8,
6378 CG_V9,
6379 };
6380
6381 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6382 switch (Kind) {
6383 case CK_GENERIC:
6384 case CK_V8:
6385 case CK_SUPERSPARC:
6386 case CK_SPARCLITE:
6387 case CK_F934:
6388 case CK_HYPERSPARC:
6389 case CK_SPARCLITE86X:
6390 case CK_SPARCLET:
6391 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006392 case CK_MYRIAD2_1:
6393 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006394 return CG_V8;
6395 case CK_V9:
6396 case CK_ULTRASPARC:
6397 case CK_ULTRASPARC3:
6398 case CK_NIAGARA:
6399 case CK_NIAGARA2:
6400 case CK_NIAGARA3:
6401 case CK_NIAGARA4:
6402 return CG_V9;
6403 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006404 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006405 }
6406
6407 CPUKind getCPUKind(StringRef Name) const {
6408 return llvm::StringSwitch<CPUKind>(Name)
6409 .Case("v8", CK_V8)
6410 .Case("supersparc", CK_SUPERSPARC)
6411 .Case("sparclite", CK_SPARCLITE)
6412 .Case("f934", CK_F934)
6413 .Case("hypersparc", CK_HYPERSPARC)
6414 .Case("sparclite86x", CK_SPARCLITE86X)
6415 .Case("sparclet", CK_SPARCLET)
6416 .Case("tsc701", CK_TSC701)
6417 .Case("v9", CK_V9)
6418 .Case("ultrasparc", CK_ULTRASPARC)
6419 .Case("ultrasparc3", CK_ULTRASPARC3)
6420 .Case("niagara", CK_NIAGARA)
6421 .Case("niagara2", CK_NIAGARA2)
6422 .Case("niagara3", CK_NIAGARA3)
6423 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006424 .Case("myriad2", CK_MYRIAD2_1)
6425 .Case("myriad2.1", CK_MYRIAD2_1)
6426 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006427 .Default(CK_GENERIC);
6428 }
6429
6430 bool setCPU(const std::string &Name) override {
6431 CPU = getCPUKind(Name);
6432 return CPU != CK_GENERIC;
6433 }
Gabor Greif49991682008-02-21 16:29:08 +00006434};
6435
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006436const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006437 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6438 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6439 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6440 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6441};
6442
Craig Topperf054e3a2015-10-19 03:52:27 +00006443ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6444 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006445}
6446
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006447const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006448 { { "g0" }, "r0" },
6449 { { "g1" }, "r1" },
6450 { { "g2" }, "r2" },
6451 { { "g3" }, "r3" },
6452 { { "g4" }, "r4" },
6453 { { "g5" }, "r5" },
6454 { { "g6" }, "r6" },
6455 { { "g7" }, "r7" },
6456 { { "o0" }, "r8" },
6457 { { "o1" }, "r9" },
6458 { { "o2" }, "r10" },
6459 { { "o3" }, "r11" },
6460 { { "o4" }, "r12" },
6461 { { "o5" }, "r13" },
6462 { { "o6", "sp" }, "r14" },
6463 { { "o7" }, "r15" },
6464 { { "l0" }, "r16" },
6465 { { "l1" }, "r17" },
6466 { { "l2" }, "r18" },
6467 { { "l3" }, "r19" },
6468 { { "l4" }, "r20" },
6469 { { "l5" }, "r21" },
6470 { { "l6" }, "r22" },
6471 { { "l7" }, "r23" },
6472 { { "i0" }, "r24" },
6473 { { "i1" }, "r25" },
6474 { { "i2" }, "r26" },
6475 { { "i3" }, "r27" },
6476 { { "i4" }, "r28" },
6477 { { "i5" }, "r29" },
6478 { { "i6", "fp" }, "r30" },
6479 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006480};
6481
Craig Topperf054e3a2015-10-19 03:52:27 +00006482ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6483 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006484}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006485
6486// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6487class SparcV8TargetInfo : public SparcTargetInfo {
6488public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006489 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6490 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006491 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006492 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6493 switch (getTriple().getOS()) {
6494 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006495 SizeType = UnsignedInt;
6496 IntPtrType = SignedInt;
6497 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006498 break;
6499 case llvm::Triple::NetBSD:
6500 case llvm::Triple::OpenBSD:
6501 SizeType = UnsignedLong;
6502 IntPtrType = SignedLong;
6503 PtrDiffType = SignedLong;
6504 break;
Brad Smith56495d52015-08-13 22:00:53 +00006505 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006506 }
6507
Craig Topper3164f332014-03-11 03:39:26 +00006508 void getTargetDefines(const LangOptions &Opts,
6509 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006510 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006511 switch (getCPUGeneration(CPU)) {
6512 case CG_V8:
6513 Builder.defineMacro("__sparcv8");
6514 if (getTriple().getOS() != llvm::Triple::Solaris)
6515 Builder.defineMacro("__sparcv8__");
6516 break;
6517 case CG_V9:
6518 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006519 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006520 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006521 Builder.defineMacro("__sparc_v9__");
6522 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006523 break;
6524 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006525 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6526 switch (CPU) {
6527 case CK_MYRIAD2_1:
6528 Builder.defineMacro("__myriad2", "1");
6529 Builder.defineMacro("__myriad2__", "1");
6530 break;
6531 case CK_MYRIAD2_2:
6532 Builder.defineMacro("__myriad2", "2");
6533 Builder.defineMacro("__myriad2__", "2");
6534 break;
6535 default:
6536 break;
6537 }
6538 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006539 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006540
6541 bool hasSjLjLowering() const override {
6542 return true;
6543 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006544};
6545
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006546// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6547class SparcV8elTargetInfo : public SparcV8TargetInfo {
6548 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006549 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6550 : SparcV8TargetInfo(Triple, Opts) {
6551 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6552 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006553 }
6554};
6555
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006556// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6557class SparcV9TargetInfo : public SparcTargetInfo {
6558public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006559 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6560 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006561 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006562 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006563 // This is an LP64 platform.
6564 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006565
6566 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006567 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006568 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006569 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006570 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006571 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006572
6573 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6574 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6575 LongDoubleWidth = 128;
6576 LongDoubleAlign = 128;
6577 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006578 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006579 }
6580
Craig Topper3164f332014-03-11 03:39:26 +00006581 void getTargetDefines(const LangOptions &Opts,
6582 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006583 SparcTargetInfo::getTargetDefines(Opts, Builder);
6584 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006585 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006586 // Solaris doesn't need these variants, but the BSDs do.
6587 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006588 Builder.defineMacro("__sparc64__");
6589 Builder.defineMacro("__sparc_v9__");
6590 Builder.defineMacro("__sparcv9__");
6591 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006592 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006593
Craig Topper3164f332014-03-11 03:39:26 +00006594 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006595 if (!SparcTargetInfo::setCPU(Name))
6596 return false;
6597 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006598 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006599};
6600
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006601class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006602 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006603 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006604 std::string CPU;
6605 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006606 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006607
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006608public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006609 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006610 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6611 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006612 IntMaxType = SignedLong;
6613 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006614 TLSSupported = true;
6615 IntWidth = IntAlign = 32;
6616 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6617 PointerWidth = PointerAlign = 64;
6618 LongDoubleWidth = 128;
6619 LongDoubleAlign = 64;
6620 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006621 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006622 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006623 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006624 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6625 }
6626 void getTargetDefines(const LangOptions &Opts,
6627 MacroBuilder &Builder) const override {
6628 Builder.defineMacro("__s390__");
6629 Builder.defineMacro("__s390x__");
6630 Builder.defineMacro("__zarch__");
6631 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006632
6633 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6634 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6635 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6636 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6637
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006638 if (HasTransactionalExecution)
6639 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006640 if (Opts.ZVector)
6641 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006642 }
Craig Topper6c03a542015-10-19 04:51:35 +00006643 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6644 return llvm::makeArrayRef(BuiltinInfo,
6645 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006646 }
6647
Craig Topperf054e3a2015-10-19 03:52:27 +00006648 ArrayRef<const char *> getGCCRegNames() const override;
6649 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006650 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006651 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006652 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006653 bool validateAsmConstraint(const char *&Name,
6654 TargetInfo::ConstraintInfo &info) const override;
6655 const char *getClobbers() const override {
6656 // FIXME: Is this really right?
6657 return "";
6658 }
6659 BuiltinVaListKind getBuiltinVaListKind() const override {
6660 return TargetInfo::SystemZBuiltinVaList;
6661 }
6662 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006663 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006664 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6665 .Case("z10", true)
6666 .Case("z196", true)
6667 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006668 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006669 .Default(false);
6670
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006671 return CPUKnown;
6672 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006673 bool
6674 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6675 StringRef CPU,
6676 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006677 if (CPU == "zEC12")
6678 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006679 if (CPU == "z13") {
6680 Features["transactional-execution"] = true;
6681 Features["vector"] = true;
6682 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006683 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006684 }
6685
6686 bool handleTargetFeatures(std::vector<std::string> &Features,
6687 DiagnosticsEngine &Diags) override {
6688 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006689 for (const auto &Feature : Features) {
6690 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006691 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006692 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006693 HasVector = true;
6694 }
6695 // If we use the vector ABI, vector types are 64-bit aligned.
6696 if (HasVector) {
6697 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006698 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6699 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006700 }
6701 return true;
6702 }
6703
6704 bool hasFeature(StringRef Feature) const override {
6705 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006706 .Case("systemz", true)
6707 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006708 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006709 .Default(false);
6710 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006711
Bryan Chane3f1ed52016-04-28 13:56:43 +00006712 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6713 switch (CC) {
6714 case CC_C:
6715 case CC_Swift:
6716 return CCCR_OK;
6717 default:
6718 return CCCR_Warning;
6719 }
6720 }
6721
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006722 StringRef getABI() const override {
6723 if (HasVector)
6724 return "vector";
6725 return "";
6726 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006727
6728 bool useFloat128ManglingForLongDouble() const override {
6729 return true;
6730 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006731};
6732
6733const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6734#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006735 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006736#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6737 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006738#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006739};
6740
6741const char *const SystemZTargetInfo::GCCRegNames[] = {
6742 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6743 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6744 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6745 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6746};
6747
Craig Topperf054e3a2015-10-19 03:52:27 +00006748ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6749 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006750}
6751
6752bool SystemZTargetInfo::
6753validateAsmConstraint(const char *&Name,
6754 TargetInfo::ConstraintInfo &Info) const {
6755 switch (*Name) {
6756 default:
6757 return false;
6758
6759 case 'a': // Address register
6760 case 'd': // Data register (equivalent to 'r')
6761 case 'f': // Floating-point register
6762 Info.setAllowsRegister();
6763 return true;
6764
6765 case 'I': // Unsigned 8-bit constant
6766 case 'J': // Unsigned 12-bit constant
6767 case 'K': // Signed 16-bit constant
6768 case 'L': // Signed 20-bit displacement (on all targets we support)
6769 case 'M': // 0x7fffffff
6770 return true;
6771
6772 case 'Q': // Memory with base and unsigned 12-bit displacement
6773 case 'R': // Likewise, plus an index
6774 case 'S': // Memory with base and signed 20-bit displacement
6775 case 'T': // Likewise, plus an index
6776 Info.setAllowsMemory();
6777 return true;
6778 }
6779}
Ulrich Weigand47445072013-05-06 16:26:41 +00006780
Eric Christopherc48497a2015-09-18 21:26:24 +00006781class MSP430TargetInfo : public TargetInfo {
6782 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006783
Eric Christopherc48497a2015-09-18 21:26:24 +00006784public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006785 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6786 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006787 BigEndian = false;
6788 TLSSupported = false;
6789 IntWidth = 16;
6790 IntAlign = 16;
6791 LongWidth = 32;
6792 LongLongWidth = 64;
6793 LongAlign = LongLongAlign = 16;
6794 PointerWidth = 16;
6795 PointerAlign = 16;
6796 SuitableAlign = 16;
6797 SizeType = UnsignedInt;
6798 IntMaxType = SignedLongLong;
6799 IntPtrType = SignedInt;
6800 PtrDiffType = SignedInt;
6801 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006802 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006803 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006804 void getTargetDefines(const LangOptions &Opts,
6805 MacroBuilder &Builder) const override {
6806 Builder.defineMacro("MSP430");
6807 Builder.defineMacro("__MSP430__");
6808 // FIXME: defines for different 'flavours' of MCU
6809 }
Craig Topper6c03a542015-10-19 04:51:35 +00006810 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006811 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006812 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006813 }
6814 bool hasFeature(StringRef Feature) const override {
6815 return Feature == "msp430";
6816 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006817 ArrayRef<const char *> getGCCRegNames() const override;
6818 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006819 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006820 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006821 }
6822 bool validateAsmConstraint(const char *&Name,
6823 TargetInfo::ConstraintInfo &info) const override {
6824 // FIXME: implement
6825 switch (*Name) {
6826 case 'K': // the constant 1
6827 case 'L': // constant -1^20 .. 1^19
6828 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006829 return true;
6830 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006831 // No target constraints for now.
6832 return false;
6833 }
6834 const char *getClobbers() const override {
6835 // FIXME: Is this really right?
6836 return "";
6837 }
6838 BuiltinVaListKind getBuiltinVaListKind() const override {
6839 // FIXME: implement
6840 return TargetInfo::CharPtrBuiltinVaList;
6841 }
6842};
6843
6844const char *const MSP430TargetInfo::GCCRegNames[] = {
6845 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6846 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6847
Craig Topperf054e3a2015-10-19 03:52:27 +00006848ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6849 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006850}
6851
6852// LLVM and Clang cannot be used directly to output native binaries for
6853// target, but is used to compile C code to llvm bitcode with correct
6854// type and alignment information.
6855//
6856// TCE uses the llvm bitcode as input and uses it for generating customized
6857// target processor and program binary. TCE co-design environment is
6858// publicly available in http://tce.cs.tut.fi
6859
6860static const unsigned TCEOpenCLAddrSpaceMap[] = {
6861 3, // opencl_global
6862 4, // opencl_local
6863 5, // opencl_constant
6864 // FIXME: generic has to be added to the target
6865 0, // opencl_generic
6866 0, // cuda_device
6867 0, // cuda_constant
6868 0 // cuda_shared
6869};
6870
6871class TCETargetInfo : public TargetInfo {
6872public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006873 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6874 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006875 TLSSupported = false;
6876 IntWidth = 32;
6877 LongWidth = LongLongWidth = 32;
6878 PointerWidth = 32;
6879 IntAlign = 32;
6880 LongAlign = LongLongAlign = 32;
6881 PointerAlign = 32;
6882 SuitableAlign = 32;
6883 SizeType = UnsignedInt;
6884 IntMaxType = SignedLong;
6885 IntPtrType = SignedInt;
6886 PtrDiffType = SignedInt;
6887 FloatWidth = 32;
6888 FloatAlign = 32;
6889 DoubleWidth = 32;
6890 DoubleAlign = 32;
6891 LongDoubleWidth = 32;
6892 LongDoubleAlign = 32;
6893 FloatFormat = &llvm::APFloat::IEEEsingle;
6894 DoubleFormat = &llvm::APFloat::IEEEsingle;
6895 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006896 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6897 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006898 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6899 UseAddrSpaceMapMangling = true;
6900 }
6901
6902 void getTargetDefines(const LangOptions &Opts,
6903 MacroBuilder &Builder) const override {
6904 DefineStd(Builder, "tce", Opts);
6905 Builder.defineMacro("__TCE__");
6906 Builder.defineMacro("__TCE_V1__");
6907 }
6908 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6909
Craig Topper6c03a542015-10-19 04:51:35 +00006910 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006911 const char *getClobbers() const override { return ""; }
6912 BuiltinVaListKind getBuiltinVaListKind() const override {
6913 return TargetInfo::VoidPtrBuiltinVaList;
6914 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006915 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006916 bool validateAsmConstraint(const char *&Name,
6917 TargetInfo::ConstraintInfo &info) const override {
6918 return true;
6919 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006920 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6921 return None;
6922 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006923};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006924
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006925class BPFTargetInfo : public TargetInfo {
6926public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006927 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6928 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006929 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6930 SizeType = UnsignedLong;
6931 PtrDiffType = SignedLong;
6932 IntPtrType = SignedLong;
6933 IntMaxType = SignedLong;
6934 Int64Type = SignedLong;
6935 RegParmMax = 5;
6936 if (Triple.getArch() == llvm::Triple::bpfeb) {
6937 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006938 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006939 } else {
6940 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006941 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006942 }
6943 MaxAtomicPromoteWidth = 64;
6944 MaxAtomicInlineWidth = 64;
6945 TLSSupported = false;
6946 }
6947 void getTargetDefines(const LangOptions &Opts,
6948 MacroBuilder &Builder) const override {
6949 DefineStd(Builder, "bpf", Opts);
6950 Builder.defineMacro("__BPF__");
6951 }
6952 bool hasFeature(StringRef Feature) const override {
6953 return Feature == "bpf";
6954 }
6955
Craig Topper6c03a542015-10-19 04:51:35 +00006956 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006957 const char *getClobbers() const override {
6958 return "";
6959 }
6960 BuiltinVaListKind getBuiltinVaListKind() const override {
6961 return TargetInfo::VoidPtrBuiltinVaList;
6962 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006963 ArrayRef<const char *> getGCCRegNames() const override {
6964 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006965 }
6966 bool validateAsmConstraint(const char *&Name,
6967 TargetInfo::ConstraintInfo &info) const override {
6968 return true;
6969 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006970 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6971 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006972 }
6973};
6974
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006975class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006976 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006977
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006978 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006979 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006980 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006981 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006982 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006983 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006984 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006985 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006986 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006987 enum DspRevEnum {
6988 NoDSP, DSP1, DSP2
6989 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006990 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006991
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006992protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006993 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006994 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006995
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006996public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006997 MipsTargetInfoBase(const llvm::Triple &Triple, const TargetOptions &,
6998 const std::string &ABIStr, const std::string &CPUStr)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006999 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007000 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007001 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
7002 TheCXXABI.set(TargetCXXABI::GenericMIPS);
7003 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007004
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007005 bool isNaN2008Default() const {
7006 return CPU == "mips32r6" || CPU == "mips64r6";
7007 }
7008
7009 bool isFP64Default() const {
7010 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7011 }
7012
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007013 bool isNan2008() const override {
7014 return IsNan2008;
7015 }
7016
Alp Toker4925ba72014-06-07 23:30:42 +00007017 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00007018 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007019 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
7020 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00007021 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007022 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007023 .Case("mips1", IsMips32)
7024 .Case("mips2", IsMips32)
7025 .Case("mips3", true)
7026 .Case("mips4", true)
7027 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007028 .Case("mips32", IsMips32)
7029 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007030 .Case("mips32r3", IsMips32)
7031 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007032 .Case("mips32r6", IsMips32)
7033 .Case("mips64", true)
7034 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007035 .Case("mips64r3", true)
7036 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007037 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007038 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00007039 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007040 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007041 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007042 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007043 bool
7044 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7045 StringRef CPU,
7046 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007047 if (CPU.empty())
7048 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007049 if (CPU == "octeon")
7050 Features["mips64r2"] = Features["cnmips"] = true;
7051 else
7052 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007053 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007054 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007055
Craig Topper3164f332014-03-11 03:39:26 +00007056 void getTargetDefines(const LangOptions &Opts,
7057 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007058 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007059 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007060 if (Opts.GNUMode)
7061 Builder.defineMacro("mips");
7062
Simon Atanasyan683535b2012-08-29 19:14:58 +00007063 Builder.defineMacro("__REGISTER_PREFIX__", "");
7064
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007065 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007066 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007067 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007068 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007069 case SoftFloat:
7070 Builder.defineMacro("__mips_soft_float", Twine(1));
7071 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007072 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007073
Simon Atanasyan16071912013-04-14 14:07:30 +00007074 if (IsSingleFloat)
7075 Builder.defineMacro("__mips_single_float", Twine(1));
7076
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007077 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7078 Builder.defineMacro("_MIPS_FPSET",
7079 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7080
Simon Atanasyan72244b62012-07-05 16:06:06 +00007081 if (IsMips16)
7082 Builder.defineMacro("__mips16", Twine(1));
7083
Simon Atanasyan60777612013-04-14 14:07:51 +00007084 if (IsMicromips)
7085 Builder.defineMacro("__mips_micromips", Twine(1));
7086
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007087 if (IsNan2008)
7088 Builder.defineMacro("__mips_nan2008", Twine(1));
7089
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007090 switch (DspRev) {
7091 default:
7092 break;
7093 case DSP1:
7094 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7095 Builder.defineMacro("__mips_dsp", Twine(1));
7096 break;
7097 case DSP2:
7098 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7099 Builder.defineMacro("__mips_dspr2", Twine(1));
7100 Builder.defineMacro("__mips_dsp", Twine(1));
7101 break;
7102 }
7103
Jack Carter44ff1e52013-08-12 17:20:29 +00007104 if (HasMSA)
7105 Builder.defineMacro("__mips_msa", Twine(1));
7106
Simon Atanasyan26f19672012-04-05 19:28:31 +00007107 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7108 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7109 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007110
7111 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7112 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007113
7114 // These shouldn't be defined for MIPS-I but there's no need to check
7115 // for that since MIPS-I isn't supported.
7116 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7117 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7118 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007119 }
7120
Craig Topper6c03a542015-10-19 04:51:35 +00007121 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7122 return llvm::makeArrayRef(BuiltinInfo,
7123 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007124 }
Craig Topper3164f332014-03-11 03:39:26 +00007125 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007126 return llvm::StringSwitch<bool>(Feature)
7127 .Case("mips", true)
7128 .Case("fp64", HasFP64)
7129 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007130 }
Craig Topper3164f332014-03-11 03:39:26 +00007131 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007132 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007133 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007134 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007135 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007136 // CPU register names
7137 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007138 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7139 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7140 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007141 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7142 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007143 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7144 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7145 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7146 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007147 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007148 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007149 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7150 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007151 // MSA register names
7152 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7153 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7154 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7155 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7156 // MSA control register names
7157 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7158 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007159 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007160 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007161 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007162 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00007163 bool validateAsmConstraint(const char *&Name,
7164 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007165 switch (*Name) {
7166 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007167 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007168 case 'r': // CPU registers.
7169 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007170 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007171 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007172 case 'c': // $25 for indirect jumps
7173 case 'l': // lo register
7174 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007175 Info.setAllowsRegister();
7176 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007177 case 'I': // Signed 16-bit constant
7178 case 'J': // Integer 0
7179 case 'K': // Unsigned 16-bit constant
7180 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7181 case 'M': // Constants not loadable via lui, addiu, or ori
7182 case 'N': // Constant -1 to -65535
7183 case 'O': // A signed 15-bit constant
7184 case 'P': // A constant between 1 go 65535
7185 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007186 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007187 Info.setAllowsMemory();
7188 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007189 case 'Z':
7190 if (Name[1] == 'C') { // An address usable by ll, and sc.
7191 Info.setAllowsMemory();
7192 Name++; // Skip over 'Z'.
7193 return true;
7194 }
7195 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007196 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007197 }
7198
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007199 std::string convertConstraint(const char *&Constraint) const override {
7200 std::string R;
7201 switch (*Constraint) {
7202 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7203 if (Constraint[1] == 'C') {
7204 R = std::string("^") + std::string(Constraint, 2);
7205 Constraint++;
7206 return R;
7207 }
7208 break;
7209 }
7210 return TargetInfo::convertConstraint(Constraint);
7211 }
7212
Craig Topper3164f332014-03-11 03:39:26 +00007213 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007214 // In GCC, $1 is not widely used in generated code (it's used only in a few
7215 // specific situations), so there is no real need for users to add it to
7216 // the clobbers list if they want to use it in their inline assembly code.
7217 //
7218 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7219 // code generation, so using it in inline assembly without adding it to the
7220 // clobbers list can cause conflicts between the inline assembly code and
7221 // the surrounding generated code.
7222 //
7223 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7224 // operands, which will conflict with the ".set at" assembler option (which
7225 // we use only for inline assembly, in order to maintain compatibility with
7226 // GCC) and will also conflict with the user's usage of $1.
7227 //
7228 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7229 // register for generated code is to automatically clobber $1 for all inline
7230 // assembly code.
7231 //
7232 // FIXME: We should automatically clobber $1 only for inline assembly code
7233 // which actually uses it. This would allow LLVM to use $1 for inline
7234 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007235 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007236 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007237
Craig Topper3164f332014-03-11 03:39:26 +00007238 bool handleTargetFeatures(std::vector<std::string> &Features,
7239 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007240 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007241 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007242 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007243 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007244 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007245 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007246 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007247
Eric Christopher610fe112015-08-26 08:21:55 +00007248 for (const auto &Feature : Features) {
7249 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007250 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007251 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007252 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007253 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007254 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007255 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007256 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007257 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007258 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007259 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007260 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007261 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007262 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007263 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007264 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007265 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007266 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007267 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007268 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007269 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007270 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007271 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007272
James Y Knightb214cbc2016-03-04 19:00:41 +00007273 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007274
Rafael Espindolaeb265472013-08-21 21:59:03 +00007275 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007276 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007277
Craig Topper3164f332014-03-11 03:39:26 +00007278 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007279 if (RegNo == 0) return 4;
7280 if (RegNo == 1) return 5;
7281 return -1;
7282 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007283
7284 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007285};
7286
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007287const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007288#define BUILTIN(ID, TYPE, ATTRS) \
7289 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7290#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7291 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007292#include "clang/Basic/BuiltinsMips.def"
7293};
7294
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007295class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007296public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007297 Mips32TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7298 : MipsTargetInfoBase(Triple, Opts, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007299 SizeType = UnsignedInt;
7300 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007301 Int64Type = SignedLongLong;
7302 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007303 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007304 }
Craig Topper3164f332014-03-11 03:39:26 +00007305 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007306 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007307 ABI = Name;
7308 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007309 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007310 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007311 }
Craig Topper3164f332014-03-11 03:39:26 +00007312 void getTargetDefines(const LangOptions &Opts,
7313 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007314 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007315
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007316 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007317 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7318
7319 const std::string& CPUStr = getCPU();
7320 if (CPUStr == "mips32")
7321 Builder.defineMacro("__mips_isa_rev", "1");
7322 else if (CPUStr == "mips32r2")
7323 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007324 else if (CPUStr == "mips32r3")
7325 Builder.defineMacro("__mips_isa_rev", "3");
7326 else if (CPUStr == "mips32r5")
7327 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007328 else if (CPUStr == "mips32r6")
7329 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007330
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007331 if (ABI == "o32") {
7332 Builder.defineMacro("__mips_o32");
7333 Builder.defineMacro("_ABIO32", "1");
7334 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7335 }
7336 else if (ABI == "eabi")
7337 Builder.defineMacro("__mips_eabi");
7338 else
David Blaikie83d382b2011-09-23 05:06:16 +00007339 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007340 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007341 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007342 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7343 { { "at" }, "$1" },
7344 { { "v0" }, "$2" },
7345 { { "v1" }, "$3" },
7346 { { "a0" }, "$4" },
7347 { { "a1" }, "$5" },
7348 { { "a2" }, "$6" },
7349 { { "a3" }, "$7" },
7350 { { "t0" }, "$8" },
7351 { { "t1" }, "$9" },
7352 { { "t2" }, "$10" },
7353 { { "t3" }, "$11" },
7354 { { "t4" }, "$12" },
7355 { { "t5" }, "$13" },
7356 { { "t6" }, "$14" },
7357 { { "t7" }, "$15" },
7358 { { "s0" }, "$16" },
7359 { { "s1" }, "$17" },
7360 { { "s2" }, "$18" },
7361 { { "s3" }, "$19" },
7362 { { "s4" }, "$20" },
7363 { { "s5" }, "$21" },
7364 { { "s6" }, "$22" },
7365 { { "s7" }, "$23" },
7366 { { "t8" }, "$24" },
7367 { { "t9" }, "$25" },
7368 { { "k0" }, "$26" },
7369 { { "k1" }, "$27" },
7370 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007371 { { "sp","$sp" }, "$29" },
7372 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007373 { { "ra" }, "$31" }
7374 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007375 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007376 }
7377};
7378
7379class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007380 void setDataLayout() override {
7381 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007382 }
7383
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007384public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007385 Mips32EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7386 : Mips32TargetInfoBase(Triple, Opts) {
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00007387 }
Craig Topper3164f332014-03-11 03:39:26 +00007388 void getTargetDefines(const LangOptions &Opts,
7389 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007390 DefineStd(Builder, "MIPSEB", Opts);
7391 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007392 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007393 }
7394};
7395
7396class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007397 void setDataLayout() override {
7398 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007399 }
7400
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007401public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007402 Mips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7403 : Mips32TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007404 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007405 }
Craig Topper3164f332014-03-11 03:39:26 +00007406 void getTargetDefines(const LangOptions &Opts,
7407 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007408 DefineStd(Builder, "MIPSEL", Opts);
7409 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007410 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007411 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007412};
Akira Hatanakabef17452011-09-20 19:21:49 +00007413
7414class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007415public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007416 Mips64TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7417 : MipsTargetInfoBase(Triple, Opts, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007418 LongDoubleWidth = LongDoubleAlign = 128;
7419 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007420 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7421 LongDoubleWidth = LongDoubleAlign = 64;
7422 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7423 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007424 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007425 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007426 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007427 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007428
7429 void setN64ABITypes() {
7430 LongWidth = LongAlign = 64;
7431 PointerWidth = PointerAlign = 64;
7432 SizeType = UnsignedLong;
7433 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007434 Int64Type = SignedLong;
7435 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007436 }
7437
7438 void setN32ABITypes() {
7439 LongWidth = LongAlign = 32;
7440 PointerWidth = PointerAlign = 32;
7441 SizeType = UnsignedInt;
7442 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007443 Int64Type = SignedLongLong;
7444 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007445 }
7446
Craig Topper3164f332014-03-11 03:39:26 +00007447 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007448 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007449 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007450 ABI = Name;
7451 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007452 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007453 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007454 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007455 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007456 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007457 }
7458 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007459 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007460
Craig Topper3164f332014-03-11 03:39:26 +00007461 void getTargetDefines(const LangOptions &Opts,
7462 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007463 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007464
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007465 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007466 Builder.defineMacro("__mips64");
7467 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007468 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7469
7470 const std::string& CPUStr = getCPU();
7471 if (CPUStr == "mips64")
7472 Builder.defineMacro("__mips_isa_rev", "1");
7473 else if (CPUStr == "mips64r2")
7474 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007475 else if (CPUStr == "mips64r3")
7476 Builder.defineMacro("__mips_isa_rev", "3");
7477 else if (CPUStr == "mips64r5")
7478 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007479 else if (CPUStr == "mips64r6")
7480 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007481
Akira Hatanakabef17452011-09-20 19:21:49 +00007482 if (ABI == "n32") {
7483 Builder.defineMacro("__mips_n32");
7484 Builder.defineMacro("_ABIN32", "2");
7485 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7486 }
7487 else if (ABI == "n64") {
7488 Builder.defineMacro("__mips_n64");
7489 Builder.defineMacro("_ABI64", "3");
7490 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7491 }
7492 else
David Blaikie83d382b2011-09-23 05:06:16 +00007493 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007494
7495 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007496 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007497 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007498 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7499 { { "at" }, "$1" },
7500 { { "v0" }, "$2" },
7501 { { "v1" }, "$3" },
7502 { { "a0" }, "$4" },
7503 { { "a1" }, "$5" },
7504 { { "a2" }, "$6" },
7505 { { "a3" }, "$7" },
7506 { { "a4" }, "$8" },
7507 { { "a5" }, "$9" },
7508 { { "a6" }, "$10" },
7509 { { "a7" }, "$11" },
7510 { { "t0" }, "$12" },
7511 { { "t1" }, "$13" },
7512 { { "t2" }, "$14" },
7513 { { "t3" }, "$15" },
7514 { { "s0" }, "$16" },
7515 { { "s1" }, "$17" },
7516 { { "s2" }, "$18" },
7517 { { "s3" }, "$19" },
7518 { { "s4" }, "$20" },
7519 { { "s5" }, "$21" },
7520 { { "s6" }, "$22" },
7521 { { "s7" }, "$23" },
7522 { { "t8" }, "$24" },
7523 { { "t9" }, "$25" },
7524 { { "k0" }, "$26" },
7525 { { "k1" }, "$27" },
7526 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007527 { { "sp","$sp" }, "$29" },
7528 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007529 { { "ra" }, "$31" }
7530 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007531 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007532 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007533
7534 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007535};
7536
7537class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007538 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007539 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007540 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007541 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007542 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007543 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007544
Akira Hatanakabef17452011-09-20 19:21:49 +00007545public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007546 Mips64EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7547 : Mips64TargetInfoBase(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00007548 void getTargetDefines(const LangOptions &Opts,
7549 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007550 DefineStd(Builder, "MIPSEB", Opts);
7551 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007552 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007553 }
7554};
7555
7556class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007557 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007558 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007559 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007560 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007561 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007562 }
7563public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007564 Mips64ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7565 : Mips64TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007566 // Default ABI is n64.
7567 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007568 }
Craig Topper3164f332014-03-11 03:39:26 +00007569 void getTargetDefines(const LangOptions &Opts,
7570 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007571 DefineStd(Builder, "MIPSEL", Opts);
7572 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007573 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007574 }
7575};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007576
Ivan Krasindd7403e2011-08-24 20:22:22 +00007577class PNaClTargetInfo : public TargetInfo {
7578public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007579 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7580 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007581 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007582 this->LongAlign = 32;
7583 this->LongWidth = 32;
7584 this->PointerAlign = 32;
7585 this->PointerWidth = 32;
7586 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007587 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007588 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007589 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007590 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007591 this->SizeType = TargetInfo::UnsignedInt;
7592 this->PtrDiffType = TargetInfo::SignedInt;
7593 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007594 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007595 }
7596
Craig Toppere6f17d02014-03-11 04:07:52 +00007597 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007598 Builder.defineMacro("__le32__");
7599 Builder.defineMacro("__pnacl__");
7600 }
Craig Topper3164f332014-03-11 03:39:26 +00007601 void getTargetDefines(const LangOptions &Opts,
7602 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007603 getArchDefines(Opts, Builder);
7604 }
Craig Topper3164f332014-03-11 03:39:26 +00007605 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007606 return Feature == "pnacl";
7607 }
Craig Topper6c03a542015-10-19 04:51:35 +00007608 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007609 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007610 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007611 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007612 ArrayRef<const char *> getGCCRegNames() const override;
7613 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007614 bool validateAsmConstraint(const char *&Name,
7615 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007616 return false;
7617 }
7618
Craig Topper3164f332014-03-11 03:39:26 +00007619 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007620 return "";
7621 }
7622};
7623
Craig Topperf054e3a2015-10-19 03:52:27 +00007624ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7625 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007626}
7627
Craig Topperf054e3a2015-10-19 03:52:27 +00007628ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7629 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007630}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007631
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007632// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7633class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7634public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007635 NaClMips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7636 : Mips32ELTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007637
7638 BuiltinVaListKind getBuiltinVaListKind() const override {
7639 return TargetInfo::PNaClABIBuiltinVaList;
7640 }
7641};
7642
JF Bastien643817d2014-09-12 17:52:47 +00007643class Le64TargetInfo : public TargetInfo {
7644 static const Builtin::Info BuiltinInfo[];
7645
7646public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007647 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7648 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007649 BigEndian = false;
7650 NoAsmVariants = true;
7651 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7652 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007653 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007654 }
7655
7656 void getTargetDefines(const LangOptions &Opts,
7657 MacroBuilder &Builder) const override {
7658 DefineStd(Builder, "unix", Opts);
7659 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7660 Builder.defineMacro("__ELF__");
7661 }
Craig Topper6c03a542015-10-19 04:51:35 +00007662 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7663 return llvm::makeArrayRef(BuiltinInfo,
7664 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007665 }
7666 BuiltinVaListKind getBuiltinVaListKind() const override {
7667 return TargetInfo::PNaClABIBuiltinVaList;
7668 }
7669 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007670 ArrayRef<const char *> getGCCRegNames() const override {
7671 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007672 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007673 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7674 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007675 }
7676 bool validateAsmConstraint(const char *&Name,
7677 TargetInfo::ConstraintInfo &Info) const override {
7678 return false;
7679 }
7680
7681 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007682};
Dan Gohmanc2853072015-09-03 22:51:53 +00007683
7684class WebAssemblyTargetInfo : public TargetInfo {
7685 static const Builtin::Info BuiltinInfo[];
7686
7687 enum SIMDEnum {
7688 NoSIMD,
7689 SIMD128,
7690 } SIMDLevel;
7691
7692public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007693 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007694 : TargetInfo(T), SIMDLevel(NoSIMD) {
7695 BigEndian = false;
7696 NoAsmVariants = true;
7697 SuitableAlign = 128;
7698 LargeArrayMinWidth = 128;
7699 LargeArrayAlign = 128;
7700 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007701 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007702 LongDoubleWidth = LongDoubleAlign = 128;
7703 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007704 }
7705
7706protected:
7707 void getTargetDefines(const LangOptions &Opts,
7708 MacroBuilder &Builder) const override {
7709 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7710 if (SIMDLevel >= SIMD128)
7711 Builder.defineMacro("__wasm_simd128__");
7712 }
7713
7714private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007715 bool
7716 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7717 StringRef CPU,
7718 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007719 if (CPU == "bleeding-edge")
7720 Features["simd128"] = true;
7721 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7722 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007723 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007724 return llvm::StringSwitch<bool>(Feature)
7725 .Case("simd128", SIMDLevel >= SIMD128)
7726 .Default(false);
7727 }
7728 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007729 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007730 for (const auto &Feature : Features) {
7731 if (Feature == "+simd128") {
7732 SIMDLevel = std::max(SIMDLevel, SIMD128);
7733 continue;
7734 }
7735 if (Feature == "-simd128") {
7736 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7737 continue;
7738 }
7739
7740 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7741 << "-target-feature";
7742 return false;
7743 }
7744 return true;
7745 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007746 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007747 return llvm::StringSwitch<bool>(Name)
7748 .Case("mvp", true)
7749 .Case("bleeding-edge", true)
7750 .Case("generic", true)
7751 .Default(false);
7752 }
Craig Topper6c03a542015-10-19 04:51:35 +00007753 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7754 return llvm::makeArrayRef(BuiltinInfo,
7755 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007756 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007757 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007758 return VoidPtrBuiltinVaList;
7759 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007760 ArrayRef<const char *> getGCCRegNames() const final {
7761 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007762 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007763 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7764 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007765 }
7766 bool
7767 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007768 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007769 return false;
7770 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007771 const char *getClobbers() const final { return ""; }
7772 bool isCLZForZeroUndef() const final { return false; }
7773 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007774 IntType getIntTypeByWidth(unsigned BitWidth,
7775 bool IsSigned) const final {
7776 // WebAssembly prefers long long for explicitly 64-bit integers.
7777 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7778 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7779 }
7780 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7781 bool IsSigned) const final {
7782 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7783 return BitWidth == 64
7784 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7785 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7786 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007787};
7788
7789const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7790#define BUILTIN(ID, TYPE, ATTRS) \
7791 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7792#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7793 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7794#include "clang/Basic/BuiltinsWebAssembly.def"
7795};
7796
7797class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7798public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007799 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7800 const TargetOptions &Opts)
7801 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007802 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007803 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007804 }
7805
7806protected:
7807 void getTargetDefines(const LangOptions &Opts,
7808 MacroBuilder &Builder) const override {
7809 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7810 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7811 }
7812};
7813
7814class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7815public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007816 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7817 const TargetOptions &Opts)
7818 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007819 LongAlign = LongWidth = 64;
7820 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007821 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007822 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007823 }
7824
7825protected:
7826 void getTargetDefines(const LangOptions &Opts,
7827 MacroBuilder &Builder) const override {
7828 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7829 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7830 }
7831};
7832
JF Bastien643817d2014-09-12 17:52:47 +00007833const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7834#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007835 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007836#include "clang/Basic/BuiltinsLe64.def"
7837};
7838
Eric Christopherc48497a2015-09-18 21:26:24 +00007839static const unsigned SPIRAddrSpaceMap[] = {
7840 1, // opencl_global
7841 3, // opencl_local
7842 2, // opencl_constant
7843 4, // opencl_generic
7844 0, // cuda_device
7845 0, // cuda_constant
7846 0 // cuda_shared
7847};
7848class SPIRTargetInfo : public TargetInfo {
7849public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007850 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7851 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007852 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7853 "SPIR target must use unknown OS");
7854 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7855 "SPIR target must use unknown environment type");
7856 BigEndian = false;
7857 TLSSupported = false;
7858 LongWidth = LongAlign = 64;
7859 AddrSpaceMap = &SPIRAddrSpaceMap;
7860 UseAddrSpaceMapMangling = true;
7861 // Define available target features
7862 // These must be defined in sorted order!
7863 NoAsmVariants = true;
7864 }
7865 void getTargetDefines(const LangOptions &Opts,
7866 MacroBuilder &Builder) const override {
7867 DefineStd(Builder, "SPIR", Opts);
7868 }
7869 bool hasFeature(StringRef Feature) const override {
7870 return Feature == "spir";
7871 }
Craig Topper3164f332014-03-11 03:39:26 +00007872
Craig Topper6c03a542015-10-19 04:51:35 +00007873 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007874 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007875 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007876 bool validateAsmConstraint(const char *&Name,
7877 TargetInfo::ConstraintInfo &info) const override {
7878 return true;
7879 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007880 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7881 return None;
7882 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007883 BuiltinVaListKind getBuiltinVaListKind() const override {
7884 return TargetInfo::VoidPtrBuiltinVaList;
7885 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007886
Eric Christopherc48497a2015-09-18 21:26:24 +00007887 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7888 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7889 : CCCR_Warning;
7890 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007891
Eric Christopherc48497a2015-09-18 21:26:24 +00007892 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7893 return CC_SpirFunction;
7894 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007895
7896 void setSupportedOpenCLOpts() override {
7897 // Assume all OpenCL extensions and optional core features are supported
7898 // for SPIR since it is a generic target.
7899 getSupportedOpenCLOpts().setAll();
7900 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007901};
Guy Benyeib798fc92012-12-11 21:38:14 +00007902
Eric Christopherc48497a2015-09-18 21:26:24 +00007903class SPIR32TargetInfo : public SPIRTargetInfo {
7904public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007905 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7906 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007907 PointerWidth = PointerAlign = 32;
7908 SizeType = TargetInfo::UnsignedInt;
7909 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007910 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7911 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007912 }
7913 void getTargetDefines(const LangOptions &Opts,
7914 MacroBuilder &Builder) const override {
7915 DefineStd(Builder, "SPIR32", Opts);
7916 }
7917};
Guy Benyeib798fc92012-12-11 21:38:14 +00007918
Eric Christopherc48497a2015-09-18 21:26:24 +00007919class SPIR64TargetInfo : public SPIRTargetInfo {
7920public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007921 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7922 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007923 PointerWidth = PointerAlign = 64;
7924 SizeType = TargetInfo::UnsignedLong;
7925 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007926 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7927 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007928 }
7929 void getTargetDefines(const LangOptions &Opts,
7930 MacroBuilder &Builder) const override {
7931 DefineStd(Builder, "SPIR64", Opts);
7932 }
7933};
Guy Benyeib798fc92012-12-11 21:38:14 +00007934
Robert Lytton0e076492013-08-13 09:43:10 +00007935class XCoreTargetInfo : public TargetInfo {
7936 static const Builtin::Info BuiltinInfo[];
7937public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007938 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7939 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007940 BigEndian = false;
7941 NoAsmVariants = true;
7942 LongLongAlign = 32;
7943 SuitableAlign = 32;
7944 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007945 SizeType = UnsignedInt;
7946 PtrDiffType = SignedInt;
7947 IntPtrType = SignedInt;
7948 WCharType = UnsignedChar;
7949 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007950 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007951 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7952 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007953 }
Craig Topper3164f332014-03-11 03:39:26 +00007954 void getTargetDefines(const LangOptions &Opts,
7955 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007956 Builder.defineMacro("__XS1B__");
7957 }
Craig Topper6c03a542015-10-19 04:51:35 +00007958 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7959 return llvm::makeArrayRef(BuiltinInfo,
7960 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007961 }
Craig Topper3164f332014-03-11 03:39:26 +00007962 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007963 return TargetInfo::VoidPtrBuiltinVaList;
7964 }
Craig Topper3164f332014-03-11 03:39:26 +00007965 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007966 return "";
7967 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007968 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007969 static const char * const GCCRegNames[] = {
7970 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7971 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7972 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007973 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007974 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007975 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7976 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007977 }
Craig Topper3164f332014-03-11 03:39:26 +00007978 bool validateAsmConstraint(const char *&Name,
7979 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007980 return false;
7981 }
Craig Topper3164f332014-03-11 03:39:26 +00007982 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007983 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7984 return (RegNo < 2)? RegNo : -1;
7985 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007986 bool allowsLargerPreferedTypeAlignment() const override {
7987 return false;
7988 }
Robert Lytton0e076492013-08-13 09:43:10 +00007989};
7990
7991const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007992#define BUILTIN(ID, TYPE, ATTRS) \
7993 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7994#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7995 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007996#include "clang/Basic/BuiltinsXCore.def"
7997};
Robert Lytton0e076492013-08-13 09:43:10 +00007998
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007999// x86_32 Android target
8000class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8001public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008002 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8003 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008004 SuitableAlign = 32;
8005 LongDoubleWidth = 64;
8006 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8007 }
8008};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008009
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008010// x86_64 Android target
8011class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8012public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008013 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8014 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008015 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8016 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008017
8018 bool useFloat128ManglingForLongDouble() const override {
8019 return true;
8020 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008021};
8022} // end anonymous namespace
8023
Chris Lattner5ba61f02006-10-14 07:39:34 +00008024//===----------------------------------------------------------------------===//
8025// Driver code
8026//===----------------------------------------------------------------------===//
8027
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008028static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8029 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008030 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008031
Daniel Dunbar52322032009-08-18 05:47:58 +00008032 switch (Triple.getArch()) {
8033 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008034 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008035
Tim Northover2a0783d2014-05-30 14:14:07 +00008036 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008037 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008038
8039 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008040 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008041
Jacques Pienaard964cc22016-03-28 21:02:54 +00008042 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008043 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008044
Tim Northover2a0783d2014-05-30 14:14:07 +00008045 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008046 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008047 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008048
8049 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008050 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008051 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008052 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008053 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008054 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008055 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008056 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008057 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008058 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008059 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008060 }
8061
Christian Pirker9b019ae2014-02-25 13:51:00 +00008062 case llvm::Triple::aarch64_be:
8063 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008064 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008065 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008066 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008067 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008068 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008069 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008070 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008071 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008072 }
8073
Daniel Dunbar52322032009-08-18 05:47:58 +00008074 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008075 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008076 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008077 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008078
Daniel Dunbar52322032009-08-18 05:47:58 +00008079 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008080 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008081 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008082 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008083 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008084 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008085 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008086 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008087 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008088 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008089 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008090 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008091 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008092 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008093 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008094 case llvm::Triple::Win32:
8095 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008096 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008097 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008098 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008099 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008100 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008101 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008102 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008103 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008104 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008105 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008106 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008107 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008108 }
8109
8110 case llvm::Triple::armeb:
8111 case llvm::Triple::thumbeb:
8112 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008113 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008114
8115 switch (os) {
8116 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008117 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008118 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008119 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008120 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008121 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008122 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008123 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008124 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008125 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008126 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008127 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008128 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008129 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008130 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008131 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008132 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008133
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008134 case llvm::Triple::bpfeb:
8135 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008136 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008137
Daniel Dunbar52322032009-08-18 05:47:58 +00008138 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008139 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008140
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008141 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008142 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008143 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008144 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008145 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008146 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008147 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008148 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008149 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008150 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008151 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008152 return new Mips32EBTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008153 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008154
8155 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008156 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008157 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008158 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008159 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008160 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008161 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008162 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008163 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008164 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008165 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008166 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008167 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008168 return new Mips32ELTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008169 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008170
Akira Hatanakabef17452011-09-20 19:21:49 +00008171 case llvm::Triple::mips64:
8172 switch (os) {
8173 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008174 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008175 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008176 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008177 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008178 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008179 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008180 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008181 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008182 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008183 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008184 return new Mips64EBTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008185 }
8186
8187 case llvm::Triple::mips64el:
8188 switch (os) {
8189 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008190 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008191 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008192 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008193 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008194 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008195 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008196 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008197 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008198 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008199 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008200 return new Mips64ELTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008201 }
8202
Ivan Krasindd7403e2011-08-24 20:22:22 +00008203 case llvm::Triple::le32:
8204 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008205 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008206 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008207 default:
8208 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008209 }
8210
JF Bastien643817d2014-09-12 17:52:47 +00008211 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008212 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008213
Daniel Dunbar52322032009-08-18 05:47:58 +00008214 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008215 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008216 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008217 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008218 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008219 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008220 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008222 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008224 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008226 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008228 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008230 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008231
8232 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008233 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008234 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008235 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008236 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008238 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008240 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008242 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008244 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008246 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008247
Bill Schmidt778d3872013-07-26 01:36:11 +00008248 case llvm::Triple::ppc64le:
8249 switch (os) {
8250 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008251 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008252 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008253 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008254 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008256 }
8257
Peter Collingbournec947aae2012-05-20 23:28:41 +00008258 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008260 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008262
Tom Stellardd8e38a32015-01-06 20:34:47 +00008263 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008264 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008265 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008266
Daniel Dunbar52322032009-08-18 05:47:58 +00008267 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008268 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008269 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008270 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008271 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008272 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008273 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008274 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008275 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008276 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008277 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008278 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008279 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008280 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008281 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008282
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008283 // The 'sparcel' architecture copies all the above cases except for Solaris.
8284 case llvm::Triple::sparcel:
8285 switch (os) {
8286 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008287 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008288 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008289 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008290 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008291 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008292 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008294 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008295 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008296 }
8297
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008298 case llvm::Triple::sparcv9:
8299 switch (os) {
8300 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008302 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008304 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008306 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008308 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008310 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008312 }
8313
Ulrich Weigand47445072013-05-06 16:26:41 +00008314 case llvm::Triple::systemz:
8315 switch (os) {
8316 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008317 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008318 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008319 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008320 }
8321
Eli Friedmana9c3d712009-08-19 20:47:07 +00008322 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008323 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008324
Daniel Dunbar52322032009-08-18 05:47:58 +00008325 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008326 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008328
Daniel Dunbar52322032009-08-18 05:47:58 +00008329 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008330 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008332 case llvm::Triple::Linux: {
8333 switch (Triple.getEnvironment()) {
8334 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008336 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008337 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008338 }
8339 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008340 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008341 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008342 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008343 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008344 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008345 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008346 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008347 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008348 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008350 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008351 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008352 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008353 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008354 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008356 case llvm::Triple::Win32: {
8357 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008358 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008359 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008360 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008361 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008362 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008363 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008364 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008366 }
8367 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008368 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008370 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008371 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008372 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008373 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008374 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008375 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008376 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008377 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008378 }
8379
8380 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008381 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008383
Daniel Dunbar52322032009-08-18 05:47:58 +00008384 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008385 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008386 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008387 case llvm::Triple::Linux: {
8388 switch (Triple.getEnvironment()) {
8389 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008391 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008392 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008393 }
8394 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008395 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008396 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008397 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008398 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008399 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008401 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008402 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008403 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008404 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008405 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008406 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008407 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008408 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008409 case llvm::Triple::Win32: {
8410 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008411 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008412 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008413 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008414 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008415 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008416 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008417 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008418 }
8419 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008420 case llvm::Triple::Haiku:
8421 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008422 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008423 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008424 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008425 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008426 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008428 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008429
Douglas Katzman78d7c542015-05-12 21:18:10 +00008430 case llvm::Triple::spir: {
8431 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8432 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8433 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008434 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008435 }
8436 case llvm::Triple::spir64: {
8437 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8438 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8439 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008440 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008441 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008442 case llvm::Triple::wasm32:
8443 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8444 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008445 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008446 case llvm::Triple::wasm64:
8447 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8448 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008449 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008450 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008451}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008452
8453/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008454/// options.
Alp Toker80758082014-07-06 05:26:44 +00008455TargetInfo *
8456TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008457 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008458 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008459
8460 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008462 if (!Target) {
8463 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008464 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008465 }
Alp Toker80758082014-07-06 05:26:44 +00008466 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008467
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008468 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008469 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8470 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008471 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008472 }
8473
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008474 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008475 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8476 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008477 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008478 }
8479
Rafael Espindolaeb265472013-08-21 21:59:03 +00008480 // Set the fp math unit.
8481 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8482 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008483 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008484 }
8485
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008486 // Compute the default target features, we need the target to handle this
8487 // because features may have dependencies on one another.
8488 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008489 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8490 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008491 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008492
8493 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008494 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008495 for (const auto &F : Features)
8496 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8497
Eric Christopher3ff21b32013-10-16 21:26:26 +00008498 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008499 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008500
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008501 Target->setSupportedOpenCLOpts();
8502
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008503 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008504}