blob: ae6c2e616e76596d9700ef941ce91e2af5553b5c [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
Chris Lattner3e2ee142010-07-07 16:01:42 +0000385// Minix Target
386template<typename Target>
387class MinixTargetInfo : public OSTargetInfo<Target> {
388protected:
Craig Topper3164f332014-03-11 03:39:26 +0000389 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
390 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000391 // Minix defines
392
393 Builder.defineMacro("__minix", "3");
394 Builder.defineMacro("_EM_WSIZE", "4");
395 Builder.defineMacro("_EM_PSIZE", "4");
396 Builder.defineMacro("_EM_SSIZE", "2");
397 Builder.defineMacro("_EM_LSIZE", "4");
398 Builder.defineMacro("_EM_FSIZE", "4");
399 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000400 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000401 DefineStd(Builder, "unix", Opts);
402 }
403public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000404 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
405 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000406};
407
Torok Edwinb2b37c62009-06-30 17:10:35 +0000408// Linux target
409template<typename Target>
410class LinuxTargetInfo : 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 {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000414 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000415 DefineStd(Builder, "unix", Opts);
416 DefineStd(Builder, "linux", Opts);
417 Builder.defineMacro("__gnu_linux__");
418 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000419 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000420 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000421 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000422 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000423 this->PlatformName = "android";
424 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
425 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000426 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000427 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000428 if (Opts.CPlusPlus)
429 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000430 if (this->HasFloat128)
431 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000432 }
433public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000434 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
435 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000436 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000437
438 switch (Triple.getArch()) {
439 default:
440 break;
441 case llvm::Triple::ppc:
442 case llvm::Triple::ppc64:
443 case llvm::Triple::ppc64le:
444 this->MCountName = "_mcount";
445 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000446 case llvm::Triple::x86:
447 case llvm::Triple::x86_64:
448 case llvm::Triple::systemz:
449 this->HasFloat128 = true;
450 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000451 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000452 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000453
Craig Topper3164f332014-03-11 03:39:26 +0000454 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000455 return ".text.startup";
456 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457};
458
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000459// NetBSD Target
460template<typename Target>
461class NetBSDTargetInfo : public OSTargetInfo<Target> {
462protected:
Craig Topper3164f332014-03-11 03:39:26 +0000463 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
464 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000465 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000466 Builder.defineMacro("__NetBSD__");
467 Builder.defineMacro("__unix__");
468 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000471
472 switch (Triple.getArch()) {
473 default:
474 break;
475 case llvm::Triple::arm:
476 case llvm::Triple::armeb:
477 case llvm::Triple::thumb:
478 case llvm::Triple::thumbeb:
479 Builder.defineMacro("__ARM_DWARF_EH__");
480 break;
481 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000482 }
483public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000484 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
485 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000486 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000487 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000488};
489
Torok Edwinb2b37c62009-06-30 17:10:35 +0000490// OpenBSD Target
491template<typename Target>
492class OpenBSDTargetInfo : public OSTargetInfo<Target> {
493protected:
Craig Topper3164f332014-03-11 03:39:26 +0000494 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
495 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000496 // OpenBSD defines; list based off of gcc output
497
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000498 Builder.defineMacro("__OpenBSD__");
499 DefineStd(Builder, "unix", Opts);
500 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000501 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000502 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000503 }
504public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000505 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
506 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000507 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000508
Eli Friedman3715d1f2011-12-15 02:15:56 +0000509 switch (Triple.getArch()) {
510 default:
511 case llvm::Triple::x86:
512 case llvm::Triple::x86_64:
513 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000514 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000515 this->MCountName = "__mcount";
516 break;
517 case llvm::Triple::mips64:
518 case llvm::Triple::mips64el:
519 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000520 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000521 this->MCountName = "_mcount";
522 break;
523 }
524 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000525};
526
Eli Friedman9fa28852012-08-08 23:57:20 +0000527// Bitrig Target
528template<typename Target>
529class BitrigTargetInfo : public OSTargetInfo<Target> {
530protected:
Craig Topper3164f332014-03-11 03:39:26 +0000531 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
532 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000533 // Bitrig defines; list based off of gcc output
534
535 Builder.defineMacro("__Bitrig__");
536 DefineStd(Builder, "unix", Opts);
537 Builder.defineMacro("__ELF__");
538 if (Opts.POSIXThreads)
539 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000540
541 switch (Triple.getArch()) {
542 default:
543 break;
544 case llvm::Triple::arm:
545 case llvm::Triple::armeb:
546 case llvm::Triple::thumb:
547 case llvm::Triple::thumbeb:
548 Builder.defineMacro("__ARM_DWARF_EH__");
549 break;
550 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000551 }
552public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000553 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
554 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000555 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000556 }
557};
558
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000559// PSP Target
560template<typename Target>
561class PSPTargetInfo : public OSTargetInfo<Target> {
562protected:
Craig Topper3164f332014-03-11 03:39:26 +0000563 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
564 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000565 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000566 Builder.defineMacro("PSP");
567 Builder.defineMacro("_PSP");
568 Builder.defineMacro("__psp__");
569 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000570 }
571public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000572 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000573};
574
John Thompsone467e192009-11-19 17:18:50 +0000575// PS3 PPU Target
576template<typename Target>
577class PS3PPUTargetInfo : public OSTargetInfo<Target> {
578protected:
Craig Topper3164f332014-03-11 03:39:26 +0000579 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
580 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000581 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000582 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000583 Builder.defineMacro("__PPU__");
584 Builder.defineMacro("__CELLOS_LV2__");
585 Builder.defineMacro("__ELF__");
586 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000587 Builder.defineMacro("_ARCH_PPC64");
588 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000589 }
590public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000591 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
592 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000593 this->LongWidth = this->LongAlign = 32;
594 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000595 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000596 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000597 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000598 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000599 }
600};
601
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000602template <typename Target>
603class PS4OSTargetInfo : public OSTargetInfo<Target> {
604protected:
605 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
606 MacroBuilder &Builder) const override {
607 Builder.defineMacro("__FreeBSD__", "9");
608 Builder.defineMacro("__FreeBSD_cc_version", "900001");
609 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
610 DefineStd(Builder, "unix", Opts);
611 Builder.defineMacro("__ELF__");
612 Builder.defineMacro("__PS4__");
613 }
614public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000615 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
616 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000617 this->WCharType = this->UnsignedShort;
618
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000619 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
620 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000621
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000622 // On PS4, do not honor explicit bit field alignment,
623 // as in "__attribute__((aligned(2))) int b : 1;".
624 this->UseExplicitBitFieldAlignment = false;
625
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000626 switch (Triple.getArch()) {
627 default:
628 case llvm::Triple::x86_64:
629 this->MCountName = ".mcount";
630 break;
631 }
632 }
633};
634
Torok Edwinb2b37c62009-06-30 17:10:35 +0000635// Solaris target
636template<typename Target>
637class SolarisTargetInfo : public OSTargetInfo<Target> {
638protected:
Craig Topper3164f332014-03-11 03:39:26 +0000639 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
640 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000641 DefineStd(Builder, "sun", Opts);
642 DefineStd(Builder, "unix", Opts);
643 Builder.defineMacro("__ELF__");
644 Builder.defineMacro("__svr4__");
645 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000646 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
647 // newer, but to 500 for everything else. feature_test.h has a check to
648 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000649 // with a new version.
650 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000651 Builder.defineMacro("_XOPEN_SOURCE", "600");
652 else
653 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000654 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000655 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000656 Builder.defineMacro("_LARGEFILE_SOURCE");
657 Builder.defineMacro("_LARGEFILE64_SOURCE");
658 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000659 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000660 }
661public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000662 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
663 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000664 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000665 // FIXME: WIntType should be SignedLong
666 }
667};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000668
669// Windows target
670template<typename Target>
671class WindowsTargetInfo : public OSTargetInfo<Target> {
672protected:
Craig Topper3164f332014-03-11 03:39:26 +0000673 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
674 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000675 Builder.defineMacro("_WIN32");
676 }
677 void getVisualStudioDefines(const LangOptions &Opts,
678 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000679 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000680 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000681 Builder.defineMacro("_CPPRTTI");
682
Reid Kleckner16514352015-01-30 21:42:55 +0000683 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000684 Builder.defineMacro("_CPPUNWIND");
685 }
686
David Majnemer6a658902015-07-22 22:36:26 +0000687 if (Opts.Bool)
688 Builder.defineMacro("__BOOL_DEFINED");
689
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000690 if (!Opts.CharIsSigned)
691 Builder.defineMacro("_CHAR_UNSIGNED");
692
693 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
694 // but it works for now.
695 if (Opts.POSIXThreads)
696 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000697
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000698 if (Opts.MSCompatibilityVersion) {
699 Builder.defineMacro("_MSC_VER",
700 Twine(Opts.MSCompatibilityVersion / 100000));
701 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000702 // FIXME We cannot encode the revision information into 32-bits
703 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000704
David Majnemerb710a932015-05-11 03:57:49 +0000705 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000706 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000707 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000708
709 if (Opts.MicrosoftExt) {
710 Builder.defineMacro("_MSC_EXTENSIONS");
711
712 if (Opts.CPlusPlus11) {
713 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
714 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
715 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
716 }
717 }
718
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000719 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000720 }
721
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000723 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
724 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000725};
726
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000727template <typename Target>
728class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000729protected:
Craig Topper3164f332014-03-11 03:39:26 +0000730 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
731 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000732 if (Opts.POSIXThreads)
733 Builder.defineMacro("_REENTRANT");
734 if (Opts.CPlusPlus)
735 Builder.defineMacro("_GNU_SOURCE");
736
737 DefineStd(Builder, "unix", Opts);
738 Builder.defineMacro("__ELF__");
739 Builder.defineMacro("__native_client__");
740 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000741
742public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000743 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
744 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000745 this->LongAlign = 32;
746 this->LongWidth = 32;
747 this->PointerAlign = 32;
748 this->PointerWidth = 32;
749 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000750 this->Int64Type = TargetInfo::SignedLongLong;
751 this->DoubleAlign = 64;
752 this->LongDoubleWidth = 64;
753 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000754 this->LongLongWidth = 64;
755 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000756 this->SizeType = TargetInfo::UnsignedInt;
757 this->PtrDiffType = TargetInfo::SignedInt;
758 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000759 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000760 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000761 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000762 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000763 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000764 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000765 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000766 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000767 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000768 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000769 } else {
770 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000771 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000772 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000773 }
774};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000775
Dan Gohmanc2853072015-09-03 22:51:53 +0000776// WebAssembly target
777template <typename Target>
778class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
779 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000780 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000781 // A common platform macro.
782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 // Follow g++ convention and predefine _GNU_SOURCE for C++.
785 if (Opts.CPlusPlus)
786 Builder.defineMacro("_GNU_SOURCE");
787 }
788
789 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000790 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000791 return ".text.__startup";
792 }
793
794public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000795 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
796 const TargetOptions &Opts)
797 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000798 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000799 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
800 }
801};
Dan Gohmanc2853072015-09-03 22:51:53 +0000802
Chris Lattner09d98f52008-10-05 21:50:58 +0000803//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000804// Specific target implementations.
805//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000806
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000807// PPC abstract base class
808class PPCTargetInfo : public TargetInfo {
809 static const Builtin::Info BuiltinInfo[];
810 static const char * const GCCRegNames[];
811 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000812 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000813
814 // Target cpu features.
815 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000816 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000817 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000818 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000819 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000820 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000821 bool HasBPERMD;
822 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000823
Ulrich Weigand8afad612014-07-28 13:17:52 +0000824protected:
825 std::string ABI;
826
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000827public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000828 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000829 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
830 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000831 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000832 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000833 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000834 LongDoubleWidth = LongDoubleAlign = 128;
835 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
836 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000837
Hal Finkel6b984f02012-07-03 16:51:04 +0000838 /// \brief Flags for architecture specific defines.
839 typedef enum {
840 ArchDefineNone = 0,
841 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
842 ArchDefinePpcgr = 1 << 1,
843 ArchDefinePpcsq = 1 << 2,
844 ArchDefine440 = 1 << 3,
845 ArchDefine603 = 1 << 4,
846 ArchDefine604 = 1 << 5,
847 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000848 ArchDefinePwr5 = 1 << 7,
849 ArchDefinePwr5x = 1 << 8,
850 ArchDefinePwr6 = 1 << 9,
851 ArchDefinePwr6x = 1 << 10,
852 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000853 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000854 ArchDefinePwr9 = 1 << 13,
855 ArchDefineA2 = 1 << 14,
856 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000857 } ArchDefineTypes;
858
Bill Schmidt38378a02013-02-01 20:23:10 +0000859 // Note: GCC recognizes the following additional cpus:
860 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
861 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
862 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000863 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000864 bool CPUKnown = llvm::StringSwitch<bool>(Name)
865 .Case("generic", true)
866 .Case("440", true)
867 .Case("450", true)
868 .Case("601", true)
869 .Case("602", true)
870 .Case("603", true)
871 .Case("603e", true)
872 .Case("603ev", true)
873 .Case("604", true)
874 .Case("604e", true)
875 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000876 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000877 .Case("g3", true)
878 .Case("7400", true)
879 .Case("g4", true)
880 .Case("7450", true)
881 .Case("g4+", true)
882 .Case("750", true)
883 .Case("970", true)
884 .Case("g5", true)
885 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000886 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000887 .Case("e500mc", true)
888 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000889 .Case("power3", true)
890 .Case("pwr3", true)
891 .Case("power4", true)
892 .Case("pwr4", true)
893 .Case("power5", true)
894 .Case("pwr5", true)
895 .Case("power5x", true)
896 .Case("pwr5x", true)
897 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000898 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000899 .Case("power6x", true)
900 .Case("pwr6x", true)
901 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000902 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000903 .Case("power8", true)
904 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000905 .Case("power9", true)
906 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000907 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000908 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000909 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000910 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000911 .Case("powerpc64le", true)
912 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000913 .Default(false);
914
915 if (CPUKnown)
916 CPU = Name;
917
918 return CPUKnown;
919 }
920
Ulrich Weigand8afad612014-07-28 13:17:52 +0000921
922 StringRef getABI() const override { return ABI; }
923
Craig Topper6c03a542015-10-19 04:51:35 +0000924 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
925 return llvm::makeArrayRef(BuiltinInfo,
926 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000927 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000928
Craig Topper3164f332014-03-11 03:39:26 +0000929 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000930
Craig Topper3164f332014-03-11 03:39:26 +0000931 void getTargetDefines(const LangOptions &Opts,
932 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000933
Eric Christopher8c47b422015-10-09 18:39:55 +0000934 bool
935 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
936 StringRef CPU,
937 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000938
Craig Topper3164f332014-03-11 03:39:26 +0000939 bool handleTargetFeatures(std::vector<std::string> &Features,
940 DiagnosticsEngine &Diags) override;
941 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000942 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
943 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000944
Craig Topperf054e3a2015-10-19 03:52:27 +0000945 ArrayRef<const char *> getGCCRegNames() const override;
946 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000947 bool validateAsmConstraint(const char *&Name,
948 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000949 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000950 default: return false;
951 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000952 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000953 case 'b': // Base register
954 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000955 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000956 break;
957 // FIXME: The following are added to allow parsing.
958 // I just took a guess at what the actions should be.
959 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000960 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000961 case 'v': // Altivec vector register
962 Info.setAllowsRegister();
963 break;
964 case 'w':
965 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000966 case 'd':// VSX vector register to hold vector double data
967 case 'f':// VSX vector register to hold vector float data
968 case 's':// VSX vector register to hold scalar float data
969 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000970 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000971 break;
972 default:
973 return false;
974 }
975 Info.setAllowsRegister();
976 Name++; // Skip over 'w'.
977 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000978 case 'h': // `MQ', `CTR', or `LINK' register
979 case 'q': // `MQ' register
980 case 'c': // `CTR' register
981 case 'l': // `LINK' register
982 case 'x': // `CR' register (condition register) number 0
983 case 'y': // `CR' register (condition register)
984 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000985 Info.setAllowsRegister();
986 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000987 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000988 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000989 // (use `L' instead for SImode constants)
990 case 'K': // Unsigned 16-bit constant
991 case 'L': // Signed 16-bit constant shifted left 16 bits
992 case 'M': // Constant larger than 31
993 case 'N': // Exact power of 2
994 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000997 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000998 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000999 break;
1000 case 'm': // Memory operand. Note that on PowerPC targets, m can
1001 // include addresses that update the base register. It
1002 // is therefore only safe to use `m' in an asm statement
1003 // if that asm statement accesses the operand exactly once.
1004 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001005 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001006 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001007 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001008 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001009 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1010 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001011 // register to be updated.
1012 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001013 if (Name[1] != 's')
1014 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001015 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001016 // include any automodification of the base register. Unlike
1017 // `m', this constraint can be used in asm statements that
1018 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001019 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001020 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001021 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001022 break;
1023 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001024 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001025 case 'Z': // Memory operand that is an indexed or indirect from a
1026 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001027 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001028 Info.setAllowsMemory();
1029 Info.setAllowsRegister();
1030 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001031 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001032 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001033 // register (`p' is preferable for asm statements)
1034 case 'S': // Constant suitable as a 64-bit mask operand
1035 case 'T': // Constant suitable as a 32-bit mask operand
1036 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001037 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 // instructions
1039 case 'W': // Vector constant that does not require memory
1040 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001041 break;
1042 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001043 }
John Thompson07a61a42010-06-24 22:44:13 +00001044 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001045 }
Craig Topper3164f332014-03-11 03:39:26 +00001046 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001047 std::string R;
1048 switch (*Constraint) {
1049 case 'e':
1050 case 'w':
1051 // Two-character constraint; add "^" hint for later parsing.
1052 R = std::string("^") + std::string(Constraint, 2);
1053 Constraint++;
1054 break;
1055 default:
1056 return TargetInfo::convertConstraint(Constraint);
1057 }
1058 return R;
1059 }
Craig Topper3164f332014-03-11 03:39:26 +00001060 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001061 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001062 }
Craig Topper3164f332014-03-11 03:39:26 +00001063 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001064 if (RegNo == 0) return 3;
1065 if (RegNo == 1) return 4;
1066 return -1;
1067 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001068
1069 bool hasSjLjLowering() const override {
1070 return true;
1071 }
David Majnemer2617ea62015-06-09 18:05:33 +00001072
1073 bool useFloat128ManglingForLongDouble() const override {
1074 return LongDoubleWidth == 128 &&
1075 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1076 getTriple().isOSBinFormatELF();
1077 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001078};
Anders Carlssonf511f642007-11-27 04:11:28 +00001079
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001080const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001081#define BUILTIN(ID, TYPE, ATTRS) \
1082 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1083#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1084 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001085#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001086};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001087
Eric Christopher917e9522014-11-18 22:36:15 +00001088/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001089/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001090bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001091 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001092 for (const auto &Feature : Features) {
1093 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001094 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001095 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001096 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001097 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001098 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001099 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001100 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001101 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001102 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001103 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001104 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001105 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001106 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001107 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001108 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001109 } else if (Feature == "+float128") {
1110 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001111 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001112 // TODO: Finish this list and add an assert that we've handled them
1113 // all.
1114 }
Eric Christopher02c33352015-08-25 00:59:11 +00001115
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001116 return true;
1117}
1118
Chris Lattnerecd49032009-03-02 22:27:17 +00001119/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1120/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001121void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001122 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001123 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001124 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001125 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001126 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001127 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001128 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001129 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001130 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001131 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001132 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001133 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001134 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001135
Chris Lattnerecd49032009-03-02 22:27:17 +00001136 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001137 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1138 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001139 } else {
1140 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1141 getTriple().getOS() != llvm::Triple::OpenBSD)
1142 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001143 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001144
Ulrich Weigand8afad612014-07-28 13:17:52 +00001145 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001146 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001147 Builder.defineMacro("_CALL_ELF", "1");
1148 if (ABI == "elfv2")
1149 Builder.defineMacro("_CALL_ELF", "2");
1150
Chris Lattnerecd49032009-03-02 22:27:17 +00001151 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001152 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1153 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001154
Chris Lattnerecd49032009-03-02 22:27:17 +00001155 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001156 if (LongDoubleWidth == 128)
1157 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001158
John Thompsone467e192009-11-19 17:18:50 +00001159 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001160 Builder.defineMacro("__VEC__", "10206");
1161 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001162 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001163
1164 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001165 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1166 .Case("440", ArchDefineName)
1167 .Case("450", ArchDefineName | ArchDefine440)
1168 .Case("601", ArchDefineName)
1169 .Case("602", ArchDefineName | ArchDefinePpcgr)
1170 .Case("603", ArchDefineName | ArchDefinePpcgr)
1171 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1172 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1173 .Case("604", ArchDefineName | ArchDefinePpcgr)
1174 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1175 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001176 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001177 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1178 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1179 .Case("750", ArchDefineName | ArchDefinePpcgr)
1180 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1181 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001182 .Case("a2", ArchDefineA2)
1183 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001184 .Case("pwr3", ArchDefinePpcgr)
1185 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1186 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1187 | ArchDefinePpcsq)
1188 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1189 | ArchDefinePpcgr | ArchDefinePpcsq)
1190 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1191 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1192 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1193 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1194 | ArchDefinePpcsq)
1195 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1196 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001197 | ArchDefinePpcgr | ArchDefinePpcsq)
1198 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1199 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1200 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001201 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1202 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1203 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1204 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001205 .Case("power3", ArchDefinePpcgr)
1206 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1207 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1208 | ArchDefinePpcsq)
1209 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1210 | ArchDefinePpcgr | ArchDefinePpcsq)
1211 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1212 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1213 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1214 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1215 | ArchDefinePpcsq)
1216 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1217 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001218 | ArchDefinePpcgr | ArchDefinePpcsq)
1219 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1220 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1221 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001222 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1223 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1224 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1225 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001226 .Default(ArchDefineNone);
1227
1228 if (defs & ArchDefineName)
1229 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1230 if (defs & ArchDefinePpcgr)
1231 Builder.defineMacro("_ARCH_PPCGR");
1232 if (defs & ArchDefinePpcsq)
1233 Builder.defineMacro("_ARCH_PPCSQ");
1234 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001235 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001236 if (defs & ArchDefine603)
1237 Builder.defineMacro("_ARCH_603");
1238 if (defs & ArchDefine604)
1239 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001240 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001241 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001242 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001243 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001244 if (defs & ArchDefinePwr5x)
1245 Builder.defineMacro("_ARCH_PWR5X");
1246 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001247 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001248 if (defs & ArchDefinePwr6x)
1249 Builder.defineMacro("_ARCH_PWR6X");
1250 if (defs & ArchDefinePwr7)
1251 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001252 if (defs & ArchDefinePwr8)
1253 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001254 if (defs & ArchDefinePwr9)
1255 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001256 if (defs & ArchDefineA2)
1257 Builder.defineMacro("_ARCH_A2");
1258 if (defs & ArchDefineA2q) {
1259 Builder.defineMacro("_ARCH_A2Q");
1260 Builder.defineMacro("_ARCH_QP");
1261 }
1262
1263 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1264 Builder.defineMacro("__bg__");
1265 Builder.defineMacro("__THW_BLUEGENE__");
1266 Builder.defineMacro("__bgq__");
1267 Builder.defineMacro("__TOS_BGQ__");
1268 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001269
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001270 if (HasVSX)
1271 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001272 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001273 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001274 if (HasP8Crypto)
1275 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001276 if (HasHTM)
1277 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001278 if (HasFloat128)
1279 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001280
1281 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1282 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1283 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1284 if (PointerWidth == 64)
1285 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001286
Bill Schmidt38378a02013-02-01 20:23:10 +00001287 // FIXME: The following are not yet generated here by Clang, but are
1288 // generated by GCC:
1289 //
1290 // _SOFT_FLOAT_
1291 // __RECIP_PRECISION__
1292 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001293 // __RECIP__
1294 // __RECIPF__
1295 // __RSQRTE__
1296 // __RSQRTEF__
1297 // _SOFT_DOUBLE_
1298 // __NO_LWSYNC__
1299 // __HAVE_BSWAP__
1300 // __LONGDOUBLE128
1301 // __CMODEL_MEDIUM__
1302 // __CMODEL_LARGE__
1303 // _CALL_SYSV
1304 // _CALL_DARWIN
1305 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001306}
1307
Eric Christophera8a14c32015-08-31 18:39:16 +00001308// Handle explicit options being passed to the compiler here: if we've
1309// explicitly turned off vsx and turned on power8-vector or direct-move then
1310// go ahead and error since the customer has expressed a somewhat incompatible
1311// set of options.
1312static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001313 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001314
1315 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1316 FeaturesVec.end()) {
1317 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1318 FeaturesVec.end()) {
1319 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1320 << "-mno-vsx";
1321 return false;
1322 }
1323
1324 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1325 FeaturesVec.end()) {
1326 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1327 << "-mno-vsx";
1328 return false;
1329 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001330
1331 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1332 FeaturesVec.end()) {
1333 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1334 << "-mno-vsx";
1335 return false;
1336 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001337 }
1338
1339 return true;
1340}
1341
Eric Christopher8c47b422015-10-09 18:39:55 +00001342bool PPCTargetInfo::initFeatureMap(
1343 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1344 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001345 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1346 .Case("7400", true)
1347 .Case("g4", true)
1348 .Case("7450", true)
1349 .Case("g4+", true)
1350 .Case("970", true)
1351 .Case("g5", true)
1352 .Case("pwr6", true)
1353 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001354 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001355 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001356 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001357 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001358 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001359
1360 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001361 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1362 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001363 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001364 .Case("pwr8", true)
1365 .Default(false);
1366 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1367 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001368 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001369 .Case("pwr8", true)
1370 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001371 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1372 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001373 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001374 .Case("pwr8", true)
1375 .Case("pwr7", true)
1376 .Default(false);
1377 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1378 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001379 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001380 .Case("pwr8", true)
1381 .Case("pwr7", true)
1382 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001383 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1384 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001385 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001386 .Case("pwr8", true)
1387 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001388 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1389 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001390 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001391 .Case("pwr8", true)
1392 .Case("pwr7", true)
1393 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001394
Eric Christophera8a14c32015-08-31 18:39:16 +00001395 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1396 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001397
Eric Christopher007b0a02015-08-28 22:32:01 +00001398 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001399}
1400
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001401bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001402 return llvm::StringSwitch<bool>(Feature)
1403 .Case("powerpc", true)
1404 .Case("vsx", HasVSX)
1405 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001406 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001407 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001408 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001409 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001410 .Case("bpermd", HasBPERMD)
1411 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001412 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001413 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001414}
Chris Lattner17df24e2008-04-21 18:56:49 +00001415
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001416void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1417 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001418 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1419 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1420 // incompatible options.
1421 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001422 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001423 Features[Name] = Features["vsx"] = true;
1424 } else if (Name == "power8-vector") {
1425 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001426 } else if (Name == "float128") {
1427 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001428 } else {
1429 Features[Name] = true;
1430 }
1431 } else {
1432 if (Name == "vsx") {
1433 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001434 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001435 } else {
1436 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001437 }
1438 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001439}
1440
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001441const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001442 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1443 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1444 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1445 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1446 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1447 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1448 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1449 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001450 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001451 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001452 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001453 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1454 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1455 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1456 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001457 "vrsave", "vscr",
1458 "spe_acc", "spefscr",
1459 "sfp"
1460};
Chris Lattner10a5b382007-01-29 05:24:35 +00001461
Craig Topperf054e3a2015-10-19 03:52:27 +00001462ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1463 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001464}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001465
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001466const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1467 // While some of these aliases do map to different registers
1468 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001469 { { "0" }, "r0" },
1470 { { "1"}, "r1" },
1471 { { "2" }, "r2" },
1472 { { "3" }, "r3" },
1473 { { "4" }, "r4" },
1474 { { "5" }, "r5" },
1475 { { "6" }, "r6" },
1476 { { "7" }, "r7" },
1477 { { "8" }, "r8" },
1478 { { "9" }, "r9" },
1479 { { "10" }, "r10" },
1480 { { "11" }, "r11" },
1481 { { "12" }, "r12" },
1482 { { "13" }, "r13" },
1483 { { "14" }, "r14" },
1484 { { "15" }, "r15" },
1485 { { "16" }, "r16" },
1486 { { "17" }, "r17" },
1487 { { "18" }, "r18" },
1488 { { "19" }, "r19" },
1489 { { "20" }, "r20" },
1490 { { "21" }, "r21" },
1491 { { "22" }, "r22" },
1492 { { "23" }, "r23" },
1493 { { "24" }, "r24" },
1494 { { "25" }, "r25" },
1495 { { "26" }, "r26" },
1496 { { "27" }, "r27" },
1497 { { "28" }, "r28" },
1498 { { "29" }, "r29" },
1499 { { "30" }, "r30" },
1500 { { "31" }, "r31" },
1501 { { "fr0" }, "f0" },
1502 { { "fr1" }, "f1" },
1503 { { "fr2" }, "f2" },
1504 { { "fr3" }, "f3" },
1505 { { "fr4" }, "f4" },
1506 { { "fr5" }, "f5" },
1507 { { "fr6" }, "f6" },
1508 { { "fr7" }, "f7" },
1509 { { "fr8" }, "f8" },
1510 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001511 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001512 { { "fr11" }, "f11" },
1513 { { "fr12" }, "f12" },
1514 { { "fr13" }, "f13" },
1515 { { "fr14" }, "f14" },
1516 { { "fr15" }, "f15" },
1517 { { "fr16" }, "f16" },
1518 { { "fr17" }, "f17" },
1519 { { "fr18" }, "f18" },
1520 { { "fr19" }, "f19" },
1521 { { "fr20" }, "f20" },
1522 { { "fr21" }, "f21" },
1523 { { "fr22" }, "f22" },
1524 { { "fr23" }, "f23" },
1525 { { "fr24" }, "f24" },
1526 { { "fr25" }, "f25" },
1527 { { "fr26" }, "f26" },
1528 { { "fr27" }, "f27" },
1529 { { "fr28" }, "f28" },
1530 { { "fr29" }, "f29" },
1531 { { "fr30" }, "f30" },
1532 { { "fr31" }, "f31" },
1533 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001534};
1535
Craig Topperf054e3a2015-10-19 03:52:27 +00001536ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1537 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001538}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001539
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001540class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001541public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001542 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1543 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001544 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001545
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001546 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001547 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001548 case llvm::Triple::FreeBSD:
1549 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001550 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001551 PtrDiffType = SignedInt;
1552 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001553 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001554 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001555 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001556 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001557
Roman Divacky3ffe7462012-03-13 19:20:17 +00001558 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1559 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001560 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001561 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001562
1563 // PPC32 supports atomics up to 4 bytes.
1564 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001565 }
1566
Craig Topper3164f332014-03-11 03:39:26 +00001567 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001568 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001569 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001570 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001571};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001572
Bill Schmidt778d3872013-07-26 01:36:11 +00001573// Note: ABI differences may eventually require us to have a separate
1574// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001575class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001576public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001577 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1578 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001579 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001580 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001581 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001582
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001583 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001584 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001585 ABI = "elfv2";
1586 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001587 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001588 ABI = "elfv1";
1589 }
1590
1591 switch (getTriple().getOS()) {
1592 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001593 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001594 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001595 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001596 case llvm::Triple::NetBSD:
1597 IntMaxType = SignedLongLong;
1598 Int64Type = SignedLongLong;
1599 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001600 default:
1601 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001602 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001603
1604 // PPC64 supports atomics up to 8 bytes.
1605 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001606 }
Craig Topper3164f332014-03-11 03:39:26 +00001607 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001608 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001609 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001610 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001611 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001612 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001613 ABI = Name;
1614 return true;
1615 }
1616 return false;
1617 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001618};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001619
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001620class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001621public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001622 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1623 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001624 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001625 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001626 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001627 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001628 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001629 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001630 }
Craig Topper3164f332014-03-11 03:39:26 +00001631 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001632 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001633 }
1634};
1635
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001636class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001638 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1639 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001640 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001641 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001642 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001643 }
1644};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001645
Eric Christopherc48497a2015-09-18 21:26:24 +00001646static const unsigned NVPTXAddrSpaceMap[] = {
1647 1, // opencl_global
1648 3, // opencl_local
1649 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001650 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001651 0, // opencl_generic
1652 1, // cuda_device
1653 4, // cuda_constant
1654 3, // cuda_shared
1655};
1656
1657class NVPTXTargetInfo : public TargetInfo {
1658 static const char *const GCCRegNames[];
1659 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001660
1661 // The GPU profiles supported by the NVPTX backend
1662 enum GPUKind {
1663 GK_NONE,
1664 GK_SM20,
1665 GK_SM21,
1666 GK_SM30,
1667 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001668 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001669 } GPU;
1670
Eric Christopherc48497a2015-09-18 21:26:24 +00001671public:
Justin Lebar76945b22016-04-29 23:05:19 +00001672 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001673 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001674 BigEndian = false;
1675 TLSSupported = false;
1676 LongWidth = LongAlign = 64;
1677 AddrSpaceMap = &NVPTXAddrSpaceMap;
1678 UseAddrSpaceMapMangling = true;
1679 // Define available target features
1680 // These must be defined in sorted order!
1681 NoAsmVariants = true;
1682 // Set the default GPU to sm20
1683 GPU = GK_SM20;
Justin Lebar76945b22016-04-29 23:05:19 +00001684
1685 // If possible, get a TargetInfo for our host triple, so we can match its
1686 // types.
1687 llvm::Triple HostTriple(Opts.HostTriple);
1688 if (HostTriple.isNVPTX())
1689 return;
1690 std::unique_ptr<TargetInfo> HostTarget(
1691 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1692 if (!HostTarget) {
1693 return;
1694 }
1695
1696 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1697 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1698 BoolWidth = HostTarget->getBoolWidth();
1699 BoolAlign = HostTarget->getBoolAlign();
1700 IntWidth = HostTarget->getIntWidth();
1701 IntAlign = HostTarget->getIntAlign();
1702 HalfWidth = HostTarget->getHalfWidth();
1703 HalfAlign = HostTarget->getHalfAlign();
1704 FloatWidth = HostTarget->getFloatWidth();
1705 FloatAlign = HostTarget->getFloatAlign();
1706 DoubleWidth = HostTarget->getDoubleWidth();
1707 DoubleAlign = HostTarget->getDoubleAlign();
1708 LongWidth = HostTarget->getLongWidth();
1709 LongAlign = HostTarget->getLongAlign();
1710 LongLongWidth = HostTarget->getLongLongWidth();
1711 LongLongAlign = HostTarget->getLongLongAlign();
1712 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1713 DefaultAlignForAttributeAligned =
1714 HostTarget->getDefaultAlignForAttributeAligned();
1715 SizeType = HostTarget->getSizeType();
1716 IntMaxType = HostTarget->getIntMaxType();
1717 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1718 IntPtrType = HostTarget->getIntPtrType();
1719 WCharType = HostTarget->getWCharType();
1720 WIntType = HostTarget->getWIntType();
1721 Char16Type = HostTarget->getChar16Type();
1722 Char32Type = HostTarget->getChar32Type();
1723 Int64Type = HostTarget->getInt64Type();
1724 SigAtomicType = HostTarget->getSigAtomicType();
1725 ProcessIDType = HostTarget->getProcessIDType();
1726
1727 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1728 UseZeroLengthBitfieldAlignment =
1729 HostTarget->useZeroLengthBitfieldAlignment();
1730 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1731 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1732
1733 // Properties intentionally not copied from host:
1734 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1735 // host/device boundary.
1736 // - SuitableAlign: Not visible across the host/device boundary, and may
1737 // correctly be different on host/device, e.g. if host has wider vector
1738 // types than device.
1739 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1740 // as its double type, but that's not necessarily true on the host.
1741 // TODO: nvcc emits a warning when using long double on device; we should
1742 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001743 }
1744 void getTargetDefines(const LangOptions &Opts,
1745 MacroBuilder &Builder) const override {
1746 Builder.defineMacro("__PTX__");
1747 Builder.defineMacro("__NVPTX__");
1748 if (Opts.CUDAIsDevice) {
1749 // Set __CUDA_ARCH__ for the GPU specified.
1750 std::string CUDAArchCode;
1751 switch (GPU) {
1752 case GK_SM20:
1753 CUDAArchCode = "200";
1754 break;
1755 case GK_SM21:
1756 CUDAArchCode = "210";
1757 break;
1758 case GK_SM30:
1759 CUDAArchCode = "300";
1760 break;
1761 case GK_SM35:
1762 CUDAArchCode = "350";
1763 break;
1764 case GK_SM37:
1765 CUDAArchCode = "370";
1766 break;
1767 default:
1768 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001769 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001770 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001771 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001772 }
Craig Topper6c03a542015-10-19 04:51:35 +00001773 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1774 return llvm::makeArrayRef(BuiltinInfo,
1775 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001776 }
1777 bool hasFeature(StringRef Feature) const override {
1778 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001779 }
1780
Craig Topperf054e3a2015-10-19 03:52:27 +00001781 ArrayRef<const char *> getGCCRegNames() const override;
1782 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001783 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001784 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001785 }
1786 bool validateAsmConstraint(const char *&Name,
1787 TargetInfo::ConstraintInfo &Info) const override {
1788 switch (*Name) {
1789 default:
1790 return false;
1791 case 'c':
1792 case 'h':
1793 case 'r':
1794 case 'l':
1795 case 'f':
1796 case 'd':
1797 Info.setAllowsRegister();
1798 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001799 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001800 }
1801 const char *getClobbers() const override {
1802 // FIXME: Is this really right?
1803 return "";
1804 }
1805 BuiltinVaListKind getBuiltinVaListKind() const override {
1806 // FIXME: implement
1807 return TargetInfo::CharPtrBuiltinVaList;
1808 }
1809 bool setCPU(const std::string &Name) override {
1810 GPU = llvm::StringSwitch<GPUKind>(Name)
1811 .Case("sm_20", GK_SM20)
1812 .Case("sm_21", GK_SM21)
1813 .Case("sm_30", GK_SM30)
1814 .Case("sm_35", GK_SM35)
1815 .Case("sm_37", GK_SM37)
1816 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001817
Eric Christopherc48497a2015-09-18 21:26:24 +00001818 return GPU != GK_NONE;
1819 }
1820};
1821
1822const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1823#define BUILTIN(ID, TYPE, ATTRS) \
1824 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1825#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1826 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1827#include "clang/Basic/BuiltinsNVPTX.def"
1828};
1829
1830const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1831
Craig Topperf054e3a2015-10-19 03:52:27 +00001832ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1833 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001834}
1835
1836class NVPTX32TargetInfo : public NVPTXTargetInfo {
1837public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001838 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1839 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001840 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001841 PointerWidth = PointerAlign = 32;
1842 SizeType = TargetInfo::UnsignedInt;
1843 PtrDiffType = TargetInfo::SignedInt;
1844 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001845 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001846 }
1847};
1848
1849class NVPTX64TargetInfo : public NVPTXTargetInfo {
1850public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001851 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1852 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001853 PointerWidth = PointerAlign = 64;
1854 SizeType = TargetInfo::UnsignedLong;
1855 PtrDiffType = TargetInfo::SignedLong;
1856 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001857 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001858 }
1859};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001860
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001861static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001862 1, // opencl_global
1863 3, // opencl_local
1864 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001865 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001866 1, // cuda_device
1867 2, // cuda_constant
1868 3 // cuda_shared
1869};
1870
Tom Stellarda96344b2014-08-21 13:58:40 +00001871// If you edit the description strings, make sure you update
1872// getPointerWidthV().
1873
Craig Topper273dbc62015-10-18 05:29:26 +00001874static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001875 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1876 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001877
Craig Topper273dbc62015-10-18 05:29:26 +00001878static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001879 "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 +00001880 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1881 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001882
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001883class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001884 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001885 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001886
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001887 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001888 enum GPUKind {
1889 GK_NONE,
1890 GK_R600,
1891 GK_R600_DOUBLE_OPS,
1892 GK_R700,
1893 GK_R700_DOUBLE_OPS,
1894 GK_EVERGREEN,
1895 GK_EVERGREEN_DOUBLE_OPS,
1896 GK_NORTHERN_ISLANDS,
1897 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001898 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001899 GK_SEA_ISLANDS,
1900 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001901 } GPU;
1902
Jan Veselyeebeaea2015-05-04 19:53:36 +00001903 bool hasFP64:1;
1904 bool hasFMAF:1;
1905 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001906
Eli Friedmand13b41e2012-10-12 23:32:00 +00001907public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001908 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
1909 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001910 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001911 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001912 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001913 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001914 hasFMAF = true;
1915 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001916 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001917 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001918 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001919 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001920 hasFMAF = false;
1921 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001922 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001923 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001924 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001925 }
1926
Tom Stellarda96344b2014-08-21 13:58:40 +00001927 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1928 if (GPU <= GK_CAYMAN)
1929 return 32;
1930
1931 switch(AddrSpace) {
1932 default:
1933 return 64;
1934 case 0:
1935 case 3:
1936 case 5:
1937 return 32;
1938 }
1939 }
1940
Craig Topper3164f332014-03-11 03:39:26 +00001941 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001942 return "";
1943 }
1944
Craig Topperf054e3a2015-10-19 03:52:27 +00001945 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001946
Craig Topperf054e3a2015-10-19 03:52:27 +00001947 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1948 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001949 }
1950
Craig Topper3164f332014-03-11 03:39:26 +00001951 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001952 TargetInfo::ConstraintInfo &Info) const override {
1953 switch (*Name) {
1954 default: break;
1955 case 'v': // vgpr
1956 case 's': // sgpr
1957 Info.setAllowsRegister();
1958 return true;
1959 }
1960 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001961 }
1962
Craig Topper6c03a542015-10-19 04:51:35 +00001963 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1964 return llvm::makeArrayRef(BuiltinInfo,
1965 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001966 }
1967
Craig Topper3164f332014-03-11 03:39:26 +00001968 void getTargetDefines(const LangOptions &Opts,
1969 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001970 if (getTriple().getArch() == llvm::Triple::amdgcn)
1971 Builder.defineMacro("__AMDGCN__");
1972 else
1973 Builder.defineMacro("__R600__");
1974
Jan Veselyeebeaea2015-05-04 19:53:36 +00001975 if (hasFMAF)
1976 Builder.defineMacro("__HAS_FMAF__");
1977 if (hasLDEXPF)
1978 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001979 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001980 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001981 if (Opts.OpenCL) {
1982 if (GPU >= GK_NORTHERN_ISLANDS) {
1983 Builder.defineMacro("cl_khr_byte_addressable_store");
1984 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1985 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1986 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1987 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1988 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001989 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001990 }
1991
Craig Topper3164f332014-03-11 03:39:26 +00001992 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001993 return TargetInfo::CharPtrBuiltinVaList;
1994 }
1995
Craig Topper3164f332014-03-11 03:39:26 +00001996 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001997 GPU = llvm::StringSwitch<GPUKind>(Name)
1998 .Case("r600" , GK_R600)
1999 .Case("rv610", GK_R600)
2000 .Case("rv620", GK_R600)
2001 .Case("rv630", GK_R600)
2002 .Case("rv635", GK_R600)
2003 .Case("rs780", GK_R600)
2004 .Case("rs880", GK_R600)
2005 .Case("rv670", GK_R600_DOUBLE_OPS)
2006 .Case("rv710", GK_R700)
2007 .Case("rv730", GK_R700)
2008 .Case("rv740", GK_R700_DOUBLE_OPS)
2009 .Case("rv770", GK_R700_DOUBLE_OPS)
2010 .Case("palm", GK_EVERGREEN)
2011 .Case("cedar", GK_EVERGREEN)
2012 .Case("sumo", GK_EVERGREEN)
2013 .Case("sumo2", GK_EVERGREEN)
2014 .Case("redwood", GK_EVERGREEN)
2015 .Case("juniper", GK_EVERGREEN)
2016 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2017 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2018 .Case("barts", GK_NORTHERN_ISLANDS)
2019 .Case("turks", GK_NORTHERN_ISLANDS)
2020 .Case("caicos", GK_NORTHERN_ISLANDS)
2021 .Case("cayman", GK_CAYMAN)
2022 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00002023 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002024 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2025 .Case("verde", GK_SOUTHERN_ISLANDS)
2026 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002027 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002028 .Case("bonaire", GK_SEA_ISLANDS)
2029 .Case("kabini", GK_SEA_ISLANDS)
2030 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002031 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002032 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002033 .Case("tonga", GK_VOLCANIC_ISLANDS)
2034 .Case("iceland", GK_VOLCANIC_ISLANDS)
2035 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002036 .Case("fiji", GK_VOLCANIC_ISLANDS)
2037 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002038 .Default(GK_NONE);
2039
2040 if (GPU == GK_NONE) {
2041 return false;
2042 }
2043
2044 // Set the correct data layout
2045 switch (GPU) {
2046 case GK_NONE:
2047 case GK_R600:
2048 case GK_R700:
2049 case GK_EVERGREEN:
2050 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002051 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002052 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002053 hasFMAF = false;
2054 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002055 break;
2056 case GK_R600_DOUBLE_OPS:
2057 case GK_R700_DOUBLE_OPS:
2058 case GK_EVERGREEN_DOUBLE_OPS:
2059 case GK_CAYMAN:
Matt Arsenaultedc7c6b2016-03-30 21:32:37 +00002060 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002061 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002062 hasFMAF = true;
2063 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002064 break;
2065 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00002066 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00002067 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002068 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002069 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002070 hasFMAF = true;
2071 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002072 break;
2073 }
2074
2075 return true;
2076 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002077};
2078
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002079const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002080#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002081 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002082#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002083};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002084const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002085 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2086 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2087 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2088 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2089 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2090 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2091 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2092 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2093 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2094 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2095 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2096 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2097 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2098 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2099 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2100 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2101 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2102 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2103 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2104 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2105 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2106 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2107 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2108 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2109 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2110 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2111 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2112 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2113 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2114 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2115 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2116 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2117 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2118 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2119 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2120 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2121 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2122 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2123 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2124 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2125 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2126 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2127 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2128 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2129 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2130 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2131 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002132 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002133 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2134 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002135};
2136
Craig Topperf054e3a2015-10-19 03:52:27 +00002137ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2138 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002139}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002140
Eli Friedman3fd920a2008-08-20 02:34:37 +00002141// Namespace for x86 abstract base class
2142const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002143#define BUILTIN(ID, TYPE, ATTRS) \
2144 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002145#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002146 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002147#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002148 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002149#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002150};
Eli Friedmanb5366062008-05-20 14:21:01 +00002151
Nuno Lopescfca1f02009-12-23 17:49:57 +00002152static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002153 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2154 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002155 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002156 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2157 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2158 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002159 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002160 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2161 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002162 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2163 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2164 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2165 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2166 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2167 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2168 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2169 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002170};
2171
Eric Christophercdd36352011-06-21 00:05:20 +00002172const TargetInfo::AddlRegName AddlRegNames[] = {
2173 { { "al", "ah", "eax", "rax" }, 0 },
2174 { { "bl", "bh", "ebx", "rbx" }, 3 },
2175 { { "cl", "ch", "ecx", "rcx" }, 2 },
2176 { { "dl", "dh", "edx", "rdx" }, 1 },
2177 { { "esi", "rsi" }, 4 },
2178 { { "edi", "rdi" }, 5 },
2179 { { "esp", "rsp" }, 7 },
2180 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002181 { { "r8d", "r8w", "r8b" }, 38 },
2182 { { "r9d", "r9w", "r9b" }, 39 },
2183 { { "r10d", "r10w", "r10b" }, 40 },
2184 { { "r11d", "r11w", "r11b" }, 41 },
2185 { { "r12d", "r12w", "r12b" }, 42 },
2186 { { "r13d", "r13w", "r13b" }, 43 },
2187 { { "r14d", "r14w", "r14b" }, 44 },
2188 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002189};
2190
2191// X86 target abstract base class; x86-32 and x86-64 are very close, so
2192// most of the implementation can be shared.
2193class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002194 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002195 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002196 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002197 enum MMX3DNowEnum {
2198 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002199 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002200 enum XOPEnum {
2201 NoXOP,
2202 SSE4A,
2203 FMA4,
2204 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002205 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002206
Craig Topper543f3bd2015-10-14 23:47:57 +00002207 bool HasAES = false;
2208 bool HasPCLMUL = false;
2209 bool HasLZCNT = false;
2210 bool HasRDRND = false;
2211 bool HasFSGSBASE = false;
2212 bool HasBMI = false;
2213 bool HasBMI2 = false;
2214 bool HasPOPCNT = false;
2215 bool HasRTM = false;
2216 bool HasPRFCHW = false;
2217 bool HasRDSEED = false;
2218 bool HasADX = false;
2219 bool HasTBM = false;
2220 bool HasFMA = false;
2221 bool HasF16C = false;
2222 bool HasAVX512CD = false;
2223 bool HasAVX512ER = false;
2224 bool HasAVX512PF = false;
2225 bool HasAVX512DQ = false;
2226 bool HasAVX512BW = false;
2227 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002228 bool HasAVX512VBMI = false;
2229 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002230 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002231 bool HasMPX = false;
2232 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002233 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002234 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002235 bool HasXSAVE = false;
2236 bool HasXSAVEOPT = false;
2237 bool HasXSAVEC = false;
2238 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002239 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002240 bool HasCLFLUSHOPT = false;
2241 bool HasPCOMMIT = false;
2242 bool HasCLWB = false;
2243 bool HasUMIP = false;
2244 bool HasMOVBE = false;
2245 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002246
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002247 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2248 ///
2249 /// Each enumeration represents a particular CPU supported by Clang. These
2250 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2251 enum CPUKind {
2252 CK_Generic,
2253
2254 /// \name i386
2255 /// i386-generation processors.
2256 //@{
2257 CK_i386,
2258 //@}
2259
2260 /// \name i486
2261 /// i486-generation processors.
2262 //@{
2263 CK_i486,
2264 CK_WinChipC6,
2265 CK_WinChip2,
2266 CK_C3,
2267 //@}
2268
2269 /// \name i586
2270 /// i586-generation processors, P5 microarchitecture based.
2271 //@{
2272 CK_i586,
2273 CK_Pentium,
2274 CK_PentiumMMX,
2275 //@}
2276
2277 /// \name i686
2278 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2279 //@{
2280 CK_i686,
2281 CK_PentiumPro,
2282 CK_Pentium2,
2283 CK_Pentium3,
2284 CK_Pentium3M,
2285 CK_PentiumM,
2286 CK_C3_2,
2287
2288 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2289 /// Clang however has some logic to suport this.
2290 // FIXME: Warn, deprecate, and potentially remove this.
2291 CK_Yonah,
2292 //@}
2293
2294 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002295 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002296 //@{
2297 CK_Pentium4,
2298 CK_Pentium4M,
2299 CK_Prescott,
2300 CK_Nocona,
2301 //@}
2302
2303 /// \name Core
2304 /// Core microarchitecture based processors.
2305 //@{
2306 CK_Core2,
2307
2308 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2309 /// codename which GCC no longer accepts as an option to -march, but Clang
2310 /// has some logic for recognizing it.
2311 // FIXME: Warn, deprecate, and potentially remove this.
2312 CK_Penryn,
2313 //@}
2314
2315 /// \name Atom
2316 /// Atom processors
2317 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002318 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002319 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002320 //@}
2321
2322 /// \name Nehalem
2323 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002324 CK_Nehalem,
2325
2326 /// \name Westmere
2327 /// Westmere microarchitecture based processors.
2328 CK_Westmere,
2329
2330 /// \name Sandy Bridge
2331 /// Sandy Bridge microarchitecture based processors.
2332 CK_SandyBridge,
2333
2334 /// \name Ivy Bridge
2335 /// Ivy Bridge microarchitecture based processors.
2336 CK_IvyBridge,
2337
2338 /// \name Haswell
2339 /// Haswell microarchitecture based processors.
2340 CK_Haswell,
2341
2342 /// \name Broadwell
2343 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002344 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002345
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002346 /// \name Skylake Client
2347 /// Skylake client microarchitecture based processors.
2348 CK_SkylakeClient,
2349
2350 /// \name Skylake Server
2351 /// Skylake server microarchitecture based processors.
2352 CK_SkylakeServer,
2353
2354 /// \name Cannonlake Client
2355 /// Cannonlake client microarchitecture based processors.
2356 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002357
Craig Topper449314e2013-08-20 07:09:39 +00002358 /// \name Knights Landing
2359 /// Knights Landing processor.
2360 CK_KNL,
2361
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002362 /// \name Lakemont
2363 /// Lakemont microarchitecture based processors.
2364 CK_Lakemont,
2365
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002366 /// \name K6
2367 /// K6 architecture processors.
2368 //@{
2369 CK_K6,
2370 CK_K6_2,
2371 CK_K6_3,
2372 //@}
2373
2374 /// \name K7
2375 /// K7 architecture processors.
2376 //@{
2377 CK_Athlon,
2378 CK_AthlonThunderbird,
2379 CK_Athlon4,
2380 CK_AthlonXP,
2381 CK_AthlonMP,
2382 //@}
2383
2384 /// \name K8
2385 /// K8 architecture processors.
2386 //@{
2387 CK_Athlon64,
2388 CK_Athlon64SSE3,
2389 CK_AthlonFX,
2390 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002391 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002392 CK_Opteron,
2393 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002394 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002395 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002396
Benjamin Kramer569f2152012-01-10 11:50:18 +00002397 /// \name Bobcat
2398 /// Bobcat architecture processors.
2399 //@{
2400 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002401 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002402 //@}
2403
2404 /// \name Bulldozer
2405 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002406 //@{
2407 CK_BDVER1,
2408 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002409 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002410 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002411 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002412
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002413 /// This specification is deprecated and will be removed in the future.
2414 /// Users should prefer \see CK_K8.
2415 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002416 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002417 CK_x86_64,
2418 //@}
2419
2420 /// \name Geode
2421 /// Geode processors.
2422 //@{
2423 CK_Geode
2424 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002425 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002426
Eric Christopherc50738f2015-08-27 00:05:50 +00002427 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002428 return llvm::StringSwitch<CPUKind>(CPU)
2429 .Case("i386", CK_i386)
2430 .Case("i486", CK_i486)
2431 .Case("winchip-c6", CK_WinChipC6)
2432 .Case("winchip2", CK_WinChip2)
2433 .Case("c3", CK_C3)
2434 .Case("i586", CK_i586)
2435 .Case("pentium", CK_Pentium)
2436 .Case("pentium-mmx", CK_PentiumMMX)
2437 .Case("i686", CK_i686)
2438 .Case("pentiumpro", CK_PentiumPro)
2439 .Case("pentium2", CK_Pentium2)
2440 .Case("pentium3", CK_Pentium3)
2441 .Case("pentium3m", CK_Pentium3M)
2442 .Case("pentium-m", CK_PentiumM)
2443 .Case("c3-2", CK_C3_2)
2444 .Case("yonah", CK_Yonah)
2445 .Case("pentium4", CK_Pentium4)
2446 .Case("pentium4m", CK_Pentium4M)
2447 .Case("prescott", CK_Prescott)
2448 .Case("nocona", CK_Nocona)
2449 .Case("core2", CK_Core2)
2450 .Case("penryn", CK_Penryn)
2451 .Case("bonnell", CK_Bonnell)
2452 .Case("atom", CK_Bonnell) // Legacy name.
2453 .Case("silvermont", CK_Silvermont)
2454 .Case("slm", CK_Silvermont) // Legacy name.
2455 .Case("nehalem", CK_Nehalem)
2456 .Case("corei7", CK_Nehalem) // Legacy name.
2457 .Case("westmere", CK_Westmere)
2458 .Case("sandybridge", CK_SandyBridge)
2459 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2460 .Case("ivybridge", CK_IvyBridge)
2461 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2462 .Case("haswell", CK_Haswell)
2463 .Case("core-avx2", CK_Haswell) // Legacy name.
2464 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002465 .Case("skylake", CK_SkylakeClient)
2466 .Case("skylake-avx512", CK_SkylakeServer)
2467 .Case("skx", CK_SkylakeServer) // Legacy name.
2468 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002469 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002470 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002471 .Case("k6", CK_K6)
2472 .Case("k6-2", CK_K6_2)
2473 .Case("k6-3", CK_K6_3)
2474 .Case("athlon", CK_Athlon)
2475 .Case("athlon-tbird", CK_AthlonThunderbird)
2476 .Case("athlon-4", CK_Athlon4)
2477 .Case("athlon-xp", CK_AthlonXP)
2478 .Case("athlon-mp", CK_AthlonMP)
2479 .Case("athlon64", CK_Athlon64)
2480 .Case("athlon64-sse3", CK_Athlon64SSE3)
2481 .Case("athlon-fx", CK_AthlonFX)
2482 .Case("k8", CK_K8)
2483 .Case("k8-sse3", CK_K8SSE3)
2484 .Case("opteron", CK_Opteron)
2485 .Case("opteron-sse3", CK_OpteronSSE3)
2486 .Case("barcelona", CK_AMDFAM10)
2487 .Case("amdfam10", CK_AMDFAM10)
2488 .Case("btver1", CK_BTVER1)
2489 .Case("btver2", CK_BTVER2)
2490 .Case("bdver1", CK_BDVER1)
2491 .Case("bdver2", CK_BDVER2)
2492 .Case("bdver3", CK_BDVER3)
2493 .Case("bdver4", CK_BDVER4)
2494 .Case("x86-64", CK_x86_64)
2495 .Case("geode", CK_Geode)
2496 .Default(CK_Generic);
2497 }
2498
Rafael Espindolaeb265472013-08-21 21:59:03 +00002499 enum FPMathKind {
2500 FP_Default,
2501 FP_SSE,
2502 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002503 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002504
Eli Friedman3fd920a2008-08-20 02:34:37 +00002505public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002506 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2507 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002508 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002509 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002510 }
Craig Topper3164f332014-03-11 03:39:26 +00002511 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002512 // X87 evaluates with 80 bits "long double" precision.
2513 return SSELevel == NoSSE ? 2 : 0;
2514 }
Craig Topper6c03a542015-10-19 04:51:35 +00002515 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2516 return llvm::makeArrayRef(BuiltinInfo,
2517 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002518 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002519 ArrayRef<const char *> getGCCRegNames() const override {
2520 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002521 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002522 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2523 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002524 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002525 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2526 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002527 }
Eric Christopherd9832702015-06-29 21:00:05 +00002528 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002529 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002530 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002531
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002532 bool validateGlobalRegisterVariable(StringRef RegName,
2533 unsigned RegSize,
2534 bool &HasSizeMismatch) const override {
2535 // esp and ebp are the only 32-bit registers the x86 backend can currently
2536 // handle.
2537 if (RegName.equals("esp") || RegName.equals("ebp")) {
2538 // Check that the register size is 32-bit.
2539 HasSizeMismatch = RegSize != 32;
2540 return true;
2541 }
2542
2543 return false;
2544 }
2545
Akira Hatanaka974131e2014-09-18 18:17:18 +00002546 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2547
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002548 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2549
Akira Hatanaka974131e2014-09-18 18:17:18 +00002550 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2551
Craig Topper3164f332014-03-11 03:39:26 +00002552 std::string convertConstraint(const char *&Constraint) const override;
2553 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002554 return "~{dirflag},~{fpsr},~{flags}";
2555 }
Craig Topper3164f332014-03-11 03:39:26 +00002556 void getTargetDefines(const LangOptions &Opts,
2557 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002558 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2559 bool Enabled);
2560 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2561 bool Enabled);
2562 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2563 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002564 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2565 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002566 setFeatureEnabledImpl(Features, Name, Enabled);
2567 }
2568 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002569 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002570 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2571 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002572 bool
2573 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2574 StringRef CPU,
2575 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002576 bool hasFeature(StringRef Feature) const override;
2577 bool handleTargetFeatures(std::vector<std::string> &Features,
2578 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002579 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002580 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2581 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002582 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002583 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002584 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002585 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002586 return "no-mmx";
2587 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002588 }
Craig Topper3164f332014-03-11 03:39:26 +00002589 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002590 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002591
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002592 // Perform any per-CPU checks necessary to determine if this CPU is
2593 // acceptable.
2594 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2595 // invalid without explaining *why*.
2596 switch (CPU) {
2597 case CK_Generic:
2598 // No processor selected!
2599 return false;
2600
2601 case CK_i386:
2602 case CK_i486:
2603 case CK_WinChipC6:
2604 case CK_WinChip2:
2605 case CK_C3:
2606 case CK_i586:
2607 case CK_Pentium:
2608 case CK_PentiumMMX:
2609 case CK_i686:
2610 case CK_PentiumPro:
2611 case CK_Pentium2:
2612 case CK_Pentium3:
2613 case CK_Pentium3M:
2614 case CK_PentiumM:
2615 case CK_Yonah:
2616 case CK_C3_2:
2617 case CK_Pentium4:
2618 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002619 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002620 case CK_Prescott:
2621 case CK_K6:
2622 case CK_K6_2:
2623 case CK_K6_3:
2624 case CK_Athlon:
2625 case CK_AthlonThunderbird:
2626 case CK_Athlon4:
2627 case CK_AthlonXP:
2628 case CK_AthlonMP:
2629 case CK_Geode:
2630 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002631 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002632 return false;
2633
2634 // Fallthrough
2635 case CK_Nocona:
2636 case CK_Core2:
2637 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002638 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002639 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002640 case CK_Nehalem:
2641 case CK_Westmere:
2642 case CK_SandyBridge:
2643 case CK_IvyBridge:
2644 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002645 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002646 case CK_SkylakeClient:
2647 case CK_SkylakeServer:
2648 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002649 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002650 case CK_Athlon64:
2651 case CK_Athlon64SSE3:
2652 case CK_AthlonFX:
2653 case CK_K8:
2654 case CK_K8SSE3:
2655 case CK_Opteron:
2656 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002657 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002658 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002659 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002660 case CK_BDVER1:
2661 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002662 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002663 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002664 case CK_x86_64:
2665 return true;
2666 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002667 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002668 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002669
Craig Topper3164f332014-03-11 03:39:26 +00002670 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002671
Craig Topper3164f332014-03-11 03:39:26 +00002672 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002673 // Most of the non-ARM calling conventions are i386 conventions.
2674 switch (CC) {
2675 case CC_X86ThisCall:
2676 case CC_X86FastCall:
2677 case CC_X86StdCall:
2678 case CC_X86VectorCall:
2679 case CC_C:
2680 case CC_Swift:
2681 case CC_X86Pascal:
2682 case CC_IntelOclBicc:
2683 return CCCR_OK;
2684 default:
2685 return CCCR_Warning;
2686 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002687 }
2688
Craig Topper3164f332014-03-11 03:39:26 +00002689 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002690 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002691 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002692
2693 bool hasSjLjLowering() const override {
2694 return true;
2695 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002696};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002697
Rafael Espindolaeb265472013-08-21 21:59:03 +00002698bool X86TargetInfo::setFPMath(StringRef Name) {
2699 if (Name == "387") {
2700 FPMath = FP_387;
2701 return true;
2702 }
2703 if (Name == "sse") {
2704 FPMath = FP_SSE;
2705 return true;
2706 }
2707 return false;
2708}
2709
Eric Christopher007b0a02015-08-28 22:32:01 +00002710bool X86TargetInfo::initFeatureMap(
2711 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002712 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002713 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002714 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002715 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002716 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002717
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002718 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002719
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002720 // Enable X87 for all X86 processors but Lakemont.
2721 if (Kind != CK_Lakemont)
2722 setFeatureEnabledImpl(Features, "x87", true);
2723
2724 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002725 case CK_Generic:
2726 case CK_i386:
2727 case CK_i486:
2728 case CK_i586:
2729 case CK_Pentium:
2730 case CK_i686:
2731 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002732 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002733 break;
2734 case CK_PentiumMMX:
2735 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002736 case CK_K6:
2737 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002738 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002739 break;
2740 case CK_Pentium3:
2741 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002742 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002743 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002744 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002745 break;
2746 case CK_PentiumM:
2747 case CK_Pentium4:
2748 case CK_Pentium4M:
2749 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002750 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002751 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002752 break;
2753 case CK_Yonah:
2754 case CK_Prescott:
2755 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002756 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002757 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002758 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002759 break;
2760 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002761 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002762 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002763 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002764 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002765 break;
2766 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002767 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002768 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002769 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002770 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002771 case CK_Cannonlake:
2772 setFeatureEnabledImpl(Features, "avx512ifma", true);
2773 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2774 setFeatureEnabledImpl(Features, "sha", true);
2775 setFeatureEnabledImpl(Features, "umip", true);
2776 // FALLTHROUGH
2777 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002778 setFeatureEnabledImpl(Features, "avx512f", true);
2779 setFeatureEnabledImpl(Features, "avx512cd", true);
2780 setFeatureEnabledImpl(Features, "avx512dq", true);
2781 setFeatureEnabledImpl(Features, "avx512bw", true);
2782 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002783 setFeatureEnabledImpl(Features, "pku", true);
2784 setFeatureEnabledImpl(Features, "pcommit", true);
2785 setFeatureEnabledImpl(Features, "clwb", true);
2786 // FALLTHROUGH
2787 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002788 setFeatureEnabledImpl(Features, "xsavec", true);
2789 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002790 setFeatureEnabledImpl(Features, "mpx", true);
2791 setFeatureEnabledImpl(Features, "sgx", true);
2792 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002793 // FALLTHROUGH
2794 case CK_Broadwell:
2795 setFeatureEnabledImpl(Features, "rdseed", true);
2796 setFeatureEnabledImpl(Features, "adx", true);
2797 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002798 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002799 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002800 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002801 setFeatureEnabledImpl(Features, "bmi", true);
2802 setFeatureEnabledImpl(Features, "bmi2", true);
2803 setFeatureEnabledImpl(Features, "rtm", true);
2804 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002805 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002806 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002807 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002808 setFeatureEnabledImpl(Features, "rdrnd", true);
2809 setFeatureEnabledImpl(Features, "f16c", true);
2810 setFeatureEnabledImpl(Features, "fsgsbase", true);
2811 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002812 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002813 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002814 setFeatureEnabledImpl(Features, "xsave", true);
2815 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002816 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002817 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002818 case CK_Silvermont:
2819 setFeatureEnabledImpl(Features, "aes", true);
2820 setFeatureEnabledImpl(Features, "pclmul", true);
2821 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002822 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002823 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002824 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002825 setFeatureEnabledImpl(Features, "cx16", true);
2826 break;
2827 case CK_KNL:
2828 setFeatureEnabledImpl(Features, "avx512f", true);
2829 setFeatureEnabledImpl(Features, "avx512cd", true);
2830 setFeatureEnabledImpl(Features, "avx512er", true);
2831 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002832 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002833 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002834 setFeatureEnabledImpl(Features, "rdseed", true);
2835 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002836 setFeatureEnabledImpl(Features, "lzcnt", true);
2837 setFeatureEnabledImpl(Features, "bmi", true);
2838 setFeatureEnabledImpl(Features, "bmi2", true);
2839 setFeatureEnabledImpl(Features, "rtm", true);
2840 setFeatureEnabledImpl(Features, "fma", true);
2841 setFeatureEnabledImpl(Features, "rdrnd", true);
2842 setFeatureEnabledImpl(Features, "f16c", true);
2843 setFeatureEnabledImpl(Features, "fsgsbase", true);
2844 setFeatureEnabledImpl(Features, "aes", true);
2845 setFeatureEnabledImpl(Features, "pclmul", true);
2846 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002847 setFeatureEnabledImpl(Features, "xsaveopt", true);
2848 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002849 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002850 break;
2851 case CK_K6_2:
2852 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002853 case CK_WinChip2:
2854 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002855 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002856 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002857 case CK_Athlon:
2858 case CK_AthlonThunderbird:
2859 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002860 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002861 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002862 case CK_Athlon4:
2863 case CK_AthlonXP:
2864 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002865 setFeatureEnabledImpl(Features, "sse", true);
2866 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002867 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002868 break;
2869 case CK_K8:
2870 case CK_Opteron:
2871 case CK_Athlon64:
2872 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002873 setFeatureEnabledImpl(Features, "sse2", true);
2874 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002875 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002876 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002877 case CK_AMDFAM10:
2878 setFeatureEnabledImpl(Features, "sse4a", true);
2879 setFeatureEnabledImpl(Features, "lzcnt", true);
2880 setFeatureEnabledImpl(Features, "popcnt", true);
2881 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002882 case CK_K8SSE3:
2883 case CK_OpteronSSE3:
2884 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002885 setFeatureEnabledImpl(Features, "sse3", true);
2886 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002887 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002888 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002889 case CK_BTVER2:
2890 setFeatureEnabledImpl(Features, "avx", true);
2891 setFeatureEnabledImpl(Features, "aes", true);
2892 setFeatureEnabledImpl(Features, "pclmul", true);
2893 setFeatureEnabledImpl(Features, "bmi", true);
2894 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002895 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002896 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002897 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002898 setFeatureEnabledImpl(Features, "ssse3", true);
2899 setFeatureEnabledImpl(Features, "sse4a", true);
2900 setFeatureEnabledImpl(Features, "lzcnt", true);
2901 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002902 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002903 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002904 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002905 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002906 case CK_BDVER4:
2907 setFeatureEnabledImpl(Features, "avx2", true);
2908 setFeatureEnabledImpl(Features, "bmi2", true);
2909 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002910 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002911 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002912 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002913 // FALLTHROUGH
2914 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002915 setFeatureEnabledImpl(Features, "bmi", true);
2916 setFeatureEnabledImpl(Features, "fma", true);
2917 setFeatureEnabledImpl(Features, "f16c", true);
2918 setFeatureEnabledImpl(Features, "tbm", true);
2919 // FALLTHROUGH
2920 case CK_BDVER1:
2921 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002922 setFeatureEnabledImpl(Features, "xop", true);
2923 setFeatureEnabledImpl(Features, "lzcnt", true);
2924 setFeatureEnabledImpl(Features, "aes", true);
2925 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002926 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002927 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002928 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002929 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002930 break;
Eli Friedman33465822011-07-08 23:31:17 +00002931 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002932 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2933 return false;
2934
2935 // Can't do this earlier because we need to be able to explicitly enable
2936 // or disable these features and the things that they depend upon.
2937
2938 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2939 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002940 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002941 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2942 FeaturesVec.end())
2943 Features["popcnt"] = true;
2944
2945 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2946 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002947 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002948 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2949 FeaturesVec.end())
2950 Features["prfchw"] = true;
2951
Eric Christophera7260af2015-10-08 20:10:18 +00002952 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2953 // then enable MMX.
2954 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002955 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002956 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2957 FeaturesVec.end())
2958 Features["mmx"] = true;
2959
Eric Christopherbbd746d2015-10-08 20:10:14 +00002960 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002961}
2962
Rafael Espindolae62e2792013-08-20 13:44:29 +00002963void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002964 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002965 if (Enabled) {
2966 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002967 case AVX512F:
2968 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002969 case AVX2:
2970 Features["avx2"] = true;
2971 case AVX:
2972 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002973 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002974 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002975 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002976 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002977 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002978 case SSSE3:
2979 Features["ssse3"] = true;
2980 case SSE3:
2981 Features["sse3"] = true;
2982 case SSE2:
2983 Features["sse2"] = true;
2984 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002985 Features["sse"] = true;
2986 case NoSSE:
2987 break;
2988 }
2989 return;
2990 }
2991
2992 switch (Level) {
2993 case NoSSE:
2994 case SSE1:
2995 Features["sse"] = false;
2996 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002997 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2998 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002999 case SSE3:
3000 Features["sse3"] = false;
3001 setXOPLevel(Features, NoXOP, false);
3002 case SSSE3:
3003 Features["ssse3"] = false;
3004 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003005 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003006 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003007 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003008 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003009 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3010 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003011 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003012 case AVX2:
3013 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003014 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003015 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003016 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003017 Features["avx512vl"] = Features["avx512vbmi"] =
3018 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003019 }
3020}
3021
3022void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003023 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003024 if (Enabled) {
3025 switch (Level) {
3026 case AMD3DNowAthlon:
3027 Features["3dnowa"] = true;
3028 case AMD3DNow:
3029 Features["3dnow"] = true;
3030 case MMX:
3031 Features["mmx"] = true;
3032 case NoMMX3DNow:
3033 break;
3034 }
3035 return;
3036 }
3037
3038 switch (Level) {
3039 case NoMMX3DNow:
3040 case MMX:
3041 Features["mmx"] = false;
3042 case AMD3DNow:
3043 Features["3dnow"] = false;
3044 case AMD3DNowAthlon:
3045 Features["3dnowa"] = false;
3046 }
3047}
3048
3049void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003050 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003051 if (Enabled) {
3052 switch (Level) {
3053 case XOP:
3054 Features["xop"] = true;
3055 case FMA4:
3056 Features["fma4"] = true;
3057 setSSELevel(Features, AVX, true);
3058 case SSE4A:
3059 Features["sse4a"] = true;
3060 setSSELevel(Features, SSE3, true);
3061 case NoXOP:
3062 break;
3063 }
3064 return;
3065 }
3066
3067 switch (Level) {
3068 case NoXOP:
3069 case SSE4A:
3070 Features["sse4a"] = false;
3071 case FMA4:
3072 Features["fma4"] = false;
3073 case XOP:
3074 Features["xop"] = false;
3075 }
3076}
3077
Craig Topper86d79ef2013-09-17 04:51:29 +00003078void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3079 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003080 // This is a bit of a hack to deal with the sse4 target feature when used
3081 // as part of the target attribute. We handle sse4 correctly everywhere
3082 // else. See below for more information on how we handle the sse4 options.
3083 if (Name != "sse4")
3084 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003085
Craig Topper29561122013-09-19 01:13:07 +00003086 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003087 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003088 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003089 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003090 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003091 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003092 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003093 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003094 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003095 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003096 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003097 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003098 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003099 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003100 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003101 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003102 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003103 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003104 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003105 if (Enabled)
3106 setSSELevel(Features, SSE2, Enabled);
3107 } else if (Name == "pclmul") {
3108 if (Enabled)
3109 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003110 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003111 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003112 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003113 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003114 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003115 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003116 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3117 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3118 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003119 if (Enabled)
3120 setSSELevel(Features, AVX512F, Enabled);
3121 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003122 if (Enabled)
3123 setSSELevel(Features, AVX, Enabled);
3124 } else if (Name == "fma4") {
3125 setXOPLevel(Features, FMA4, Enabled);
3126 } else if (Name == "xop") {
3127 setXOPLevel(Features, XOP, Enabled);
3128 } else if (Name == "sse4a") {
3129 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003130 } else if (Name == "f16c") {
3131 if (Enabled)
3132 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003133 } else if (Name == "sha") {
3134 if (Enabled)
3135 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003136 } else if (Name == "sse4") {
3137 // We can get here via the __target__ attribute since that's not controlled
3138 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3139 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3140 // disabled.
3141 if (Enabled)
3142 setSSELevel(Features, SSE42, Enabled);
3143 else
3144 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003145 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003146 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003147 Features["xsaveopt"] = false;
3148 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003149 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003150 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003151 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003152}
3153
Eric Christopher3ff21b32013-10-16 21:26:26 +00003154/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003155/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003156bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003157 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003158 for (const auto &Feature : Features) {
3159 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003160 continue;
3161
Eric Christopher610fe112015-08-26 08:21:55 +00003162 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003163 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003164 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003165 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003166 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003167 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003168 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003169 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003170 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003171 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003172 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003173 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003174 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003175 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003176 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003177 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003178 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003179 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003180 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003181 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003182 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003183 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003184 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003185 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003186 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003187 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003188 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003189 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003190 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003191 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003192 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003193 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003194 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003195 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003196 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003197 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003198 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003199 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003200 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003201 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003202 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003203 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003204 } else if (Feature == "+avx512vbmi") {
3205 HasAVX512VBMI = true;
3206 } else if (Feature == "+avx512ifma") {
3207 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003208 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003209 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003210 } else if (Feature == "+mpx") {
3211 HasMPX = true;
3212 } else if (Feature == "+movbe") {
3213 HasMOVBE = true;
3214 } else if (Feature == "+sgx") {
3215 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003216 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003217 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003218 } else if (Feature == "+fxsr") {
3219 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003220 } else if (Feature == "+xsave") {
3221 HasXSAVE = true;
3222 } else if (Feature == "+xsaveopt") {
3223 HasXSAVEOPT = true;
3224 } else if (Feature == "+xsavec") {
3225 HasXSAVEC = true;
3226 } else if (Feature == "+xsaves") {
3227 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003228 } else if (Feature == "+pku") {
3229 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003230 } else if (Feature == "+clflushopt") {
3231 HasCLFLUSHOPT = true;
3232 } else if (Feature == "+pcommit") {
3233 HasPCOMMIT = true;
3234 } else if (Feature == "+clwb") {
3235 HasCLWB = true;
3236 } else if (Feature == "+umip") {
3237 HasUMIP = true;
3238 } else if (Feature == "+prefetchwt1") {
3239 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003240 }
3241
Benjamin Kramer27402c62012-03-05 15:10:44 +00003242 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003243 .Case("+avx512f", AVX512F)
3244 .Case("+avx2", AVX2)
3245 .Case("+avx", AVX)
3246 .Case("+sse4.2", SSE42)
3247 .Case("+sse4.1", SSE41)
3248 .Case("+ssse3", SSSE3)
3249 .Case("+sse3", SSE3)
3250 .Case("+sse2", SSE2)
3251 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003252 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003253 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003254
Eli Friedman33465822011-07-08 23:31:17 +00003255 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003256 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003257 .Case("+3dnowa", AMD3DNowAthlon)
3258 .Case("+3dnow", AMD3DNow)
3259 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003260 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003261 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003262
3263 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003264 .Case("+xop", XOP)
3265 .Case("+fma4", FMA4)
3266 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003267 .Default(NoXOP);
3268 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003269 }
Eli Friedman33465822011-07-08 23:31:17 +00003270
Rafael Espindolaeb265472013-08-21 21:59:03 +00003271 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3272 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003273 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3274 (FPMath == FP_387 && SSELevel >= SSE1)) {
3275 Diags.Report(diag::err_target_unsupported_fpmath) <<
3276 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003277 return false;
3278 }
3279
Alexey Bataev00396512015-07-02 03:40:19 +00003280 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003281 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003282 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003283}
Chris Lattnerecd49032009-03-02 22:27:17 +00003284
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003285/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3286/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003287void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003288 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003289 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003290 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003291 Builder.defineMacro("__amd64__");
3292 Builder.defineMacro("__amd64");
3293 Builder.defineMacro("__x86_64");
3294 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003295 if (getTriple().getArchName() == "x86_64h") {
3296 Builder.defineMacro("__x86_64h");
3297 Builder.defineMacro("__x86_64h__");
3298 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003299 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003300 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003301 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003302
Chris Lattnerecd49032009-03-02 22:27:17 +00003303 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003304 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3305 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003306 switch (CPU) {
3307 case CK_Generic:
3308 break;
3309 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003310 // The rest are coming from the i386 define above.
3311 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003312 break;
3313 case CK_i486:
3314 case CK_WinChipC6:
3315 case CK_WinChip2:
3316 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003317 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003318 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003319 case CK_PentiumMMX:
3320 Builder.defineMacro("__pentium_mmx__");
3321 Builder.defineMacro("__tune_pentium_mmx__");
3322 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003323 case CK_i586:
3324 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003325 defineCPUMacros(Builder, "i586");
3326 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003327 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003328 case CK_Pentium3:
3329 case CK_Pentium3M:
3330 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003331 Builder.defineMacro("__tune_pentium3__");
3332 // Fallthrough
3333 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003334 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003335 Builder.defineMacro("__tune_pentium2__");
3336 // Fallthrough
3337 case CK_PentiumPro:
3338 Builder.defineMacro("__tune_i686__");
3339 Builder.defineMacro("__tune_pentiumpro__");
3340 // Fallthrough
3341 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003342 Builder.defineMacro("__i686");
3343 Builder.defineMacro("__i686__");
3344 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3345 Builder.defineMacro("__pentiumpro");
3346 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003347 break;
3348 case CK_Pentium4:
3349 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003350 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003351 break;
3352 case CK_Yonah:
3353 case CK_Prescott:
3354 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003355 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003356 break;
3357 case CK_Core2:
3358 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003359 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003360 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003361 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003362 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003363 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003364 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003365 defineCPUMacros(Builder, "slm");
3366 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003367 case CK_Nehalem:
3368 case CK_Westmere:
3369 case CK_SandyBridge:
3370 case CK_IvyBridge:
3371 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003372 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003373 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003374 // FIXME: Historically, we defined this legacy name, it would be nice to
3375 // remove it at some point. We've never exposed fine-grained names for
3376 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003377 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003378 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003379 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003380 defineCPUMacros(Builder, "skx");
3381 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003382 case CK_Cannonlake:
3383 break;
Craig Topper449314e2013-08-20 07:09:39 +00003384 case CK_KNL:
3385 defineCPUMacros(Builder, "knl");
3386 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003387 case CK_Lakemont:
3388 Builder.defineMacro("__tune_lakemont__");
3389 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003390 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003391 Builder.defineMacro("__k6_2__");
3392 Builder.defineMacro("__tune_k6_2__");
3393 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003394 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003395 if (CPU != CK_K6_2) { // In case of fallthrough
3396 // FIXME: GCC may be enabling these in cases where some other k6
3397 // architecture is specified but -m3dnow is explicitly provided. The
3398 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003399 Builder.defineMacro("__k6_3__");
3400 Builder.defineMacro("__tune_k6_3__");
3401 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003402 // Fallthrough
3403 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003404 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003405 break;
3406 case CK_Athlon:
3407 case CK_AthlonThunderbird:
3408 case CK_Athlon4:
3409 case CK_AthlonXP:
3410 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003411 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003412 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003413 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003414 Builder.defineMacro("__tune_athlon_sse__");
3415 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003416 break;
3417 case CK_K8:
3418 case CK_K8SSE3:
3419 case CK_x86_64:
3420 case CK_Opteron:
3421 case CK_OpteronSSE3:
3422 case CK_Athlon64:
3423 case CK_Athlon64SSE3:
3424 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003425 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003426 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003427 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003428 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003429 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003430 case CK_BTVER1:
3431 defineCPUMacros(Builder, "btver1");
3432 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003433 case CK_BTVER2:
3434 defineCPUMacros(Builder, "btver2");
3435 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003436 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003437 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003438 break;
3439 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003440 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003441 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003442 case CK_BDVER3:
3443 defineCPUMacros(Builder, "bdver3");
3444 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003445 case CK_BDVER4:
3446 defineCPUMacros(Builder, "bdver4");
3447 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003448 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003449 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003450 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003451 }
Chris Lattner96e43572009-03-02 22:40:39 +00003452
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003453 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003454 Builder.defineMacro("__REGISTER_PREFIX__", "");
3455
Chris Lattner6df41af2009-04-19 17:32:33 +00003456 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3457 // functions in glibc header files that use FP Stack inline asm which the
3458 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003459 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003460
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003461 if (HasAES)
3462 Builder.defineMacro("__AES__");
3463
Craig Topper3f122a72012-05-31 05:18:48 +00003464 if (HasPCLMUL)
3465 Builder.defineMacro("__PCLMUL__");
3466
Craig Topper22967d42011-12-25 05:06:45 +00003467 if (HasLZCNT)
3468 Builder.defineMacro("__LZCNT__");
3469
Benjamin Kramer1e250392012-07-07 09:39:18 +00003470 if (HasRDRND)
3471 Builder.defineMacro("__RDRND__");
3472
Craig Topper8c7f2512014-11-03 06:51:41 +00003473 if (HasFSGSBASE)
3474 Builder.defineMacro("__FSGSBASE__");
3475
Craig Topper22967d42011-12-25 05:06:45 +00003476 if (HasBMI)
3477 Builder.defineMacro("__BMI__");
3478
3479 if (HasBMI2)
3480 Builder.defineMacro("__BMI2__");
3481
Craig Topper1de83482011-12-29 16:10:46 +00003482 if (HasPOPCNT)
3483 Builder.defineMacro("__POPCNT__");
3484
Michael Liao625a8752012-11-10 05:17:46 +00003485 if (HasRTM)
3486 Builder.defineMacro("__RTM__");
3487
Michael Liao74f4eaf2013-03-26 17:52:08 +00003488 if (HasPRFCHW)
3489 Builder.defineMacro("__PRFCHW__");
3490
Michael Liaoffaae352013-03-29 05:17:55 +00003491 if (HasRDSEED)
3492 Builder.defineMacro("__RDSEED__");
3493
Robert Khasanov50e6f582014-09-19 09:53:48 +00003494 if (HasADX)
3495 Builder.defineMacro("__ADX__");
3496
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003497 if (HasTBM)
3498 Builder.defineMacro("__TBM__");
3499
Rafael Espindolae62e2792013-08-20 13:44:29 +00003500 switch (XOPLevel) {
3501 case XOP:
3502 Builder.defineMacro("__XOP__");
3503 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003504 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003505 case SSE4A:
3506 Builder.defineMacro("__SSE4A__");
3507 case NoXOP:
3508 break;
3509 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003510
Craig Topperbba778b2012-06-03 21:46:30 +00003511 if (HasFMA)
3512 Builder.defineMacro("__FMA__");
3513
Manman Rena45358c2012-10-11 00:59:55 +00003514 if (HasF16C)
3515 Builder.defineMacro("__F16C__");
3516
Craig Topper679b53a2013-08-21 05:29:10 +00003517 if (HasAVX512CD)
3518 Builder.defineMacro("__AVX512CD__");
3519 if (HasAVX512ER)
3520 Builder.defineMacro("__AVX512ER__");
3521 if (HasAVX512PF)
3522 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003523 if (HasAVX512DQ)
3524 Builder.defineMacro("__AVX512DQ__");
3525 if (HasAVX512BW)
3526 Builder.defineMacro("__AVX512BW__");
3527 if (HasAVX512VL)
3528 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003529 if (HasAVX512VBMI)
3530 Builder.defineMacro("__AVX512VBMI__");
3531 if (HasAVX512IFMA)
3532 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003533
Ben Langmuir58078d02013-09-19 13:22:04 +00003534 if (HasSHA)
3535 Builder.defineMacro("__SHA__");
3536
Craig Toppere33f51f2015-10-16 06:22:36 +00003537 if (HasFXSR)
3538 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003539 if (HasXSAVE)
3540 Builder.defineMacro("__XSAVE__");
3541 if (HasXSAVEOPT)
3542 Builder.defineMacro("__XSAVEOPT__");
3543 if (HasXSAVEC)
3544 Builder.defineMacro("__XSAVEC__");
3545 if (HasXSAVES)
3546 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003547 if (HasPKU)
3548 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003549 if (HasCX16)
3550 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3551
Chris Lattner96e43572009-03-02 22:40:39 +00003552 // Each case falls through to the previous one here.
3553 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003554 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003555 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003556 case AVX2:
3557 Builder.defineMacro("__AVX2__");
3558 case AVX:
3559 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003560 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003561 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003562 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003563 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003564 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003565 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003566 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003567 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003568 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003569 Builder.defineMacro("__SSE2__");
3570 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003571 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003572 Builder.defineMacro("__SSE__");
3573 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003574 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003575 break;
3576 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003577
Derek Schuffc7dd7222012-10-11 15:52:22 +00003578 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003579 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003580 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003581 case AVX2:
3582 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003583 case SSE42:
3584 case SSE41:
3585 case SSSE3:
3586 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003587 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003588 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003589 break;
3590 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003591 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003592 break;
3593 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003594 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003595 }
3596 }
3597
Anders Carlssone437c682010-01-27 03:47:49 +00003598 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003599 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003600 case AMD3DNowAthlon:
3601 Builder.defineMacro("__3dNOW_A__");
3602 case AMD3DNow:
3603 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003604 case MMX:
3605 Builder.defineMacro("__MMX__");
3606 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003607 break;
3608 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003609
3610 if (CPU >= CK_i486) {
3611 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3612 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3613 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3614 }
3615 if (CPU >= CK_i586)
3616 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003617}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003618
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003619bool X86TargetInfo::hasFeature(StringRef Feature) const {
3620 return llvm::StringSwitch<bool>(Feature)
3621 .Case("aes", HasAES)
3622 .Case("avx", SSELevel >= AVX)
3623 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003624 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003625 .Case("avx512cd", HasAVX512CD)
3626 .Case("avx512er", HasAVX512ER)
3627 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003628 .Case("avx512dq", HasAVX512DQ)
3629 .Case("avx512bw", HasAVX512BW)
3630 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003631 .Case("avx512vbmi", HasAVX512VBMI)
3632 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003633 .Case("bmi", HasBMI)
3634 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003635 .Case("clflushopt", HasCLFLUSHOPT)
3636 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003637 .Case("cx16", HasCX16)
3638 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003639 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003640 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003641 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003642 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003643 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003644 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3645 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3646 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003647 .Case("movbe", HasMOVBE)
3648 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003649 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003650 .Case("pcommit", HasPCOMMIT)
3651 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003652 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003653 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003654 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003655 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003656 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003657 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003658 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003659 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003660 .Case("sse", SSELevel >= SSE1)
3661 .Case("sse2", SSELevel >= SSE2)
3662 .Case("sse3", SSELevel >= SSE3)
3663 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003664 .Case("sse4.1", SSELevel >= SSE41)
3665 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003666 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003667 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003668 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003669 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003670 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3671 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003672 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003673 .Case("xsave", HasXSAVE)
3674 .Case("xsavec", HasXSAVEC)
3675 .Case("xsaves", HasXSAVES)
3676 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003677 .Default(false);
3678}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003679
Eric Christopherd9832702015-06-29 21:00:05 +00003680// We can't use a generic validation scheme for the features accepted here
3681// versus subtarget features accepted in the target attribute because the
3682// bitfield structure that's initialized in the runtime only supports the
3683// below currently rather than the full range of subtarget features. (See
3684// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3685bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3686 return llvm::StringSwitch<bool>(FeatureStr)
3687 .Case("cmov", true)
3688 .Case("mmx", true)
3689 .Case("popcnt", true)
3690 .Case("sse", true)
3691 .Case("sse2", true)
3692 .Case("sse3", true)
3693 .Case("sse4.1", true)
3694 .Case("sse4.2", true)
3695 .Case("avx", true)
3696 .Case("avx2", true)
3697 .Case("sse4a", true)
3698 .Case("fma4", true)
3699 .Case("xop", true)
3700 .Case("fma", true)
3701 .Case("avx512f", true)
3702 .Case("bmi", true)
3703 .Case("bmi2", true)
3704 .Default(false);
3705}
3706
Eli Friedman3fd920a2008-08-20 02:34:37 +00003707bool
Anders Carlsson58436352009-02-28 17:11:49 +00003708X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003709 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003710 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003711 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003712 // Constant constraints.
3713 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3714 // instructions.
3715 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3716 // x86_64 instructions.
3717 case 's':
3718 Info.setRequiresImmediate();
3719 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003720 case 'I':
3721 Info.setRequiresImmediate(0, 31);
3722 return true;
3723 case 'J':
3724 Info.setRequiresImmediate(0, 63);
3725 return true;
3726 case 'K':
3727 Info.setRequiresImmediate(-128, 127);
3728 return true;
3729 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003730 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003731 return true;
3732 case 'M':
3733 Info.setRequiresImmediate(0, 3);
3734 return true;
3735 case 'N':
3736 Info.setRequiresImmediate(0, 255);
3737 return true;
3738 case 'O':
3739 Info.setRequiresImmediate(0, 127);
3740 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003741 // Register constraints.
3742 case 'Y': // 'Y' is the first character for several 2-character constraints.
3743 // Shift the pointer to the second character of the constraint.
3744 Name++;
3745 switch (*Name) {
3746 default:
3747 return false;
3748 case '0': // First SSE register.
3749 case 't': // Any SSE register, when SSE2 is enabled.
3750 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3751 case 'm': // Any MMX register, when inter-unit moves enabled.
3752 Info.setAllowsRegister();
3753 return true;
3754 }
3755 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003756 // Constraint 'f' cannot be used for output operands.
3757 if (Info.ConstraintStr[0] == '=')
3758 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003759 Info.setAllowsRegister();
3760 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003761 case 'a': // eax.
3762 case 'b': // ebx.
3763 case 'c': // ecx.
3764 case 'd': // edx.
3765 case 'S': // esi.
3766 case 'D': // edi.
3767 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003768 case 't': // Top of floating point stack.
3769 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003770 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003771 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003772 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003773 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003774 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3775 case 'l': // "Index" registers: any general register that can be used as an
3776 // index in a base+index memory access.
3777 Info.setAllowsRegister();
3778 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003779 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003780 case 'C': // SSE floating point constant.
3781 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003782 return true;
3783 }
3784}
3785
Akira Hatanaka974131e2014-09-18 18:17:18 +00003786bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3787 unsigned Size) const {
3788 // Strip off constraint modifiers.
3789 while (Constraint[0] == '=' ||
3790 Constraint[0] == '+' ||
3791 Constraint[0] == '&')
3792 Constraint = Constraint.substr(1);
3793
3794 return validateOperandSize(Constraint, Size);
3795}
3796
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003797bool X86TargetInfo::validateInputSize(StringRef Constraint,
3798 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003799 return validateOperandSize(Constraint, Size);
3800}
3801
3802bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3803 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003804 switch (Constraint[0]) {
3805 default: break;
3806 case 'y':
3807 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003808 case 'f':
3809 case 't':
3810 case 'u':
3811 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003812 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003813 if (SSELevel >= AVX512F)
3814 // 512-bit zmm registers can be used if target supports AVX512F.
3815 return Size <= 512U;
3816 else if (SSELevel >= AVX)
3817 // 256-bit ymm registers can be used if target supports AVX.
3818 return Size <= 256U;
3819 return Size <= 128U;
3820 case 'Y':
3821 // 'Y' is the first character for several 2-character constraints.
3822 switch (Constraint[1]) {
3823 default: break;
3824 case 'm':
3825 // 'Ym' is synonymous with 'y'.
3826 return Size <= 64;
3827 case 'i':
3828 case 't':
3829 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3830 if (SSELevel >= AVX512F)
3831 return Size <= 512U;
3832 else if (SSELevel >= AVX)
3833 return Size <= 256U;
3834 return SSELevel >= SSE2 && Size <= 128U;
3835 }
3836
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003837 }
3838
3839 return true;
3840}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003841
Eli Friedman3fd920a2008-08-20 02:34:37 +00003842std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003843X86TargetInfo::convertConstraint(const char *&Constraint) const {
3844 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003845 case 'a': return std::string("{ax}");
3846 case 'b': return std::string("{bx}");
3847 case 'c': return std::string("{cx}");
3848 case 'd': return std::string("{dx}");
3849 case 'S': return std::string("{si}");
3850 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003851 case 'p': // address
3852 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003853 case 't': // top of floating point stack.
3854 return std::string("{st}");
3855 case 'u': // second from top of floating point stack.
3856 return std::string("{st(1)}"); // second from top of floating point stack.
3857 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003858 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003859 }
3860}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003861
Eli Friedman3fd920a2008-08-20 02:34:37 +00003862// X86-32 generic target
3863class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003864public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003865 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3866 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003867 DoubleAlign = LongLongAlign = 32;
3868 LongDoubleWidth = 96;
3869 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003870 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003871 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003872 SizeType = UnsignedInt;
3873 PtrDiffType = SignedInt;
3874 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003875 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003876
3877 // Use fpret for all types.
3878 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3879 (1 << TargetInfo::Double) |
3880 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003881
3882 // x86-32 has atomics up to 8 bytes
3883 // FIXME: Check that we actually have cmpxchg8b before setting
3884 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3885 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003886 }
Craig Topper3164f332014-03-11 03:39:26 +00003887 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003888 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003889 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003890
Craig Topper3164f332014-03-11 03:39:26 +00003891 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003892 if (RegNo == 0) return 0;
3893 if (RegNo == 1) return 2;
3894 return -1;
3895 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003896 bool validateOperandSize(StringRef Constraint,
3897 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003898 switch (Constraint[0]) {
3899 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003900 case 'R':
3901 case 'q':
3902 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003903 case 'a':
3904 case 'b':
3905 case 'c':
3906 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003907 case 'S':
3908 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003909 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003910 case 'A':
3911 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003912 }
3913
Akira Hatanaka974131e2014-09-18 18:17:18 +00003914 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003915 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003916};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003917
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003918class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3919public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003920 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3921 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003922
Craig Topper3164f332014-03-11 03:39:26 +00003923 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003924 unsigned Major, Minor, Micro;
3925 getTriple().getOSVersion(Major, Minor, Micro);
3926 // New NetBSD uses the default rounding mode.
3927 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3928 return X86_32TargetInfo::getFloatEvalMethod();
3929 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003930 return 1;
3931 }
3932};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003933
Eli Friedmane3aa4542009-07-05 18:47:56 +00003934class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3935public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003936 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3937 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003938 SizeType = UnsignedLong;
3939 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003940 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003941 }
3942};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003943
Eli Friedman9fa28852012-08-08 23:57:20 +00003944class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3945public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003946 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3947 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003948 SizeType = UnsignedLong;
3949 IntPtrType = SignedLong;
3950 PtrDiffType = SignedLong;
3951 }
3952};
Eli Friedman9fa28852012-08-08 23:57:20 +00003953
Torok Edwinb2b37c62009-06-30 17:10:35 +00003954class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003956 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3957 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003958 LongDoubleWidth = 128;
3959 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003960 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003961 MaxVectorAlign = 256;
3962 // The watchOS simulator uses the builtin bool type for Objective-C.
3963 llvm::Triple T = llvm::Triple(Triple);
3964 if (T.isWatchOS())
3965 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003966 SizeType = UnsignedLong;
3967 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00003968 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00003969 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003970 }
3971
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003972 bool handleTargetFeatures(std::vector<std::string> &Features,
3973 DiagnosticsEngine &Diags) override {
3974 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3975 Diags))
3976 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003977 // We now know the features we have: we can decide how to align vectors.
3978 MaxVectorAlign =
3979 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003980 return true;
3981 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003982};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003983
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003984// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003985class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003986public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003987 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3988 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003989 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003990 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003991 bool IsWinCOFF =
3992 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00003993 resetDataLayout(IsWinCOFF
3994 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3995 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003996 }
Craig Topper3164f332014-03-11 03:39:26 +00003997 void getTargetDefines(const LangOptions &Opts,
3998 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003999 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4000 }
4001};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004002
4003// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004004class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004005public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004006 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4007 const TargetOptions &Opts)
4008 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004009 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004010 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4011 }
Craig Topper3164f332014-03-11 03:39:26 +00004012 void getTargetDefines(const LangOptions &Opts,
4013 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004014 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4015 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4016 // The value of the following reflects processor type.
4017 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4018 // We lost the original triple, so we use the default.
4019 Builder.defineMacro("_M_IX86", "600");
4020 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004021};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004022
David Majnemerae1ed0e2015-05-28 04:36:18 +00004023static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004024 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4025 // supports __declspec natively under -fms-extensions, but we define a no-op
4026 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004027 if (Opts.MicrosoftExt)
4028 Builder.defineMacro("__declspec", "__declspec");
4029 else
4030 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4031
4032 if (!Opts.MicrosoftExt) {
4033 // Provide macros for all the calling convention keywords. Provide both
4034 // single and double underscore prefixed variants. These are available on
4035 // x64 as well as x86, even though they have no effect.
4036 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4037 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004038 std::string GCCSpelling = "__attribute__((__";
4039 GCCSpelling += CC;
4040 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004041 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4042 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4043 }
4044 }
4045}
4046
David Majnemerae1ed0e2015-05-28 04:36:18 +00004047static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4048 Builder.defineMacro("__MSVCRT__");
4049 Builder.defineMacro("__MINGW32__");
4050 addCygMingDefines(Opts, Builder);
4051}
4052
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004053// x86-32 MinGW target
4054class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4055public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004056 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4057 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004058 void getTargetDefines(const LangOptions &Opts,
4059 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004060 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004061 DefineStd(Builder, "WIN32", Opts);
4062 DefineStd(Builder, "WINNT", Opts);
4063 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004064 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004065 }
4066};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004067
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004068// x86-32 Cygwin target
4069class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4070public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004071 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4072 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004073 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004074 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004075 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 +00004076 }
Craig Topper3164f332014-03-11 03:39:26 +00004077 void getTargetDefines(const LangOptions &Opts,
4078 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004079 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004080 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004081 Builder.defineMacro("__CYGWIN__");
4082 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004083 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004084 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004085 if (Opts.CPlusPlus)
4086 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004087 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004088};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004089
Chris Lattnerb986aba2010-04-11 19:29:39 +00004090// x86-32 Haiku target
4091class HaikuX86_32TargetInfo : public X86_32TargetInfo {
4092public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004093 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4094 : X86_32TargetInfo(Triple, Opts) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004095 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00004096 IntPtrType = SignedLong;
4097 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00004098 ProcessIDType = SignedLong;
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00004099 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00004100 }
Craig Topper3164f332014-03-11 03:39:26 +00004101 void getTargetDefines(const LangOptions &Opts,
4102 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004103 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4104 Builder.defineMacro("__INTEL__");
4105 Builder.defineMacro("__HAIKU__");
4106 }
4107};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004108
Alexey Bataevc99b0492015-11-25 09:24:26 +00004109// X86-32 MCU target
4110class MCUX86_32TargetInfo : public X86_32TargetInfo {
4111public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004112 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4113 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004114 LongDoubleWidth = 64;
4115 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004116 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 +00004117 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004118 }
4119
4120 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4121 // On MCU we support only C calling convention.
4122 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4123 }
4124
4125 void getTargetDefines(const LangOptions &Opts,
4126 MacroBuilder &Builder) const override {
4127 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4128 Builder.defineMacro("__iamcu");
4129 Builder.defineMacro("__iamcu__");
4130 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004131
4132 bool allowsLargerPreferedTypeAlignment() const override {
4133 return false;
4134 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004135};
4136
Douglas Gregor9fabd852011-07-01 22:41:14 +00004137// RTEMS Target
4138template<typename Target>
4139class RTEMSTargetInfo : public OSTargetInfo<Target> {
4140protected:
Craig Topper3164f332014-03-11 03:39:26 +00004141 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4142 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004143 // RTEMS defines; list based off of gcc output
4144
Douglas Gregor9fabd852011-07-01 22:41:14 +00004145 Builder.defineMacro("__rtems__");
4146 Builder.defineMacro("__ELF__");
4147 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004148
Douglas Gregor9fabd852011-07-01 22:41:14 +00004149public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004150 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4151 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004152 switch (Triple.getArch()) {
4153 default:
4154 case llvm::Triple::x86:
4155 // this->MCountName = ".mcount";
4156 break;
4157 case llvm::Triple::mips:
4158 case llvm::Triple::mipsel:
4159 case llvm::Triple::ppc:
4160 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004161 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004162 // this->MCountName = "_mcount";
4163 break;
4164 case llvm::Triple::arm:
4165 // this->MCountName = "__mcount";
4166 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004167 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004168 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004169};
4170
Douglas Gregor9fabd852011-07-01 22:41:14 +00004171// x86-32 RTEMS target
4172class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4173public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004174 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4175 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004176 SizeType = UnsignedLong;
4177 IntPtrType = SignedLong;
4178 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004179 }
Craig Topper3164f332014-03-11 03:39:26 +00004180 void getTargetDefines(const LangOptions &Opts,
4181 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004182 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4183 Builder.defineMacro("__INTEL__");
4184 Builder.defineMacro("__rtems__");
4185 }
4186};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004187
Eli Friedman3fd920a2008-08-20 02:34:37 +00004188// x86-64 generic target
4189class X86_64TargetInfo : public X86TargetInfo {
4190public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004191 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4192 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004193 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004194 bool IsWinCOFF =
4195 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004196 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004197 LongDoubleWidth = 128;
4198 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004199 LargeArrayMinWidth = 128;
4200 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004201 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004202 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4203 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4204 IntPtrType = IsX32 ? SignedInt : SignedLong;
4205 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004206 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004207 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004208
Eric Christopher917e9522014-11-18 22:36:15 +00004209 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004210 resetDataLayout(IsX32
4211 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4212 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4213 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004214
4215 // Use fpret only for long double.
4216 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004217
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004218 // Use fp2ret for _Complex long double.
4219 ComplexLongDoubleUsesFP2Ret = true;
4220
Charles Davisc7d5c942015-09-17 20:55:33 +00004221 // Make __builtin_ms_va_list available.
4222 HasBuiltinMSVaList = true;
4223
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004224 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004225 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004226 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004227 }
Craig Topper3164f332014-03-11 03:39:26 +00004228 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004229 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004230 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004231
Craig Topper3164f332014-03-11 03:39:26 +00004232 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004233 if (RegNo == 0) return 0;
4234 if (RegNo == 1) return 1;
4235 return -1;
4236 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004237
Craig Topper3164f332014-03-11 03:39:26 +00004238 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004239 switch (CC) {
4240 case CC_C:
4241 case CC_Swift:
4242 case CC_X86VectorCall:
4243 case CC_IntelOclBicc:
4244 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004245 case CC_PreserveMost:
4246 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004247 return CCCR_OK;
4248 default:
4249 return CCCR_Warning;
4250 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004251 }
4252
Craig Topper3164f332014-03-11 03:39:26 +00004253 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004254 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004255 }
4256
Pavel Chupinfd223e12014-08-04 12:39:43 +00004257 // for x32 we need it here explicitly
4258 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004259 unsigned getUnwindWordWidth() const override { return 64; }
4260 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004261
4262 bool validateGlobalRegisterVariable(StringRef RegName,
4263 unsigned RegSize,
4264 bool &HasSizeMismatch) const override {
4265 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4266 // handle.
4267 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4268 // Check that the register size is 64-bit.
4269 HasSizeMismatch = RegSize != 64;
4270 return true;
4271 }
4272
4273 // Check if the register is a 32-bit register the backend can handle.
4274 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4275 HasSizeMismatch);
4276 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004277};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004278
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004279// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004280class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004281public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004282 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4283 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004284 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004285 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004286 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004287 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004288 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004289 SizeType = UnsignedLongLong;
4290 PtrDiffType = SignedLongLong;
4291 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004292 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004293
Craig Topper3164f332014-03-11 03:39:26 +00004294 void getTargetDefines(const LangOptions &Opts,
4295 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004296 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004297 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004298 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004299
Craig Topper3164f332014-03-11 03:39:26 +00004300 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004301 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004302 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004303
Craig Topper3164f332014-03-11 03:39:26 +00004304 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004305 switch (CC) {
4306 case CC_X86StdCall:
4307 case CC_X86ThisCall:
4308 case CC_X86FastCall:
4309 return CCCR_Ignore;
4310 case CC_C:
4311 case CC_X86VectorCall:
4312 case CC_IntelOclBicc:
4313 case CC_X86_64SysV:
4314 return CCCR_OK;
4315 default:
4316 return CCCR_Warning;
4317 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004318 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004319};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004320
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004321// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004322class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004323public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004324 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4325 const TargetOptions &Opts)
4326 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004327 LongDoubleWidth = LongDoubleAlign = 64;
4328 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004329 }
Craig Topper3164f332014-03-11 03:39:26 +00004330 void getTargetDefines(const LangOptions &Opts,
4331 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004332 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4333 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004334 Builder.defineMacro("_M_X64", "100");
4335 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004336 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004337};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004338
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004339// x86-64 MinGW target
4340class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4341public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004342 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4343 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004344 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4345 // with x86 FP ops. Weird.
4346 LongDoubleWidth = LongDoubleAlign = 128;
4347 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4348 }
4349
Craig Topper3164f332014-03-11 03:39:26 +00004350 void getTargetDefines(const LangOptions &Opts,
4351 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004352 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004353 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004354 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004355 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004356
4357 // GCC defines this macro when it is using __gxx_personality_seh0.
4358 if (!Opts.SjLjExceptions)
4359 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004360 }
4361};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004362
Yaron Kerend030d112015-07-22 17:38:19 +00004363// x86-64 Cygwin target
4364class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4365public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004366 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4367 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004368 TLSSupported = false;
4369 WCharType = UnsignedShort;
4370 }
4371 void getTargetDefines(const LangOptions &Opts,
4372 MacroBuilder &Builder) const override {
4373 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4374 Builder.defineMacro("__x86_64__");
4375 Builder.defineMacro("__CYGWIN__");
4376 Builder.defineMacro("__CYGWIN64__");
4377 addCygMingDefines(Opts, Builder);
4378 DefineStd(Builder, "unix", Opts);
4379 if (Opts.CPlusPlus)
4380 Builder.defineMacro("_GNU_SOURCE");
4381
4382 // GCC defines this macro when it is using __gxx_personality_seh0.
4383 if (!Opts.SjLjExceptions)
4384 Builder.defineMacro("__SEH__");
4385 }
4386};
4387
Eli Friedman2857ccb2009-07-01 03:36:11 +00004388class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4389public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004390 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4391 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004392 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004393 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4394 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004395 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004396 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004397 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004398 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004399
4400 bool handleTargetFeatures(std::vector<std::string> &Features,
4401 DiagnosticsEngine &Diags) override {
4402 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4403 Diags))
4404 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004405 // We now know the features we have: we can decide how to align vectors.
4406 MaxVectorAlign =
4407 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004408 return true;
4409 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004410};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004411
Eli Friedman245f2292009-07-05 22:31:18 +00004412class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4413public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004414 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4415 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004416 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004417 Int64Type = SignedLongLong;
4418 }
4419};
Eli Friedman245f2292009-07-05 22:31:18 +00004420
Eli Friedman9fa28852012-08-08 23:57:20 +00004421class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4422public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004423 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4424 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004425 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004426 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004427 }
4428};
Tim Northover9bb857a2013-01-31 12:13:10 +00004429
Eli Friedmanf05b7722008-08-20 07:44:10 +00004430class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004431 // Possible FPU choices.
4432 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004433 VFP2FPU = (1 << 0),
4434 VFP3FPU = (1 << 1),
4435 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004436 NeonFPU = (1 << 3),
4437 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004438 };
4439
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004440 // Possible HWDiv features.
4441 enum HWDivMode {
4442 HWDivThumb = (1 << 0),
4443 HWDivARM = (1 << 1)
4444 };
4445
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004446 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004447 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004448 }
4449
4450 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4451 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004452
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004453 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004454
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004455 StringRef CPUProfile;
4456 StringRef CPUAttr;
4457
Rafael Espindolaeb265472013-08-21 21:59:03 +00004458 enum {
4459 FP_Default,
4460 FP_VFP,
4461 FP_Neon
4462 } FPMath;
4463
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004464 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004465 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004466 unsigned ArchProfile;
4467 unsigned ArchVersion;
4468
Bernard Ogdenda13af32013-10-24 18:32:51 +00004469 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004470
Logan Chien57086ce2012-10-10 06:56:20 +00004471 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004472 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004473
4474 // Initialized via features.
4475 unsigned SoftFloat : 1;
4476 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004477
Bernard Ogden18b57012013-10-29 09:47:51 +00004478 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004479 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004480 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004481 unsigned Unaligned : 1;
4482
4483 enum {
4484 LDREX_B = (1 << 0), /// byte (8-bit)
4485 LDREX_H = (1 << 1), /// half (16-bit)
4486 LDREX_W = (1 << 2), /// word (32-bit)
4487 LDREX_D = (1 << 3), /// double (64-bit)
4488 };
4489
4490 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004491
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004492 // ACLE 6.5.1 Hardware floating point
4493 enum {
4494 HW_FP_HP = (1 << 1), /// half (16-bit)
4495 HW_FP_SP = (1 << 2), /// single (32-bit)
4496 HW_FP_DP = (1 << 3), /// double (64-bit)
4497 };
4498 uint32_t HW_FP;
4499
Chris Lattner5cc15e02010-03-03 19:03:45 +00004500 static const Builtin::Info BuiltinInfo[];
4501
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004502 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004503 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004504
4505 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004506 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004507
Renato Golin9ba39232015-02-27 16:35:48 +00004508 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4509 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4510 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004511 SizeType = UnsignedLong;
4512 else
4513 SizeType = UnsignedInt;
4514
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004515 switch (T.getOS()) {
4516 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004517 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004518 break;
4519 case llvm::Triple::Win32:
4520 WCharType = UnsignedShort;
4521 break;
4522 case llvm::Triple::Linux:
4523 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004524 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4525 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004526 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004527 }
4528
4529 UseBitFieldTypeAlignment = true;
4530
4531 ZeroLengthBitfieldBoundary = 0;
4532
Tim Northover147cd2f2014-10-14 22:12:21 +00004533 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4534 // so set preferred for small types to 32.
4535 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004536 resetDataLayout(BigEndian
4537 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4538 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004539 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004540 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004541 resetDataLayout("e"
4542 "-m:w"
4543 "-p:32:32"
4544 "-i64:64"
4545 "-v128:64:128"
4546 "-a:0:32"
4547 "-n32"
4548 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004549 } else if (T.isOSNaCl()) {
4550 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004551 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004552 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004553 resetDataLayout(BigEndian
4554 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4555 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004556 }
4557
4558 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004559 }
4560
Tim Northover5627d392015-10-30 16:30:45 +00004561 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004562 const llvm::Triple &T = getTriple();
4563
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004564 IsAAPCS = false;
4565
Tim Northover5627d392015-10-30 16:30:45 +00004566 if (IsAAPCS16)
4567 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4568 else
4569 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004570
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004571 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004572 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004573 SizeType = UnsignedInt;
4574 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004575 SizeType = UnsignedLong;
4576
4577 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4578 WCharType = SignedInt;
4579
4580 // Do not respect the alignment of bit-field types when laying out
4581 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4582 UseBitFieldTypeAlignment = false;
4583
4584 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4585 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4586 /// gcc.
4587 ZeroLengthBitfieldBoundary = 32;
4588
Tim Northover5627d392015-10-30 16:30:45 +00004589 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4590 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004591 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004592 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004593 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004594 BigEndian
4595 ? "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 +00004596 : "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 +00004597 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004598 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004599 BigEndian
4600 ? "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 +00004601 : "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 +00004602
4603 // FIXME: Override "preferred align" for double and long long.
4604 }
4605
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004606 void setArchInfo() {
4607 StringRef ArchName = getTriple().getArchName();
4608
Renato Goline84b0002015-10-08 16:43:26 +00004609 ArchISA = llvm::ARM::parseArchISA(ArchName);
4610 CPU = llvm::ARM::getDefaultCPU(ArchName);
4611 unsigned AK = llvm::ARM::parseArch(ArchName);
4612 if (AK != llvm::ARM::AK_INVALID)
4613 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004614 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004615 }
4616
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004617 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004618 StringRef SubArch;
4619
4620 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004621 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004622 SubArch = llvm::ARM::getSubArch(ArchKind);
4623 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4624 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004625
4626 // cache CPU related strings
4627 CPUAttr = getCPUAttr();
4628 CPUProfile = getCPUProfile();
4629 }
4630
4631 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004632 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004633 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004634 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004635 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4636 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004637 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004638 if (ArchProfile == llvm::ARM::PK_M) {
4639 MaxAtomicPromoteWidth = 32;
4640 if (ShouldUseInlineAtomic)
4641 MaxAtomicInlineWidth = 32;
4642 }
4643 else {
4644 MaxAtomicPromoteWidth = 64;
4645 if (ShouldUseInlineAtomic)
4646 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004647 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004648 }
4649
4650 bool isThumb() const {
4651 return (ArchISA == llvm::ARM::IK_THUMB);
4652 }
4653
4654 bool supportsThumb() const {
4655 return CPUAttr.count('T') || ArchVersion >= 6;
4656 }
4657
4658 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004659 return CPUAttr.equals("6T2") ||
4660 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004661 }
4662
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004663 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004664 // For most sub-arches, the build attribute CPU name is enough.
4665 // For Cortex variants, it's slightly different.
4666 switch(ArchKind) {
4667 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004668 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004669 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004670 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004671 case llvm::ARM::AK_ARMV7S:
4672 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004673 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004674 return "7A";
4675 case llvm::ARM::AK_ARMV7R:
4676 return "7R";
4677 case llvm::ARM::AK_ARMV7M:
4678 return "7M";
4679 case llvm::ARM::AK_ARMV7EM:
4680 return "7EM";
4681 case llvm::ARM::AK_ARMV8A:
4682 return "8A";
4683 case llvm::ARM::AK_ARMV8_1A:
4684 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004685 case llvm::ARM::AK_ARMV8_2A:
4686 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004687 case llvm::ARM::AK_ARMV8MBaseline:
4688 return "8M_BASE";
4689 case llvm::ARM::AK_ARMV8MMainline:
4690 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004691 }
4692 }
4693
4694 StringRef getCPUProfile() const {
4695 switch(ArchProfile) {
4696 case llvm::ARM::PK_A:
4697 return "A";
4698 case llvm::ARM::PK_R:
4699 return "R";
4700 case llvm::ARM::PK_M:
4701 return "M";
4702 default:
4703 return "";
4704 }
4705 }
4706
Chris Lattner17df24e2008-04-21 18:56:49 +00004707public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004708 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4709 bool IsBigEndian)
4710 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4711 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004712 BigEndian = IsBigEndian;
4713
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004714 switch (getTriple().getOS()) {
4715 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004716 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004717 break;
4718 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004719 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004720 break;
4721 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004722
Renato Goline84b0002015-10-08 16:43:26 +00004723 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004724 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004725
Chris Lattner1a8f3942010-04-23 16:29:58 +00004726 // {} in inline assembly are neon specifiers, not assembly variant
4727 // specifiers.
4728 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004729
Eric Christopher0e261882014-12-05 01:06:59 +00004730 // FIXME: This duplicates code from the driver that sets the -target-abi
4731 // option - this code is used if -target-abi isn't passed and should
4732 // be unified in some way.
4733 if (Triple.isOSBinFormatMachO()) {
4734 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4735 // the frontend matches that.
4736 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4737 Triple.getOS() == llvm::Triple::UnknownOS ||
4738 StringRef(CPU).startswith("cortex-m")) {
4739 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004740 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004741 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004742 } else {
4743 setABI("apcs-gnu");
4744 }
4745 } else if (Triple.isOSWindows()) {
4746 // FIXME: this is invalid for WindowsCE
4747 setABI("aapcs");
4748 } else {
4749 // Select the default based on the platform.
4750 switch (Triple.getEnvironment()) {
4751 case llvm::Triple::Android:
4752 case llvm::Triple::GNUEABI:
4753 case llvm::Triple::GNUEABIHF:
4754 setABI("aapcs-linux");
4755 break;
4756 case llvm::Triple::EABIHF:
4757 case llvm::Triple::EABI:
4758 setABI("aapcs");
4759 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004760 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004761 setABI("apcs-gnu");
4762 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004763 default:
4764 if (Triple.getOS() == llvm::Triple::NetBSD)
4765 setABI("apcs-gnu");
4766 else
4767 setABI("aapcs");
4768 break;
4769 }
4770 }
John McCall86353412010-08-21 22:46:04 +00004771
4772 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004773 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004774
Renato Golin15b86152015-07-03 16:41:13 +00004775 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004776 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004777
James Molloya7139222012-03-12 09:14:10 +00004778 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004779 // the alignment of the zero-length bitfield is greater than the member
4780 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004781 // zero length bitfield.
4782 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004783
4784 if (Triple.getOS() == llvm::Triple::Linux ||
4785 Triple.getOS() == llvm::Triple::UnknownOS)
4786 this->MCountName =
4787 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004788 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004789
Alp Toker4925ba72014-06-07 23:30:42 +00004790 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004791
Craig Topper3164f332014-03-11 03:39:26 +00004792 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004793 ABI = Name;
4794
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004795 // The defaults (above) are for AAPCS, check if we need to change them.
4796 //
4797 // FIXME: We need support for -meabi... we could just mangle it into the
4798 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004799 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004800 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004801 return true;
4802 }
4803 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4804 setABIAAPCS();
4805 return true;
4806 }
4807 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004808 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004809
Renato Golinf5c4dec2015-05-27 13:33:00 +00004810 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004811 bool
4812 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4813 StringRef CPU,
4814 const std::vector<std::string> &FeaturesVec) const override {
4815
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004816 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004817 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004818
4819 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004820 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004821 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4822
4823 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004824 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004825 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4826
4827 for (const char *Feature : TargetFeatures)
4828 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004829 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004830
Eric Christopher007b0a02015-08-28 22:32:01 +00004831 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004832 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004833
Craig Topper3164f332014-03-11 03:39:26 +00004834 bool handleTargetFeatures(std::vector<std::string> &Features,
4835 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004836 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004837 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004838 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004839 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004840 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004841 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004842 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004843
Ranjeet Singhac08e532015-06-24 23:39:25 +00004844 // This does not diagnose illegal cases like having both
4845 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4846 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004847 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004848 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004849 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004850 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004851 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004852 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004853 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004854 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004855 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004856 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004857 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004858 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004859 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004860 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004861 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004862 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004863 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004864 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004865 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004866 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004867 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004868 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004869 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004870 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004871 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004872 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004873 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004874 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004875 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004876 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004877 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004878 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004879 } else if (Feature == "+strict-align") {
4880 Unaligned = 0;
4881 } else if (Feature == "+fp16") {
4882 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004883 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004884 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004885 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004886
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004887 switch (ArchVersion) {
4888 case 6:
4889 if (ArchProfile == llvm::ARM::PK_M)
4890 LDREX = 0;
4891 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4892 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4893 else
4894 LDREX = LDREX_W;
4895 break;
4896 case 7:
4897 if (ArchProfile == llvm::ARM::PK_M)
4898 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4899 else
4900 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4901 break;
4902 case 8:
4903 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4904 }
4905
Rafael Espindolaeb265472013-08-21 21:59:03 +00004906 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4907 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4908 return false;
4909 }
4910
4911 if (FPMath == FP_Neon)
4912 Features.push_back("+neonfp");
4913 else if (FPMath == FP_VFP)
4914 Features.push_back("-neonfp");
4915
Daniel Dunbar893d4752009-12-19 04:15:38 +00004916 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004917 auto Feature =
4918 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4919 if (Feature != Features.end())
4920 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004921
Rafael Espindolaeb265472013-08-21 21:59:03 +00004922 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004923 }
4924
Craig Topper3164f332014-03-11 03:39:26 +00004925 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004926 return llvm::StringSwitch<bool>(Feature)
4927 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004928 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004929 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004930 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004931 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004932 .Case("hwdiv", HWDiv & HWDivThumb)
4933 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004934 .Default(false);
4935 }
Renato Golin15b86152015-07-03 16:41:13 +00004936
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004937 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004938 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004939 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004940
Renato Golin15b86152015-07-03 16:41:13 +00004941 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004942 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004943 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004944 CPU = Name;
4945 return true;
4946 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004947
Craig Topper3164f332014-03-11 03:39:26 +00004948 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004949
Craig Topper3164f332014-03-11 03:39:26 +00004950 void getTargetDefines(const LangOptions &Opts,
4951 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004952 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004953 Builder.defineMacro("__arm");
4954 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00004955 // For bare-metal none-eabi.
4956 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
4957 getTriple().getEnvironment() == llvm::Triple::EABI)
4958 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004959
Chris Lattnerecd49032009-03-02 22:27:17 +00004960 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004961 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004962
4963 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4964 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004965 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004966 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4967
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004968 if (!CPUAttr.empty())
4969 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004970
4971 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004972 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004973 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004974
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004975 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004976 // ACLE 6.5.7 Crypto Extension
4977 if (Crypto)
4978 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4979 // ACLE 6.5.8 CRC32 Extension
4980 if (CRC)
4981 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4982 // ACLE 6.5.10 Numeric Maximum and Minimum
4983 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4984 // ACLE 6.5.9 Directed Rounding
4985 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004986 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004987
4988 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4989 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00004990 // NOTE that the default profile is assumed to be 'A'
4991 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004992 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4993
Bradley Smithf4affc12016-03-03 13:52:22 +00004994 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
4995 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
4996 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
4997 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004998 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004999 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005000 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005001 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5002
5003 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5004 // instruction set such as ARM or Thumb.
5005 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5006
5007 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5008
5009 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005010 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005011 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005012
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005013 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005014 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005015 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005016
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005017 // ACLE 6.4.4 LDREX/STREX
5018 if (LDREX)
5019 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5020
5021 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005022 if (ArchVersion == 5 ||
5023 (ArchVersion == 6 && CPUProfile != "M") ||
5024 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005025 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5026
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005027 // ACLE 6.5.1 Hardware Floating Point
5028 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005029 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005030
Yi Konga44c4d72014-06-27 21:25:42 +00005031 // ACLE predefines.
5032 Builder.defineMacro("__ARM_ACLE", "200");
5033
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005034 // FP16 support (we currently only support IEEE format).
5035 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5036 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5037
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005038 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005039 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005040 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5041
Mike Stump9d54bd72009-04-08 02:07:04 +00005042 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005043
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005044 // FIXME: It's more complicated than this and we don't really support
5045 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005046 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005047 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005048 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005049
David Tweed8f676532012-10-25 13:33:01 +00005050 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005051 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005052 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
5053 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005054 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005055 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005056 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005057
Tim Northover28fc0e12016-04-28 13:59:55 +00005058 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5059 ABI == "aapcs16")
5060 Builder.defineMacro("__ARM_PCS_VFP", "1");
5061
Daniel Dunbar893d4752009-12-19 04:15:38 +00005062 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005063 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005064
5065 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005066 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005067
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005068 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005069 Builder.defineMacro("__THUMBEL__");
5070 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005071 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005072 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005073 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005074
5075 // ACLE 6.4.9 32-bit SIMD instructions
5076 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5077 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5078
5079 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005080 if (((HWDiv & HWDivThumb) && isThumb()) ||
5081 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005082 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005083 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005084 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005085
5086 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005087 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005088
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005089 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005090 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005091 if (FPU & VFP2FPU)
5092 Builder.defineMacro("__ARM_VFPV2__");
5093 if (FPU & VFP3FPU)
5094 Builder.defineMacro("__ARM_VFPV3__");
5095 if (FPU & VFP4FPU)
5096 Builder.defineMacro("__ARM_VFPV4__");
5097 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005098
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005099 // This only gets set when Neon instructions are actually available, unlike
5100 // the VFP define, hence the soft float and arch check. This is subtly
5101 // different from gcc, we follow the intent which was that it should be set
5102 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005103 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005104 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005105 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005106 // current AArch32 NEON implementations do not support double-precision
5107 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005108 Builder.defineMacro("__ARM_NEON_FP",
5109 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005110 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005111
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005112 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5113 Opts.ShortWChar ? "2" : "4");
5114
5115 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5116 Opts.ShortEnums ? "1" : "4");
5117
Bradley Smithf4affc12016-03-03 13:52:22 +00005118 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005119 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5120 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5121 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5122 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5123 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005124
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005125 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005126 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005127 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005128 }
5129
5130 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005131 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005132 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5133 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005134 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005135 }
5136
5137 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005138 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005139 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005140
5141 if (Opts.UnsafeFPMath)
5142 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005143
5144 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5145 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005146 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005147
Craig Topper6c03a542015-10-19 04:51:35 +00005148 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5149 return llvm::makeArrayRef(BuiltinInfo,
5150 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005151 }
Craig Topper3164f332014-03-11 03:39:26 +00005152 bool isCLZForZeroUndef() const override { return false; }
5153 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005154 return IsAAPCS
5155 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005156 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5157 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005158 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005159 ArrayRef<const char *> getGCCRegNames() const override;
5160 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005161 bool validateAsmConstraint(const char *&Name,
5162 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005163 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005164 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005165 case 'l': // r0-r7
5166 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005167 case 't': // VFP Floating point register single precision
5168 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005169 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005170 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005171 case 'I':
5172 case 'J':
5173 case 'K':
5174 case 'L':
5175 case 'M':
5176 // FIXME
5177 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005178 case 'Q': // A memory address that is a single base register.
5179 Info.setAllowsMemory();
5180 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005181 case 'U': // a memory reference...
5182 switch (Name[1]) {
5183 case 'q': // ...ARMV4 ldrsb
5184 case 'v': // ...VFP load/store (reg+constant offset)
5185 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005186 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005187 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005188 case 'n': // valid address for Neon doubleword vector load/store
5189 case 'm': // valid address for Neon element and structure load/store
5190 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005191 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005192 Info.setAllowsMemory();
5193 Name++;
5194 return true;
5195 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005196 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005197 return false;
5198 }
Craig Topper3164f332014-03-11 03:39:26 +00005199 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005200 std::string R;
5201 switch (*Constraint) {
5202 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005203 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005204 Constraint++;
5205 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005206 case 'p': // 'p' should be translated to 'r' by default.
5207 R = std::string("r");
5208 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005209 default:
5210 return std::string(1, *Constraint);
5211 }
5212 return R;
5213 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005214 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005215 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005216 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005217 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005218 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005219
Bill Wendling9d1ee112012-10-25 23:28:48 +00005220 // Strip off constraint modifiers.
5221 while (Constraint[0] == '=' ||
5222 Constraint[0] == '+' ||
5223 Constraint[0] == '&')
5224 Constraint = Constraint.substr(1);
5225
5226 switch (Constraint[0]) {
5227 default: break;
5228 case 'r': {
5229 switch (Modifier) {
5230 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005231 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005232 case 'q':
5233 // A register of size 32 cannot fit a vector type.
5234 return false;
5235 }
5236 }
5237 }
5238
5239 return true;
5240 }
Craig Topper3164f332014-03-11 03:39:26 +00005241 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005242 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005243 return "";
5244 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005245
Craig Topper3164f332014-03-11 03:39:26 +00005246 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005247 switch (CC) {
5248 case CC_AAPCS:
5249 case CC_AAPCS_VFP:
5250 case CC_Swift:
5251 return CCCR_OK;
5252 default:
5253 return CCCR_Warning;
5254 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005255 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005256
Craig Topper3164f332014-03-11 03:39:26 +00005257 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005258 if (RegNo == 0) return 0;
5259 if (RegNo == 1) return 1;
5260 return -1;
5261 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005262
5263 bool hasSjLjLowering() const override {
5264 return true;
5265 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005266};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005267
Rafael Espindolaeb265472013-08-21 21:59:03 +00005268bool ARMTargetInfo::setFPMath(StringRef Name) {
5269 if (Name == "neon") {
5270 FPMath = FP_Neon;
5271 return true;
5272 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5273 Name == "vfp4") {
5274 FPMath = FP_VFP;
5275 return true;
5276 }
5277 return false;
5278}
5279
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005280const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005281 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005282 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005283 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5284
5285 // Float registers
5286 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5287 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5288 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005289 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005290
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005291 // Double registers
5292 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5293 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005294 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5295 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005296
5297 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005298 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5299 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005300};
5301
Craig Topperf054e3a2015-10-19 03:52:27 +00005302ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5303 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005304}
5305
5306const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005307 { { "a1" }, "r0" },
5308 { { "a2" }, "r1" },
5309 { { "a3" }, "r2" },
5310 { { "a4" }, "r3" },
5311 { { "v1" }, "r4" },
5312 { { "v2" }, "r5" },
5313 { { "v3" }, "r6" },
5314 { { "v4" }, "r7" },
5315 { { "v5" }, "r8" },
5316 { { "v6", "rfp" }, "r9" },
5317 { { "sl" }, "r10" },
5318 { { "fp" }, "r11" },
5319 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005320 { { "r13" }, "sp" },
5321 { { "r14" }, "lr" },
5322 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005323 // The S, D and Q registers overlap, but aren't really aliases; we
5324 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005325};
5326
Craig Topperf054e3a2015-10-19 03:52:27 +00005327ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5328 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005329}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005330
5331const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005332#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005333 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005334#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5335 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005336#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005337
Craig Topper07d3b622015-08-07 05:14:44 +00005338#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005339 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005340#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005341 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005342#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5343 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005344#include "clang/Basic/BuiltinsARM.def"
5345};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005346
5347class ARMleTargetInfo : public ARMTargetInfo {
5348public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005349 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5350 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005351 void getTargetDefines(const LangOptions &Opts,
5352 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005353 Builder.defineMacro("__ARMEL__");
5354 ARMTargetInfo::getTargetDefines(Opts, Builder);
5355 }
5356};
5357
5358class ARMbeTargetInfo : public ARMTargetInfo {
5359public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005360 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5361 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005362 void getTargetDefines(const LangOptions &Opts,
5363 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005364 Builder.defineMacro("__ARMEB__");
5365 Builder.defineMacro("__ARM_BIG_ENDIAN");
5366 ARMTargetInfo::getTargetDefines(Opts, Builder);
5367 }
5368};
Chris Lattner17df24e2008-04-21 18:56:49 +00005369
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005370class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5371 const llvm::Triple Triple;
5372public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005373 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5374 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005375 WCharType = UnsignedShort;
5376 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005377 }
5378 void getVisualStudioDefines(const LangOptions &Opts,
5379 MacroBuilder &Builder) const {
5380 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5381
5382 // FIXME: this is invalid for WindowsCE
5383 Builder.defineMacro("_M_ARM_NT", "1");
5384 Builder.defineMacro("_M_ARMT", "_M_ARM");
5385 Builder.defineMacro("_M_THUMB", "_M_ARM");
5386
5387 assert((Triple.getArch() == llvm::Triple::arm ||
5388 Triple.getArch() == llvm::Triple::thumb) &&
5389 "invalid architecture for Windows ARM target info");
5390 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5391 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5392
5393 // TODO map the complete set of values
5394 // 31: VFPv3 40: VFPv4
5395 Builder.defineMacro("_M_ARM_FP", "31");
5396 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005397 BuiltinVaListKind getBuiltinVaListKind() const override {
5398 return TargetInfo::CharPtrBuiltinVaList;
5399 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005400 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5401 switch (CC) {
5402 case CC_X86StdCall:
5403 case CC_X86ThisCall:
5404 case CC_X86FastCall:
5405 case CC_X86VectorCall:
5406 return CCCR_Ignore;
5407 case CC_C:
5408 return CCCR_OK;
5409 default:
5410 return CCCR_Warning;
5411 }
5412 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005413};
5414
5415// Windows ARM + Itanium C++ ABI Target
5416class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5417public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005418 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5419 const TargetOptions &Opts)
5420 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005421 TheCXXABI.set(TargetCXXABI::GenericARM);
5422 }
5423
5424 void getTargetDefines(const LangOptions &Opts,
5425 MacroBuilder &Builder) const override {
5426 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5427
5428 if (Opts.MSVCCompat)
5429 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5430 }
5431};
5432
5433// Windows ARM, MS (C++) ABI
5434class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5435public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005436 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5437 const TargetOptions &Opts)
5438 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005439 TheCXXABI.set(TargetCXXABI::Microsoft);
5440 }
5441
5442 void getTargetDefines(const LangOptions &Opts,
5443 MacroBuilder &Builder) const override {
5444 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5445 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5446 }
5447};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005448
Yaron Keren321249c2015-07-15 13:32:23 +00005449// ARM MinGW target
5450class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5451public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005452 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5453 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005454 TheCXXABI.set(TargetCXXABI::GenericARM);
5455 }
5456
5457 void getTargetDefines(const LangOptions &Opts,
5458 MacroBuilder &Builder) const override {
5459 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5460 DefineStd(Builder, "WIN32", Opts);
5461 DefineStd(Builder, "WINNT", Opts);
5462 Builder.defineMacro("_ARM_");
5463 addMinGWDefines(Opts, Builder);
5464 }
5465};
5466
5467// ARM Cygwin target
5468class CygwinARMTargetInfo : public ARMleTargetInfo {
5469public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005470 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5471 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005472 TLSSupported = false;
5473 WCharType = UnsignedShort;
5474 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005475 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005476 }
5477 void getTargetDefines(const LangOptions &Opts,
5478 MacroBuilder &Builder) const override {
5479 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5480 Builder.defineMacro("_ARM_");
5481 Builder.defineMacro("__CYGWIN__");
5482 Builder.defineMacro("__CYGWIN32__");
5483 DefineStd(Builder, "unix", Opts);
5484 if (Opts.CPlusPlus)
5485 Builder.defineMacro("_GNU_SOURCE");
5486 }
5487};
5488
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005489class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005490protected:
Craig Topper3164f332014-03-11 03:39:26 +00005491 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5492 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005493 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005494 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005495
Torok Edwinb2b37c62009-06-30 17:10:35 +00005496public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005497 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5498 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005499 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005500 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005501 // FIXME: This should be based off of the target features in
5502 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005503 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005504
Tim Northoverd88ecb32016-01-27 19:32:40 +00005505 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005506 // Darwin on iOS uses a variant of the ARM C++ ABI.
5507 TheCXXABI.set(TargetCXXABI::WatchOS);
5508
5509 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5510 // size_t is long, it's a bit weird for it to be int.
5511 PtrDiffType = SignedLong;
5512
5513 // BOOL should be a real boolean on the new ABI
5514 UseSignedCharForObjCBool = false;
5515 } else
5516 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005517 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005518};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005519
Tim Northover573cbee2014-05-24 12:52:07 +00005520class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005521 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005522 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5523 static const char *const GCCRegNames[];
5524
James Molloy75f5f9e2014-04-16 15:33:48 +00005525 enum FPUModeEnum {
5526 FPUMode,
5527 NeonMode
5528 };
5529
5530 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005531 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005532 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005533 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005534 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005535
Tim Northovera2ee4332014-03-29 15:09:45 +00005536 static const Builtin::Info BuiltinInfo[];
5537
5538 std::string ABI;
5539
5540public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005541 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005542 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005543 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5544 WCharType = SignedInt;
5545
5546 // NetBSD apparently prefers consistency across ARM targets to consistency
5547 // across 64-bit targets.
5548 Int64Type = SignedLongLong;
5549 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005550 } else {
5551 WCharType = UnsignedInt;
5552 Int64Type = SignedLong;
5553 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005554 }
5555
Tim Northovera2ee4332014-03-29 15:09:45 +00005556 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005557 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005558 MaxAtomicInlineWidth = 128;
5559 MaxAtomicPromoteWidth = 128;
5560
Tim Northovera6a19f12015-02-06 01:25:07 +00005561 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005562 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5563
Tim Northovera2ee4332014-03-29 15:09:45 +00005564 // {} in inline assembly are neon specifiers, not assembly variant
5565 // specifiers.
5566 NoAsmVariants = true;
5567
Tim Northover7ad87af2015-01-16 18:44:04 +00005568 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5569 // contributes to the alignment of the containing aggregate in the same way
5570 // a plain (non bit-field) member of that type would, without exception for
5571 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005572 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005573 UseZeroLengthBitfieldAlignment = true;
5574
Tim Northover573cbee2014-05-24 12:52:07 +00005575 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005576 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005577
5578 if (Triple.getOS() == llvm::Triple::Linux ||
5579 Triple.getOS() == llvm::Triple::UnknownOS)
5580 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005581 }
5582
Alp Toker4925ba72014-06-07 23:30:42 +00005583 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005584 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005585 if (Name != "aapcs" && Name != "darwinpcs")
5586 return false;
5587
5588 ABI = Name;
5589 return true;
5590 }
5591
David Blaikie1cbb9712014-11-14 19:09:44 +00005592 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005593 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005594 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005595 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5596 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005597 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005598 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005599 .Default(false);
5600 return CPUKnown;
5601 }
5602
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005603 void getTargetDefines(const LangOptions &Opts,
5604 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005605 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005606 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005607
5608 // Target properties.
5609 Builder.defineMacro("_LP64");
5610 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005611
5612 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5613 Builder.defineMacro("__ARM_ACLE", "200");
5614 Builder.defineMacro("__ARM_ARCH", "8");
5615 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5616
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005617 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005618 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005619 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005620
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005621 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5622 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5623 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5624 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005625 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005626 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5627 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005628
5629 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5630
5631 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005632 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005633
5634 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5635 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005636 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5637 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005638
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005639 if (Opts.UnsafeFPMath)
5640 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005641
5642 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5643
5644 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5645 Opts.ShortEnums ? "1" : "4");
5646
James Molloy75f5f9e2014-04-16 15:33:48 +00005647 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005648 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005649 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005650 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005651 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005652
Bradley Smith418c5932014-05-02 15:17:51 +00005653 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005654 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005655
James Molloy75f5f9e2014-04-16 15:33:48 +00005656 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005657 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5658
5659 if (Unaligned)
5660 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005661
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005662 if (V8_1A)
5663 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5664
Reid Klecknerd167d422015-05-06 15:31:46 +00005665 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5666 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5667 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5668 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5669 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005670 }
5671
Craig Topper6c03a542015-10-19 04:51:35 +00005672 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5673 return llvm::makeArrayRef(BuiltinInfo,
5674 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005675 }
5676
David Blaikie1cbb9712014-11-14 19:09:44 +00005677 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005678 return Feature == "aarch64" ||
5679 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005680 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005681 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005682 }
5683
James Molloy5e73df52014-04-16 15:06:20 +00005684 bool handleTargetFeatures(std::vector<std::string> &Features,
5685 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005686 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005687 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005688 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005689 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005690 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005691
Eric Christopher610fe112015-08-26 08:21:55 +00005692 for (const auto &Feature : Features) {
5693 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005694 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005695 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005696 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005697 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005698 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005699 if (Feature == "+strict-align")
5700 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005701 if (Feature == "+v8.1a")
5702 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005703 }
5704
James Y Knightb214cbc2016-03-04 19:00:41 +00005705 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005706
5707 return true;
5708 }
5709
John McCall477f2bb2016-03-03 06:39:32 +00005710 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5711 switch (CC) {
5712 case CC_C:
5713 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005714 case CC_PreserveMost:
5715 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005716 return CCCR_OK;
5717 default:
5718 return CCCR_Warning;
5719 }
5720 }
5721
David Blaikie1cbb9712014-11-14 19:09:44 +00005722 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005723
David Blaikie1cbb9712014-11-14 19:09:44 +00005724 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005725 return TargetInfo::AArch64ABIBuiltinVaList;
5726 }
5727
Craig Topperf054e3a2015-10-19 03:52:27 +00005728 ArrayRef<const char *> getGCCRegNames() const override;
5729 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005730
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005731 bool validateAsmConstraint(const char *&Name,
5732 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005733 switch (*Name) {
5734 default:
5735 return false;
5736 case 'w': // Floating point and SIMD registers (V0-V31)
5737 Info.setAllowsRegister();
5738 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005739 case 'I': // Constant that can be used with an ADD instruction
5740 case 'J': // Constant that can be used with a SUB instruction
5741 case 'K': // Constant that can be used with a 32-bit logical instruction
5742 case 'L': // Constant that can be used with a 64-bit logical instruction
5743 case 'M': // Constant that can be used as a 32-bit MOV immediate
5744 case 'N': // Constant that can be used as a 64-bit MOV immediate
5745 case 'Y': // Floating point constant zero
5746 case 'Z': // Integer constant zero
5747 return true;
5748 case 'Q': // A memory reference with base register and no offset
5749 Info.setAllowsMemory();
5750 return true;
5751 case 'S': // A symbolic address
5752 Info.setAllowsRegister();
5753 return true;
5754 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005755 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5756 // Utf: A memory address suitable for ldp/stp in TF mode.
5757 // Usa: An absolute symbolic address.
5758 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5759 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005760 case 'z': // Zero register, wzr or xzr
5761 Info.setAllowsRegister();
5762 return true;
5763 case 'x': // Floating point and SIMD registers (V0-V15)
5764 Info.setAllowsRegister();
5765 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005766 }
5767 return false;
5768 }
5769
Akira Hatanaka987f1862014-08-22 06:05:21 +00005770 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005771 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005772 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005773 // Strip off constraint modifiers.
5774 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5775 Constraint = Constraint.substr(1);
5776
5777 switch (Constraint[0]) {
5778 default:
5779 return true;
5780 case 'z':
5781 case 'r': {
5782 switch (Modifier) {
5783 case 'x':
5784 case 'w':
5785 // For now assume that the person knows what they're
5786 // doing with the modifier.
5787 return true;
5788 default:
5789 // By default an 'r' constraint will be in the 'x'
5790 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005791 if (Size == 64)
5792 return true;
5793
5794 SuggestedModifier = "w";
5795 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005796 }
5797 }
5798 }
5799 }
5800
David Blaikie1cbb9712014-11-14 19:09:44 +00005801 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005802
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005803 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005804 if (RegNo == 0)
5805 return 0;
5806 if (RegNo == 1)
5807 return 1;
5808 return -1;
5809 }
5810};
5811
Tim Northover573cbee2014-05-24 12:52:07 +00005812const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005813 // 32-bit Integer registers
5814 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5815 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5816 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5817
5818 // 64-bit Integer registers
5819 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5820 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5821 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5822
5823 // 32-bit floating point regsisters
5824 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5825 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5826 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5827
5828 // 64-bit floating point regsisters
5829 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5830 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5831 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5832
5833 // Vector registers
5834 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5835 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5836 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5837};
5838
Craig Topperf054e3a2015-10-19 03:52:27 +00005839ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5840 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005841}
5842
Tim Northover573cbee2014-05-24 12:52:07 +00005843const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005844 { { "w31" }, "wsp" },
5845 { { "x29" }, "fp" },
5846 { { "x30" }, "lr" },
5847 { { "x31" }, "sp" },
5848 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5849 // don't want to substitute one of these for a different-sized one.
5850};
5851
Craig Topperf054e3a2015-10-19 03:52:27 +00005852ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5853 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005854}
5855
Tim Northover573cbee2014-05-24 12:52:07 +00005856const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005857#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005858 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005859#include "clang/Basic/BuiltinsNEON.def"
5860
5861#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005862 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005863#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005864};
James Molloy5e73df52014-04-16 15:06:20 +00005865
Tim Northover573cbee2014-05-24 12:52:07 +00005866class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005867 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005868 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005869 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005870 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005871 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005872 }
5873
5874public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005875 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5876 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00005877 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005878 }
James Molloy5e73df52014-04-16 15:06:20 +00005879 void getTargetDefines(const LangOptions &Opts,
5880 MacroBuilder &Builder) const override {
5881 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005882 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005883 }
5884};
5885
Tim Northover573cbee2014-05-24 12:52:07 +00005886class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005887 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005888 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005889 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005890 }
5891
5892public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005893 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5894 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00005895 void getTargetDefines(const LangOptions &Opts,
5896 MacroBuilder &Builder) const override {
5897 Builder.defineMacro("__AARCH64EB__");
5898 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5899 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005900 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005901 }
5902};
Tim Northovera2ee4332014-03-29 15:09:45 +00005903
Tim Northover573cbee2014-05-24 12:52:07 +00005904class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005905protected:
5906 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5907 MacroBuilder &Builder) const override {
5908 Builder.defineMacro("__AARCH64_SIMD__");
5909 Builder.defineMacro("__ARM64_ARCH_8__");
5910 Builder.defineMacro("__ARM_NEON__");
5911 Builder.defineMacro("__LITTLE_ENDIAN__");
5912 Builder.defineMacro("__REGISTER_PREFIX__", "");
5913 Builder.defineMacro("__arm64", "1");
5914 Builder.defineMacro("__arm64__", "1");
5915
5916 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5917 }
5918
Tim Northovera2ee4332014-03-29 15:09:45 +00005919public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005920 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5921 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005922 Int64Type = SignedLongLong;
5923 WCharType = SignedInt;
5924 UseSignedCharForObjCBool = false;
5925
Tim Northovera6a19f12015-02-06 01:25:07 +00005926 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005927 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5928
5929 TheCXXABI.set(TargetCXXABI::iOS64);
5930 }
5931
David Blaikie1cbb9712014-11-14 19:09:44 +00005932 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005933 return TargetInfo::CharPtrBuiltinVaList;
5934 }
5935};
Tim Northovera2ee4332014-03-29 15:09:45 +00005936
Tony Linthicum76329bf2011-12-12 21:14:55 +00005937// Hexagon abstract base class
5938class HexagonTargetInfo : public TargetInfo {
5939 static const Builtin::Info BuiltinInfo[];
5940 static const char * const GCCRegNames[];
5941 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5942 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005943 bool HasHVX, HasHVXDouble;
5944
Tony Linthicum76329bf2011-12-12 21:14:55 +00005945public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005946 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
5947 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005948 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005949 // Specify the vector alignment explicitly. For v512x1, the calculated
5950 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5951 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005952 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005953 "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 +00005954 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005955 SizeType = UnsignedInt;
5956 PtrDiffType = SignedInt;
5957 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005958
5959 // {} in inline assembly are packet specifiers, not assembly variant
5960 // specifiers.
5961 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005962
5963 LargeArrayMinWidth = 64;
5964 LargeArrayAlign = 64;
5965 UseBitFieldTypeAlignment = true;
5966 ZeroLengthBitfieldBoundary = 32;
5967 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005968 }
5969
Craig Topper6c03a542015-10-19 04:51:35 +00005970 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5971 return llvm::makeArrayRef(BuiltinInfo,
5972 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005973 }
5974
Craig Topper3164f332014-03-11 03:39:26 +00005975 bool validateAsmConstraint(const char *&Name,
5976 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005977 return true;
5978 }
5979
Craig Topper3164f332014-03-11 03:39:26 +00005980 void getTargetDefines(const LangOptions &Opts,
5981 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005982
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005983 bool isCLZForZeroUndef() const override { return false; }
5984
Craig Topper3164f332014-03-11 03:39:26 +00005985 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005986 return llvm::StringSwitch<bool>(Feature)
5987 .Case("hexagon", true)
5988 .Case("hvx", HasHVX)
5989 .Case("hvx-double", HasHVXDouble)
5990 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005991 }
Craig Topper3164f332014-03-11 03:39:26 +00005992
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005993 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5994 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5995 const override;
5996
5997 bool handleTargetFeatures(std::vector<std::string> &Features,
5998 DiagnosticsEngine &Diags) override;
5999
Craig Topper3164f332014-03-11 03:39:26 +00006000 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006001 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006002 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006003 ArrayRef<const char *> getGCCRegNames() const override;
6004 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006005 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006006 return "";
6007 }
Sebastian Pop86500282012-01-13 20:37:10 +00006008
6009 static const char *getHexagonCPUSuffix(StringRef Name) {
6010 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006011 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006012 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006013 .Case("hexagonv55", "55")
6014 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006015 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006016 }
6017
Craig Topper3164f332014-03-11 03:39:26 +00006018 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006019 if (!getHexagonCPUSuffix(Name))
6020 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006021 CPU = Name;
6022 return true;
6023 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006024
6025 int getEHDataRegisterNumber(unsigned RegNo) const override {
6026 return RegNo < 2 ? RegNo : -1;
6027 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006028};
6029
6030void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006031 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006032 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006033 Builder.defineMacro("__hexagon__", "1");
6034
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006035 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006036 Builder.defineMacro("__HEXAGON_V4__");
6037 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006038 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006039 Builder.defineMacro("__QDSP6_V4__");
6040 Builder.defineMacro("__QDSP6_ARCH__", "4");
6041 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006042 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006043 Builder.defineMacro("__HEXAGON_V5__");
6044 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6045 if(Opts.HexagonQdsp6Compat) {
6046 Builder.defineMacro("__QDSP6_V5__");
6047 Builder.defineMacro("__QDSP6_ARCH__", "5");
6048 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006049 } else if (CPU == "hexagonv55") {
6050 Builder.defineMacro("__HEXAGON_V55__");
6051 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6052 Builder.defineMacro("__QDSP6_V55__");
6053 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006054 } else if (CPU == "hexagonv60") {
6055 Builder.defineMacro("__HEXAGON_V60__");
6056 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6057 Builder.defineMacro("__QDSP6_V60__");
6058 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006059 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006060
6061 if (hasFeature("hvx")) {
6062 Builder.defineMacro("__HVX__");
6063 if (hasFeature("hvx-double"))
6064 Builder.defineMacro("__HVXDBL__");
6065 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006066}
6067
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006068bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6069 DiagnosticsEngine &Diags) {
6070 for (auto &F : Features) {
6071 if (F == "+hvx")
6072 HasHVX = true;
6073 else if (F == "-hvx")
6074 HasHVX = HasHVXDouble = false;
6075 else if (F == "+hvx-double")
6076 HasHVX = HasHVXDouble = true;
6077 else if (F == "-hvx-double")
6078 HasHVXDouble = false;
6079 }
6080 return true;
6081}
6082
6083bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6084 DiagnosticsEngine &Diags, StringRef CPU,
6085 const std::vector<std::string> &FeaturesVec) const {
6086 // Default for v60: -hvx, -hvx-double.
6087 Features["hvx"] = false;
6088 Features["hvx-double"] = false;
6089
6090 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6091}
6092
6093
6094const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006095 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6096 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6097 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6098 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6099 "p0", "p1", "p2", "p3",
6100 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6101};
6102
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006103ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006104 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006105}
6106
Tony Linthicum76329bf2011-12-12 21:14:55 +00006107const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6108 { { "sp" }, "r29" },
6109 { { "fp" }, "r30" },
6110 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006111};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006112
Craig Topperf054e3a2015-10-19 03:52:27 +00006113ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6114 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006115}
6116
6117
6118const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006119#define BUILTIN(ID, TYPE, ATTRS) \
6120 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6121#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6122 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006123#include "clang/Basic/BuiltinsHexagon.def"
6124};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006125
Jacques Pienaard964cc22016-03-28 21:02:54 +00006126class LanaiTargetInfo : public TargetInfo {
6127 // Class for Lanai (32-bit).
6128 // The CPU profiles supported by the Lanai backend
6129 enum CPUKind {
6130 CK_NONE,
6131 CK_V11,
6132 } CPU;
6133
6134 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6135 static const char *const GCCRegNames[];
6136
6137public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006138 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6139 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006140 // Description string has to be kept in sync with backend.
6141 resetDataLayout("E" // Big endian
6142 "-m:e" // ELF name manging
6143 "-p:32:32" // 32 bit pointers, 32 bit aligned
6144 "-i64:64" // 64 bit integers, 64 bit aligned
6145 "-a:0:32" // 32 bit alignment of objects of aggregate type
6146 "-n32" // 32 bit native integer width
6147 "-S64" // 64 bit natural stack alignment
6148 );
6149
6150 // Setting RegParmMax equal to what mregparm was set to in the old
6151 // toolchain
6152 RegParmMax = 4;
6153
6154 // Set the default CPU to V11
6155 CPU = CK_V11;
6156
6157 // Temporary approach to make everything at least word-aligned and allow for
6158 // safely casting between pointers with different alignment requirements.
6159 // TODO: Remove this when there are no more cast align warnings on the
6160 // firmware.
6161 MinGlobalAlign = 32;
6162 }
6163
6164 void getTargetDefines(const LangOptions &Opts,
6165 MacroBuilder &Builder) const override {
6166 // Define __lanai__ when building for target lanai.
6167 Builder.defineMacro("__lanai__");
6168
6169 // Set define for the CPU specified.
6170 switch (CPU) {
6171 case CK_V11:
6172 Builder.defineMacro("__LANAI_V11__");
6173 break;
6174 case CK_NONE:
6175 llvm_unreachable("Unhandled target CPU");
6176 }
6177 }
6178
6179 bool setCPU(const std::string &Name) override {
6180 CPU = llvm::StringSwitch<CPUKind>(Name)
6181 .Case("v11", CK_V11)
6182 .Default(CK_NONE);
6183
6184 return CPU != CK_NONE;
6185 }
6186
6187 bool hasFeature(StringRef Feature) const override {
6188 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6189 }
6190
6191 ArrayRef<const char *> getGCCRegNames() const override;
6192
6193 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6194
6195 BuiltinVaListKind getBuiltinVaListKind() const override {
6196 return TargetInfo::VoidPtrBuiltinVaList;
6197 }
6198
6199 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6200
6201 bool validateAsmConstraint(const char *&Name,
6202 TargetInfo::ConstraintInfo &info) const override {
6203 return false;
6204 }
6205
6206 const char *getClobbers() const override { return ""; }
6207};
6208
6209const char *const LanaiTargetInfo::GCCRegNames[] = {
6210 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6211 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6212 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6213
6214ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6215 return llvm::makeArrayRef(GCCRegNames);
6216}
6217
6218const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6219 {{"pc"}, "r2"},
6220 {{"sp"}, "r4"},
6221 {{"fp"}, "r5"},
6222 {{"rv"}, "r8"},
6223 {{"rr1"}, "r10"},
6224 {{"rr2"}, "r11"},
6225 {{"rca"}, "r15"},
6226};
6227
6228ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6229 return llvm::makeArrayRef(GCCRegAliases);
6230}
6231
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006232// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6233class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006234 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6235 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006236 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006237public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006238 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006239 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006240
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006241 int getEHDataRegisterNumber(unsigned RegNo) const override {
6242 if (RegNo == 0) return 24;
6243 if (RegNo == 1) return 25;
6244 return -1;
6245 }
6246
Craig Topper3164f332014-03-11 03:39:26 +00006247 bool handleTargetFeatures(std::vector<std::string> &Features,
6248 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006249 // The backend doesn't actually handle soft float yet, but in case someone
6250 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006251 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6252 if (Feature != Features.end()) {
6253 SoftFloat = true;
6254 Features.erase(Feature);
6255 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006256 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006257 }
Craig Topper3164f332014-03-11 03:39:26 +00006258 void getTargetDefines(const LangOptions &Opts,
6259 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006260 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006261 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006262
6263 if (SoftFloat)
6264 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006265 }
Craig Topper3164f332014-03-11 03:39:26 +00006266
6267 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006268 return llvm::StringSwitch<bool>(Feature)
6269 .Case("softfloat", SoftFloat)
6270 .Case("sparc", true)
6271 .Default(false);
6272 }
Craig Topper3164f332014-03-11 03:39:26 +00006273
Craig Topper6c03a542015-10-19 04:51:35 +00006274 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006275 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006276 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006277 }
Craig Topper3164f332014-03-11 03:39:26 +00006278 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006279 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006280 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006281 ArrayRef<const char *> getGCCRegNames() const override;
6282 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006283 bool validateAsmConstraint(const char *&Name,
6284 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006285 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006286 switch (*Name) {
6287 case 'I': // Signed 13-bit constant
6288 case 'J': // Zero
6289 case 'K': // 32-bit constant with the low 12 bits clear
6290 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6291 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6292 case 'N': // Same as 'K' but zext (required for SIMode)
6293 case 'O': // The constant 4096
6294 return true;
6295 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006296 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006297 }
Craig Topper3164f332014-03-11 03:39:26 +00006298 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006299 // FIXME: Implement!
6300 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006301 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006302
6303 // No Sparc V7 for now, the backend doesn't support it anyway.
6304 enum CPUKind {
6305 CK_GENERIC,
6306 CK_V8,
6307 CK_SUPERSPARC,
6308 CK_SPARCLITE,
6309 CK_F934,
6310 CK_HYPERSPARC,
6311 CK_SPARCLITE86X,
6312 CK_SPARCLET,
6313 CK_TSC701,
6314 CK_V9,
6315 CK_ULTRASPARC,
6316 CK_ULTRASPARC3,
6317 CK_NIAGARA,
6318 CK_NIAGARA2,
6319 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006320 CK_NIAGARA4,
6321 CK_MYRIAD2_1,
6322 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006323 } CPU = CK_GENERIC;
6324
6325 enum CPUGeneration {
6326 CG_V8,
6327 CG_V9,
6328 };
6329
6330 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6331 switch (Kind) {
6332 case CK_GENERIC:
6333 case CK_V8:
6334 case CK_SUPERSPARC:
6335 case CK_SPARCLITE:
6336 case CK_F934:
6337 case CK_HYPERSPARC:
6338 case CK_SPARCLITE86X:
6339 case CK_SPARCLET:
6340 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006341 case CK_MYRIAD2_1:
6342 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006343 return CG_V8;
6344 case CK_V9:
6345 case CK_ULTRASPARC:
6346 case CK_ULTRASPARC3:
6347 case CK_NIAGARA:
6348 case CK_NIAGARA2:
6349 case CK_NIAGARA3:
6350 case CK_NIAGARA4:
6351 return CG_V9;
6352 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006353 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006354 }
6355
6356 CPUKind getCPUKind(StringRef Name) const {
6357 return llvm::StringSwitch<CPUKind>(Name)
6358 .Case("v8", CK_V8)
6359 .Case("supersparc", CK_SUPERSPARC)
6360 .Case("sparclite", CK_SPARCLITE)
6361 .Case("f934", CK_F934)
6362 .Case("hypersparc", CK_HYPERSPARC)
6363 .Case("sparclite86x", CK_SPARCLITE86X)
6364 .Case("sparclet", CK_SPARCLET)
6365 .Case("tsc701", CK_TSC701)
6366 .Case("v9", CK_V9)
6367 .Case("ultrasparc", CK_ULTRASPARC)
6368 .Case("ultrasparc3", CK_ULTRASPARC3)
6369 .Case("niagara", CK_NIAGARA)
6370 .Case("niagara2", CK_NIAGARA2)
6371 .Case("niagara3", CK_NIAGARA3)
6372 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006373 .Case("myriad2", CK_MYRIAD2_1)
6374 .Case("myriad2.1", CK_MYRIAD2_1)
6375 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006376 .Default(CK_GENERIC);
6377 }
6378
6379 bool setCPU(const std::string &Name) override {
6380 CPU = getCPUKind(Name);
6381 return CPU != CK_GENERIC;
6382 }
Gabor Greif49991682008-02-21 16:29:08 +00006383};
6384
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006385const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006386 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6387 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6388 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6389 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6390};
6391
Craig Topperf054e3a2015-10-19 03:52:27 +00006392ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6393 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006394}
6395
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006396const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006397 { { "g0" }, "r0" },
6398 { { "g1" }, "r1" },
6399 { { "g2" }, "r2" },
6400 { { "g3" }, "r3" },
6401 { { "g4" }, "r4" },
6402 { { "g5" }, "r5" },
6403 { { "g6" }, "r6" },
6404 { { "g7" }, "r7" },
6405 { { "o0" }, "r8" },
6406 { { "o1" }, "r9" },
6407 { { "o2" }, "r10" },
6408 { { "o3" }, "r11" },
6409 { { "o4" }, "r12" },
6410 { { "o5" }, "r13" },
6411 { { "o6", "sp" }, "r14" },
6412 { { "o7" }, "r15" },
6413 { { "l0" }, "r16" },
6414 { { "l1" }, "r17" },
6415 { { "l2" }, "r18" },
6416 { { "l3" }, "r19" },
6417 { { "l4" }, "r20" },
6418 { { "l5" }, "r21" },
6419 { { "l6" }, "r22" },
6420 { { "l7" }, "r23" },
6421 { { "i0" }, "r24" },
6422 { { "i1" }, "r25" },
6423 { { "i2" }, "r26" },
6424 { { "i3" }, "r27" },
6425 { { "i4" }, "r28" },
6426 { { "i5" }, "r29" },
6427 { { "i6", "fp" }, "r30" },
6428 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006429};
6430
Craig Topperf054e3a2015-10-19 03:52:27 +00006431ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6432 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006433}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006434
6435// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6436class SparcV8TargetInfo : public SparcTargetInfo {
6437public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006438 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6439 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006440 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006441 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6442 switch (getTriple().getOS()) {
6443 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006444 SizeType = UnsignedInt;
6445 IntPtrType = SignedInt;
6446 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006447 break;
6448 case llvm::Triple::NetBSD:
6449 case llvm::Triple::OpenBSD:
6450 SizeType = UnsignedLong;
6451 IntPtrType = SignedLong;
6452 PtrDiffType = SignedLong;
6453 break;
Brad Smith56495d52015-08-13 22:00:53 +00006454 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006455 }
6456
Craig Topper3164f332014-03-11 03:39:26 +00006457 void getTargetDefines(const LangOptions &Opts,
6458 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006459 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006460 switch (getCPUGeneration(CPU)) {
6461 case CG_V8:
6462 Builder.defineMacro("__sparcv8");
6463 if (getTriple().getOS() != llvm::Triple::Solaris)
6464 Builder.defineMacro("__sparcv8__");
6465 break;
6466 case CG_V9:
6467 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006468 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006469 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006470 Builder.defineMacro("__sparc_v9__");
6471 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006472 break;
6473 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006474 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6475 switch (CPU) {
6476 case CK_MYRIAD2_1:
6477 Builder.defineMacro("__myriad2", "1");
6478 Builder.defineMacro("__myriad2__", "1");
6479 break;
6480 case CK_MYRIAD2_2:
6481 Builder.defineMacro("__myriad2", "2");
6482 Builder.defineMacro("__myriad2__", "2");
6483 break;
6484 default:
6485 break;
6486 }
6487 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006488 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006489
6490 bool hasSjLjLowering() const override {
6491 return true;
6492 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006493};
6494
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006495// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6496class SparcV8elTargetInfo : public SparcV8TargetInfo {
6497 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006498 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6499 : SparcV8TargetInfo(Triple, Opts) {
6500 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6501 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006502 }
6503};
6504
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006505// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6506class SparcV9TargetInfo : public SparcTargetInfo {
6507public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006508 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6509 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006510 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006511 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006512 // This is an LP64 platform.
6513 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006514
6515 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006516 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006517 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006518 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006519 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006520 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006521
6522 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6523 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6524 LongDoubleWidth = 128;
6525 LongDoubleAlign = 128;
6526 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006527 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006528 }
6529
Craig Topper3164f332014-03-11 03:39:26 +00006530 void getTargetDefines(const LangOptions &Opts,
6531 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006532 SparcTargetInfo::getTargetDefines(Opts, Builder);
6533 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006534 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006535 // Solaris doesn't need these variants, but the BSDs do.
6536 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006537 Builder.defineMacro("__sparc64__");
6538 Builder.defineMacro("__sparc_v9__");
6539 Builder.defineMacro("__sparcv9__");
6540 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006541 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006542
Craig Topper3164f332014-03-11 03:39:26 +00006543 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006544 if (!SparcTargetInfo::setCPU(Name))
6545 return false;
6546 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006547 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006548};
6549
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006550class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006551 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006552 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006553 std::string CPU;
6554 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006555 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006556
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006557public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006558 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006559 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6560 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006561 IntMaxType = SignedLong;
6562 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006563 TLSSupported = true;
6564 IntWidth = IntAlign = 32;
6565 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6566 PointerWidth = PointerAlign = 64;
6567 LongDoubleWidth = 128;
6568 LongDoubleAlign = 64;
6569 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006570 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006571 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006572 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 +00006573 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6574 }
6575 void getTargetDefines(const LangOptions &Opts,
6576 MacroBuilder &Builder) const override {
6577 Builder.defineMacro("__s390__");
6578 Builder.defineMacro("__s390x__");
6579 Builder.defineMacro("__zarch__");
6580 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006581
6582 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6583 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6584 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6585 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6586
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006587 if (HasTransactionalExecution)
6588 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006589 if (Opts.ZVector)
6590 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006591 }
Craig Topper6c03a542015-10-19 04:51:35 +00006592 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6593 return llvm::makeArrayRef(BuiltinInfo,
6594 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006595 }
6596
Craig Topperf054e3a2015-10-19 03:52:27 +00006597 ArrayRef<const char *> getGCCRegNames() const override;
6598 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006599 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006600 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006601 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006602 bool validateAsmConstraint(const char *&Name,
6603 TargetInfo::ConstraintInfo &info) const override;
6604 const char *getClobbers() const override {
6605 // FIXME: Is this really right?
6606 return "";
6607 }
6608 BuiltinVaListKind getBuiltinVaListKind() const override {
6609 return TargetInfo::SystemZBuiltinVaList;
6610 }
6611 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006612 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006613 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6614 .Case("z10", true)
6615 .Case("z196", true)
6616 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006617 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006618 .Default(false);
6619
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006620 return CPUKnown;
6621 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006622 bool
6623 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6624 StringRef CPU,
6625 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006626 if (CPU == "zEC12")
6627 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006628 if (CPU == "z13") {
6629 Features["transactional-execution"] = true;
6630 Features["vector"] = true;
6631 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006632 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006633 }
6634
6635 bool handleTargetFeatures(std::vector<std::string> &Features,
6636 DiagnosticsEngine &Diags) override {
6637 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006638 for (const auto &Feature : Features) {
6639 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006640 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006641 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006642 HasVector = true;
6643 }
6644 // If we use the vector ABI, vector types are 64-bit aligned.
6645 if (HasVector) {
6646 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006647 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6648 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006649 }
6650 return true;
6651 }
6652
6653 bool hasFeature(StringRef Feature) const override {
6654 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006655 .Case("systemz", true)
6656 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006657 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006658 .Default(false);
6659 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006660
Bryan Chane3f1ed52016-04-28 13:56:43 +00006661 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6662 switch (CC) {
6663 case CC_C:
6664 case CC_Swift:
6665 return CCCR_OK;
6666 default:
6667 return CCCR_Warning;
6668 }
6669 }
6670
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006671 StringRef getABI() const override {
6672 if (HasVector)
6673 return "vector";
6674 return "";
6675 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006676
6677 bool useFloat128ManglingForLongDouble() const override {
6678 return true;
6679 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006680};
6681
6682const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6683#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006684 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006685#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6686 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006687#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006688};
6689
6690const char *const SystemZTargetInfo::GCCRegNames[] = {
6691 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6692 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6693 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6694 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6695};
6696
Craig Topperf054e3a2015-10-19 03:52:27 +00006697ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6698 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006699}
6700
6701bool SystemZTargetInfo::
6702validateAsmConstraint(const char *&Name,
6703 TargetInfo::ConstraintInfo &Info) const {
6704 switch (*Name) {
6705 default:
6706 return false;
6707
6708 case 'a': // Address register
6709 case 'd': // Data register (equivalent to 'r')
6710 case 'f': // Floating-point register
6711 Info.setAllowsRegister();
6712 return true;
6713
6714 case 'I': // Unsigned 8-bit constant
6715 case 'J': // Unsigned 12-bit constant
6716 case 'K': // Signed 16-bit constant
6717 case 'L': // Signed 20-bit displacement (on all targets we support)
6718 case 'M': // 0x7fffffff
6719 return true;
6720
6721 case 'Q': // Memory with base and unsigned 12-bit displacement
6722 case 'R': // Likewise, plus an index
6723 case 'S': // Memory with base and signed 20-bit displacement
6724 case 'T': // Likewise, plus an index
6725 Info.setAllowsMemory();
6726 return true;
6727 }
6728}
Ulrich Weigand47445072013-05-06 16:26:41 +00006729
Eric Christopherc48497a2015-09-18 21:26:24 +00006730class MSP430TargetInfo : public TargetInfo {
6731 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006732
Eric Christopherc48497a2015-09-18 21:26:24 +00006733public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006734 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6735 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006736 BigEndian = false;
6737 TLSSupported = false;
6738 IntWidth = 16;
6739 IntAlign = 16;
6740 LongWidth = 32;
6741 LongLongWidth = 64;
6742 LongAlign = LongLongAlign = 16;
6743 PointerWidth = 16;
6744 PointerAlign = 16;
6745 SuitableAlign = 16;
6746 SizeType = UnsignedInt;
6747 IntMaxType = SignedLongLong;
6748 IntPtrType = SignedInt;
6749 PtrDiffType = SignedInt;
6750 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006751 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006752 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006753 void getTargetDefines(const LangOptions &Opts,
6754 MacroBuilder &Builder) const override {
6755 Builder.defineMacro("MSP430");
6756 Builder.defineMacro("__MSP430__");
6757 // FIXME: defines for different 'flavours' of MCU
6758 }
Craig Topper6c03a542015-10-19 04:51:35 +00006759 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006760 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006761 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006762 }
6763 bool hasFeature(StringRef Feature) const override {
6764 return Feature == "msp430";
6765 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006766 ArrayRef<const char *> getGCCRegNames() const override;
6767 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006768 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006769 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006770 }
6771 bool validateAsmConstraint(const char *&Name,
6772 TargetInfo::ConstraintInfo &info) const override {
6773 // FIXME: implement
6774 switch (*Name) {
6775 case 'K': // the constant 1
6776 case 'L': // constant -1^20 .. 1^19
6777 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006778 return true;
6779 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006780 // No target constraints for now.
6781 return false;
6782 }
6783 const char *getClobbers() const override {
6784 // FIXME: Is this really right?
6785 return "";
6786 }
6787 BuiltinVaListKind getBuiltinVaListKind() const override {
6788 // FIXME: implement
6789 return TargetInfo::CharPtrBuiltinVaList;
6790 }
6791};
6792
6793const char *const MSP430TargetInfo::GCCRegNames[] = {
6794 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6795 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6796
Craig Topperf054e3a2015-10-19 03:52:27 +00006797ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6798 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006799}
6800
6801// LLVM and Clang cannot be used directly to output native binaries for
6802// target, but is used to compile C code to llvm bitcode with correct
6803// type and alignment information.
6804//
6805// TCE uses the llvm bitcode as input and uses it for generating customized
6806// target processor and program binary. TCE co-design environment is
6807// publicly available in http://tce.cs.tut.fi
6808
6809static const unsigned TCEOpenCLAddrSpaceMap[] = {
6810 3, // opencl_global
6811 4, // opencl_local
6812 5, // opencl_constant
6813 // FIXME: generic has to be added to the target
6814 0, // opencl_generic
6815 0, // cuda_device
6816 0, // cuda_constant
6817 0 // cuda_shared
6818};
6819
6820class TCETargetInfo : public TargetInfo {
6821public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006822 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6823 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006824 TLSSupported = false;
6825 IntWidth = 32;
6826 LongWidth = LongLongWidth = 32;
6827 PointerWidth = 32;
6828 IntAlign = 32;
6829 LongAlign = LongLongAlign = 32;
6830 PointerAlign = 32;
6831 SuitableAlign = 32;
6832 SizeType = UnsignedInt;
6833 IntMaxType = SignedLong;
6834 IntPtrType = SignedInt;
6835 PtrDiffType = SignedInt;
6836 FloatWidth = 32;
6837 FloatAlign = 32;
6838 DoubleWidth = 32;
6839 DoubleAlign = 32;
6840 LongDoubleWidth = 32;
6841 LongDoubleAlign = 32;
6842 FloatFormat = &llvm::APFloat::IEEEsingle;
6843 DoubleFormat = &llvm::APFloat::IEEEsingle;
6844 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006845 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6846 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006847 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6848 UseAddrSpaceMapMangling = true;
6849 }
6850
6851 void getTargetDefines(const LangOptions &Opts,
6852 MacroBuilder &Builder) const override {
6853 DefineStd(Builder, "tce", Opts);
6854 Builder.defineMacro("__TCE__");
6855 Builder.defineMacro("__TCE_V1__");
6856 }
6857 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6858
Craig Topper6c03a542015-10-19 04:51:35 +00006859 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006860 const char *getClobbers() const override { return ""; }
6861 BuiltinVaListKind getBuiltinVaListKind() const override {
6862 return TargetInfo::VoidPtrBuiltinVaList;
6863 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006864 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006865 bool validateAsmConstraint(const char *&Name,
6866 TargetInfo::ConstraintInfo &info) const override {
6867 return true;
6868 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006869 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6870 return None;
6871 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006872};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006873
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006874class BPFTargetInfo : public TargetInfo {
6875public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006876 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6877 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006878 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6879 SizeType = UnsignedLong;
6880 PtrDiffType = SignedLong;
6881 IntPtrType = SignedLong;
6882 IntMaxType = SignedLong;
6883 Int64Type = SignedLong;
6884 RegParmMax = 5;
6885 if (Triple.getArch() == llvm::Triple::bpfeb) {
6886 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006887 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006888 } else {
6889 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006890 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006891 }
6892 MaxAtomicPromoteWidth = 64;
6893 MaxAtomicInlineWidth = 64;
6894 TLSSupported = false;
6895 }
6896 void getTargetDefines(const LangOptions &Opts,
6897 MacroBuilder &Builder) const override {
6898 DefineStd(Builder, "bpf", Opts);
6899 Builder.defineMacro("__BPF__");
6900 }
6901 bool hasFeature(StringRef Feature) const override {
6902 return Feature == "bpf";
6903 }
6904
Craig Topper6c03a542015-10-19 04:51:35 +00006905 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006906 const char *getClobbers() const override {
6907 return "";
6908 }
6909 BuiltinVaListKind getBuiltinVaListKind() const override {
6910 return TargetInfo::VoidPtrBuiltinVaList;
6911 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006912 ArrayRef<const char *> getGCCRegNames() const override {
6913 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006914 }
6915 bool validateAsmConstraint(const char *&Name,
6916 TargetInfo::ConstraintInfo &info) const override {
6917 return true;
6918 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006919 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6920 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006921 }
6922};
6923
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006924class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006925 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006926
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006927 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006928 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006929 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006930 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006931 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006932 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006933 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006934 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006935 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006936 enum DspRevEnum {
6937 NoDSP, DSP1, DSP2
6938 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006939 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006940
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006941protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006942 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006943 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006944
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006945public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006946 MipsTargetInfoBase(const llvm::Triple &Triple, const TargetOptions &,
6947 const std::string &ABIStr, const std::string &CPUStr)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006948 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006949 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006950 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6951 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6952 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006953
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006954 bool isNaN2008Default() const {
6955 return CPU == "mips32r6" || CPU == "mips64r6";
6956 }
6957
6958 bool isFP64Default() const {
6959 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6960 }
6961
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006962 bool isNan2008() const override {
6963 return IsNan2008;
6964 }
6965
Alp Toker4925ba72014-06-07 23:30:42 +00006966 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006967 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006968 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6969 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006970 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006971 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006972 .Case("mips1", IsMips32)
6973 .Case("mips2", IsMips32)
6974 .Case("mips3", true)
6975 .Case("mips4", true)
6976 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006977 .Case("mips32", IsMips32)
6978 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006979 .Case("mips32r3", IsMips32)
6980 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006981 .Case("mips32r6", IsMips32)
6982 .Case("mips64", true)
6983 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006984 .Case("mips64r3", true)
6985 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006986 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006987 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006988 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006989 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006990 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006991 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006992 bool
6993 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6994 StringRef CPU,
6995 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006996 if (CPU.empty())
6997 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006998 if (CPU == "octeon")
6999 Features["mips64r2"] = Features["cnmips"] = true;
7000 else
7001 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007002 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007003 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007004
Craig Topper3164f332014-03-11 03:39:26 +00007005 void getTargetDefines(const LangOptions &Opts,
7006 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007007 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007008 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007009 if (Opts.GNUMode)
7010 Builder.defineMacro("mips");
7011
Simon Atanasyan683535b2012-08-29 19:14:58 +00007012 Builder.defineMacro("__REGISTER_PREFIX__", "");
7013
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007014 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007015 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007016 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007017 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007018 case SoftFloat:
7019 Builder.defineMacro("__mips_soft_float", Twine(1));
7020 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007021 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007022
Simon Atanasyan16071912013-04-14 14:07:30 +00007023 if (IsSingleFloat)
7024 Builder.defineMacro("__mips_single_float", Twine(1));
7025
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007026 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7027 Builder.defineMacro("_MIPS_FPSET",
7028 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7029
Simon Atanasyan72244b62012-07-05 16:06:06 +00007030 if (IsMips16)
7031 Builder.defineMacro("__mips16", Twine(1));
7032
Simon Atanasyan60777612013-04-14 14:07:51 +00007033 if (IsMicromips)
7034 Builder.defineMacro("__mips_micromips", Twine(1));
7035
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007036 if (IsNan2008)
7037 Builder.defineMacro("__mips_nan2008", Twine(1));
7038
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007039 switch (DspRev) {
7040 default:
7041 break;
7042 case DSP1:
7043 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7044 Builder.defineMacro("__mips_dsp", Twine(1));
7045 break;
7046 case DSP2:
7047 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7048 Builder.defineMacro("__mips_dspr2", Twine(1));
7049 Builder.defineMacro("__mips_dsp", Twine(1));
7050 break;
7051 }
7052
Jack Carter44ff1e52013-08-12 17:20:29 +00007053 if (HasMSA)
7054 Builder.defineMacro("__mips_msa", Twine(1));
7055
Simon Atanasyan26f19672012-04-05 19:28:31 +00007056 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7057 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7058 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007059
7060 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7061 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007062
7063 // These shouldn't be defined for MIPS-I but there's no need to check
7064 // for that since MIPS-I isn't supported.
7065 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7066 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7067 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007068 }
7069
Craig Topper6c03a542015-10-19 04:51:35 +00007070 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7071 return llvm::makeArrayRef(BuiltinInfo,
7072 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007073 }
Craig Topper3164f332014-03-11 03:39:26 +00007074 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007075 return llvm::StringSwitch<bool>(Feature)
7076 .Case("mips", true)
7077 .Case("fp64", HasFP64)
7078 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007079 }
Craig Topper3164f332014-03-11 03:39:26 +00007080 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007081 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007082 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007083 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007084 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007085 // CPU register names
7086 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007087 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7088 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7089 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007090 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7091 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007092 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7093 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7094 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7095 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007096 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007097 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007098 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7099 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007100 // MSA register names
7101 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7102 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7103 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7104 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7105 // MSA control register names
7106 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7107 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007108 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007109 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007110 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007111 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00007112 bool validateAsmConstraint(const char *&Name,
7113 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007114 switch (*Name) {
7115 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007116 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007117 case 'r': // CPU registers.
7118 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007119 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007120 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007121 case 'c': // $25 for indirect jumps
7122 case 'l': // lo register
7123 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007124 Info.setAllowsRegister();
7125 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007126 case 'I': // Signed 16-bit constant
7127 case 'J': // Integer 0
7128 case 'K': // Unsigned 16-bit constant
7129 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7130 case 'M': // Constants not loadable via lui, addiu, or ori
7131 case 'N': // Constant -1 to -65535
7132 case 'O': // A signed 15-bit constant
7133 case 'P': // A constant between 1 go 65535
7134 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007135 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007136 Info.setAllowsMemory();
7137 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007138 case 'Z':
7139 if (Name[1] == 'C') { // An address usable by ll, and sc.
7140 Info.setAllowsMemory();
7141 Name++; // Skip over 'Z'.
7142 return true;
7143 }
7144 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007145 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007146 }
7147
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007148 std::string convertConstraint(const char *&Constraint) const override {
7149 std::string R;
7150 switch (*Constraint) {
7151 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7152 if (Constraint[1] == 'C') {
7153 R = std::string("^") + std::string(Constraint, 2);
7154 Constraint++;
7155 return R;
7156 }
7157 break;
7158 }
7159 return TargetInfo::convertConstraint(Constraint);
7160 }
7161
Craig Topper3164f332014-03-11 03:39:26 +00007162 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007163 // In GCC, $1 is not widely used in generated code (it's used only in a few
7164 // specific situations), so there is no real need for users to add it to
7165 // the clobbers list if they want to use it in their inline assembly code.
7166 //
7167 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7168 // code generation, so using it in inline assembly without adding it to the
7169 // clobbers list can cause conflicts between the inline assembly code and
7170 // the surrounding generated code.
7171 //
7172 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7173 // operands, which will conflict with the ".set at" assembler option (which
7174 // we use only for inline assembly, in order to maintain compatibility with
7175 // GCC) and will also conflict with the user's usage of $1.
7176 //
7177 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7178 // register for generated code is to automatically clobber $1 for all inline
7179 // assembly code.
7180 //
7181 // FIXME: We should automatically clobber $1 only for inline assembly code
7182 // which actually uses it. This would allow LLVM to use $1 for inline
7183 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007184 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007185 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007186
Craig Topper3164f332014-03-11 03:39:26 +00007187 bool handleTargetFeatures(std::vector<std::string> &Features,
7188 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007189 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007190 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007191 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007192 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007193 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007194 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007195 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007196
Eric Christopher610fe112015-08-26 08:21:55 +00007197 for (const auto &Feature : Features) {
7198 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007199 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007200 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007201 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007202 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007203 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007204 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007205 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007206 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007207 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007208 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007209 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007210 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007211 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007212 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007213 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007214 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007215 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007216 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007217 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007218 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007219 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007220 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007221
James Y Knightb214cbc2016-03-04 19:00:41 +00007222 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007223
Rafael Espindolaeb265472013-08-21 21:59:03 +00007224 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007225 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007226
Craig Topper3164f332014-03-11 03:39:26 +00007227 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007228 if (RegNo == 0) return 4;
7229 if (RegNo == 1) return 5;
7230 return -1;
7231 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007232
7233 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007234};
7235
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007236const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007237#define BUILTIN(ID, TYPE, ATTRS) \
7238 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7239#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7240 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007241#include "clang/Basic/BuiltinsMips.def"
7242};
7243
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007244class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007245public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007246 Mips32TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7247 : MipsTargetInfoBase(Triple, Opts, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007248 SizeType = UnsignedInt;
7249 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007250 Int64Type = SignedLongLong;
7251 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007252 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007253 }
Craig Topper3164f332014-03-11 03:39:26 +00007254 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007255 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007256 ABI = Name;
7257 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007258 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007259 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007260 }
Craig Topper3164f332014-03-11 03:39:26 +00007261 void getTargetDefines(const LangOptions &Opts,
7262 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007263 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007264
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007265 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007266 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7267
7268 const std::string& CPUStr = getCPU();
7269 if (CPUStr == "mips32")
7270 Builder.defineMacro("__mips_isa_rev", "1");
7271 else if (CPUStr == "mips32r2")
7272 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007273 else if (CPUStr == "mips32r3")
7274 Builder.defineMacro("__mips_isa_rev", "3");
7275 else if (CPUStr == "mips32r5")
7276 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007277 else if (CPUStr == "mips32r6")
7278 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007279
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007280 if (ABI == "o32") {
7281 Builder.defineMacro("__mips_o32");
7282 Builder.defineMacro("_ABIO32", "1");
7283 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7284 }
7285 else if (ABI == "eabi")
7286 Builder.defineMacro("__mips_eabi");
7287 else
David Blaikie83d382b2011-09-23 05:06:16 +00007288 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007289 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007290 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007291 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7292 { { "at" }, "$1" },
7293 { { "v0" }, "$2" },
7294 { { "v1" }, "$3" },
7295 { { "a0" }, "$4" },
7296 { { "a1" }, "$5" },
7297 { { "a2" }, "$6" },
7298 { { "a3" }, "$7" },
7299 { { "t0" }, "$8" },
7300 { { "t1" }, "$9" },
7301 { { "t2" }, "$10" },
7302 { { "t3" }, "$11" },
7303 { { "t4" }, "$12" },
7304 { { "t5" }, "$13" },
7305 { { "t6" }, "$14" },
7306 { { "t7" }, "$15" },
7307 { { "s0" }, "$16" },
7308 { { "s1" }, "$17" },
7309 { { "s2" }, "$18" },
7310 { { "s3" }, "$19" },
7311 { { "s4" }, "$20" },
7312 { { "s5" }, "$21" },
7313 { { "s6" }, "$22" },
7314 { { "s7" }, "$23" },
7315 { { "t8" }, "$24" },
7316 { { "t9" }, "$25" },
7317 { { "k0" }, "$26" },
7318 { { "k1" }, "$27" },
7319 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007320 { { "sp","$sp" }, "$29" },
7321 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007322 { { "ra" }, "$31" }
7323 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007324 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007325 }
7326};
7327
7328class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007329 void setDataLayout() override {
7330 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007331 }
7332
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007333public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007334 Mips32EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7335 : Mips32TargetInfoBase(Triple, Opts) {
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00007336 }
Craig Topper3164f332014-03-11 03:39:26 +00007337 void getTargetDefines(const LangOptions &Opts,
7338 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007339 DefineStd(Builder, "MIPSEB", Opts);
7340 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007341 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007342 }
7343};
7344
7345class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007346 void setDataLayout() override {
7347 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007348 }
7349
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007350public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007351 Mips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7352 : Mips32TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007353 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007354 }
Craig Topper3164f332014-03-11 03:39:26 +00007355 void getTargetDefines(const LangOptions &Opts,
7356 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007357 DefineStd(Builder, "MIPSEL", Opts);
7358 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007359 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007360 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007361};
Akira Hatanakabef17452011-09-20 19:21:49 +00007362
7363class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007364public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007365 Mips64TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7366 : MipsTargetInfoBase(Triple, Opts, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007367 LongDoubleWidth = LongDoubleAlign = 128;
7368 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007369 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7370 LongDoubleWidth = LongDoubleAlign = 64;
7371 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7372 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007373 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007374 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007375 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007376 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007377
7378 void setN64ABITypes() {
7379 LongWidth = LongAlign = 64;
7380 PointerWidth = PointerAlign = 64;
7381 SizeType = UnsignedLong;
7382 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007383 Int64Type = SignedLong;
7384 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007385 }
7386
7387 void setN32ABITypes() {
7388 LongWidth = LongAlign = 32;
7389 PointerWidth = PointerAlign = 32;
7390 SizeType = UnsignedInt;
7391 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007392 Int64Type = SignedLongLong;
7393 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007394 }
7395
Craig Topper3164f332014-03-11 03:39:26 +00007396 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007397 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007398 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007399 ABI = Name;
7400 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007401 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007402 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007403 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007404 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007405 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007406 }
7407 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007408 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007409
Craig Topper3164f332014-03-11 03:39:26 +00007410 void getTargetDefines(const LangOptions &Opts,
7411 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007412 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007413
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007414 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007415 Builder.defineMacro("__mips64");
7416 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007417 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7418
7419 const std::string& CPUStr = getCPU();
7420 if (CPUStr == "mips64")
7421 Builder.defineMacro("__mips_isa_rev", "1");
7422 else if (CPUStr == "mips64r2")
7423 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007424 else if (CPUStr == "mips64r3")
7425 Builder.defineMacro("__mips_isa_rev", "3");
7426 else if (CPUStr == "mips64r5")
7427 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007428 else if (CPUStr == "mips64r6")
7429 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007430
Akira Hatanakabef17452011-09-20 19:21:49 +00007431 if (ABI == "n32") {
7432 Builder.defineMacro("__mips_n32");
7433 Builder.defineMacro("_ABIN32", "2");
7434 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7435 }
7436 else if (ABI == "n64") {
7437 Builder.defineMacro("__mips_n64");
7438 Builder.defineMacro("_ABI64", "3");
7439 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7440 }
7441 else
David Blaikie83d382b2011-09-23 05:06:16 +00007442 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007443
7444 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007445 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007446 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007447 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7448 { { "at" }, "$1" },
7449 { { "v0" }, "$2" },
7450 { { "v1" }, "$3" },
7451 { { "a0" }, "$4" },
7452 { { "a1" }, "$5" },
7453 { { "a2" }, "$6" },
7454 { { "a3" }, "$7" },
7455 { { "a4" }, "$8" },
7456 { { "a5" }, "$9" },
7457 { { "a6" }, "$10" },
7458 { { "a7" }, "$11" },
7459 { { "t0" }, "$12" },
7460 { { "t1" }, "$13" },
7461 { { "t2" }, "$14" },
7462 { { "t3" }, "$15" },
7463 { { "s0" }, "$16" },
7464 { { "s1" }, "$17" },
7465 { { "s2" }, "$18" },
7466 { { "s3" }, "$19" },
7467 { { "s4" }, "$20" },
7468 { { "s5" }, "$21" },
7469 { { "s6" }, "$22" },
7470 { { "s7" }, "$23" },
7471 { { "t8" }, "$24" },
7472 { { "t9" }, "$25" },
7473 { { "k0" }, "$26" },
7474 { { "k1" }, "$27" },
7475 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007476 { { "sp","$sp" }, "$29" },
7477 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007478 { { "ra" }, "$31" }
7479 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007480 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007481 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007482
7483 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007484};
7485
7486class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007487 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007488 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007489 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 +00007490 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007491 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007492 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007493
Akira Hatanakabef17452011-09-20 19:21:49 +00007494public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007495 Mips64EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7496 : Mips64TargetInfoBase(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00007497 void getTargetDefines(const LangOptions &Opts,
7498 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007499 DefineStd(Builder, "MIPSEB", Opts);
7500 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007501 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007502 }
7503};
7504
7505class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007506 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007507 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007508 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 +00007509 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007510 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007511 }
7512public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007513 Mips64ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7514 : Mips64TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007515 // Default ABI is n64.
7516 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007517 }
Craig Topper3164f332014-03-11 03:39:26 +00007518 void getTargetDefines(const LangOptions &Opts,
7519 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007520 DefineStd(Builder, "MIPSEL", Opts);
7521 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007522 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007523 }
7524};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007525
Ivan Krasindd7403e2011-08-24 20:22:22 +00007526class PNaClTargetInfo : public TargetInfo {
7527public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007528 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7529 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007530 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007531 this->LongAlign = 32;
7532 this->LongWidth = 32;
7533 this->PointerAlign = 32;
7534 this->PointerWidth = 32;
7535 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007536 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007537 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007538 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007539 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007540 this->SizeType = TargetInfo::UnsignedInt;
7541 this->PtrDiffType = TargetInfo::SignedInt;
7542 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007543 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007544 }
7545
Craig Toppere6f17d02014-03-11 04:07:52 +00007546 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007547 Builder.defineMacro("__le32__");
7548 Builder.defineMacro("__pnacl__");
7549 }
Craig Topper3164f332014-03-11 03:39:26 +00007550 void getTargetDefines(const LangOptions &Opts,
7551 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007552 getArchDefines(Opts, Builder);
7553 }
Craig Topper3164f332014-03-11 03:39:26 +00007554 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007555 return Feature == "pnacl";
7556 }
Craig Topper6c03a542015-10-19 04:51:35 +00007557 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007558 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007559 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007560 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007561 ArrayRef<const char *> getGCCRegNames() const override;
7562 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007563 bool validateAsmConstraint(const char *&Name,
7564 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007565 return false;
7566 }
7567
Craig Topper3164f332014-03-11 03:39:26 +00007568 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007569 return "";
7570 }
7571};
7572
Craig Topperf054e3a2015-10-19 03:52:27 +00007573ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7574 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007575}
7576
Craig Topperf054e3a2015-10-19 03:52:27 +00007577ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7578 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007579}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007580
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007581// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7582class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7583public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007584 NaClMips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7585 : Mips32ELTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007586
7587 BuiltinVaListKind getBuiltinVaListKind() const override {
7588 return TargetInfo::PNaClABIBuiltinVaList;
7589 }
7590};
7591
JF Bastien643817d2014-09-12 17:52:47 +00007592class Le64TargetInfo : public TargetInfo {
7593 static const Builtin::Info BuiltinInfo[];
7594
7595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007596 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7597 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007598 BigEndian = false;
7599 NoAsmVariants = true;
7600 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7601 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007602 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007603 }
7604
7605 void getTargetDefines(const LangOptions &Opts,
7606 MacroBuilder &Builder) const override {
7607 DefineStd(Builder, "unix", Opts);
7608 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7609 Builder.defineMacro("__ELF__");
7610 }
Craig Topper6c03a542015-10-19 04:51:35 +00007611 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7612 return llvm::makeArrayRef(BuiltinInfo,
7613 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007614 }
7615 BuiltinVaListKind getBuiltinVaListKind() const override {
7616 return TargetInfo::PNaClABIBuiltinVaList;
7617 }
7618 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007619 ArrayRef<const char *> getGCCRegNames() const override {
7620 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007621 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007622 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7623 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007624 }
7625 bool validateAsmConstraint(const char *&Name,
7626 TargetInfo::ConstraintInfo &Info) const override {
7627 return false;
7628 }
7629
7630 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007631};
Dan Gohmanc2853072015-09-03 22:51:53 +00007632
7633class WebAssemblyTargetInfo : public TargetInfo {
7634 static const Builtin::Info BuiltinInfo[];
7635
7636 enum SIMDEnum {
7637 NoSIMD,
7638 SIMD128,
7639 } SIMDLevel;
7640
7641public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007642 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007643 : TargetInfo(T), SIMDLevel(NoSIMD) {
7644 BigEndian = false;
7645 NoAsmVariants = true;
7646 SuitableAlign = 128;
7647 LargeArrayMinWidth = 128;
7648 LargeArrayAlign = 128;
7649 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007650 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007651 LongDoubleWidth = LongDoubleAlign = 128;
7652 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007653 }
7654
7655protected:
7656 void getTargetDefines(const LangOptions &Opts,
7657 MacroBuilder &Builder) const override {
7658 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7659 if (SIMDLevel >= SIMD128)
7660 Builder.defineMacro("__wasm_simd128__");
7661 }
7662
7663private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007664 bool
7665 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7666 StringRef CPU,
7667 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007668 if (CPU == "bleeding-edge")
7669 Features["simd128"] = true;
7670 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7671 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007672 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007673 return llvm::StringSwitch<bool>(Feature)
7674 .Case("simd128", SIMDLevel >= SIMD128)
7675 .Default(false);
7676 }
7677 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007678 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007679 for (const auto &Feature : Features) {
7680 if (Feature == "+simd128") {
7681 SIMDLevel = std::max(SIMDLevel, SIMD128);
7682 continue;
7683 }
7684 if (Feature == "-simd128") {
7685 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7686 continue;
7687 }
7688
7689 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7690 << "-target-feature";
7691 return false;
7692 }
7693 return true;
7694 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007695 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007696 return llvm::StringSwitch<bool>(Name)
7697 .Case("mvp", true)
7698 .Case("bleeding-edge", true)
7699 .Case("generic", true)
7700 .Default(false);
7701 }
Craig Topper6c03a542015-10-19 04:51:35 +00007702 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7703 return llvm::makeArrayRef(BuiltinInfo,
7704 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007705 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007706 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007707 return VoidPtrBuiltinVaList;
7708 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007709 ArrayRef<const char *> getGCCRegNames() const final {
7710 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007711 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007712 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7713 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007714 }
7715 bool
7716 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007717 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007718 return false;
7719 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007720 const char *getClobbers() const final { return ""; }
7721 bool isCLZForZeroUndef() const final { return false; }
7722 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007723 IntType getIntTypeByWidth(unsigned BitWidth,
7724 bool IsSigned) const final {
7725 // WebAssembly prefers long long for explicitly 64-bit integers.
7726 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7727 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7728 }
7729 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7730 bool IsSigned) const final {
7731 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7732 return BitWidth == 64
7733 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7734 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7735 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007736};
7737
7738const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7739#define BUILTIN(ID, TYPE, ATTRS) \
7740 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7741#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7742 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7743#include "clang/Basic/BuiltinsWebAssembly.def"
7744};
7745
7746class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7747public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007748 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7749 const TargetOptions &Opts)
7750 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007751 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007752 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007753 }
7754
7755protected:
7756 void getTargetDefines(const LangOptions &Opts,
7757 MacroBuilder &Builder) const override {
7758 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7759 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7760 }
7761};
7762
7763class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7764public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007765 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7766 const TargetOptions &Opts)
7767 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007768 LongAlign = LongWidth = 64;
7769 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007770 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007771 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007772 }
7773
7774protected:
7775 void getTargetDefines(const LangOptions &Opts,
7776 MacroBuilder &Builder) const override {
7777 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7778 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7779 }
7780};
7781
JF Bastien643817d2014-09-12 17:52:47 +00007782const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7783#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007784 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007785#include "clang/Basic/BuiltinsLe64.def"
7786};
7787
Eric Christopherc48497a2015-09-18 21:26:24 +00007788static const unsigned SPIRAddrSpaceMap[] = {
7789 1, // opencl_global
7790 3, // opencl_local
7791 2, // opencl_constant
7792 4, // opencl_generic
7793 0, // cuda_device
7794 0, // cuda_constant
7795 0 // cuda_shared
7796};
7797class SPIRTargetInfo : public TargetInfo {
7798public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007799 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7800 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007801 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7802 "SPIR target must use unknown OS");
7803 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7804 "SPIR target must use unknown environment type");
7805 BigEndian = false;
7806 TLSSupported = false;
7807 LongWidth = LongAlign = 64;
7808 AddrSpaceMap = &SPIRAddrSpaceMap;
7809 UseAddrSpaceMapMangling = true;
7810 // Define available target features
7811 // These must be defined in sorted order!
7812 NoAsmVariants = true;
7813 }
7814 void getTargetDefines(const LangOptions &Opts,
7815 MacroBuilder &Builder) const override {
7816 DefineStd(Builder, "SPIR", Opts);
7817 }
7818 bool hasFeature(StringRef Feature) const override {
7819 return Feature == "spir";
7820 }
Craig Topper3164f332014-03-11 03:39:26 +00007821
Craig Topper6c03a542015-10-19 04:51:35 +00007822 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007823 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007824 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007825 bool validateAsmConstraint(const char *&Name,
7826 TargetInfo::ConstraintInfo &info) const override {
7827 return true;
7828 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007829 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7830 return None;
7831 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007832 BuiltinVaListKind getBuiltinVaListKind() const override {
7833 return TargetInfo::VoidPtrBuiltinVaList;
7834 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007835
Eric Christopherc48497a2015-09-18 21:26:24 +00007836 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7837 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7838 : CCCR_Warning;
7839 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007840
Eric Christopherc48497a2015-09-18 21:26:24 +00007841 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7842 return CC_SpirFunction;
7843 }
7844};
Guy Benyeib798fc92012-12-11 21:38:14 +00007845
Eric Christopherc48497a2015-09-18 21:26:24 +00007846class SPIR32TargetInfo : public SPIRTargetInfo {
7847public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007848 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7849 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007850 PointerWidth = PointerAlign = 32;
7851 SizeType = TargetInfo::UnsignedInt;
7852 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007853 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7854 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007855 }
7856 void getTargetDefines(const LangOptions &Opts,
7857 MacroBuilder &Builder) const override {
7858 DefineStd(Builder, "SPIR32", Opts);
7859 }
7860};
Guy Benyeib798fc92012-12-11 21:38:14 +00007861
Eric Christopherc48497a2015-09-18 21:26:24 +00007862class SPIR64TargetInfo : public SPIRTargetInfo {
7863public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007864 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7865 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007866 PointerWidth = PointerAlign = 64;
7867 SizeType = TargetInfo::UnsignedLong;
7868 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007869 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7870 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007871 }
7872 void getTargetDefines(const LangOptions &Opts,
7873 MacroBuilder &Builder) const override {
7874 DefineStd(Builder, "SPIR64", Opts);
7875 }
7876};
Guy Benyeib798fc92012-12-11 21:38:14 +00007877
Robert Lytton0e076492013-08-13 09:43:10 +00007878class XCoreTargetInfo : public TargetInfo {
7879 static const Builtin::Info BuiltinInfo[];
7880public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007881 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7882 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007883 BigEndian = false;
7884 NoAsmVariants = true;
7885 LongLongAlign = 32;
7886 SuitableAlign = 32;
7887 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007888 SizeType = UnsignedInt;
7889 PtrDiffType = SignedInt;
7890 IntPtrType = SignedInt;
7891 WCharType = UnsignedChar;
7892 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007893 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007894 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7895 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007896 }
Craig Topper3164f332014-03-11 03:39:26 +00007897 void getTargetDefines(const LangOptions &Opts,
7898 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007899 Builder.defineMacro("__XS1B__");
7900 }
Craig Topper6c03a542015-10-19 04:51:35 +00007901 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7902 return llvm::makeArrayRef(BuiltinInfo,
7903 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007904 }
Craig Topper3164f332014-03-11 03:39:26 +00007905 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007906 return TargetInfo::VoidPtrBuiltinVaList;
7907 }
Craig Topper3164f332014-03-11 03:39:26 +00007908 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007909 return "";
7910 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007911 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007912 static const char * const GCCRegNames[] = {
7913 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7914 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7915 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007916 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007917 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007918 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7919 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007920 }
Craig Topper3164f332014-03-11 03:39:26 +00007921 bool validateAsmConstraint(const char *&Name,
7922 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007923 return false;
7924 }
Craig Topper3164f332014-03-11 03:39:26 +00007925 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007926 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7927 return (RegNo < 2)? RegNo : -1;
7928 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007929 bool allowsLargerPreferedTypeAlignment() const override {
7930 return false;
7931 }
Robert Lytton0e076492013-08-13 09:43:10 +00007932};
7933
7934const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007935#define BUILTIN(ID, TYPE, ATTRS) \
7936 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7937#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7938 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007939#include "clang/Basic/BuiltinsXCore.def"
7940};
Robert Lytton0e076492013-08-13 09:43:10 +00007941
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007942// x86_32 Android target
7943class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7944public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007945 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7946 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007947 SuitableAlign = 32;
7948 LongDoubleWidth = 64;
7949 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7950 }
7951};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007952
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007953// x86_64 Android target
7954class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007956 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7957 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007958 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7959 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007960
7961 bool useFloat128ManglingForLongDouble() const override {
7962 return true;
7963 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007964};
7965} // end anonymous namespace
7966
Chris Lattner5ba61f02006-10-14 07:39:34 +00007967//===----------------------------------------------------------------------===//
7968// Driver code
7969//===----------------------------------------------------------------------===//
7970
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007971static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
7972 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007973 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007974
Daniel Dunbar52322032009-08-18 05:47:58 +00007975 switch (Triple.getArch()) {
7976 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007977 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007978
Tim Northover2a0783d2014-05-30 14:14:07 +00007979 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007980 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007981
7982 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007983 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007984
Jacques Pienaard964cc22016-03-28 21:02:54 +00007985 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007986 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00007987
Tim Northover2a0783d2014-05-30 14:14:07 +00007988 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007989 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007990 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007991
7992 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007993 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007994 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00007995 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007996 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007997 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007998 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00007999 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008000 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008001 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008002 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008003 }
8004
Christian Pirker9b019ae2014-02-25 13:51:00 +00008005 case llvm::Triple::aarch64_be:
8006 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008007 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008008 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008009 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008010 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008011 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008012 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008013 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008014 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008015 }
8016
Daniel Dunbar52322032009-08-18 05:47:58 +00008017 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008018 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008019 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008020 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008021
Daniel Dunbar52322032009-08-18 05:47:58 +00008022 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008023 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008024 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008025 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008026 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008027 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008028 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008029 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008030 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008031 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008032 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008033 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008034 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008035 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008036 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008037 case llvm::Triple::Win32:
8038 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008039 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008040 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008041 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008042 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008043 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008044 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008045 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008046 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008047 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008048 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008049 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008050 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008051 }
8052
8053 case llvm::Triple::armeb:
8054 case llvm::Triple::thumbeb:
8055 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008056 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008057
8058 switch (os) {
8059 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008060 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008061 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008062 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008063 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008064 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008065 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008066 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008067 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008068 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008069 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008070 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008071 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008072 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008073 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008074 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008075 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008076
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008077 case llvm::Triple::bpfeb:
8078 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008079 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008080
Daniel Dunbar52322032009-08-18 05:47:58 +00008081 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008082 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008083
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008084 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008085 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008086 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008087 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008088 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008089 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008090 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008091 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008092 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008093 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008094 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008095 return new Mips32EBTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008096 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008097
8098 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008099 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008100 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008101 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008102 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008103 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008104 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008105 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008106 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008107 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008108 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008109 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008110 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008111 return new Mips32ELTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008112 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008113
Akira Hatanakabef17452011-09-20 19:21:49 +00008114 case llvm::Triple::mips64:
8115 switch (os) {
8116 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008117 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008118 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008119 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008120 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008121 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008122 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008123 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008124 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008125 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008126 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008127 return new Mips64EBTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008128 }
8129
8130 case llvm::Triple::mips64el:
8131 switch (os) {
8132 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008133 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008134 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008135 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008136 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008137 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008138 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008139 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008140 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008141 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008142 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008143 return new Mips64ELTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008144 }
8145
Ivan Krasindd7403e2011-08-24 20:22:22 +00008146 case llvm::Triple::le32:
8147 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008148 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008149 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008150 default:
8151 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008152 }
8153
JF Bastien643817d2014-09-12 17:52:47 +00008154 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008155 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008156
Daniel Dunbar52322032009-08-18 05:47:58 +00008157 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008158 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008159 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008160 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008161 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008162 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008163 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008164 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008165 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008166 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008167 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008168 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008169 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008170 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008171 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008172 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008173 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008174
8175 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008176 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008177 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008178 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008179 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008180 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008181 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008182 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008183 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008184 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008185 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008186 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008187 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008188 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008189 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008190
Bill Schmidt778d3872013-07-26 01:36:11 +00008191 case llvm::Triple::ppc64le:
8192 switch (os) {
8193 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008194 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008195 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008196 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008197 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008198 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008199 }
8200
Peter Collingbournec947aae2012-05-20 23:28:41 +00008201 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008202 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008203 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008204 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008205
Tom Stellardd8e38a32015-01-06 20:34:47 +00008206 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008207 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008208 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008209
Daniel Dunbar52322032009-08-18 05:47:58 +00008210 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008211 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008212 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008213 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008214 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008215 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008216 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008217 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008218 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008219 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008220 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008222 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008224 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008225
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008226 // The 'sparcel' architecture copies all the above cases except for Solaris.
8227 case llvm::Triple::sparcel:
8228 switch (os) {
8229 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008230 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008231 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008232 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008233 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008234 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008235 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008236 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008237 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008238 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008239 }
8240
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008241 case llvm::Triple::sparcv9:
8242 switch (os) {
8243 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008244 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008245 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008246 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008247 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008248 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008249 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008250 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008251 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008252 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008253 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008254 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008255 }
8256
Ulrich Weigand47445072013-05-06 16:26:41 +00008257 case llvm::Triple::systemz:
8258 switch (os) {
8259 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008260 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008261 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008262 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008263 }
8264
Eli Friedmana9c3d712009-08-19 20:47:07 +00008265 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008266 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008267
Daniel Dunbar52322032009-08-18 05:47:58 +00008268 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008269 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008270 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008271
Daniel Dunbar52322032009-08-18 05:47:58 +00008272 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008273 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008274 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008275 case llvm::Triple::Linux: {
8276 switch (Triple.getEnvironment()) {
8277 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008278 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008279 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008280 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008281 }
8282 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008283 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008284 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008285 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008286 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008287 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008288 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008289 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008290 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008291 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008292 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008293 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008294 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008295 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008296 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008297 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008298 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008299 case llvm::Triple::Win32: {
8300 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008301 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008302 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008303 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008304 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008305 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008306 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008307 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008308 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008309 }
8310 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008311 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008312 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008313 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008314 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008315 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008316 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008317 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008318 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008319 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008320 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008321 }
8322
8323 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008324 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008325 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008326
Daniel Dunbar52322032009-08-18 05:47:58 +00008327 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008328 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008330 case llvm::Triple::Linux: {
8331 switch (Triple.getEnvironment()) {
8332 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008334 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008336 }
8337 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008338 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008339 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008340 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008341 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008342 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008343 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008344 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008345 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008346 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008347 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008348 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008350 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008351 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008352 case llvm::Triple::Win32: {
8353 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008354 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008356 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008357 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008358 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008359 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008360 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008361 }
8362 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008363 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008364 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008365 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008366 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008367 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008368 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008369 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008370
Douglas Katzman78d7c542015-05-12 21:18:10 +00008371 case llvm::Triple::spir: {
8372 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8373 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8374 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008375 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008376 }
8377 case llvm::Triple::spir64: {
8378 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8379 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8380 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008381 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008382 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008383 case llvm::Triple::wasm32:
8384 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8385 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008386 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008387 case llvm::Triple::wasm64:
8388 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8389 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008391 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008392}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008393
8394/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008395/// options.
Alp Toker80758082014-07-06 05:26:44 +00008396TargetInfo *
8397TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008398 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008399 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008400
8401 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008402 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008403 if (!Target) {
8404 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008405 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008406 }
Alp Toker80758082014-07-06 05:26:44 +00008407 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008408
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008409 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008410 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8411 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008412 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008413 }
8414
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008415 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008416 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8417 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008418 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008419 }
8420
Rafael Espindolaeb265472013-08-21 21:59:03 +00008421 // Set the fp math unit.
8422 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8423 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008424 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008425 }
8426
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008427 // Compute the default target features, we need the target to handle this
8428 // because features may have dependencies on one another.
8429 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008430 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8431 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008432 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008433
8434 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008435 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008436 for (const auto &F : Features)
8437 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8438
Eric Christopher3ff21b32013-10-16 21:26:26 +00008439 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008440 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008441
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008442 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008443}