blob: 2a018071000784f5ae688031c855bcabbbe14c77 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Saleem Abdulrasool10a49722016-04-08 16:52:00 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Justin Lebar76945b22016-04-29 23:05:19 +000068static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
69 const TargetOptions &Opts);
70
Chris Lattner09d98f52008-10-05 21:50:58 +000071//===----------------------------------------------------------------------===//
72// Defines specific to certain operating systems.
73//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000074
Torok Edwinb2b37c62009-06-30 17:10:35 +000075namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076template<typename TgtInfo>
77class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000078protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000079 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000082 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
83 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000084 void getTargetDefines(const LangOptions &Opts,
85 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000086 TgtInfo::getTargetDefines(Opts, Builder);
87 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000088 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000089
90};
Chris Lattner30ba6742009-08-10 19:03:04 +000091
Eric Christopher7d0c7252015-09-24 21:17:04 +000092// CloudABI Target
93template <typename Target>
94class CloudABITargetInfo : public OSTargetInfo<Target> {
95protected:
96 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
97 MacroBuilder &Builder) const override {
98 Builder.defineMacro("__CloudABI__");
99 Builder.defineMacro("__ELF__");
100
101 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
102 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
103 Builder.defineMacro("__STDC_UTF_16__");
104 Builder.defineMacro("__STDC_UTF_32__");
105 }
106
107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000108 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
109 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000110};
111
Daniel Dunbard86666f2010-01-26 01:44:04 +0000112static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000114 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000116 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000119 // AddressSanitizer doesn't play well with source fortification, which is on
120 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000121 if (Opts.Sanitize.has(SanitizerKind::Address))
122 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000123
John McCall460ce582015-10-22 18:38:17 +0000124 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
125 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000126 // __weak is always defined, for use in blocks and with objc pointers.
127 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000128 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000129 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000130 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000131
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000136
137 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 if (Triple.isMacOSX()) {
143 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000146 Triple.getOSVersion(Maj, Min, Rev);
147 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000148 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000149
Sebastian Pop422377c2012-01-20 22:01:23 +0000150 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000151 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000152 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153 if (PlatformName == "win32") {
154 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
155 return;
156 }
157
Evan Cheng31dd9a62014-01-26 23:12:43 +0000158 // Set the appropriate OS version define.
159 if (Triple.isiOS()) {
160 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
161 char Str[6];
162 Str[0] = '0' + Maj;
163 Str[1] = '0' + (Min / 10);
164 Str[2] = '0' + (Min % 10);
165 Str[3] = '0' + (Rev / 10);
166 Str[4] = '0' + (Rev % 10);
167 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000168 if (Triple.isTvOS())
169 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
170 else
171 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
172 Str);
173
174 } else if (Triple.isWatchOS()) {
175 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
176 char Str[6];
177 Str[0] = '0' + Maj;
178 Str[1] = '0' + (Min / 10);
179 Str[2] = '0' + (Min % 10);
180 Str[3] = '0' + (Rev / 10);
181 Str[4] = '0' + (Rev % 10);
182 Str[5] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000184 } else if (Triple.isMacOSX()) {
185 // Note that the Driver allows versions which aren't representable in the
186 // define (because we only get a single digit for the minor and micro
187 // revision numbers). So, we limit them to the maximum representable
188 // version.
189 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000190 char Str[7];
191 if (Maj < 10 || (Maj == 10 && Min < 10)) {
192 Str[0] = '0' + (Maj / 10);
193 Str[1] = '0' + (Maj % 10);
194 Str[2] = '0' + std::min(Min, 9U);
195 Str[3] = '0' + std::min(Rev, 9U);
196 Str[4] = '\0';
197 } else {
198 // Handle versions > 10.9.
199 Str[0] = '0' + (Maj / 10);
200 Str[1] = '0' + (Maj % 10);
201 Str[2] = '0' + (Min / 10);
202 Str[3] = '0' + (Min % 10);
203 Str[4] = '0' + (Rev / 10);
204 Str[5] = '0' + (Rev % 10);
205 Str[6] = '\0';
206 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000207 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000208 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210 // Tell users about the kernel if there is one.
211 if (Triple.isOSDarwin())
212 Builder.defineMacro("__MACH__");
213
Chris Bieneman46977b62016-04-29 17:53:00 +0000214 // The Watch ABI uses Dwarf EH.
215 if(Triple.isWatchABI())
216 Builder.defineMacro("__ARM_DWARF_EH__");
217
Daniel Dunbarecf13562011-04-19 21:40:34 +0000218 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000219}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000220
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221template<typename Target>
222class DarwinTargetInfo : public OSTargetInfo<Target> {
223protected:
Craig Topper3164f332014-03-11 03:39:26 +0000224 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
225 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000226 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000227 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228 }
Mike Stump11289f42009-09-09 15:08:12 +0000229
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000231 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
232 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000233 // By default, no TLS, and we whitelist permitted architecture/OS
234 // combinations.
235 this->TLSSupported = false;
236
237 if (Triple.isMacOSX())
238 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
239 else if (Triple.isiOS()) {
240 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
241 if (Triple.getArch() == llvm::Triple::x86_64 ||
242 Triple.getArch() == llvm::Triple::aarch64)
243 this->TLSSupported = !Triple.isOSVersionLT(8);
244 else if (Triple.getArch() == llvm::Triple::x86 ||
245 Triple.getArch() == llvm::Triple::arm ||
246 Triple.getArch() == llvm::Triple::thumb)
247 this->TLSSupported = !Triple.isOSVersionLT(9);
248 } else if (Triple.isWatchOS())
249 this->TLSSupported = !Triple.isOSVersionLT(2);
250
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000251 this->MCountName = "\01mcount";
252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000255 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000256 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000257 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000258 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000259 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000260 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000261 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000262
Craig Topper3164f332014-03-11 03:39:26 +0000263 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000264 // FIXME: We should return 0 when building kexts.
265 return "__TEXT,__StaticInit,regular,pure_instructions";
266 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000267
John McCalleed64c72012-01-29 01:20:30 +0000268 /// Darwin does not support protected visibility. Darwin's "default"
269 /// is very similar to ELF's "protected"; Darwin requires a "weak"
270 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000271 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000272 return false;
273 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000274
275 unsigned getExnObjectAlignment() const override {
276 // The alignment of an exception object is 8-bytes for darwin since
277 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
278 // and therefore doesn't guarantee 16-byte alignment.
279 return 64;
280 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281};
282
Chris Lattner30ba6742009-08-10 19:03:04 +0000283
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284// DragonFlyBSD Target
285template<typename Target>
286class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
287protected:
Craig Topper3164f332014-03-11 03:39:26 +0000288 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__DragonFly__");
292 Builder.defineMacro("__DragonFly_cc_version", "100001");
293 Builder.defineMacro("__ELF__");
294 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
295 Builder.defineMacro("__tune_i386__");
296 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297 }
298public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000299 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
300 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000301 switch (Triple.getArch()) {
302 default:
303 case llvm::Triple::x86:
304 case llvm::Triple::x86_64:
305 this->MCountName = ".mcount";
306 break;
307 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000308 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000309};
310
311// FreeBSD Target
312template<typename Target>
313class FreeBSDTargetInfo : public OSTargetInfo<Target> {
314protected:
Craig Topper3164f332014-03-11 03:39:26 +0000315 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
316 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000317 // FreeBSD defines; list based off of gcc output
318
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000319 unsigned Release = Triple.getOSMajorVersion();
320 if (Release == 0U)
321 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000323 Builder.defineMacro("__FreeBSD__", Twine(Release));
324 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000325 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
326 DefineStd(Builder, "unix", Opts);
327 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000328
329 // On FreeBSD, wchar_t contains the number of the code point as
330 // used by the character set of the locale. These character sets are
331 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000332 //
333 // FIXME: This is wrong; the macro refers to the numerical values
334 // of wchar_t *literals*, which are not locale-dependent. However,
335 // FreeBSD systems apparently depend on us getting this wrong, and
336 // setting this to 1 is conforming even if all the basic source
337 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000338 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000339 }
340public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000341 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
342 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000343 switch (Triple.getArch()) {
344 default:
345 case llvm::Triple::x86:
346 case llvm::Triple::x86_64:
347 this->MCountName = ".mcount";
348 break;
349 case llvm::Triple::mips:
350 case llvm::Triple::mipsel:
351 case llvm::Triple::ppc:
352 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000353 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000354 this->MCountName = "_mcount";
355 break;
356 case llvm::Triple::arm:
357 this->MCountName = "__mcount";
358 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000359 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000360 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000361};
362
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000363// GNU/kFreeBSD Target
364template<typename Target>
365class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
366protected:
Craig Topper3164f332014-03-11 03:39:26 +0000367 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
368 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000369 // GNU/kFreeBSD defines; list based off of gcc output
370
371 DefineStd(Builder, "unix", Opts);
372 Builder.defineMacro("__FreeBSD_kernel__");
373 Builder.defineMacro("__GLIBC__");
374 Builder.defineMacro("__ELF__");
375 if (Opts.POSIXThreads)
376 Builder.defineMacro("_REENTRANT");
377 if (Opts.CPlusPlus)
378 Builder.defineMacro("_GNU_SOURCE");
379 }
380public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000381 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
382 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383};
384
Reid Kleckner330fb172016-05-11 16:19:05 +0000385// Haiku Target
386template<typename Target>
387class HaikuTargetInfo : public OSTargetInfo<Target> {
388protected:
389 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
390 MacroBuilder &Builder) const override {
391 // Haiku defines; list based off of gcc output
392 Builder.defineMacro("__HAIKU__");
393 Builder.defineMacro("__ELF__");
394 DefineStd(Builder, "unix", Opts);
395 }
396public:
397 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
398 : OSTargetInfo<Target>(Triple, Opts) {
399 this->SizeType = TargetInfo::UnsignedLong;
400 this->IntPtrType = TargetInfo::SignedLong;
401 this->PtrDiffType = TargetInfo::SignedLong;
402 this->ProcessIDType = TargetInfo::SignedLong;
403 this->TLSSupported = false;
404
405 }
406};
407
Chris Lattner3e2ee142010-07-07 16:01:42 +0000408// Minix Target
409template<typename Target>
410class MinixTargetInfo : public OSTargetInfo<Target> {
411protected:
Craig Topper3164f332014-03-11 03:39:26 +0000412 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
413 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000414 // Minix defines
415
416 Builder.defineMacro("__minix", "3");
417 Builder.defineMacro("_EM_WSIZE", "4");
418 Builder.defineMacro("_EM_PSIZE", "4");
419 Builder.defineMacro("_EM_SSIZE", "2");
420 Builder.defineMacro("_EM_LSIZE", "4");
421 Builder.defineMacro("_EM_FSIZE", "4");
422 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000423 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000424 DefineStd(Builder, "unix", Opts);
425 }
426public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000427 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
428 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000429};
430
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431// Linux target
432template<typename Target>
433class LinuxTargetInfo : public OSTargetInfo<Target> {
434protected:
Craig Topper3164f332014-03-11 03:39:26 +0000435 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
436 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000437 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000438 DefineStd(Builder, "unix", Opts);
439 DefineStd(Builder, "linux", Opts);
440 Builder.defineMacro("__gnu_linux__");
441 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000442 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000443 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000444 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000445 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000446 this->PlatformName = "android";
447 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
448 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000449 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000450 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000451 if (Opts.CPlusPlus)
452 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000453 if (this->HasFloat128)
454 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000455 }
456public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000457 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
458 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000459 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000460
461 switch (Triple.getArch()) {
462 default:
463 break;
464 case llvm::Triple::ppc:
465 case llvm::Triple::ppc64:
466 case llvm::Triple::ppc64le:
467 this->MCountName = "_mcount";
468 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000469 case llvm::Triple::x86:
470 case llvm::Triple::x86_64:
471 case llvm::Triple::systemz:
472 this->HasFloat128 = true;
473 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000474 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000476
Craig Topper3164f332014-03-11 03:39:26 +0000477 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000478 return ".text.startup";
479 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000480};
481
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000482// NetBSD Target
483template<typename Target>
484class NetBSDTargetInfo : public OSTargetInfo<Target> {
485protected:
Craig Topper3164f332014-03-11 03:39:26 +0000486 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
487 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000488 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000489 Builder.defineMacro("__NetBSD__");
490 Builder.defineMacro("__unix__");
491 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000492 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000493 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000494
495 switch (Triple.getArch()) {
496 default:
497 break;
498 case llvm::Triple::arm:
499 case llvm::Triple::armeb:
500 case llvm::Triple::thumb:
501 case llvm::Triple::thumbeb:
502 Builder.defineMacro("__ARM_DWARF_EH__");
503 break;
504 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000505 }
506public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000507 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
508 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000509 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000510 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000511};
512
Torok Edwinb2b37c62009-06-30 17:10:35 +0000513// OpenBSD Target
514template<typename Target>
515class OpenBSDTargetInfo : public OSTargetInfo<Target> {
516protected:
Craig Topper3164f332014-03-11 03:39:26 +0000517 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
518 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000519 // OpenBSD defines; list based off of gcc output
520
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000521 Builder.defineMacro("__OpenBSD__");
522 DefineStd(Builder, "unix", Opts);
523 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000524 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000525 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000526 }
527public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000528 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
529 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000531
Eli Friedman3715d1f2011-12-15 02:15:56 +0000532 switch (Triple.getArch()) {
533 default:
534 case llvm::Triple::x86:
535 case llvm::Triple::x86_64:
536 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000537 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000538 this->MCountName = "__mcount";
539 break;
540 case llvm::Triple::mips64:
541 case llvm::Triple::mips64el:
542 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000543 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000544 this->MCountName = "_mcount";
545 break;
546 }
547 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000548};
549
Eli Friedman9fa28852012-08-08 23:57:20 +0000550// Bitrig Target
551template<typename Target>
552class BitrigTargetInfo : public OSTargetInfo<Target> {
553protected:
Craig Topper3164f332014-03-11 03:39:26 +0000554 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
555 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000556 // Bitrig defines; list based off of gcc output
557
558 Builder.defineMacro("__Bitrig__");
559 DefineStd(Builder, "unix", Opts);
560 Builder.defineMacro("__ELF__");
561 if (Opts.POSIXThreads)
562 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000563
564 switch (Triple.getArch()) {
565 default:
566 break;
567 case llvm::Triple::arm:
568 case llvm::Triple::armeb:
569 case llvm::Triple::thumb:
570 case llvm::Triple::thumbeb:
571 Builder.defineMacro("__ARM_DWARF_EH__");
572 break;
573 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000574 }
575public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000576 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
577 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000578 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000579 }
580};
581
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000582// PSP Target
583template<typename Target>
584class PSPTargetInfo : public OSTargetInfo<Target> {
585protected:
Craig Topper3164f332014-03-11 03:39:26 +0000586 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
587 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000588 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000589 Builder.defineMacro("PSP");
590 Builder.defineMacro("_PSP");
591 Builder.defineMacro("__psp__");
592 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000593 }
594public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000595 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000596};
597
John Thompsone467e192009-11-19 17:18:50 +0000598// PS3 PPU Target
599template<typename Target>
600class PS3PPUTargetInfo : public OSTargetInfo<Target> {
601protected:
Craig Topper3164f332014-03-11 03:39:26 +0000602 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
603 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000604 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000605 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000606 Builder.defineMacro("__PPU__");
607 Builder.defineMacro("__CELLOS_LV2__");
608 Builder.defineMacro("__ELF__");
609 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000610 Builder.defineMacro("_ARCH_PPC64");
611 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000612 }
613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000614 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
615 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000616 this->LongWidth = this->LongAlign = 32;
617 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000618 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000619 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000620 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000621 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000622 }
623};
624
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000625template <typename Target>
626class PS4OSTargetInfo : public OSTargetInfo<Target> {
627protected:
628 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
629 MacroBuilder &Builder) const override {
630 Builder.defineMacro("__FreeBSD__", "9");
631 Builder.defineMacro("__FreeBSD_cc_version", "900001");
632 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
633 DefineStd(Builder, "unix", Opts);
634 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000635 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000636 }
637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000638 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
639 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000640 this->WCharType = this->UnsignedShort;
641
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000642 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
643 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000644
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000645 // On PS4, do not honor explicit bit field alignment,
646 // as in "__attribute__((aligned(2))) int b : 1;".
647 this->UseExplicitBitFieldAlignment = false;
648
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000649 switch (Triple.getArch()) {
650 default:
651 case llvm::Triple::x86_64:
652 this->MCountName = ".mcount";
653 break;
654 }
655 }
656};
657
Torok Edwinb2b37c62009-06-30 17:10:35 +0000658// Solaris target
659template<typename Target>
660class SolarisTargetInfo : public OSTargetInfo<Target> {
661protected:
Craig Topper3164f332014-03-11 03:39:26 +0000662 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
663 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000664 DefineStd(Builder, "sun", Opts);
665 DefineStd(Builder, "unix", Opts);
666 Builder.defineMacro("__ELF__");
667 Builder.defineMacro("__svr4__");
668 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000669 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
670 // newer, but to 500 for everything else. feature_test.h has a check to
671 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000672 // with a new version.
673 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000674 Builder.defineMacro("_XOPEN_SOURCE", "600");
675 else
676 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000677 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000678 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000679 Builder.defineMacro("_LARGEFILE_SOURCE");
680 Builder.defineMacro("_LARGEFILE64_SOURCE");
681 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000682 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000683 }
684public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000685 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
686 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000687 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000688 // FIXME: WIntType should be SignedLong
689 }
690};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000691
692// Windows target
693template<typename Target>
694class WindowsTargetInfo : public OSTargetInfo<Target> {
695protected:
Craig Topper3164f332014-03-11 03:39:26 +0000696 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
697 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000698 Builder.defineMacro("_WIN32");
699 }
700 void getVisualStudioDefines(const LangOptions &Opts,
701 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000702 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000703 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000704 Builder.defineMacro("_CPPRTTI");
705
Reid Kleckner16514352015-01-30 21:42:55 +0000706 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000707 Builder.defineMacro("_CPPUNWIND");
708 }
709
David Majnemer6a658902015-07-22 22:36:26 +0000710 if (Opts.Bool)
711 Builder.defineMacro("__BOOL_DEFINED");
712
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000713 if (!Opts.CharIsSigned)
714 Builder.defineMacro("_CHAR_UNSIGNED");
715
716 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
717 // but it works for now.
718 if (Opts.POSIXThreads)
719 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000720
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000721 if (Opts.MSCompatibilityVersion) {
722 Builder.defineMacro("_MSC_VER",
723 Twine(Opts.MSCompatibilityVersion / 100000));
724 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000725 // FIXME We cannot encode the revision information into 32-bits
726 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000727
David Majnemerb710a932015-05-11 03:57:49 +0000728 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000729 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000730 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000731
732 if (Opts.MicrosoftExt) {
733 Builder.defineMacro("_MSC_EXTENSIONS");
734
735 if (Opts.CPlusPlus11) {
736 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
737 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
738 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
739 }
740 }
741
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000742 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000743 }
744
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000745public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000746 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
747 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000748};
749
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000750template <typename Target>
751class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000752protected:
Craig Topper3164f332014-03-11 03:39:26 +0000753 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
754 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000755 if (Opts.POSIXThreads)
756 Builder.defineMacro("_REENTRANT");
757 if (Opts.CPlusPlus)
758 Builder.defineMacro("_GNU_SOURCE");
759
760 DefineStd(Builder, "unix", Opts);
761 Builder.defineMacro("__ELF__");
762 Builder.defineMacro("__native_client__");
763 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000764
765public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000766 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
767 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000768 this->LongAlign = 32;
769 this->LongWidth = 32;
770 this->PointerAlign = 32;
771 this->PointerWidth = 32;
772 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000773 this->Int64Type = TargetInfo::SignedLongLong;
774 this->DoubleAlign = 64;
775 this->LongDoubleWidth = 64;
776 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000777 this->LongLongWidth = 64;
778 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000779 this->SizeType = TargetInfo::UnsignedInt;
780 this->PtrDiffType = TargetInfo::SignedInt;
781 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000782 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000783 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000784 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000785 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000786 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000787 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000788 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000789 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000790 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000791 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000792 } else {
793 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000794 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000795 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000796 }
797};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000798
Dan Gohmanc2853072015-09-03 22:51:53 +0000799// WebAssembly target
800template <typename Target>
801class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
802 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000803 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000804 // A common platform macro.
805 if (Opts.POSIXThreads)
806 Builder.defineMacro("_REENTRANT");
807 // Follow g++ convention and predefine _GNU_SOURCE for C++.
808 if (Opts.CPlusPlus)
809 Builder.defineMacro("_GNU_SOURCE");
810 }
811
812 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000813 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000814 return ".text.__startup";
815 }
816
817public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000818 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
819 const TargetOptions &Opts)
820 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000821 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000822 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
823 }
824};
Dan Gohmanc2853072015-09-03 22:51:53 +0000825
Chris Lattner09d98f52008-10-05 21:50:58 +0000826//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000827// Specific target implementations.
828//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000829
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000830// PPC abstract base class
831class PPCTargetInfo : public TargetInfo {
832 static const Builtin::Info BuiltinInfo[];
833 static const char * const GCCRegNames[];
834 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000835 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000836
837 // Target cpu features.
838 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000839 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000840 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000841 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000842 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000843 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000844 bool HasBPERMD;
845 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000846
Ulrich Weigand8afad612014-07-28 13:17:52 +0000847protected:
848 std::string ABI;
849
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000850public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000851 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000852 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
853 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000854 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000855 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000856 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000857 LongDoubleWidth = LongDoubleAlign = 128;
858 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
859 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000860
Hal Finkel6b984f02012-07-03 16:51:04 +0000861 /// \brief Flags for architecture specific defines.
862 typedef enum {
863 ArchDefineNone = 0,
864 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
865 ArchDefinePpcgr = 1 << 1,
866 ArchDefinePpcsq = 1 << 2,
867 ArchDefine440 = 1 << 3,
868 ArchDefine603 = 1 << 4,
869 ArchDefine604 = 1 << 5,
870 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000871 ArchDefinePwr5 = 1 << 7,
872 ArchDefinePwr5x = 1 << 8,
873 ArchDefinePwr6 = 1 << 9,
874 ArchDefinePwr6x = 1 << 10,
875 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000876 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000877 ArchDefinePwr9 = 1 << 13,
878 ArchDefineA2 = 1 << 14,
879 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000880 } ArchDefineTypes;
881
Bill Schmidt38378a02013-02-01 20:23:10 +0000882 // Note: GCC recognizes the following additional cpus:
883 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
884 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
885 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000886 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000887 bool CPUKnown = llvm::StringSwitch<bool>(Name)
888 .Case("generic", true)
889 .Case("440", true)
890 .Case("450", true)
891 .Case("601", true)
892 .Case("602", true)
893 .Case("603", true)
894 .Case("603e", true)
895 .Case("603ev", true)
896 .Case("604", true)
897 .Case("604e", true)
898 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000899 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000900 .Case("g3", true)
901 .Case("7400", true)
902 .Case("g4", true)
903 .Case("7450", true)
904 .Case("g4+", true)
905 .Case("750", true)
906 .Case("970", true)
907 .Case("g5", true)
908 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000909 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000910 .Case("e500mc", true)
911 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000912 .Case("power3", true)
913 .Case("pwr3", true)
914 .Case("power4", true)
915 .Case("pwr4", true)
916 .Case("power5", true)
917 .Case("pwr5", true)
918 .Case("power5x", true)
919 .Case("pwr5x", true)
920 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000921 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000922 .Case("power6x", true)
923 .Case("pwr6x", true)
924 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000925 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000926 .Case("power8", true)
927 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000928 .Case("power9", true)
929 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000930 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000931 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000932 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000933 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000934 .Case("powerpc64le", true)
935 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000936 .Default(false);
937
938 if (CPUKnown)
939 CPU = Name;
940
941 return CPUKnown;
942 }
943
Ulrich Weigand8afad612014-07-28 13:17:52 +0000944
945 StringRef getABI() const override { return ABI; }
946
Craig Topper6c03a542015-10-19 04:51:35 +0000947 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
948 return llvm::makeArrayRef(BuiltinInfo,
949 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000950 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000951
Craig Topper3164f332014-03-11 03:39:26 +0000952 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000953
Craig Topper3164f332014-03-11 03:39:26 +0000954 void getTargetDefines(const LangOptions &Opts,
955 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000956
Eric Christopher8c47b422015-10-09 18:39:55 +0000957 bool
958 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
959 StringRef CPU,
960 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000961
Craig Topper3164f332014-03-11 03:39:26 +0000962 bool handleTargetFeatures(std::vector<std::string> &Features,
963 DiagnosticsEngine &Diags) override;
964 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000965 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
966 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000967
Craig Topperf054e3a2015-10-19 03:52:27 +0000968 ArrayRef<const char *> getGCCRegNames() const override;
969 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000970 bool validateAsmConstraint(const char *&Name,
971 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000972 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000973 default: return false;
974 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000975 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000976 case 'b': // Base register
977 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000978 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000979 break;
980 // FIXME: The following are added to allow parsing.
981 // I just took a guess at what the actions should be.
982 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000983 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000984 case 'v': // Altivec vector register
985 Info.setAllowsRegister();
986 break;
987 case 'w':
988 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000989 case 'd':// VSX vector register to hold vector double data
990 case 'f':// VSX vector register to hold vector float data
991 case 's':// VSX vector register to hold scalar float data
992 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000993 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000994 break;
995 default:
996 return false;
997 }
998 Info.setAllowsRegister();
999 Name++; // Skip over 'w'.
1000 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 case 'h': // `MQ', `CTR', or `LINK' register
1002 case 'q': // `MQ' register
1003 case 'c': // `CTR' register
1004 case 'l': // `LINK' register
1005 case 'x': // `CR' register (condition register) number 0
1006 case 'y': // `CR' register (condition register)
1007 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001008 Info.setAllowsRegister();
1009 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001011 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001012 // (use `L' instead for SImode constants)
1013 case 'K': // Unsigned 16-bit constant
1014 case 'L': // Signed 16-bit constant shifted left 16 bits
1015 case 'M': // Constant larger than 31
1016 case 'N': // Exact power of 2
1017 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001018 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001019 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001020 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001021 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001022 break;
1023 case 'm': // Memory operand. Note that on PowerPC targets, m can
1024 // include addresses that update the base register. It
1025 // is therefore only safe to use `m' in an asm statement
1026 // if that asm statement accesses the operand exactly once.
1027 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001028 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001029 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001030 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001031 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001032 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1033 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001034 // register to be updated.
1035 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001036 if (Name[1] != 's')
1037 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001038 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001039 // include any automodification of the base register. Unlike
1040 // `m', this constraint can be used in asm statements that
1041 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001042 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001043 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001044 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001045 break;
1046 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001047 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001048 case 'Z': // Memory operand that is an indexed or indirect from a
1049 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001050 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001051 Info.setAllowsMemory();
1052 Info.setAllowsRegister();
1053 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001054 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001055 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001056 // register (`p' is preferable for asm statements)
1057 case 'S': // Constant suitable as a 64-bit mask operand
1058 case 'T': // Constant suitable as a 32-bit mask operand
1059 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001060 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // instructions
1062 case 'W': // Vector constant that does not require memory
1063 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001064 break;
1065 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001066 }
John Thompson07a61a42010-06-24 22:44:13 +00001067 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001068 }
Craig Topper3164f332014-03-11 03:39:26 +00001069 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001070 std::string R;
1071 switch (*Constraint) {
1072 case 'e':
1073 case 'w':
1074 // Two-character constraint; add "^" hint for later parsing.
1075 R = std::string("^") + std::string(Constraint, 2);
1076 Constraint++;
1077 break;
1078 default:
1079 return TargetInfo::convertConstraint(Constraint);
1080 }
1081 return R;
1082 }
Craig Topper3164f332014-03-11 03:39:26 +00001083 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001084 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001085 }
Craig Topper3164f332014-03-11 03:39:26 +00001086 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001087 if (RegNo == 0) return 3;
1088 if (RegNo == 1) return 4;
1089 return -1;
1090 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001091
1092 bool hasSjLjLowering() const override {
1093 return true;
1094 }
David Majnemer2617ea62015-06-09 18:05:33 +00001095
1096 bool useFloat128ManglingForLongDouble() const override {
1097 return LongDoubleWidth == 128 &&
1098 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1099 getTriple().isOSBinFormatELF();
1100 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001101};
Anders Carlssonf511f642007-11-27 04:11:28 +00001102
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001103const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001104#define BUILTIN(ID, TYPE, ATTRS) \
1105 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1106#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1107 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001108#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001109};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001110
Eric Christopher917e9522014-11-18 22:36:15 +00001111/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001112/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001113bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001114 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001115 for (const auto &Feature : Features) {
1116 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001117 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001118 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001119 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001120 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001121 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001122 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001123 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001124 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001125 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001126 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001127 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001128 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001129 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001130 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001131 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001132 } else if (Feature == "+float128") {
1133 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001134 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001135 // TODO: Finish this list and add an assert that we've handled them
1136 // all.
1137 }
Eric Christopher02c33352015-08-25 00:59:11 +00001138
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001139 return true;
1140}
1141
Chris Lattnerecd49032009-03-02 22:27:17 +00001142/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1143/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001144void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001145 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001146 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001147 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001148 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001149 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001150 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001151 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001152 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001153 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001154 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001155 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001156 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001157 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001158
Chris Lattnerecd49032009-03-02 22:27:17 +00001159 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001160 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1161 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001162 } else {
1163 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1164 getTriple().getOS() != llvm::Triple::OpenBSD)
1165 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001166 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001167
Ulrich Weigand8afad612014-07-28 13:17:52 +00001168 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001169 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001170 Builder.defineMacro("_CALL_ELF", "1");
1171 if (ABI == "elfv2")
1172 Builder.defineMacro("_CALL_ELF", "2");
1173
Chris Lattnerecd49032009-03-02 22:27:17 +00001174 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001175 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1176 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001177
Chris Lattnerecd49032009-03-02 22:27:17 +00001178 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001179 if (LongDoubleWidth == 128)
1180 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001181
John Thompsone467e192009-11-19 17:18:50 +00001182 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001183 Builder.defineMacro("__VEC__", "10206");
1184 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001185 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001186
1187 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001188 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1189 .Case("440", ArchDefineName)
1190 .Case("450", ArchDefineName | ArchDefine440)
1191 .Case("601", ArchDefineName)
1192 .Case("602", ArchDefineName | ArchDefinePpcgr)
1193 .Case("603", ArchDefineName | ArchDefinePpcgr)
1194 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1195 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1196 .Case("604", ArchDefineName | ArchDefinePpcgr)
1197 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1198 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001199 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001200 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1201 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1202 .Case("750", ArchDefineName | ArchDefinePpcgr)
1203 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1204 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001205 .Case("a2", ArchDefineA2)
1206 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001207 .Case("pwr3", ArchDefinePpcgr)
1208 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1209 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1210 | ArchDefinePpcsq)
1211 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1212 | ArchDefinePpcgr | ArchDefinePpcsq)
1213 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1214 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1215 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1216 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1217 | ArchDefinePpcsq)
1218 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1219 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001220 | ArchDefinePpcgr | ArchDefinePpcsq)
1221 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1222 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1223 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001224 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1225 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1226 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1227 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 .Case("power3", ArchDefinePpcgr)
1229 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1230 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1231 | ArchDefinePpcsq)
1232 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1233 | ArchDefinePpcgr | ArchDefinePpcsq)
1234 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1235 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1236 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1237 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1238 | ArchDefinePpcsq)
1239 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1240 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001241 | ArchDefinePpcgr | ArchDefinePpcsq)
1242 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1243 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1244 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001245 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1246 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1247 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1248 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001249 .Default(ArchDefineNone);
1250
1251 if (defs & ArchDefineName)
1252 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1253 if (defs & ArchDefinePpcgr)
1254 Builder.defineMacro("_ARCH_PPCGR");
1255 if (defs & ArchDefinePpcsq)
1256 Builder.defineMacro("_ARCH_PPCSQ");
1257 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001258 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001259 if (defs & ArchDefine603)
1260 Builder.defineMacro("_ARCH_603");
1261 if (defs & ArchDefine604)
1262 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001263 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001264 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001265 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001266 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001267 if (defs & ArchDefinePwr5x)
1268 Builder.defineMacro("_ARCH_PWR5X");
1269 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001270 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001271 if (defs & ArchDefinePwr6x)
1272 Builder.defineMacro("_ARCH_PWR6X");
1273 if (defs & ArchDefinePwr7)
1274 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001275 if (defs & ArchDefinePwr8)
1276 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001277 if (defs & ArchDefinePwr9)
1278 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001279 if (defs & ArchDefineA2)
1280 Builder.defineMacro("_ARCH_A2");
1281 if (defs & ArchDefineA2q) {
1282 Builder.defineMacro("_ARCH_A2Q");
1283 Builder.defineMacro("_ARCH_QP");
1284 }
1285
1286 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1287 Builder.defineMacro("__bg__");
1288 Builder.defineMacro("__THW_BLUEGENE__");
1289 Builder.defineMacro("__bgq__");
1290 Builder.defineMacro("__TOS_BGQ__");
1291 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001292
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001293 if (HasVSX)
1294 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001295 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001296 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001297 if (HasP8Crypto)
1298 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001299 if (HasHTM)
1300 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001301 if (HasFloat128)
1302 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001303
1304 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1305 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1306 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1307 if (PointerWidth == 64)
1308 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001309
Bill Schmidt38378a02013-02-01 20:23:10 +00001310 // FIXME: The following are not yet generated here by Clang, but are
1311 // generated by GCC:
1312 //
1313 // _SOFT_FLOAT_
1314 // __RECIP_PRECISION__
1315 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 // __RECIP__
1317 // __RECIPF__
1318 // __RSQRTE__
1319 // __RSQRTEF__
1320 // _SOFT_DOUBLE_
1321 // __NO_LWSYNC__
1322 // __HAVE_BSWAP__
1323 // __LONGDOUBLE128
1324 // __CMODEL_MEDIUM__
1325 // __CMODEL_LARGE__
1326 // _CALL_SYSV
1327 // _CALL_DARWIN
1328 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001329}
1330
Eric Christophera8a14c32015-08-31 18:39:16 +00001331// Handle explicit options being passed to the compiler here: if we've
1332// explicitly turned off vsx and turned on power8-vector or direct-move then
1333// go ahead and error since the customer has expressed a somewhat incompatible
1334// set of options.
1335static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001336 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001337
1338 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1339 FeaturesVec.end()) {
1340 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1341 FeaturesVec.end()) {
1342 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1343 << "-mno-vsx";
1344 return false;
1345 }
1346
1347 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1348 FeaturesVec.end()) {
1349 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1350 << "-mno-vsx";
1351 return false;
1352 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001353
1354 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1355 FeaturesVec.end()) {
1356 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1357 << "-mno-vsx";
1358 return false;
1359 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001360 }
1361
1362 return true;
1363}
1364
Eric Christopher8c47b422015-10-09 18:39:55 +00001365bool PPCTargetInfo::initFeatureMap(
1366 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1367 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001368 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1369 .Case("7400", true)
1370 .Case("g4", true)
1371 .Case("7450", true)
1372 .Case("g4+", true)
1373 .Case("970", true)
1374 .Case("g5", true)
1375 .Case("pwr6", true)
1376 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001377 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001378 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001379 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001380 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001381 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001382
1383 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001384 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1385 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001386 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001387 .Case("pwr8", true)
1388 .Default(false);
1389 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1390 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001391 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001392 .Case("pwr8", true)
1393 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001394 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1395 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001396 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001397 .Case("pwr8", true)
1398 .Case("pwr7", true)
1399 .Default(false);
1400 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1401 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001402 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001403 .Case("pwr8", true)
1404 .Case("pwr7", true)
1405 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001406 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1407 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001408 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001409 .Case("pwr8", true)
1410 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001411 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1412 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001413 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001414 .Case("pwr8", true)
1415 .Case("pwr7", true)
1416 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001417
Eric Christophera8a14c32015-08-31 18:39:16 +00001418 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1419 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001420
Eric Christopher007b0a02015-08-28 22:32:01 +00001421 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001422}
1423
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001424bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001425 return llvm::StringSwitch<bool>(Feature)
1426 .Case("powerpc", true)
1427 .Case("vsx", HasVSX)
1428 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001429 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001430 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001431 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001432 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001433 .Case("bpermd", HasBPERMD)
1434 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001435 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001436 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001437}
Chris Lattner17df24e2008-04-21 18:56:49 +00001438
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001439void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1440 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001441 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1442 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1443 // incompatible options.
1444 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001445 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001446 Features[Name] = Features["vsx"] = true;
1447 } else if (Name == "power8-vector") {
1448 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001449 } else if (Name == "float128") {
1450 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001451 } else {
1452 Features[Name] = true;
1453 }
1454 } else {
1455 if (Name == "vsx") {
1456 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001457 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001458 } else {
1459 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001460 }
1461 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001462}
1463
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001464const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001465 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1466 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1467 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1468 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1469 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1470 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1471 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1472 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001473 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001474 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001475 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001476 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1477 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1478 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1479 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001480 "vrsave", "vscr",
1481 "spe_acc", "spefscr",
1482 "sfp"
1483};
Chris Lattner10a5b382007-01-29 05:24:35 +00001484
Craig Topperf054e3a2015-10-19 03:52:27 +00001485ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1486 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001487}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001488
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001489const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1490 // While some of these aliases do map to different registers
1491 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001492 { { "0" }, "r0" },
1493 { { "1"}, "r1" },
1494 { { "2" }, "r2" },
1495 { { "3" }, "r3" },
1496 { { "4" }, "r4" },
1497 { { "5" }, "r5" },
1498 { { "6" }, "r6" },
1499 { { "7" }, "r7" },
1500 { { "8" }, "r8" },
1501 { { "9" }, "r9" },
1502 { { "10" }, "r10" },
1503 { { "11" }, "r11" },
1504 { { "12" }, "r12" },
1505 { { "13" }, "r13" },
1506 { { "14" }, "r14" },
1507 { { "15" }, "r15" },
1508 { { "16" }, "r16" },
1509 { { "17" }, "r17" },
1510 { { "18" }, "r18" },
1511 { { "19" }, "r19" },
1512 { { "20" }, "r20" },
1513 { { "21" }, "r21" },
1514 { { "22" }, "r22" },
1515 { { "23" }, "r23" },
1516 { { "24" }, "r24" },
1517 { { "25" }, "r25" },
1518 { { "26" }, "r26" },
1519 { { "27" }, "r27" },
1520 { { "28" }, "r28" },
1521 { { "29" }, "r29" },
1522 { { "30" }, "r30" },
1523 { { "31" }, "r31" },
1524 { { "fr0" }, "f0" },
1525 { { "fr1" }, "f1" },
1526 { { "fr2" }, "f2" },
1527 { { "fr3" }, "f3" },
1528 { { "fr4" }, "f4" },
1529 { { "fr5" }, "f5" },
1530 { { "fr6" }, "f6" },
1531 { { "fr7" }, "f7" },
1532 { { "fr8" }, "f8" },
1533 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001534 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001535 { { "fr11" }, "f11" },
1536 { { "fr12" }, "f12" },
1537 { { "fr13" }, "f13" },
1538 { { "fr14" }, "f14" },
1539 { { "fr15" }, "f15" },
1540 { { "fr16" }, "f16" },
1541 { { "fr17" }, "f17" },
1542 { { "fr18" }, "f18" },
1543 { { "fr19" }, "f19" },
1544 { { "fr20" }, "f20" },
1545 { { "fr21" }, "f21" },
1546 { { "fr22" }, "f22" },
1547 { { "fr23" }, "f23" },
1548 { { "fr24" }, "f24" },
1549 { { "fr25" }, "f25" },
1550 { { "fr26" }, "f26" },
1551 { { "fr27" }, "f27" },
1552 { { "fr28" }, "f28" },
1553 { { "fr29" }, "f29" },
1554 { { "fr30" }, "f30" },
1555 { { "fr31" }, "f31" },
1556 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557};
1558
Craig Topperf054e3a2015-10-19 03:52:27 +00001559ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1560 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001561}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001562
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001563class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001564public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001565 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1566 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001567 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001568
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001569 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001570 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001571 case llvm::Triple::FreeBSD:
1572 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001573 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001574 PtrDiffType = SignedInt;
1575 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001576 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001577 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001578 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001579 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001580
Roman Divacky3ffe7462012-03-13 19:20:17 +00001581 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1582 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001583 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001584 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001585
1586 // PPC32 supports atomics up to 4 bytes.
1587 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001588 }
1589
Craig Topper3164f332014-03-11 03:39:26 +00001590 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001591 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001592 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001593 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001594};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001595
Bill Schmidt778d3872013-07-26 01:36:11 +00001596// Note: ABI differences may eventually require us to have a separate
1597// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001598class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001599public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001600 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1601 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001602 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001603 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001604 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001605
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001606 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001607 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001608 ABI = "elfv2";
1609 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001610 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001611 ABI = "elfv1";
1612 }
1613
1614 switch (getTriple().getOS()) {
1615 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001616 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001617 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001618 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001619 case llvm::Triple::NetBSD:
1620 IntMaxType = SignedLongLong;
1621 Int64Type = SignedLongLong;
1622 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001623 default:
1624 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001625 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001626
1627 // PPC64 supports atomics up to 8 bytes.
1628 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001629 }
Craig Topper3164f332014-03-11 03:39:26 +00001630 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001631 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001632 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001633 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001634 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001635 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001636 ABI = Name;
1637 return true;
1638 }
1639 return false;
1640 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001641};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001642
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001643class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001644public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001645 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1646 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001647 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001648 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001649 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001650 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001651 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001652 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001653 }
Craig Topper3164f332014-03-11 03:39:26 +00001654 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001655 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001656 }
1657};
1658
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001659class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001660public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001661 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1662 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001663 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001664 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001665 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001666 }
1667};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001668
Eric Christopherc48497a2015-09-18 21:26:24 +00001669static const unsigned NVPTXAddrSpaceMap[] = {
1670 1, // opencl_global
1671 3, // opencl_local
1672 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001673 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001674 0, // opencl_generic
1675 1, // cuda_device
1676 4, // cuda_constant
1677 3, // cuda_shared
1678};
1679
1680class NVPTXTargetInfo : public TargetInfo {
1681 static const char *const GCCRegNames[];
1682 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001683
1684 // The GPU profiles supported by the NVPTX backend
1685 enum GPUKind {
1686 GK_NONE,
1687 GK_SM20,
1688 GK_SM21,
1689 GK_SM30,
1690 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001691 GK_SM37,
Artem Belevichffa5fc52016-05-19 17:47:47 +00001692 GK_SM50,
1693 GK_SM52,
1694 GK_SM53,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001695 } GPU;
1696
Eric Christopherc48497a2015-09-18 21:26:24 +00001697public:
Justin Lebar76945b22016-04-29 23:05:19 +00001698 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001699 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001700 BigEndian = false;
1701 TLSSupported = false;
1702 LongWidth = LongAlign = 64;
1703 AddrSpaceMap = &NVPTXAddrSpaceMap;
1704 UseAddrSpaceMapMangling = true;
1705 // Define available target features
1706 // These must be defined in sorted order!
1707 NoAsmVariants = true;
1708 // Set the default GPU to sm20
1709 GPU = GK_SM20;
Justin Lebar76945b22016-04-29 23:05:19 +00001710
1711 // If possible, get a TargetInfo for our host triple, so we can match its
1712 // types.
1713 llvm::Triple HostTriple(Opts.HostTriple);
1714 if (HostTriple.isNVPTX())
1715 return;
1716 std::unique_ptr<TargetInfo> HostTarget(
1717 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1718 if (!HostTarget) {
1719 return;
1720 }
1721
1722 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1723 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1724 BoolWidth = HostTarget->getBoolWidth();
1725 BoolAlign = HostTarget->getBoolAlign();
1726 IntWidth = HostTarget->getIntWidth();
1727 IntAlign = HostTarget->getIntAlign();
1728 HalfWidth = HostTarget->getHalfWidth();
1729 HalfAlign = HostTarget->getHalfAlign();
1730 FloatWidth = HostTarget->getFloatWidth();
1731 FloatAlign = HostTarget->getFloatAlign();
1732 DoubleWidth = HostTarget->getDoubleWidth();
1733 DoubleAlign = HostTarget->getDoubleAlign();
1734 LongWidth = HostTarget->getLongWidth();
1735 LongAlign = HostTarget->getLongAlign();
1736 LongLongWidth = HostTarget->getLongLongWidth();
1737 LongLongAlign = HostTarget->getLongLongAlign();
1738 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1739 DefaultAlignForAttributeAligned =
1740 HostTarget->getDefaultAlignForAttributeAligned();
1741 SizeType = HostTarget->getSizeType();
1742 IntMaxType = HostTarget->getIntMaxType();
1743 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1744 IntPtrType = HostTarget->getIntPtrType();
1745 WCharType = HostTarget->getWCharType();
1746 WIntType = HostTarget->getWIntType();
1747 Char16Type = HostTarget->getChar16Type();
1748 Char32Type = HostTarget->getChar32Type();
1749 Int64Type = HostTarget->getInt64Type();
1750 SigAtomicType = HostTarget->getSigAtomicType();
1751 ProcessIDType = HostTarget->getProcessIDType();
1752
1753 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1754 UseZeroLengthBitfieldAlignment =
1755 HostTarget->useZeroLengthBitfieldAlignment();
1756 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1757 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1758
1759 // Properties intentionally not copied from host:
1760 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1761 // host/device boundary.
1762 // - SuitableAlign: Not visible across the host/device boundary, and may
1763 // correctly be different on host/device, e.g. if host has wider vector
1764 // types than device.
1765 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1766 // as its double type, but that's not necessarily true on the host.
1767 // TODO: nvcc emits a warning when using long double on device; we should
1768 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001769 }
1770 void getTargetDefines(const LangOptions &Opts,
1771 MacroBuilder &Builder) const override {
1772 Builder.defineMacro("__PTX__");
1773 Builder.defineMacro("__NVPTX__");
1774 if (Opts.CUDAIsDevice) {
1775 // Set __CUDA_ARCH__ for the GPU specified.
1776 std::string CUDAArchCode;
1777 switch (GPU) {
1778 case GK_SM20:
1779 CUDAArchCode = "200";
1780 break;
1781 case GK_SM21:
1782 CUDAArchCode = "210";
1783 break;
1784 case GK_SM30:
1785 CUDAArchCode = "300";
1786 break;
1787 case GK_SM35:
1788 CUDAArchCode = "350";
1789 break;
1790 case GK_SM37:
1791 CUDAArchCode = "370";
1792 break;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001793 case GK_SM50:
1794 CUDAArchCode = "500";
1795 break;
1796 case GK_SM52:
1797 CUDAArchCode = "520";
1798 break;
1799 case GK_SM53:
1800 CUDAArchCode = "530";
1801 break;
Eric Christopherc48497a2015-09-18 21:26:24 +00001802 default:
1803 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001804 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001805 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001806 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001807 }
Craig Topper6c03a542015-10-19 04:51:35 +00001808 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1809 return llvm::makeArrayRef(BuiltinInfo,
1810 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001811 }
1812 bool hasFeature(StringRef Feature) const override {
1813 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001814 }
1815
Craig Topperf054e3a2015-10-19 03:52:27 +00001816 ArrayRef<const char *> getGCCRegNames() const override;
1817 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001818 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001819 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001820 }
1821 bool validateAsmConstraint(const char *&Name,
1822 TargetInfo::ConstraintInfo &Info) const override {
1823 switch (*Name) {
1824 default:
1825 return false;
1826 case 'c':
1827 case 'h':
1828 case 'r':
1829 case 'l':
1830 case 'f':
1831 case 'd':
1832 Info.setAllowsRegister();
1833 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001834 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001835 }
1836 const char *getClobbers() const override {
1837 // FIXME: Is this really right?
1838 return "";
1839 }
1840 BuiltinVaListKind getBuiltinVaListKind() const override {
1841 // FIXME: implement
1842 return TargetInfo::CharPtrBuiltinVaList;
1843 }
1844 bool setCPU(const std::string &Name) override {
1845 GPU = llvm::StringSwitch<GPUKind>(Name)
1846 .Case("sm_20", GK_SM20)
1847 .Case("sm_21", GK_SM21)
1848 .Case("sm_30", GK_SM30)
1849 .Case("sm_35", GK_SM35)
1850 .Case("sm_37", GK_SM37)
Artem Belevichffa5fc52016-05-19 17:47:47 +00001851 .Case("sm_50", GK_SM50)
1852 .Case("sm_52", GK_SM52)
1853 .Case("sm_53", GK_SM53)
Eric Christopherc48497a2015-09-18 21:26:24 +00001854 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001855
Eric Christopherc48497a2015-09-18 21:26:24 +00001856 return GPU != GK_NONE;
1857 }
1858};
1859
1860const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1861#define BUILTIN(ID, TYPE, ATTRS) \
1862 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1863#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1864 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1865#include "clang/Basic/BuiltinsNVPTX.def"
1866};
1867
1868const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1869
Craig Topperf054e3a2015-10-19 03:52:27 +00001870ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1871 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001872}
1873
1874class NVPTX32TargetInfo : public NVPTXTargetInfo {
1875public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001876 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1877 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001878 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001879 PointerWidth = PointerAlign = 32;
1880 SizeType = TargetInfo::UnsignedInt;
1881 PtrDiffType = TargetInfo::SignedInt;
1882 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001883 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001884 }
1885};
1886
1887class NVPTX64TargetInfo : public NVPTXTargetInfo {
1888public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001889 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1890 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001891 PointerWidth = PointerAlign = 64;
1892 SizeType = TargetInfo::UnsignedLong;
1893 PtrDiffType = TargetInfo::SignedLong;
1894 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001895 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001896 }
1897};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001898
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001899static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001900 1, // opencl_global
1901 3, // opencl_local
1902 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001903 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001904 1, // cuda_device
1905 2, // cuda_constant
1906 3 // cuda_shared
1907};
1908
Tom Stellarda96344b2014-08-21 13:58:40 +00001909// If you edit the description strings, make sure you update
1910// getPointerWidthV().
1911
Craig Topper273dbc62015-10-18 05:29:26 +00001912static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001913 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1914 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001915
Craig Topper273dbc62015-10-18 05:29:26 +00001916static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001917 "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 +00001918 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1919 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001920
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001921class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001922 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001923 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001924
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001925 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001926 enum GPUKind {
1927 GK_NONE,
1928 GK_R600,
1929 GK_R600_DOUBLE_OPS,
1930 GK_R700,
1931 GK_R700_DOUBLE_OPS,
1932 GK_EVERGREEN,
1933 GK_EVERGREEN_DOUBLE_OPS,
1934 GK_NORTHERN_ISLANDS,
1935 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001936 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001937 GK_SEA_ISLANDS,
1938 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001939 } GPU;
1940
Jan Veselyeebeaea2015-05-04 19:53:36 +00001941 bool hasFP64:1;
1942 bool hasFMAF:1;
1943 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001944
Eli Friedmand13b41e2012-10-12 23:32:00 +00001945public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001946 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
1947 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001948 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001949 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001950 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001951 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001952 hasFMAF = true;
1953 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001954 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001955 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001956 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001957 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001958 hasFMAF = false;
1959 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001960 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001961 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001962 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001963 }
1964
Tom Stellarda96344b2014-08-21 13:58:40 +00001965 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1966 if (GPU <= GK_CAYMAN)
1967 return 32;
1968
1969 switch(AddrSpace) {
1970 default:
1971 return 64;
1972 case 0:
1973 case 3:
1974 case 5:
1975 return 32;
1976 }
1977 }
1978
Craig Topper3164f332014-03-11 03:39:26 +00001979 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001980 return "";
1981 }
1982
Craig Topperf054e3a2015-10-19 03:52:27 +00001983 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001984
Craig Topperf054e3a2015-10-19 03:52:27 +00001985 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1986 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001987 }
1988
Craig Topper3164f332014-03-11 03:39:26 +00001989 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001990 TargetInfo::ConstraintInfo &Info) const override {
1991 switch (*Name) {
1992 default: break;
1993 case 'v': // vgpr
1994 case 's': // sgpr
1995 Info.setAllowsRegister();
1996 return true;
1997 }
1998 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001999 }
2000
Craig Topper6c03a542015-10-19 04:51:35 +00002001 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2002 return llvm::makeArrayRef(BuiltinInfo,
2003 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002004 }
2005
Craig Topper3164f332014-03-11 03:39:26 +00002006 void getTargetDefines(const LangOptions &Opts,
2007 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002008 if (getTriple().getArch() == llvm::Triple::amdgcn)
2009 Builder.defineMacro("__AMDGCN__");
2010 else
2011 Builder.defineMacro("__R600__");
2012
Jan Veselyeebeaea2015-05-04 19:53:36 +00002013 if (hasFMAF)
2014 Builder.defineMacro("__HAS_FMAF__");
2015 if (hasLDEXPF)
2016 Builder.defineMacro("__HAS_LDEXPF__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002017 }
2018
Craig Topper3164f332014-03-11 03:39:26 +00002019 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002020 return TargetInfo::CharPtrBuiltinVaList;
2021 }
2022
Craig Topper3164f332014-03-11 03:39:26 +00002023 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00002024 GPU = llvm::StringSwitch<GPUKind>(Name)
2025 .Case("r600" , GK_R600)
2026 .Case("rv610", GK_R600)
2027 .Case("rv620", GK_R600)
2028 .Case("rv630", GK_R600)
2029 .Case("rv635", GK_R600)
2030 .Case("rs780", GK_R600)
2031 .Case("rs880", GK_R600)
2032 .Case("rv670", GK_R600_DOUBLE_OPS)
2033 .Case("rv710", GK_R700)
2034 .Case("rv730", GK_R700)
2035 .Case("rv740", GK_R700_DOUBLE_OPS)
2036 .Case("rv770", GK_R700_DOUBLE_OPS)
2037 .Case("palm", GK_EVERGREEN)
2038 .Case("cedar", GK_EVERGREEN)
2039 .Case("sumo", GK_EVERGREEN)
2040 .Case("sumo2", GK_EVERGREEN)
2041 .Case("redwood", GK_EVERGREEN)
2042 .Case("juniper", GK_EVERGREEN)
2043 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2044 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2045 .Case("barts", GK_NORTHERN_ISLANDS)
2046 .Case("turks", GK_NORTHERN_ISLANDS)
2047 .Case("caicos", GK_NORTHERN_ISLANDS)
2048 .Case("cayman", GK_CAYMAN)
2049 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00002050 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002051 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2052 .Case("verde", GK_SOUTHERN_ISLANDS)
2053 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002054 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002055 .Case("bonaire", GK_SEA_ISLANDS)
2056 .Case("kabini", GK_SEA_ISLANDS)
2057 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002058 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002059 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002060 .Case("tonga", GK_VOLCANIC_ISLANDS)
2061 .Case("iceland", GK_VOLCANIC_ISLANDS)
2062 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002063 .Case("fiji", GK_VOLCANIC_ISLANDS)
2064 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002065 .Default(GK_NONE);
2066
2067 if (GPU == GK_NONE) {
2068 return false;
2069 }
2070
2071 // Set the correct data layout
2072 switch (GPU) {
2073 case GK_NONE:
2074 case GK_R600:
2075 case GK_R700:
2076 case GK_EVERGREEN:
2077 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002078 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002079 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002080 hasFMAF = false;
2081 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002082 break;
2083 case GK_R600_DOUBLE_OPS:
2084 case GK_R700_DOUBLE_OPS:
2085 case GK_EVERGREEN_DOUBLE_OPS:
2086 case GK_CAYMAN:
Matt Arsenaultedc7c6b2016-03-30 21:32:37 +00002087 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002088 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002089 hasFMAF = true;
2090 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002091 break;
2092 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00002093 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00002094 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002095 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002096 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002097 hasFMAF = true;
2098 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002099 break;
2100 }
2101
2102 return true;
2103 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002104
2105 void setSupportedOpenCLOpts() override {
2106 auto &Opts = getSupportedOpenCLOpts();
2107 Opts.cl_clang_storage_class_specifiers = 1;
2108 Opts.cl_khr_gl_sharing = 1;
2109 Opts.cl_khr_gl_event = 1;
2110 Opts.cl_khr_d3d10_sharing = 1;
2111 Opts.cl_khr_subgroups = 1;
2112
2113 if (hasFP64)
2114 Opts.cl_khr_fp64 = 1;
2115 if (GPU >= GK_NORTHERN_ISLANDS) {
2116 Opts.cl_khr_byte_addressable_store = 1;
2117 Opts.cl_khr_global_int32_base_atomics = 1;
2118 Opts.cl_khr_global_int32_extended_atomics = 1;
2119 Opts.cl_khr_local_int32_base_atomics = 1;
2120 Opts.cl_khr_local_int32_extended_atomics = 1;
2121 }
2122 if (GPU >= GK_SOUTHERN_ISLANDS)
2123 Opts.cl_khr_fp16 = 1;
2124 Opts.cl_khr_int64_base_atomics = 1;
2125 Opts.cl_khr_int64_extended_atomics = 1;
2126 Opts.cl_khr_3d_image_writes = 1;
2127 Opts.cl_khr_gl_msaa_sharing = 1;
2128 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002129};
2130
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002131const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002132#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002133 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002134#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002135};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002136const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002137 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2138 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2139 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2140 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2141 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2142 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2143 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2144 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2145 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2146 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2147 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2148 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2149 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2150 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2151 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2152 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2153 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2154 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2155 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2156 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2157 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2158 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2159 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2160 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2161 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2162 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2163 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2164 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2165 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2166 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2167 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2168 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2169 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2170 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2171 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2172 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2173 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2174 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2175 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2176 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2177 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2178 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2179 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2180 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2181 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2182 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2183 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002184 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002185 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2186 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002187};
2188
Craig Topperf054e3a2015-10-19 03:52:27 +00002189ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2190 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002191}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002192
Eli Friedman3fd920a2008-08-20 02:34:37 +00002193// Namespace for x86 abstract base class
2194const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002195#define BUILTIN(ID, TYPE, ATTRS) \
2196 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002197#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002198 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002199#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002200 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002201#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002202};
Eli Friedmanb5366062008-05-20 14:21:01 +00002203
Nuno Lopescfca1f02009-12-23 17:49:57 +00002204static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002205 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2206 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002207 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002208 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2209 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2210 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002211 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002212 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2213 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002214 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2215 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2216 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2217 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2218 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2219 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2220 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2221 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002222};
2223
Eric Christophercdd36352011-06-21 00:05:20 +00002224const TargetInfo::AddlRegName AddlRegNames[] = {
2225 { { "al", "ah", "eax", "rax" }, 0 },
2226 { { "bl", "bh", "ebx", "rbx" }, 3 },
2227 { { "cl", "ch", "ecx", "rcx" }, 2 },
2228 { { "dl", "dh", "edx", "rdx" }, 1 },
2229 { { "esi", "rsi" }, 4 },
2230 { { "edi", "rdi" }, 5 },
2231 { { "esp", "rsp" }, 7 },
2232 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002233 { { "r8d", "r8w", "r8b" }, 38 },
2234 { { "r9d", "r9w", "r9b" }, 39 },
2235 { { "r10d", "r10w", "r10b" }, 40 },
2236 { { "r11d", "r11w", "r11b" }, 41 },
2237 { { "r12d", "r12w", "r12b" }, 42 },
2238 { { "r13d", "r13w", "r13b" }, 43 },
2239 { { "r14d", "r14w", "r14b" }, 44 },
2240 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002241};
2242
2243// X86 target abstract base class; x86-32 and x86-64 are very close, so
2244// most of the implementation can be shared.
2245class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002246 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002247 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002248 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002249 enum MMX3DNowEnum {
2250 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002251 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002252 enum XOPEnum {
2253 NoXOP,
2254 SSE4A,
2255 FMA4,
2256 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002257 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002258
Craig Topper543f3bd2015-10-14 23:47:57 +00002259 bool HasAES = false;
2260 bool HasPCLMUL = false;
2261 bool HasLZCNT = false;
2262 bool HasRDRND = false;
2263 bool HasFSGSBASE = false;
2264 bool HasBMI = false;
2265 bool HasBMI2 = false;
2266 bool HasPOPCNT = false;
2267 bool HasRTM = false;
2268 bool HasPRFCHW = false;
2269 bool HasRDSEED = false;
2270 bool HasADX = false;
2271 bool HasTBM = false;
2272 bool HasFMA = false;
2273 bool HasF16C = false;
2274 bool HasAVX512CD = false;
2275 bool HasAVX512ER = false;
2276 bool HasAVX512PF = false;
2277 bool HasAVX512DQ = false;
2278 bool HasAVX512BW = false;
2279 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002280 bool HasAVX512VBMI = false;
2281 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002282 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002283 bool HasMPX = false;
2284 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002285 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002286 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002287 bool HasXSAVE = false;
2288 bool HasXSAVEOPT = false;
2289 bool HasXSAVEC = false;
2290 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002291 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002292 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002293 bool HasCLFLUSHOPT = false;
2294 bool HasPCOMMIT = false;
2295 bool HasCLWB = false;
2296 bool HasUMIP = false;
2297 bool HasMOVBE = false;
2298 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002299
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002300 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2301 ///
2302 /// Each enumeration represents a particular CPU supported by Clang. These
2303 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2304 enum CPUKind {
2305 CK_Generic,
2306
2307 /// \name i386
2308 /// i386-generation processors.
2309 //@{
2310 CK_i386,
2311 //@}
2312
2313 /// \name i486
2314 /// i486-generation processors.
2315 //@{
2316 CK_i486,
2317 CK_WinChipC6,
2318 CK_WinChip2,
2319 CK_C3,
2320 //@}
2321
2322 /// \name i586
2323 /// i586-generation processors, P5 microarchitecture based.
2324 //@{
2325 CK_i586,
2326 CK_Pentium,
2327 CK_PentiumMMX,
2328 //@}
2329
2330 /// \name i686
2331 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2332 //@{
2333 CK_i686,
2334 CK_PentiumPro,
2335 CK_Pentium2,
2336 CK_Pentium3,
2337 CK_Pentium3M,
2338 CK_PentiumM,
2339 CK_C3_2,
2340
2341 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2342 /// Clang however has some logic to suport this.
2343 // FIXME: Warn, deprecate, and potentially remove this.
2344 CK_Yonah,
2345 //@}
2346
2347 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002348 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002349 //@{
2350 CK_Pentium4,
2351 CK_Pentium4M,
2352 CK_Prescott,
2353 CK_Nocona,
2354 //@}
2355
2356 /// \name Core
2357 /// Core microarchitecture based processors.
2358 //@{
2359 CK_Core2,
2360
2361 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2362 /// codename which GCC no longer accepts as an option to -march, but Clang
2363 /// has some logic for recognizing it.
2364 // FIXME: Warn, deprecate, and potentially remove this.
2365 CK_Penryn,
2366 //@}
2367
2368 /// \name Atom
2369 /// Atom processors
2370 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002371 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002372 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002373 //@}
2374
2375 /// \name Nehalem
2376 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002377 CK_Nehalem,
2378
2379 /// \name Westmere
2380 /// Westmere microarchitecture based processors.
2381 CK_Westmere,
2382
2383 /// \name Sandy Bridge
2384 /// Sandy Bridge microarchitecture based processors.
2385 CK_SandyBridge,
2386
2387 /// \name Ivy Bridge
2388 /// Ivy Bridge microarchitecture based processors.
2389 CK_IvyBridge,
2390
2391 /// \name Haswell
2392 /// Haswell microarchitecture based processors.
2393 CK_Haswell,
2394
2395 /// \name Broadwell
2396 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002397 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002398
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002399 /// \name Skylake Client
2400 /// Skylake client microarchitecture based processors.
2401 CK_SkylakeClient,
2402
2403 /// \name Skylake Server
2404 /// Skylake server microarchitecture based processors.
2405 CK_SkylakeServer,
2406
2407 /// \name Cannonlake Client
2408 /// Cannonlake client microarchitecture based processors.
2409 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002410
Craig Topper449314e2013-08-20 07:09:39 +00002411 /// \name Knights Landing
2412 /// Knights Landing processor.
2413 CK_KNL,
2414
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002415 /// \name Lakemont
2416 /// Lakemont microarchitecture based processors.
2417 CK_Lakemont,
2418
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002419 /// \name K6
2420 /// K6 architecture processors.
2421 //@{
2422 CK_K6,
2423 CK_K6_2,
2424 CK_K6_3,
2425 //@}
2426
2427 /// \name K7
2428 /// K7 architecture processors.
2429 //@{
2430 CK_Athlon,
2431 CK_AthlonThunderbird,
2432 CK_Athlon4,
2433 CK_AthlonXP,
2434 CK_AthlonMP,
2435 //@}
2436
2437 /// \name K8
2438 /// K8 architecture processors.
2439 //@{
2440 CK_Athlon64,
2441 CK_Athlon64SSE3,
2442 CK_AthlonFX,
2443 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002444 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002445 CK_Opteron,
2446 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002447 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002448 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002449
Benjamin Kramer569f2152012-01-10 11:50:18 +00002450 /// \name Bobcat
2451 /// Bobcat architecture processors.
2452 //@{
2453 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002454 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002455 //@}
2456
2457 /// \name Bulldozer
2458 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002459 //@{
2460 CK_BDVER1,
2461 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002462 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002463 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002464 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002465
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002466 /// This specification is deprecated and will be removed in the future.
2467 /// Users should prefer \see CK_K8.
2468 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002469 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002470 CK_x86_64,
2471 //@}
2472
2473 /// \name Geode
2474 /// Geode processors.
2475 //@{
2476 CK_Geode
2477 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002478 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002479
Eric Christopherc50738f2015-08-27 00:05:50 +00002480 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002481 return llvm::StringSwitch<CPUKind>(CPU)
2482 .Case("i386", CK_i386)
2483 .Case("i486", CK_i486)
2484 .Case("winchip-c6", CK_WinChipC6)
2485 .Case("winchip2", CK_WinChip2)
2486 .Case("c3", CK_C3)
2487 .Case("i586", CK_i586)
2488 .Case("pentium", CK_Pentium)
2489 .Case("pentium-mmx", CK_PentiumMMX)
2490 .Case("i686", CK_i686)
2491 .Case("pentiumpro", CK_PentiumPro)
2492 .Case("pentium2", CK_Pentium2)
2493 .Case("pentium3", CK_Pentium3)
2494 .Case("pentium3m", CK_Pentium3M)
2495 .Case("pentium-m", CK_PentiumM)
2496 .Case("c3-2", CK_C3_2)
2497 .Case("yonah", CK_Yonah)
2498 .Case("pentium4", CK_Pentium4)
2499 .Case("pentium4m", CK_Pentium4M)
2500 .Case("prescott", CK_Prescott)
2501 .Case("nocona", CK_Nocona)
2502 .Case("core2", CK_Core2)
2503 .Case("penryn", CK_Penryn)
2504 .Case("bonnell", CK_Bonnell)
2505 .Case("atom", CK_Bonnell) // Legacy name.
2506 .Case("silvermont", CK_Silvermont)
2507 .Case("slm", CK_Silvermont) // Legacy name.
2508 .Case("nehalem", CK_Nehalem)
2509 .Case("corei7", CK_Nehalem) // Legacy name.
2510 .Case("westmere", CK_Westmere)
2511 .Case("sandybridge", CK_SandyBridge)
2512 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2513 .Case("ivybridge", CK_IvyBridge)
2514 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2515 .Case("haswell", CK_Haswell)
2516 .Case("core-avx2", CK_Haswell) // Legacy name.
2517 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002518 .Case("skylake", CK_SkylakeClient)
2519 .Case("skylake-avx512", CK_SkylakeServer)
2520 .Case("skx", CK_SkylakeServer) // Legacy name.
2521 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002522 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002523 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002524 .Case("k6", CK_K6)
2525 .Case("k6-2", CK_K6_2)
2526 .Case("k6-3", CK_K6_3)
2527 .Case("athlon", CK_Athlon)
2528 .Case("athlon-tbird", CK_AthlonThunderbird)
2529 .Case("athlon-4", CK_Athlon4)
2530 .Case("athlon-xp", CK_AthlonXP)
2531 .Case("athlon-mp", CK_AthlonMP)
2532 .Case("athlon64", CK_Athlon64)
2533 .Case("athlon64-sse3", CK_Athlon64SSE3)
2534 .Case("athlon-fx", CK_AthlonFX)
2535 .Case("k8", CK_K8)
2536 .Case("k8-sse3", CK_K8SSE3)
2537 .Case("opteron", CK_Opteron)
2538 .Case("opteron-sse3", CK_OpteronSSE3)
2539 .Case("barcelona", CK_AMDFAM10)
2540 .Case("amdfam10", CK_AMDFAM10)
2541 .Case("btver1", CK_BTVER1)
2542 .Case("btver2", CK_BTVER2)
2543 .Case("bdver1", CK_BDVER1)
2544 .Case("bdver2", CK_BDVER2)
2545 .Case("bdver3", CK_BDVER3)
2546 .Case("bdver4", CK_BDVER4)
2547 .Case("x86-64", CK_x86_64)
2548 .Case("geode", CK_Geode)
2549 .Default(CK_Generic);
2550 }
2551
Rafael Espindolaeb265472013-08-21 21:59:03 +00002552 enum FPMathKind {
2553 FP_Default,
2554 FP_SSE,
2555 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002556 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002557
Eli Friedman3fd920a2008-08-20 02:34:37 +00002558public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002559 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2560 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002561 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002562 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002563 }
Craig Topper3164f332014-03-11 03:39:26 +00002564 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002565 // X87 evaluates with 80 bits "long double" precision.
2566 return SSELevel == NoSSE ? 2 : 0;
2567 }
Craig Topper6c03a542015-10-19 04:51:35 +00002568 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2569 return llvm::makeArrayRef(BuiltinInfo,
2570 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002571 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002572 ArrayRef<const char *> getGCCRegNames() const override {
2573 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002574 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002575 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2576 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002577 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002578 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2579 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002580 }
Eric Christopherd9832702015-06-29 21:00:05 +00002581 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002582 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002583 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002584
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002585 bool validateGlobalRegisterVariable(StringRef RegName,
2586 unsigned RegSize,
2587 bool &HasSizeMismatch) const override {
2588 // esp and ebp are the only 32-bit registers the x86 backend can currently
2589 // handle.
2590 if (RegName.equals("esp") || RegName.equals("ebp")) {
2591 // Check that the register size is 32-bit.
2592 HasSizeMismatch = RegSize != 32;
2593 return true;
2594 }
2595
2596 return false;
2597 }
2598
Akira Hatanaka974131e2014-09-18 18:17:18 +00002599 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2600
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002601 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2602
Akira Hatanaka974131e2014-09-18 18:17:18 +00002603 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2604
Craig Topper3164f332014-03-11 03:39:26 +00002605 std::string convertConstraint(const char *&Constraint) const override;
2606 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002607 return "~{dirflag},~{fpsr},~{flags}";
2608 }
Craig Topper3164f332014-03-11 03:39:26 +00002609 void getTargetDefines(const LangOptions &Opts,
2610 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002611 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2612 bool Enabled);
2613 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2614 bool Enabled);
2615 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2616 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002617 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2618 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002619 setFeatureEnabledImpl(Features, Name, Enabled);
2620 }
2621 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002622 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002623 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2624 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002625 bool
2626 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2627 StringRef CPU,
2628 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002629 bool hasFeature(StringRef Feature) const override;
2630 bool handleTargetFeatures(std::vector<std::string> &Features,
2631 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002632 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002633 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2634 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002635 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002636 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002637 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002638 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002639 return "no-mmx";
2640 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002641 }
Craig Topper3164f332014-03-11 03:39:26 +00002642 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002643 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002644
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002645 // Perform any per-CPU checks necessary to determine if this CPU is
2646 // acceptable.
2647 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2648 // invalid without explaining *why*.
2649 switch (CPU) {
2650 case CK_Generic:
2651 // No processor selected!
2652 return false;
2653
2654 case CK_i386:
2655 case CK_i486:
2656 case CK_WinChipC6:
2657 case CK_WinChip2:
2658 case CK_C3:
2659 case CK_i586:
2660 case CK_Pentium:
2661 case CK_PentiumMMX:
2662 case CK_i686:
2663 case CK_PentiumPro:
2664 case CK_Pentium2:
2665 case CK_Pentium3:
2666 case CK_Pentium3M:
2667 case CK_PentiumM:
2668 case CK_Yonah:
2669 case CK_C3_2:
2670 case CK_Pentium4:
2671 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002672 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002673 case CK_Prescott:
2674 case CK_K6:
2675 case CK_K6_2:
2676 case CK_K6_3:
2677 case CK_Athlon:
2678 case CK_AthlonThunderbird:
2679 case CK_Athlon4:
2680 case CK_AthlonXP:
2681 case CK_AthlonMP:
2682 case CK_Geode:
2683 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002684 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002685 return false;
2686
2687 // Fallthrough
2688 case CK_Nocona:
2689 case CK_Core2:
2690 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002691 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002692 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002693 case CK_Nehalem:
2694 case CK_Westmere:
2695 case CK_SandyBridge:
2696 case CK_IvyBridge:
2697 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002698 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002699 case CK_SkylakeClient:
2700 case CK_SkylakeServer:
2701 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002702 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002703 case CK_Athlon64:
2704 case CK_Athlon64SSE3:
2705 case CK_AthlonFX:
2706 case CK_K8:
2707 case CK_K8SSE3:
2708 case CK_Opteron:
2709 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002710 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002711 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002712 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002713 case CK_BDVER1:
2714 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002715 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002716 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002717 case CK_x86_64:
2718 return true;
2719 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002720 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002721 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002722
Craig Topper3164f332014-03-11 03:39:26 +00002723 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002724
Craig Topper3164f332014-03-11 03:39:26 +00002725 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002726 // Most of the non-ARM calling conventions are i386 conventions.
2727 switch (CC) {
2728 case CC_X86ThisCall:
2729 case CC_X86FastCall:
2730 case CC_X86StdCall:
2731 case CC_X86VectorCall:
2732 case CC_C:
2733 case CC_Swift:
2734 case CC_X86Pascal:
2735 case CC_IntelOclBicc:
2736 return CCCR_OK;
2737 default:
2738 return CCCR_Warning;
2739 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002740 }
2741
Craig Topper3164f332014-03-11 03:39:26 +00002742 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002743 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002744 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002745
2746 bool hasSjLjLowering() const override {
2747 return true;
2748 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002749
2750 void setSupportedOpenCLOpts() override {
2751 getSupportedOpenCLOpts().setAll();
2752 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002753};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002754
Rafael Espindolaeb265472013-08-21 21:59:03 +00002755bool X86TargetInfo::setFPMath(StringRef Name) {
2756 if (Name == "387") {
2757 FPMath = FP_387;
2758 return true;
2759 }
2760 if (Name == "sse") {
2761 FPMath = FP_SSE;
2762 return true;
2763 }
2764 return false;
2765}
2766
Eric Christopher007b0a02015-08-28 22:32:01 +00002767bool X86TargetInfo::initFeatureMap(
2768 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002769 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002770 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002771 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002772 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002773 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002774
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002775 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002776
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002777 // Enable X87 for all X86 processors but Lakemont.
2778 if (Kind != CK_Lakemont)
2779 setFeatureEnabledImpl(Features, "x87", true);
2780
2781 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002782 case CK_Generic:
2783 case CK_i386:
2784 case CK_i486:
2785 case CK_i586:
2786 case CK_Pentium:
2787 case CK_i686:
2788 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002789 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002790 break;
2791 case CK_PentiumMMX:
2792 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002793 case CK_K6:
2794 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002795 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002796 break;
2797 case CK_Pentium3:
2798 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002799 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002800 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002801 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002802 break;
2803 case CK_PentiumM:
2804 case CK_Pentium4:
2805 case CK_Pentium4M:
2806 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002807 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002808 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002809 break;
2810 case CK_Yonah:
2811 case CK_Prescott:
2812 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002813 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002814 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002815 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002816 break;
2817 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002818 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002819 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002820 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002821 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002822 break;
2823 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002824 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002825 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002826 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002827 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002828 case CK_Cannonlake:
2829 setFeatureEnabledImpl(Features, "avx512ifma", true);
2830 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2831 setFeatureEnabledImpl(Features, "sha", true);
2832 setFeatureEnabledImpl(Features, "umip", true);
2833 // FALLTHROUGH
2834 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002835 setFeatureEnabledImpl(Features, "avx512f", true);
2836 setFeatureEnabledImpl(Features, "avx512cd", true);
2837 setFeatureEnabledImpl(Features, "avx512dq", true);
2838 setFeatureEnabledImpl(Features, "avx512bw", true);
2839 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002840 setFeatureEnabledImpl(Features, "pku", true);
2841 setFeatureEnabledImpl(Features, "pcommit", true);
2842 setFeatureEnabledImpl(Features, "clwb", true);
2843 // FALLTHROUGH
2844 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002845 setFeatureEnabledImpl(Features, "xsavec", true);
2846 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002847 setFeatureEnabledImpl(Features, "mpx", true);
2848 setFeatureEnabledImpl(Features, "sgx", true);
2849 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002850 // FALLTHROUGH
2851 case CK_Broadwell:
2852 setFeatureEnabledImpl(Features, "rdseed", true);
2853 setFeatureEnabledImpl(Features, "adx", true);
2854 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002855 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002856 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002857 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002858 setFeatureEnabledImpl(Features, "bmi", true);
2859 setFeatureEnabledImpl(Features, "bmi2", true);
2860 setFeatureEnabledImpl(Features, "rtm", true);
2861 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002862 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002863 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002864 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002865 setFeatureEnabledImpl(Features, "rdrnd", true);
2866 setFeatureEnabledImpl(Features, "f16c", true);
2867 setFeatureEnabledImpl(Features, "fsgsbase", true);
2868 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002869 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002870 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002871 setFeatureEnabledImpl(Features, "xsave", true);
2872 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002873 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002874 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002875 case CK_Silvermont:
2876 setFeatureEnabledImpl(Features, "aes", true);
2877 setFeatureEnabledImpl(Features, "pclmul", true);
2878 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002879 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002880 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002881 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002882 setFeatureEnabledImpl(Features, "cx16", true);
2883 break;
2884 case CK_KNL:
2885 setFeatureEnabledImpl(Features, "avx512f", true);
2886 setFeatureEnabledImpl(Features, "avx512cd", true);
2887 setFeatureEnabledImpl(Features, "avx512er", true);
2888 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002889 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002890 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002891 setFeatureEnabledImpl(Features, "rdseed", true);
2892 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002893 setFeatureEnabledImpl(Features, "lzcnt", true);
2894 setFeatureEnabledImpl(Features, "bmi", true);
2895 setFeatureEnabledImpl(Features, "bmi2", true);
2896 setFeatureEnabledImpl(Features, "rtm", true);
2897 setFeatureEnabledImpl(Features, "fma", true);
2898 setFeatureEnabledImpl(Features, "rdrnd", true);
2899 setFeatureEnabledImpl(Features, "f16c", true);
2900 setFeatureEnabledImpl(Features, "fsgsbase", true);
2901 setFeatureEnabledImpl(Features, "aes", true);
2902 setFeatureEnabledImpl(Features, "pclmul", true);
2903 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002904 setFeatureEnabledImpl(Features, "xsaveopt", true);
2905 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002906 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002907 break;
2908 case CK_K6_2:
2909 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002910 case CK_WinChip2:
2911 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002912 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002913 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002914 case CK_Athlon:
2915 case CK_AthlonThunderbird:
2916 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002917 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002918 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002919 case CK_Athlon4:
2920 case CK_AthlonXP:
2921 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002922 setFeatureEnabledImpl(Features, "sse", true);
2923 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002924 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002925 break;
2926 case CK_K8:
2927 case CK_Opteron:
2928 case CK_Athlon64:
2929 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002930 setFeatureEnabledImpl(Features, "sse2", true);
2931 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002932 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002933 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002934 case CK_AMDFAM10:
2935 setFeatureEnabledImpl(Features, "sse4a", true);
2936 setFeatureEnabledImpl(Features, "lzcnt", true);
2937 setFeatureEnabledImpl(Features, "popcnt", true);
2938 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002939 case CK_K8SSE3:
2940 case CK_OpteronSSE3:
2941 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002942 setFeatureEnabledImpl(Features, "sse3", true);
2943 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002944 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002945 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002946 case CK_BTVER2:
2947 setFeatureEnabledImpl(Features, "avx", true);
2948 setFeatureEnabledImpl(Features, "aes", true);
2949 setFeatureEnabledImpl(Features, "pclmul", true);
2950 setFeatureEnabledImpl(Features, "bmi", true);
2951 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002952 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002953 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002954 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002955 setFeatureEnabledImpl(Features, "ssse3", true);
2956 setFeatureEnabledImpl(Features, "sse4a", true);
2957 setFeatureEnabledImpl(Features, "lzcnt", true);
2958 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002959 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002960 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002961 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002962 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002963 case CK_BDVER4:
2964 setFeatureEnabledImpl(Features, "avx2", true);
2965 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002966 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00002967 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002968 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002969 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002970 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002971 // FALLTHROUGH
2972 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002973 setFeatureEnabledImpl(Features, "bmi", true);
2974 setFeatureEnabledImpl(Features, "fma", true);
2975 setFeatureEnabledImpl(Features, "f16c", true);
2976 setFeatureEnabledImpl(Features, "tbm", true);
2977 // FALLTHROUGH
2978 case CK_BDVER1:
2979 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002980 setFeatureEnabledImpl(Features, "xop", true);
2981 setFeatureEnabledImpl(Features, "lzcnt", true);
2982 setFeatureEnabledImpl(Features, "aes", true);
2983 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002984 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002985 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002986 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002987 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002988 break;
Eli Friedman33465822011-07-08 23:31:17 +00002989 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002990 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2991 return false;
2992
2993 // Can't do this earlier because we need to be able to explicitly enable
2994 // or disable these features and the things that they depend upon.
2995
2996 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2997 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002998 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002999 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3000 FeaturesVec.end())
3001 Features["popcnt"] = true;
3002
3003 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3004 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003005 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003006 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3007 FeaturesVec.end())
3008 Features["prfchw"] = true;
3009
Eric Christophera7260af2015-10-08 20:10:18 +00003010 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3011 // then enable MMX.
3012 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003013 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003014 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3015 FeaturesVec.end())
3016 Features["mmx"] = true;
3017
Eric Christopherbbd746d2015-10-08 20:10:14 +00003018 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003019}
3020
Rafael Espindolae62e2792013-08-20 13:44:29 +00003021void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003022 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003023 if (Enabled) {
3024 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003025 case AVX512F:
3026 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003027 case AVX2:
3028 Features["avx2"] = true;
3029 case AVX:
3030 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003031 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003032 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003033 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003034 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003035 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003036 case SSSE3:
3037 Features["ssse3"] = true;
3038 case SSE3:
3039 Features["sse3"] = true;
3040 case SSE2:
3041 Features["sse2"] = true;
3042 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003043 Features["sse"] = true;
3044 case NoSSE:
3045 break;
3046 }
3047 return;
3048 }
3049
3050 switch (Level) {
3051 case NoSSE:
3052 case SSE1:
3053 Features["sse"] = false;
3054 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003055 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3056 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003057 case SSE3:
3058 Features["sse3"] = false;
3059 setXOPLevel(Features, NoXOP, false);
3060 case SSSE3:
3061 Features["ssse3"] = false;
3062 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003063 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003064 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003065 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003066 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003067 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3068 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003069 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003070 case AVX2:
3071 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003072 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003073 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003074 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003075 Features["avx512vl"] = Features["avx512vbmi"] =
3076 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003077 }
3078}
3079
3080void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003081 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003082 if (Enabled) {
3083 switch (Level) {
3084 case AMD3DNowAthlon:
3085 Features["3dnowa"] = true;
3086 case AMD3DNow:
3087 Features["3dnow"] = true;
3088 case MMX:
3089 Features["mmx"] = true;
3090 case NoMMX3DNow:
3091 break;
3092 }
3093 return;
3094 }
3095
3096 switch (Level) {
3097 case NoMMX3DNow:
3098 case MMX:
3099 Features["mmx"] = false;
3100 case AMD3DNow:
3101 Features["3dnow"] = false;
3102 case AMD3DNowAthlon:
3103 Features["3dnowa"] = false;
3104 }
3105}
3106
3107void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003108 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003109 if (Enabled) {
3110 switch (Level) {
3111 case XOP:
3112 Features["xop"] = true;
3113 case FMA4:
3114 Features["fma4"] = true;
3115 setSSELevel(Features, AVX, true);
3116 case SSE4A:
3117 Features["sse4a"] = true;
3118 setSSELevel(Features, SSE3, true);
3119 case NoXOP:
3120 break;
3121 }
3122 return;
3123 }
3124
3125 switch (Level) {
3126 case NoXOP:
3127 case SSE4A:
3128 Features["sse4a"] = false;
3129 case FMA4:
3130 Features["fma4"] = false;
3131 case XOP:
3132 Features["xop"] = false;
3133 }
3134}
3135
Craig Topper86d79ef2013-09-17 04:51:29 +00003136void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3137 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003138 // This is a bit of a hack to deal with the sse4 target feature when used
3139 // as part of the target attribute. We handle sse4 correctly everywhere
3140 // else. See below for more information on how we handle the sse4 options.
3141 if (Name != "sse4")
3142 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003143
Craig Topper29561122013-09-19 01:13:07 +00003144 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003145 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003146 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003147 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003148 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003149 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003150 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003151 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003152 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003153 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003154 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003155 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003156 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003157 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003158 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003159 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003160 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003161 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003162 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003163 if (Enabled)
3164 setSSELevel(Features, SSE2, Enabled);
3165 } else if (Name == "pclmul") {
3166 if (Enabled)
3167 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003168 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003169 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003170 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003171 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003172 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003173 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003174 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3175 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3176 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003177 if (Enabled)
3178 setSSELevel(Features, AVX512F, Enabled);
3179 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003180 if (Enabled)
3181 setSSELevel(Features, AVX, Enabled);
3182 } else if (Name == "fma4") {
3183 setXOPLevel(Features, FMA4, Enabled);
3184 } else if (Name == "xop") {
3185 setXOPLevel(Features, XOP, Enabled);
3186 } else if (Name == "sse4a") {
3187 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003188 } else if (Name == "f16c") {
3189 if (Enabled)
3190 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003191 } else if (Name == "sha") {
3192 if (Enabled)
3193 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003194 } else if (Name == "sse4") {
3195 // We can get here via the __target__ attribute since that's not controlled
3196 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3197 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3198 // disabled.
3199 if (Enabled)
3200 setSSELevel(Features, SSE42, Enabled);
3201 else
3202 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003203 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003204 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003205 Features["xsaveopt"] = false;
3206 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003207 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003208 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003209 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003210}
3211
Eric Christopher3ff21b32013-10-16 21:26:26 +00003212/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003213/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003214bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003215 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003216 for (const auto &Feature : Features) {
3217 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003218 continue;
3219
Eric Christopher610fe112015-08-26 08:21:55 +00003220 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003221 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003222 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003223 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003224 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003225 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003226 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003227 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003228 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003229 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003230 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003231 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003232 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003233 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003234 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003235 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003236 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003237 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003238 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003239 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003240 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003241 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003242 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003243 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003244 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003245 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003246 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003247 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003248 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003249 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003250 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003251 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003252 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003253 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003254 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003255 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003256 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003257 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003258 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003259 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003260 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003261 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003262 } else if (Feature == "+avx512vbmi") {
3263 HasAVX512VBMI = true;
3264 } else if (Feature == "+avx512ifma") {
3265 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003266 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003267 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003268 } else if (Feature == "+mpx") {
3269 HasMPX = true;
3270 } else if (Feature == "+movbe") {
3271 HasMOVBE = true;
3272 } else if (Feature == "+sgx") {
3273 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003274 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003275 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003276 } else if (Feature == "+fxsr") {
3277 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003278 } else if (Feature == "+xsave") {
3279 HasXSAVE = true;
3280 } else if (Feature == "+xsaveopt") {
3281 HasXSAVEOPT = true;
3282 } else if (Feature == "+xsavec") {
3283 HasXSAVEC = true;
3284 } else if (Feature == "+xsaves") {
3285 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003286 } else if (Feature == "+mwaitx") {
3287 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003288 } else if (Feature == "+pku") {
3289 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003290 } else if (Feature == "+clflushopt") {
3291 HasCLFLUSHOPT = true;
3292 } else if (Feature == "+pcommit") {
3293 HasPCOMMIT = true;
3294 } else if (Feature == "+clwb") {
3295 HasCLWB = true;
3296 } else if (Feature == "+umip") {
3297 HasUMIP = true;
3298 } else if (Feature == "+prefetchwt1") {
3299 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003300 }
3301
Benjamin Kramer27402c62012-03-05 15:10:44 +00003302 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003303 .Case("+avx512f", AVX512F)
3304 .Case("+avx2", AVX2)
3305 .Case("+avx", AVX)
3306 .Case("+sse4.2", SSE42)
3307 .Case("+sse4.1", SSE41)
3308 .Case("+ssse3", SSSE3)
3309 .Case("+sse3", SSE3)
3310 .Case("+sse2", SSE2)
3311 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003312 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003313 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003314
Eli Friedman33465822011-07-08 23:31:17 +00003315 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003316 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003317 .Case("+3dnowa", AMD3DNowAthlon)
3318 .Case("+3dnow", AMD3DNow)
3319 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003320 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003321 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003322
3323 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003324 .Case("+xop", XOP)
3325 .Case("+fma4", FMA4)
3326 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003327 .Default(NoXOP);
3328 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003329 }
Eli Friedman33465822011-07-08 23:31:17 +00003330
Rafael Espindolaeb265472013-08-21 21:59:03 +00003331 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3332 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003333 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3334 (FPMath == FP_387 && SSELevel >= SSE1)) {
3335 Diags.Report(diag::err_target_unsupported_fpmath) <<
3336 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003337 return false;
3338 }
3339
Alexey Bataev00396512015-07-02 03:40:19 +00003340 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003341 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003342 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003343}
Chris Lattnerecd49032009-03-02 22:27:17 +00003344
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003345/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3346/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003347void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003348 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003349 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003350 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003351 Builder.defineMacro("__amd64__");
3352 Builder.defineMacro("__amd64");
3353 Builder.defineMacro("__x86_64");
3354 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003355 if (getTriple().getArchName() == "x86_64h") {
3356 Builder.defineMacro("__x86_64h");
3357 Builder.defineMacro("__x86_64h__");
3358 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003359 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003360 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003361 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003362
Chris Lattnerecd49032009-03-02 22:27:17 +00003363 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003364 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3365 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003366 switch (CPU) {
3367 case CK_Generic:
3368 break;
3369 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003370 // The rest are coming from the i386 define above.
3371 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003372 break;
3373 case CK_i486:
3374 case CK_WinChipC6:
3375 case CK_WinChip2:
3376 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003377 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003378 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003379 case CK_PentiumMMX:
3380 Builder.defineMacro("__pentium_mmx__");
3381 Builder.defineMacro("__tune_pentium_mmx__");
3382 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003383 case CK_i586:
3384 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003385 defineCPUMacros(Builder, "i586");
3386 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003387 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003388 case CK_Pentium3:
3389 case CK_Pentium3M:
3390 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003391 Builder.defineMacro("__tune_pentium3__");
3392 // Fallthrough
3393 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003394 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003395 Builder.defineMacro("__tune_pentium2__");
3396 // Fallthrough
3397 case CK_PentiumPro:
3398 Builder.defineMacro("__tune_i686__");
3399 Builder.defineMacro("__tune_pentiumpro__");
3400 // Fallthrough
3401 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003402 Builder.defineMacro("__i686");
3403 Builder.defineMacro("__i686__");
3404 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3405 Builder.defineMacro("__pentiumpro");
3406 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003407 break;
3408 case CK_Pentium4:
3409 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003410 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003411 break;
3412 case CK_Yonah:
3413 case CK_Prescott:
3414 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003415 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003416 break;
3417 case CK_Core2:
3418 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003419 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003420 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003421 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003422 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003423 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003424 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003425 defineCPUMacros(Builder, "slm");
3426 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003427 case CK_Nehalem:
3428 case CK_Westmere:
3429 case CK_SandyBridge:
3430 case CK_IvyBridge:
3431 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003432 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003433 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003434 // FIXME: Historically, we defined this legacy name, it would be nice to
3435 // remove it at some point. We've never exposed fine-grained names for
3436 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003437 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003438 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003439 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003440 defineCPUMacros(Builder, "skx");
3441 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003442 case CK_Cannonlake:
3443 break;
Craig Topper449314e2013-08-20 07:09:39 +00003444 case CK_KNL:
3445 defineCPUMacros(Builder, "knl");
3446 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003447 case CK_Lakemont:
3448 Builder.defineMacro("__tune_lakemont__");
3449 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003450 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003451 Builder.defineMacro("__k6_2__");
3452 Builder.defineMacro("__tune_k6_2__");
3453 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003454 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003455 if (CPU != CK_K6_2) { // In case of fallthrough
3456 // FIXME: GCC may be enabling these in cases where some other k6
3457 // architecture is specified but -m3dnow is explicitly provided. The
3458 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003459 Builder.defineMacro("__k6_3__");
3460 Builder.defineMacro("__tune_k6_3__");
3461 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003462 // Fallthrough
3463 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003464 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003465 break;
3466 case CK_Athlon:
3467 case CK_AthlonThunderbird:
3468 case CK_Athlon4:
3469 case CK_AthlonXP:
3470 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003471 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003472 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003473 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003474 Builder.defineMacro("__tune_athlon_sse__");
3475 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003476 break;
3477 case CK_K8:
3478 case CK_K8SSE3:
3479 case CK_x86_64:
3480 case CK_Opteron:
3481 case CK_OpteronSSE3:
3482 case CK_Athlon64:
3483 case CK_Athlon64SSE3:
3484 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003485 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003486 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003487 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003488 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003489 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003490 case CK_BTVER1:
3491 defineCPUMacros(Builder, "btver1");
3492 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003493 case CK_BTVER2:
3494 defineCPUMacros(Builder, "btver2");
3495 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003496 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003497 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003498 break;
3499 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003500 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003501 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003502 case CK_BDVER3:
3503 defineCPUMacros(Builder, "bdver3");
3504 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003505 case CK_BDVER4:
3506 defineCPUMacros(Builder, "bdver4");
3507 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003508 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003509 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003510 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003511 }
Chris Lattner96e43572009-03-02 22:40:39 +00003512
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003513 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003514 Builder.defineMacro("__REGISTER_PREFIX__", "");
3515
Chris Lattner6df41af2009-04-19 17:32:33 +00003516 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3517 // functions in glibc header files that use FP Stack inline asm which the
3518 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003519 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003520
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003521 if (HasAES)
3522 Builder.defineMacro("__AES__");
3523
Craig Topper3f122a72012-05-31 05:18:48 +00003524 if (HasPCLMUL)
3525 Builder.defineMacro("__PCLMUL__");
3526
Craig Topper22967d42011-12-25 05:06:45 +00003527 if (HasLZCNT)
3528 Builder.defineMacro("__LZCNT__");
3529
Benjamin Kramer1e250392012-07-07 09:39:18 +00003530 if (HasRDRND)
3531 Builder.defineMacro("__RDRND__");
3532
Craig Topper8c7f2512014-11-03 06:51:41 +00003533 if (HasFSGSBASE)
3534 Builder.defineMacro("__FSGSBASE__");
3535
Craig Topper22967d42011-12-25 05:06:45 +00003536 if (HasBMI)
3537 Builder.defineMacro("__BMI__");
3538
3539 if (HasBMI2)
3540 Builder.defineMacro("__BMI2__");
3541
Craig Topper1de83482011-12-29 16:10:46 +00003542 if (HasPOPCNT)
3543 Builder.defineMacro("__POPCNT__");
3544
Michael Liao625a8752012-11-10 05:17:46 +00003545 if (HasRTM)
3546 Builder.defineMacro("__RTM__");
3547
Michael Liao74f4eaf2013-03-26 17:52:08 +00003548 if (HasPRFCHW)
3549 Builder.defineMacro("__PRFCHW__");
3550
Michael Liaoffaae352013-03-29 05:17:55 +00003551 if (HasRDSEED)
3552 Builder.defineMacro("__RDSEED__");
3553
Robert Khasanov50e6f582014-09-19 09:53:48 +00003554 if (HasADX)
3555 Builder.defineMacro("__ADX__");
3556
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003557 if (HasTBM)
3558 Builder.defineMacro("__TBM__");
3559
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003560 if (HasMWAITX)
3561 Builder.defineMacro("__MWAITX__");
3562
Rafael Espindolae62e2792013-08-20 13:44:29 +00003563 switch (XOPLevel) {
3564 case XOP:
3565 Builder.defineMacro("__XOP__");
3566 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003567 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003568 case SSE4A:
3569 Builder.defineMacro("__SSE4A__");
3570 case NoXOP:
3571 break;
3572 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003573
Craig Topperbba778b2012-06-03 21:46:30 +00003574 if (HasFMA)
3575 Builder.defineMacro("__FMA__");
3576
Manman Rena45358c2012-10-11 00:59:55 +00003577 if (HasF16C)
3578 Builder.defineMacro("__F16C__");
3579
Craig Topper679b53a2013-08-21 05:29:10 +00003580 if (HasAVX512CD)
3581 Builder.defineMacro("__AVX512CD__");
3582 if (HasAVX512ER)
3583 Builder.defineMacro("__AVX512ER__");
3584 if (HasAVX512PF)
3585 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003586 if (HasAVX512DQ)
3587 Builder.defineMacro("__AVX512DQ__");
3588 if (HasAVX512BW)
3589 Builder.defineMacro("__AVX512BW__");
3590 if (HasAVX512VL)
3591 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003592 if (HasAVX512VBMI)
3593 Builder.defineMacro("__AVX512VBMI__");
3594 if (HasAVX512IFMA)
3595 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003596
Ben Langmuir58078d02013-09-19 13:22:04 +00003597 if (HasSHA)
3598 Builder.defineMacro("__SHA__");
3599
Craig Toppere33f51f2015-10-16 06:22:36 +00003600 if (HasFXSR)
3601 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003602 if (HasXSAVE)
3603 Builder.defineMacro("__XSAVE__");
3604 if (HasXSAVEOPT)
3605 Builder.defineMacro("__XSAVEOPT__");
3606 if (HasXSAVEC)
3607 Builder.defineMacro("__XSAVEC__");
3608 if (HasXSAVES)
3609 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003610 if (HasPKU)
3611 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003612 if (HasCX16)
3613 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3614
Chris Lattner96e43572009-03-02 22:40:39 +00003615 // Each case falls through to the previous one here.
3616 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003617 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003618 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003619 case AVX2:
3620 Builder.defineMacro("__AVX2__");
3621 case AVX:
3622 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003623 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003624 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003625 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003626 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003627 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003628 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003629 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003630 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003631 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003632 Builder.defineMacro("__SSE2__");
3633 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003634 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003635 Builder.defineMacro("__SSE__");
3636 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003637 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003638 break;
3639 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003640
Derek Schuffc7dd7222012-10-11 15:52:22 +00003641 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003642 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003643 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003644 case AVX2:
3645 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003646 case SSE42:
3647 case SSE41:
3648 case SSSE3:
3649 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003650 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003651 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003652 break;
3653 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003654 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003655 break;
3656 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003657 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003658 }
3659 }
3660
Anders Carlssone437c682010-01-27 03:47:49 +00003661 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003662 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003663 case AMD3DNowAthlon:
3664 Builder.defineMacro("__3dNOW_A__");
3665 case AMD3DNow:
3666 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003667 case MMX:
3668 Builder.defineMacro("__MMX__");
3669 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003670 break;
3671 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003672
3673 if (CPU >= CK_i486) {
3674 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3675 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3676 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3677 }
3678 if (CPU >= CK_i586)
3679 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003680}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003681
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003682bool X86TargetInfo::hasFeature(StringRef Feature) const {
3683 return llvm::StringSwitch<bool>(Feature)
3684 .Case("aes", HasAES)
3685 .Case("avx", SSELevel >= AVX)
3686 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003687 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003688 .Case("avx512cd", HasAVX512CD)
3689 .Case("avx512er", HasAVX512ER)
3690 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003691 .Case("avx512dq", HasAVX512DQ)
3692 .Case("avx512bw", HasAVX512BW)
3693 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003694 .Case("avx512vbmi", HasAVX512VBMI)
3695 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003696 .Case("bmi", HasBMI)
3697 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003698 .Case("clflushopt", HasCLFLUSHOPT)
3699 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003700 .Case("cx16", HasCX16)
3701 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003702 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003703 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003704 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003705 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003706 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003707 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3708 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3709 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003710 .Case("movbe", HasMOVBE)
3711 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003712 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003713 .Case("pcommit", HasPCOMMIT)
3714 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003715 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003716 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003717 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003718 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003719 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003720 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003721 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003722 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003723 .Case("sse", SSELevel >= SSE1)
3724 .Case("sse2", SSELevel >= SSE2)
3725 .Case("sse3", SSELevel >= SSE3)
3726 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003727 .Case("sse4.1", SSELevel >= SSE41)
3728 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003729 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003730 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003731 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003732 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003733 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3734 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003735 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003736 .Case("xsave", HasXSAVE)
3737 .Case("xsavec", HasXSAVEC)
3738 .Case("xsaves", HasXSAVES)
3739 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003740 .Default(false);
3741}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003742
Eric Christopherd9832702015-06-29 21:00:05 +00003743// We can't use a generic validation scheme for the features accepted here
3744// versus subtarget features accepted in the target attribute because the
3745// bitfield structure that's initialized in the runtime only supports the
3746// below currently rather than the full range of subtarget features. (See
3747// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3748bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3749 return llvm::StringSwitch<bool>(FeatureStr)
3750 .Case("cmov", true)
3751 .Case("mmx", true)
3752 .Case("popcnt", true)
3753 .Case("sse", true)
3754 .Case("sse2", true)
3755 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003756 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003757 .Case("sse4.1", true)
3758 .Case("sse4.2", true)
3759 .Case("avx", true)
3760 .Case("avx2", true)
3761 .Case("sse4a", true)
3762 .Case("fma4", true)
3763 .Case("xop", true)
3764 .Case("fma", true)
3765 .Case("avx512f", true)
3766 .Case("bmi", true)
3767 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003768 .Case("aes", true)
3769 .Case("pclmul", true)
3770 .Case("avx512vl", true)
3771 .Case("avx512bw", true)
3772 .Case("avx512dq", true)
3773 .Case("avx512cd", true)
3774 .Case("avx512er", true)
3775 .Case("avx512pf", true)
3776 .Case("avx512vbmi", true)
3777 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003778 .Default(false);
3779}
3780
Eli Friedman3fd920a2008-08-20 02:34:37 +00003781bool
Anders Carlsson58436352009-02-28 17:11:49 +00003782X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003783 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003784 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003785 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003786 // Constant constraints.
3787 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3788 // instructions.
3789 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3790 // x86_64 instructions.
3791 case 's':
3792 Info.setRequiresImmediate();
3793 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003794 case 'I':
3795 Info.setRequiresImmediate(0, 31);
3796 return true;
3797 case 'J':
3798 Info.setRequiresImmediate(0, 63);
3799 return true;
3800 case 'K':
3801 Info.setRequiresImmediate(-128, 127);
3802 return true;
3803 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003804 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003805 return true;
3806 case 'M':
3807 Info.setRequiresImmediate(0, 3);
3808 return true;
3809 case 'N':
3810 Info.setRequiresImmediate(0, 255);
3811 return true;
3812 case 'O':
3813 Info.setRequiresImmediate(0, 127);
3814 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003815 // Register constraints.
3816 case 'Y': // 'Y' is the first character for several 2-character constraints.
3817 // Shift the pointer to the second character of the constraint.
3818 Name++;
3819 switch (*Name) {
3820 default:
3821 return false;
3822 case '0': // First SSE register.
3823 case 't': // Any SSE register, when SSE2 is enabled.
3824 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3825 case 'm': // Any MMX register, when inter-unit moves enabled.
3826 Info.setAllowsRegister();
3827 return true;
3828 }
3829 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003830 // Constraint 'f' cannot be used for output operands.
3831 if (Info.ConstraintStr[0] == '=')
3832 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003833 Info.setAllowsRegister();
3834 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003835 case 'a': // eax.
3836 case 'b': // ebx.
3837 case 'c': // ecx.
3838 case 'd': // edx.
3839 case 'S': // esi.
3840 case 'D': // edi.
3841 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003842 case 't': // Top of floating point stack.
3843 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003844 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003845 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003846 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003847 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003848 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3849 case 'l': // "Index" registers: any general register that can be used as an
3850 // index in a base+index memory access.
3851 Info.setAllowsRegister();
3852 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003853 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003854 case 'C': // SSE floating point constant.
3855 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003856 return true;
3857 }
3858}
3859
Akira Hatanaka974131e2014-09-18 18:17:18 +00003860bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3861 unsigned Size) const {
3862 // Strip off constraint modifiers.
3863 while (Constraint[0] == '=' ||
3864 Constraint[0] == '+' ||
3865 Constraint[0] == '&')
3866 Constraint = Constraint.substr(1);
3867
3868 return validateOperandSize(Constraint, Size);
3869}
3870
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003871bool X86TargetInfo::validateInputSize(StringRef Constraint,
3872 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003873 return validateOperandSize(Constraint, Size);
3874}
3875
3876bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3877 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003878 switch (Constraint[0]) {
3879 default: break;
3880 case 'y':
3881 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003882 case 'f':
3883 case 't':
3884 case 'u':
3885 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003886 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003887 if (SSELevel >= AVX512F)
3888 // 512-bit zmm registers can be used if target supports AVX512F.
3889 return Size <= 512U;
3890 else if (SSELevel >= AVX)
3891 // 256-bit ymm registers can be used if target supports AVX.
3892 return Size <= 256U;
3893 return Size <= 128U;
3894 case 'Y':
3895 // 'Y' is the first character for several 2-character constraints.
3896 switch (Constraint[1]) {
3897 default: break;
3898 case 'm':
3899 // 'Ym' is synonymous with 'y'.
3900 return Size <= 64;
3901 case 'i':
3902 case 't':
3903 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3904 if (SSELevel >= AVX512F)
3905 return Size <= 512U;
3906 else if (SSELevel >= AVX)
3907 return Size <= 256U;
3908 return SSELevel >= SSE2 && Size <= 128U;
3909 }
3910
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003911 }
3912
3913 return true;
3914}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003915
Eli Friedman3fd920a2008-08-20 02:34:37 +00003916std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003917X86TargetInfo::convertConstraint(const char *&Constraint) const {
3918 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003919 case 'a': return std::string("{ax}");
3920 case 'b': return std::string("{bx}");
3921 case 'c': return std::string("{cx}");
3922 case 'd': return std::string("{dx}");
3923 case 'S': return std::string("{si}");
3924 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003925 case 'p': // address
3926 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003927 case 't': // top of floating point stack.
3928 return std::string("{st}");
3929 case 'u': // second from top of floating point stack.
3930 return std::string("{st(1)}"); // second from top of floating point stack.
3931 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003932 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003933 }
3934}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003935
Eli Friedman3fd920a2008-08-20 02:34:37 +00003936// X86-32 generic target
3937class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003938public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003939 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3940 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003941 DoubleAlign = LongLongAlign = 32;
3942 LongDoubleWidth = 96;
3943 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003944 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003945 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003946 SizeType = UnsignedInt;
3947 PtrDiffType = SignedInt;
3948 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003949 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003950
3951 // Use fpret for all types.
3952 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3953 (1 << TargetInfo::Double) |
3954 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003955
3956 // x86-32 has atomics up to 8 bytes
3957 // FIXME: Check that we actually have cmpxchg8b before setting
3958 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3959 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003960 }
Craig Topper3164f332014-03-11 03:39:26 +00003961 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003962 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003963 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003964
Craig Topper3164f332014-03-11 03:39:26 +00003965 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003966 if (RegNo == 0) return 0;
3967 if (RegNo == 1) return 2;
3968 return -1;
3969 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003970 bool validateOperandSize(StringRef Constraint,
3971 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003972 switch (Constraint[0]) {
3973 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003974 case 'R':
3975 case 'q':
3976 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003977 case 'a':
3978 case 'b':
3979 case 'c':
3980 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003981 case 'S':
3982 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003983 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003984 case 'A':
3985 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003986 }
3987
Akira Hatanaka974131e2014-09-18 18:17:18 +00003988 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003989 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003990};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003991
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003992class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3993public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003994 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3995 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003996
Craig Topper3164f332014-03-11 03:39:26 +00003997 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003998 unsigned Major, Minor, Micro;
3999 getTriple().getOSVersion(Major, Minor, Micro);
4000 // New NetBSD uses the default rounding mode.
4001 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4002 return X86_32TargetInfo::getFloatEvalMethod();
4003 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004004 return 1;
4005 }
4006};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004007
Eli Friedmane3aa4542009-07-05 18:47:56 +00004008class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4009public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004010 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4011 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004012 SizeType = UnsignedLong;
4013 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004014 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004015 }
4016};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004017
Eli Friedman9fa28852012-08-08 23:57:20 +00004018class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4019public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004020 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4021 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004022 SizeType = UnsignedLong;
4023 IntPtrType = SignedLong;
4024 PtrDiffType = SignedLong;
4025 }
4026};
Eli Friedman9fa28852012-08-08 23:57:20 +00004027
Torok Edwinb2b37c62009-06-30 17:10:35 +00004028class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004029public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004030 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4031 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004032 LongDoubleWidth = 128;
4033 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004034 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004035 MaxVectorAlign = 256;
4036 // The watchOS simulator uses the builtin bool type for Objective-C.
4037 llvm::Triple T = llvm::Triple(Triple);
4038 if (T.isWatchOS())
4039 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004040 SizeType = UnsignedLong;
4041 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004042 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004043 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004044 }
4045
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004046 bool handleTargetFeatures(std::vector<std::string> &Features,
4047 DiagnosticsEngine &Diags) override {
4048 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4049 Diags))
4050 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004051 // We now know the features we have: we can decide how to align vectors.
4052 MaxVectorAlign =
4053 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004054 return true;
4055 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004056};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004057
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004058// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004059class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004060public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004061 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4062 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004063 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004064 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004065 bool IsWinCOFF =
4066 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004067 resetDataLayout(IsWinCOFF
4068 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4069 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004070 }
Craig Topper3164f332014-03-11 03:39:26 +00004071 void getTargetDefines(const LangOptions &Opts,
4072 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004073 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4074 }
4075};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004076
4077// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004078class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004079public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004080 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4081 const TargetOptions &Opts)
4082 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004083 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004084 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4085 }
Craig Topper3164f332014-03-11 03:39:26 +00004086 void getTargetDefines(const LangOptions &Opts,
4087 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004088 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4089 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4090 // The value of the following reflects processor type.
4091 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4092 // We lost the original triple, so we use the default.
4093 Builder.defineMacro("_M_IX86", "600");
4094 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004095};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004096
David Majnemerae1ed0e2015-05-28 04:36:18 +00004097static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004098 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4099 // supports __declspec natively under -fms-extensions, but we define a no-op
4100 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004101 if (Opts.MicrosoftExt)
4102 Builder.defineMacro("__declspec", "__declspec");
4103 else
4104 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4105
4106 if (!Opts.MicrosoftExt) {
4107 // Provide macros for all the calling convention keywords. Provide both
4108 // single and double underscore prefixed variants. These are available on
4109 // x64 as well as x86, even though they have no effect.
4110 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4111 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004112 std::string GCCSpelling = "__attribute__((__";
4113 GCCSpelling += CC;
4114 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004115 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4116 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4117 }
4118 }
4119}
4120
David Majnemerae1ed0e2015-05-28 04:36:18 +00004121static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4122 Builder.defineMacro("__MSVCRT__");
4123 Builder.defineMacro("__MINGW32__");
4124 addCygMingDefines(Opts, Builder);
4125}
4126
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004127// x86-32 MinGW target
4128class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4129public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004130 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4131 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004132 void getTargetDefines(const LangOptions &Opts,
4133 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004134 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004135 DefineStd(Builder, "WIN32", Opts);
4136 DefineStd(Builder, "WINNT", Opts);
4137 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004138 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004139 }
4140};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004141
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004142// x86-32 Cygwin target
4143class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4144public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004145 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4146 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004147 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004148 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004149 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 +00004150 }
Craig Topper3164f332014-03-11 03:39:26 +00004151 void getTargetDefines(const LangOptions &Opts,
4152 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004153 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004154 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004155 Builder.defineMacro("__CYGWIN__");
4156 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004157 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004158 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004159 if (Opts.CPlusPlus)
4160 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004161 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004162};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004163
Chris Lattnerb986aba2010-04-11 19:29:39 +00004164// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004165class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004166public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004167 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004168 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004169 }
Craig Topper3164f332014-03-11 03:39:26 +00004170 void getTargetDefines(const LangOptions &Opts,
4171 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004172 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004173 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004174 }
4175};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004176
Alexey Bataevc99b0492015-11-25 09:24:26 +00004177// X86-32 MCU target
4178class MCUX86_32TargetInfo : public X86_32TargetInfo {
4179public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004180 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4181 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004182 LongDoubleWidth = 64;
4183 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004184 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 +00004185 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004186 }
4187
4188 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4189 // On MCU we support only C calling convention.
4190 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4191 }
4192
4193 void getTargetDefines(const LangOptions &Opts,
4194 MacroBuilder &Builder) const override {
4195 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4196 Builder.defineMacro("__iamcu");
4197 Builder.defineMacro("__iamcu__");
4198 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004199
4200 bool allowsLargerPreferedTypeAlignment() const override {
4201 return false;
4202 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004203};
4204
Douglas Gregor9fabd852011-07-01 22:41:14 +00004205// RTEMS Target
4206template<typename Target>
4207class RTEMSTargetInfo : public OSTargetInfo<Target> {
4208protected:
Craig Topper3164f332014-03-11 03:39:26 +00004209 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4210 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004211 // RTEMS defines; list based off of gcc output
4212
Douglas Gregor9fabd852011-07-01 22:41:14 +00004213 Builder.defineMacro("__rtems__");
4214 Builder.defineMacro("__ELF__");
4215 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004216
Douglas Gregor9fabd852011-07-01 22:41:14 +00004217public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004218 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4219 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004220 switch (Triple.getArch()) {
4221 default:
4222 case llvm::Triple::x86:
4223 // this->MCountName = ".mcount";
4224 break;
4225 case llvm::Triple::mips:
4226 case llvm::Triple::mipsel:
4227 case llvm::Triple::ppc:
4228 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004229 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004230 // this->MCountName = "_mcount";
4231 break;
4232 case llvm::Triple::arm:
4233 // this->MCountName = "__mcount";
4234 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004235 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004236 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004237};
4238
Douglas Gregor9fabd852011-07-01 22:41:14 +00004239// x86-32 RTEMS target
4240class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4241public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004242 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4243 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004244 SizeType = UnsignedLong;
4245 IntPtrType = SignedLong;
4246 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004247 }
Craig Topper3164f332014-03-11 03:39:26 +00004248 void getTargetDefines(const LangOptions &Opts,
4249 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004250 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4251 Builder.defineMacro("__INTEL__");
4252 Builder.defineMacro("__rtems__");
4253 }
4254};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004255
Eli Friedman3fd920a2008-08-20 02:34:37 +00004256// x86-64 generic target
4257class X86_64TargetInfo : public X86TargetInfo {
4258public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004259 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4260 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004261 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004262 bool IsWinCOFF =
4263 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004264 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004265 LongDoubleWidth = 128;
4266 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004267 LargeArrayMinWidth = 128;
4268 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004269 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004270 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4271 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4272 IntPtrType = IsX32 ? SignedInt : SignedLong;
4273 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004274 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004275 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004276
Eric Christopher917e9522014-11-18 22:36:15 +00004277 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004278 resetDataLayout(IsX32
4279 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4280 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4281 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004282
4283 // Use fpret only for long double.
4284 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004285
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004286 // Use fp2ret for _Complex long double.
4287 ComplexLongDoubleUsesFP2Ret = true;
4288
Charles Davisc7d5c942015-09-17 20:55:33 +00004289 // Make __builtin_ms_va_list available.
4290 HasBuiltinMSVaList = true;
4291
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004292 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004293 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004294 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004295 }
Craig Topper3164f332014-03-11 03:39:26 +00004296 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004297 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004298 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004299
Craig Topper3164f332014-03-11 03:39:26 +00004300 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004301 if (RegNo == 0) return 0;
4302 if (RegNo == 1) return 1;
4303 return -1;
4304 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004305
Craig Topper3164f332014-03-11 03:39:26 +00004306 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004307 switch (CC) {
4308 case CC_C:
4309 case CC_Swift:
4310 case CC_X86VectorCall:
4311 case CC_IntelOclBicc:
4312 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004313 case CC_PreserveMost:
4314 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004315 return CCCR_OK;
4316 default:
4317 return CCCR_Warning;
4318 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004319 }
4320
Craig Topper3164f332014-03-11 03:39:26 +00004321 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004322 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004323 }
4324
Pavel Chupinfd223e12014-08-04 12:39:43 +00004325 // for x32 we need it here explicitly
4326 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004327 unsigned getUnwindWordWidth() const override { return 64; }
4328 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004329
4330 bool validateGlobalRegisterVariable(StringRef RegName,
4331 unsigned RegSize,
4332 bool &HasSizeMismatch) const override {
4333 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4334 // handle.
4335 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4336 // Check that the register size is 64-bit.
4337 HasSizeMismatch = RegSize != 64;
4338 return true;
4339 }
4340
4341 // Check if the register is a 32-bit register the backend can handle.
4342 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4343 HasSizeMismatch);
4344 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004345};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004346
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004347// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004348class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004349public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004350 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4351 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004352 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004353 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004354 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004355 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004356 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004357 SizeType = UnsignedLongLong;
4358 PtrDiffType = SignedLongLong;
4359 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004360 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004361
Craig Topper3164f332014-03-11 03:39:26 +00004362 void getTargetDefines(const LangOptions &Opts,
4363 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004364 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004365 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004366 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004367
Craig Topper3164f332014-03-11 03:39:26 +00004368 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004369 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004370 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004371
Craig Topper3164f332014-03-11 03:39:26 +00004372 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004373 switch (CC) {
4374 case CC_X86StdCall:
4375 case CC_X86ThisCall:
4376 case CC_X86FastCall:
4377 return CCCR_Ignore;
4378 case CC_C:
4379 case CC_X86VectorCall:
4380 case CC_IntelOclBicc:
4381 case CC_X86_64SysV:
4382 return CCCR_OK;
4383 default:
4384 return CCCR_Warning;
4385 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004386 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004387};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004388
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004389// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004390class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004391public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004392 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4393 const TargetOptions &Opts)
4394 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004395 LongDoubleWidth = LongDoubleAlign = 64;
4396 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004397 }
Craig Topper3164f332014-03-11 03:39:26 +00004398 void getTargetDefines(const LangOptions &Opts,
4399 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004400 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4401 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004402 Builder.defineMacro("_M_X64", "100");
4403 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004404 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004405};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004406
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004407// x86-64 MinGW target
4408class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4409public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004410 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4411 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004412 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4413 // with x86 FP ops. Weird.
4414 LongDoubleWidth = LongDoubleAlign = 128;
4415 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4416 }
4417
Craig Topper3164f332014-03-11 03:39:26 +00004418 void getTargetDefines(const LangOptions &Opts,
4419 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004420 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004421 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004422 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004423 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004424
4425 // GCC defines this macro when it is using __gxx_personality_seh0.
4426 if (!Opts.SjLjExceptions)
4427 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004428 }
4429};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004430
Yaron Kerend030d112015-07-22 17:38:19 +00004431// x86-64 Cygwin target
4432class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4433public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004434 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4435 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004436 TLSSupported = false;
4437 WCharType = UnsignedShort;
4438 }
4439 void getTargetDefines(const LangOptions &Opts,
4440 MacroBuilder &Builder) const override {
4441 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4442 Builder.defineMacro("__x86_64__");
4443 Builder.defineMacro("__CYGWIN__");
4444 Builder.defineMacro("__CYGWIN64__");
4445 addCygMingDefines(Opts, Builder);
4446 DefineStd(Builder, "unix", Opts);
4447 if (Opts.CPlusPlus)
4448 Builder.defineMacro("_GNU_SOURCE");
4449
4450 // GCC defines this macro when it is using __gxx_personality_seh0.
4451 if (!Opts.SjLjExceptions)
4452 Builder.defineMacro("__SEH__");
4453 }
4454};
4455
Eli Friedman2857ccb2009-07-01 03:36:11 +00004456class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4457public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004458 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4459 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004460 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004461 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4462 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004463 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004464 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004465 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004466 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004467
4468 bool handleTargetFeatures(std::vector<std::string> &Features,
4469 DiagnosticsEngine &Diags) override {
4470 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4471 Diags))
4472 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004473 // We now know the features we have: we can decide how to align vectors.
4474 MaxVectorAlign =
4475 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004476 return true;
4477 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004478};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004479
Eli Friedman245f2292009-07-05 22:31:18 +00004480class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4481public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004482 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4483 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004484 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004485 Int64Type = SignedLongLong;
4486 }
4487};
Eli Friedman245f2292009-07-05 22:31:18 +00004488
Eli Friedman9fa28852012-08-08 23:57:20 +00004489class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4490public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004491 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4492 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004493 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004494 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004495 }
4496};
Tim Northover9bb857a2013-01-31 12:13:10 +00004497
Eli Friedmanf05b7722008-08-20 07:44:10 +00004498class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004499 // Possible FPU choices.
4500 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004501 VFP2FPU = (1 << 0),
4502 VFP3FPU = (1 << 1),
4503 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004504 NeonFPU = (1 << 3),
4505 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004506 };
4507
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004508 // Possible HWDiv features.
4509 enum HWDivMode {
4510 HWDivThumb = (1 << 0),
4511 HWDivARM = (1 << 1)
4512 };
4513
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004514 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004515 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004516 }
4517
4518 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4519 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004520
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004521 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004522
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004523 StringRef CPUProfile;
4524 StringRef CPUAttr;
4525
Rafael Espindolaeb265472013-08-21 21:59:03 +00004526 enum {
4527 FP_Default,
4528 FP_VFP,
4529 FP_Neon
4530 } FPMath;
4531
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004532 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004533 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004534 unsigned ArchProfile;
4535 unsigned ArchVersion;
4536
Bernard Ogdenda13af32013-10-24 18:32:51 +00004537 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004538
Logan Chien57086ce2012-10-10 06:56:20 +00004539 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004540 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004541
4542 // Initialized via features.
4543 unsigned SoftFloat : 1;
4544 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004545
Bernard Ogden18b57012013-10-29 09:47:51 +00004546 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004547 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004548 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004549 unsigned Unaligned : 1;
4550
4551 enum {
4552 LDREX_B = (1 << 0), /// byte (8-bit)
4553 LDREX_H = (1 << 1), /// half (16-bit)
4554 LDREX_W = (1 << 2), /// word (32-bit)
4555 LDREX_D = (1 << 3), /// double (64-bit)
4556 };
4557
4558 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004559
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004560 // ACLE 6.5.1 Hardware floating point
4561 enum {
4562 HW_FP_HP = (1 << 1), /// half (16-bit)
4563 HW_FP_SP = (1 << 2), /// single (32-bit)
4564 HW_FP_DP = (1 << 3), /// double (64-bit)
4565 };
4566 uint32_t HW_FP;
4567
Chris Lattner5cc15e02010-03-03 19:03:45 +00004568 static const Builtin::Info BuiltinInfo[];
4569
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004570 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004571 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004572
4573 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004574 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004575
Renato Golin9ba39232015-02-27 16:35:48 +00004576 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4577 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4578 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004579 SizeType = UnsignedLong;
4580 else
4581 SizeType = UnsignedInt;
4582
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004583 switch (T.getOS()) {
4584 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004585 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004586 break;
4587 case llvm::Triple::Win32:
4588 WCharType = UnsignedShort;
4589 break;
4590 case llvm::Triple::Linux:
4591 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004592 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4593 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004594 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004595 }
4596
4597 UseBitFieldTypeAlignment = true;
4598
4599 ZeroLengthBitfieldBoundary = 0;
4600
Tim Northover147cd2f2014-10-14 22:12:21 +00004601 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4602 // so set preferred for small types to 32.
4603 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004604 resetDataLayout(BigEndian
4605 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4606 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004607 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004608 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004609 resetDataLayout("e"
4610 "-m:w"
4611 "-p:32:32"
4612 "-i64:64"
4613 "-v128:64:128"
4614 "-a:0:32"
4615 "-n32"
4616 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004617 } else if (T.isOSNaCl()) {
4618 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004619 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004620 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004621 resetDataLayout(BigEndian
4622 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4623 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004624 }
4625
4626 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004627 }
4628
Tim Northover5627d392015-10-30 16:30:45 +00004629 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004630 const llvm::Triple &T = getTriple();
4631
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004632 IsAAPCS = false;
4633
Tim Northover5627d392015-10-30 16:30:45 +00004634 if (IsAAPCS16)
4635 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4636 else
4637 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004638
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004639 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004640 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004641 SizeType = UnsignedInt;
4642 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004643 SizeType = UnsignedLong;
4644
4645 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4646 WCharType = SignedInt;
4647
4648 // Do not respect the alignment of bit-field types when laying out
4649 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4650 UseBitFieldTypeAlignment = false;
4651
4652 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4653 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4654 /// gcc.
4655 ZeroLengthBitfieldBoundary = 32;
4656
Tim Northover5627d392015-10-30 16:30:45 +00004657 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4658 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004659 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004660 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004661 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004662 BigEndian
4663 ? "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 +00004664 : "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 +00004665 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004666 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004667 BigEndian
4668 ? "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 +00004669 : "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 +00004670
4671 // FIXME: Override "preferred align" for double and long long.
4672 }
4673
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004674 void setArchInfo() {
4675 StringRef ArchName = getTriple().getArchName();
4676
Renato Goline84b0002015-10-08 16:43:26 +00004677 ArchISA = llvm::ARM::parseArchISA(ArchName);
4678 CPU = llvm::ARM::getDefaultCPU(ArchName);
4679 unsigned AK = llvm::ARM::parseArch(ArchName);
4680 if (AK != llvm::ARM::AK_INVALID)
4681 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004682 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004683 }
4684
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004685 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004686 StringRef SubArch;
4687
4688 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004689 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004690 SubArch = llvm::ARM::getSubArch(ArchKind);
4691 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4692 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004693
4694 // cache CPU related strings
4695 CPUAttr = getCPUAttr();
4696 CPUProfile = getCPUProfile();
4697 }
4698
4699 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004700 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004701 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004702 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004703 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4704 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004705 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004706 if (ArchProfile == llvm::ARM::PK_M) {
4707 MaxAtomicPromoteWidth = 32;
4708 if (ShouldUseInlineAtomic)
4709 MaxAtomicInlineWidth = 32;
4710 }
4711 else {
4712 MaxAtomicPromoteWidth = 64;
4713 if (ShouldUseInlineAtomic)
4714 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004715 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004716 }
4717
4718 bool isThumb() const {
4719 return (ArchISA == llvm::ARM::IK_THUMB);
4720 }
4721
4722 bool supportsThumb() const {
4723 return CPUAttr.count('T') || ArchVersion >= 6;
4724 }
4725
4726 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004727 return CPUAttr.equals("6T2") ||
4728 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004729 }
4730
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004731 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004732 // For most sub-arches, the build attribute CPU name is enough.
4733 // For Cortex variants, it's slightly different.
4734 switch(ArchKind) {
4735 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004736 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004737 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004738 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004739 case llvm::ARM::AK_ARMV7S:
4740 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004741 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004742 return "7A";
4743 case llvm::ARM::AK_ARMV7R:
4744 return "7R";
4745 case llvm::ARM::AK_ARMV7M:
4746 return "7M";
4747 case llvm::ARM::AK_ARMV7EM:
4748 return "7EM";
4749 case llvm::ARM::AK_ARMV8A:
4750 return "8A";
4751 case llvm::ARM::AK_ARMV8_1A:
4752 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004753 case llvm::ARM::AK_ARMV8_2A:
4754 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004755 case llvm::ARM::AK_ARMV8MBaseline:
4756 return "8M_BASE";
4757 case llvm::ARM::AK_ARMV8MMainline:
4758 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004759 }
4760 }
4761
4762 StringRef getCPUProfile() const {
4763 switch(ArchProfile) {
4764 case llvm::ARM::PK_A:
4765 return "A";
4766 case llvm::ARM::PK_R:
4767 return "R";
4768 case llvm::ARM::PK_M:
4769 return "M";
4770 default:
4771 return "";
4772 }
4773 }
4774
Chris Lattner17df24e2008-04-21 18:56:49 +00004775public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004776 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4777 bool IsBigEndian)
4778 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4779 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004780 BigEndian = IsBigEndian;
4781
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004782 switch (getTriple().getOS()) {
4783 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004784 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004785 break;
4786 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004787 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004788 break;
4789 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004790
Renato Goline84b0002015-10-08 16:43:26 +00004791 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004792 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004793
Chris Lattner1a8f3942010-04-23 16:29:58 +00004794 // {} in inline assembly are neon specifiers, not assembly variant
4795 // specifiers.
4796 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004797
Eric Christopher0e261882014-12-05 01:06:59 +00004798 // FIXME: This duplicates code from the driver that sets the -target-abi
4799 // option - this code is used if -target-abi isn't passed and should
4800 // be unified in some way.
4801 if (Triple.isOSBinFormatMachO()) {
4802 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4803 // the frontend matches that.
4804 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4805 Triple.getOS() == llvm::Triple::UnknownOS ||
4806 StringRef(CPU).startswith("cortex-m")) {
4807 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004808 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004809 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004810 } else {
4811 setABI("apcs-gnu");
4812 }
4813 } else if (Triple.isOSWindows()) {
4814 // FIXME: this is invalid for WindowsCE
4815 setABI("aapcs");
4816 } else {
4817 // Select the default based on the platform.
4818 switch (Triple.getEnvironment()) {
4819 case llvm::Triple::Android:
4820 case llvm::Triple::GNUEABI:
4821 case llvm::Triple::GNUEABIHF:
4822 setABI("aapcs-linux");
4823 break;
4824 case llvm::Triple::EABIHF:
4825 case llvm::Triple::EABI:
4826 setABI("aapcs");
4827 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004828 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004829 setABI("apcs-gnu");
4830 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004831 default:
4832 if (Triple.getOS() == llvm::Triple::NetBSD)
4833 setABI("apcs-gnu");
4834 else
4835 setABI("aapcs");
4836 break;
4837 }
4838 }
John McCall86353412010-08-21 22:46:04 +00004839
4840 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004841 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004842
Renato Golin15b86152015-07-03 16:41:13 +00004843 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004844 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004845
James Molloya7139222012-03-12 09:14:10 +00004846 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004847 // the alignment of the zero-length bitfield is greater than the member
4848 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004849 // zero length bitfield.
4850 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004851
4852 if (Triple.getOS() == llvm::Triple::Linux ||
4853 Triple.getOS() == llvm::Triple::UnknownOS)
4854 this->MCountName =
4855 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004856 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004857
Alp Toker4925ba72014-06-07 23:30:42 +00004858 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004859
Craig Topper3164f332014-03-11 03:39:26 +00004860 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004861 ABI = Name;
4862
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004863 // The defaults (above) are for AAPCS, check if we need to change them.
4864 //
4865 // FIXME: We need support for -meabi... we could just mangle it into the
4866 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004867 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004868 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004869 return true;
4870 }
4871 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4872 setABIAAPCS();
4873 return true;
4874 }
4875 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004876 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004877
Renato Golinf5c4dec2015-05-27 13:33:00 +00004878 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004879 bool
4880 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4881 StringRef CPU,
4882 const std::vector<std::string> &FeaturesVec) const override {
4883
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004884 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004885 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004886
4887 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004888 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004889 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4890
4891 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004892 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004893 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4894
4895 for (const char *Feature : TargetFeatures)
4896 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004897 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004898
Eric Christopher007b0a02015-08-28 22:32:01 +00004899 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004900 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004901
Craig Topper3164f332014-03-11 03:39:26 +00004902 bool handleTargetFeatures(std::vector<std::string> &Features,
4903 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004904 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004905 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004906 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004907 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004908 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004909 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004910 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004911
Ranjeet Singhac08e532015-06-24 23:39:25 +00004912 // This does not diagnose illegal cases like having both
4913 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4914 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004915 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004916 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004917 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004918 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004919 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004920 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004921 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004922 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004923 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004924 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004925 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004926 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004927 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004928 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004929 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004930 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004931 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004932 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004933 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004934 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004935 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004936 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004937 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004938 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004939 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004940 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004941 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004942 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004943 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004944 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004945 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004946 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004947 } else if (Feature == "+strict-align") {
4948 Unaligned = 0;
4949 } else if (Feature == "+fp16") {
4950 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004951 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004952 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004953 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004954
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004955 switch (ArchVersion) {
4956 case 6:
4957 if (ArchProfile == llvm::ARM::PK_M)
4958 LDREX = 0;
4959 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4960 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4961 else
4962 LDREX = LDREX_W;
4963 break;
4964 case 7:
4965 if (ArchProfile == llvm::ARM::PK_M)
4966 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4967 else
4968 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4969 break;
4970 case 8:
4971 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4972 }
4973
Rafael Espindolaeb265472013-08-21 21:59:03 +00004974 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4975 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4976 return false;
4977 }
4978
4979 if (FPMath == FP_Neon)
4980 Features.push_back("+neonfp");
4981 else if (FPMath == FP_VFP)
4982 Features.push_back("-neonfp");
4983
Daniel Dunbar893d4752009-12-19 04:15:38 +00004984 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004985 auto Feature =
4986 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4987 if (Feature != Features.end())
4988 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004989
Rafael Espindolaeb265472013-08-21 21:59:03 +00004990 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004991 }
4992
Craig Topper3164f332014-03-11 03:39:26 +00004993 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004994 return llvm::StringSwitch<bool>(Feature)
4995 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004996 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004997 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004998 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004999 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005000 .Case("hwdiv", HWDiv & HWDivThumb)
5001 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005002 .Default(false);
5003 }
Renato Golin15b86152015-07-03 16:41:13 +00005004
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005005 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005006 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005007 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005008
Renato Golin15b86152015-07-03 16:41:13 +00005009 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005010 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005011 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005012 CPU = Name;
5013 return true;
5014 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005015
Craig Topper3164f332014-03-11 03:39:26 +00005016 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005017
Craig Topper3164f332014-03-11 03:39:26 +00005018 void getTargetDefines(const LangOptions &Opts,
5019 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005020 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005021 Builder.defineMacro("__arm");
5022 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005023 // For bare-metal none-eabi.
5024 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5025 getTriple().getEnvironment() == llvm::Triple::EABI)
5026 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005027
Chris Lattnerecd49032009-03-02 22:27:17 +00005028 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005029 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005030
5031 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5032 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005033 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005034 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5035
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005036 if (!CPUAttr.empty())
5037 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005038
5039 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005040 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005041 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005042
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005043 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005044 // ACLE 6.5.7 Crypto Extension
5045 if (Crypto)
5046 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5047 // ACLE 6.5.8 CRC32 Extension
5048 if (CRC)
5049 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5050 // ACLE 6.5.10 Numeric Maximum and Minimum
5051 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5052 // ACLE 6.5.9 Directed Rounding
5053 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005054 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005055
5056 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5057 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005058 // NOTE that the default profile is assumed to be 'A'
5059 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005060 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5061
Bradley Smithf4affc12016-03-03 13:52:22 +00005062 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5063 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5064 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5065 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005066 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005067 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005068 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005069 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5070
5071 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5072 // instruction set such as ARM or Thumb.
5073 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5074
5075 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5076
5077 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005078 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005079 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005080
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005081 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005082 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005083 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005084
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005085 // ACLE 6.4.4 LDREX/STREX
5086 if (LDREX)
5087 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5088
5089 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005090 if (ArchVersion == 5 ||
5091 (ArchVersion == 6 && CPUProfile != "M") ||
5092 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005093 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5094
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005095 // ACLE 6.5.1 Hardware Floating Point
5096 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005097 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005098
Yi Konga44c4d72014-06-27 21:25:42 +00005099 // ACLE predefines.
5100 Builder.defineMacro("__ARM_ACLE", "200");
5101
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005102 // FP16 support (we currently only support IEEE format).
5103 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5104 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5105
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005106 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005107 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005108 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5109
Mike Stump9d54bd72009-04-08 02:07:04 +00005110 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005111
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005112 // FIXME: It's more complicated than this and we don't really support
5113 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005114 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005115 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005116 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005117
David Tweed8f676532012-10-25 13:33:01 +00005118 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005119 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005120 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005121 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005122 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005123 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005124 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005125
Tim Northover28fc0e12016-04-28 13:59:55 +00005126 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5127 ABI == "aapcs16")
5128 Builder.defineMacro("__ARM_PCS_VFP", "1");
5129
Daniel Dunbar893d4752009-12-19 04:15:38 +00005130 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005131 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005132
5133 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005134 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005135
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005136 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005137 Builder.defineMacro("__THUMBEL__");
5138 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005139 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005140 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005141 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005142
5143 // ACLE 6.4.9 32-bit SIMD instructions
5144 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5145 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5146
5147 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005148 if (((HWDiv & HWDivThumb) && isThumb()) ||
5149 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005150 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005151 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005152 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005153
5154 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005155 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005156
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005157 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005158 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005159 if (FPU & VFP2FPU)
5160 Builder.defineMacro("__ARM_VFPV2__");
5161 if (FPU & VFP3FPU)
5162 Builder.defineMacro("__ARM_VFPV3__");
5163 if (FPU & VFP4FPU)
5164 Builder.defineMacro("__ARM_VFPV4__");
5165 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005166
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005167 // This only gets set when Neon instructions are actually available, unlike
5168 // the VFP define, hence the soft float and arch check. This is subtly
5169 // different from gcc, we follow the intent which was that it should be set
5170 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005171 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005172 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005173 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005174 // current AArch32 NEON implementations do not support double-precision
5175 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005176 Builder.defineMacro("__ARM_NEON_FP",
5177 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005178 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005179
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005180 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5181 Opts.ShortWChar ? "2" : "4");
5182
5183 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5184 Opts.ShortEnums ? "1" : "4");
5185
Bradley Smithf4affc12016-03-03 13:52:22 +00005186 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005187 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5188 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5189 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5190 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5191 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005192
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005193 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005194 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005195 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005196 }
5197
5198 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005199 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005200 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5201 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005202 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005203 }
5204
5205 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005206 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005207 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005208
5209 if (Opts.UnsafeFPMath)
5210 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005211
5212 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5213 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005214 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005215
Craig Topper6c03a542015-10-19 04:51:35 +00005216 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5217 return llvm::makeArrayRef(BuiltinInfo,
5218 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005219 }
Craig Topper3164f332014-03-11 03:39:26 +00005220 bool isCLZForZeroUndef() const override { return false; }
5221 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005222 return IsAAPCS
5223 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005224 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5225 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005226 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005227 ArrayRef<const char *> getGCCRegNames() const override;
5228 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005229 bool validateAsmConstraint(const char *&Name,
5230 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005231 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005232 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005233 case 'l': // r0-r7
5234 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005235 case 't': // VFP Floating point register single precision
5236 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005237 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005238 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005239 case 'I':
5240 case 'J':
5241 case 'K':
5242 case 'L':
5243 case 'M':
5244 // FIXME
5245 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005246 case 'Q': // A memory address that is a single base register.
5247 Info.setAllowsMemory();
5248 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005249 case 'U': // a memory reference...
5250 switch (Name[1]) {
5251 case 'q': // ...ARMV4 ldrsb
5252 case 'v': // ...VFP load/store (reg+constant offset)
5253 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005254 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005255 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005256 case 'n': // valid address for Neon doubleword vector load/store
5257 case 'm': // valid address for Neon element and structure load/store
5258 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005259 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005260 Info.setAllowsMemory();
5261 Name++;
5262 return true;
5263 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005264 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005265 return false;
5266 }
Craig Topper3164f332014-03-11 03:39:26 +00005267 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005268 std::string R;
5269 switch (*Constraint) {
5270 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005271 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005272 Constraint++;
5273 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005274 case 'p': // 'p' should be translated to 'r' by default.
5275 R = std::string("r");
5276 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005277 default:
5278 return std::string(1, *Constraint);
5279 }
5280 return R;
5281 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005282 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005283 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005284 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005285 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005286 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005287
Bill Wendling9d1ee112012-10-25 23:28:48 +00005288 // Strip off constraint modifiers.
5289 while (Constraint[0] == '=' ||
5290 Constraint[0] == '+' ||
5291 Constraint[0] == '&')
5292 Constraint = Constraint.substr(1);
5293
5294 switch (Constraint[0]) {
5295 default: break;
5296 case 'r': {
5297 switch (Modifier) {
5298 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005299 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005300 case 'q':
5301 // A register of size 32 cannot fit a vector type.
5302 return false;
5303 }
5304 }
5305 }
5306
5307 return true;
5308 }
Craig Topper3164f332014-03-11 03:39:26 +00005309 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005310 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005311 return "";
5312 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005313
Craig Topper3164f332014-03-11 03:39:26 +00005314 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005315 switch (CC) {
5316 case CC_AAPCS:
5317 case CC_AAPCS_VFP:
5318 case CC_Swift:
5319 return CCCR_OK;
5320 default:
5321 return CCCR_Warning;
5322 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005323 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005324
Craig Topper3164f332014-03-11 03:39:26 +00005325 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005326 if (RegNo == 0) return 0;
5327 if (RegNo == 1) return 1;
5328 return -1;
5329 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005330
5331 bool hasSjLjLowering() const override {
5332 return true;
5333 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005334};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005335
Rafael Espindolaeb265472013-08-21 21:59:03 +00005336bool ARMTargetInfo::setFPMath(StringRef Name) {
5337 if (Name == "neon") {
5338 FPMath = FP_Neon;
5339 return true;
5340 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5341 Name == "vfp4") {
5342 FPMath = FP_VFP;
5343 return true;
5344 }
5345 return false;
5346}
5347
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005348const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005349 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005350 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005351 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5352
5353 // Float registers
5354 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5355 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5356 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005357 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005358
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005359 // Double registers
5360 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5361 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005362 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5363 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005364
5365 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005366 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5367 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005368};
5369
Craig Topperf054e3a2015-10-19 03:52:27 +00005370ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5371 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005372}
5373
5374const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005375 { { "a1" }, "r0" },
5376 { { "a2" }, "r1" },
5377 { { "a3" }, "r2" },
5378 { { "a4" }, "r3" },
5379 { { "v1" }, "r4" },
5380 { { "v2" }, "r5" },
5381 { { "v3" }, "r6" },
5382 { { "v4" }, "r7" },
5383 { { "v5" }, "r8" },
5384 { { "v6", "rfp" }, "r9" },
5385 { { "sl" }, "r10" },
5386 { { "fp" }, "r11" },
5387 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005388 { { "r13" }, "sp" },
5389 { { "r14" }, "lr" },
5390 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005391 // The S, D and Q registers overlap, but aren't really aliases; we
5392 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005393};
5394
Craig Topperf054e3a2015-10-19 03:52:27 +00005395ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5396 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005397}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005398
5399const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005400#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005401 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005402#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5403 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005404#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005405
Craig Topper07d3b622015-08-07 05:14:44 +00005406#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005407 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005408#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005409 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005410#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5411 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005412#include "clang/Basic/BuiltinsARM.def"
5413};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005414
5415class ARMleTargetInfo : public ARMTargetInfo {
5416public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005417 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5418 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005419 void getTargetDefines(const LangOptions &Opts,
5420 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005421 Builder.defineMacro("__ARMEL__");
5422 ARMTargetInfo::getTargetDefines(Opts, Builder);
5423 }
5424};
5425
5426class ARMbeTargetInfo : public ARMTargetInfo {
5427public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005428 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5429 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005430 void getTargetDefines(const LangOptions &Opts,
5431 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005432 Builder.defineMacro("__ARMEB__");
5433 Builder.defineMacro("__ARM_BIG_ENDIAN");
5434 ARMTargetInfo::getTargetDefines(Opts, Builder);
5435 }
5436};
Chris Lattner17df24e2008-04-21 18:56:49 +00005437
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005438class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5439 const llvm::Triple Triple;
5440public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005441 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5442 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005443 WCharType = UnsignedShort;
5444 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005445 }
5446 void getVisualStudioDefines(const LangOptions &Opts,
5447 MacroBuilder &Builder) const {
5448 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5449
5450 // FIXME: this is invalid for WindowsCE
5451 Builder.defineMacro("_M_ARM_NT", "1");
5452 Builder.defineMacro("_M_ARMT", "_M_ARM");
5453 Builder.defineMacro("_M_THUMB", "_M_ARM");
5454
5455 assert((Triple.getArch() == llvm::Triple::arm ||
5456 Triple.getArch() == llvm::Triple::thumb) &&
5457 "invalid architecture for Windows ARM target info");
5458 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5459 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5460
5461 // TODO map the complete set of values
5462 // 31: VFPv3 40: VFPv4
5463 Builder.defineMacro("_M_ARM_FP", "31");
5464 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005465 BuiltinVaListKind getBuiltinVaListKind() const override {
5466 return TargetInfo::CharPtrBuiltinVaList;
5467 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005468 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5469 switch (CC) {
5470 case CC_X86StdCall:
5471 case CC_X86ThisCall:
5472 case CC_X86FastCall:
5473 case CC_X86VectorCall:
5474 return CCCR_Ignore;
5475 case CC_C:
5476 return CCCR_OK;
5477 default:
5478 return CCCR_Warning;
5479 }
5480 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005481};
5482
5483// Windows ARM + Itanium C++ ABI Target
5484class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5485public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005486 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5487 const TargetOptions &Opts)
5488 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005489 TheCXXABI.set(TargetCXXABI::GenericARM);
5490 }
5491
5492 void getTargetDefines(const LangOptions &Opts,
5493 MacroBuilder &Builder) const override {
5494 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5495
5496 if (Opts.MSVCCompat)
5497 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5498 }
5499};
5500
5501// Windows ARM, MS (C++) ABI
5502class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5503public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005504 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5505 const TargetOptions &Opts)
5506 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005507 TheCXXABI.set(TargetCXXABI::Microsoft);
5508 }
5509
5510 void getTargetDefines(const LangOptions &Opts,
5511 MacroBuilder &Builder) const override {
5512 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5513 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5514 }
5515};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005516
Yaron Keren321249c2015-07-15 13:32:23 +00005517// ARM MinGW target
5518class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5519public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005520 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5521 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005522 TheCXXABI.set(TargetCXXABI::GenericARM);
5523 }
5524
5525 void getTargetDefines(const LangOptions &Opts,
5526 MacroBuilder &Builder) const override {
5527 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5528 DefineStd(Builder, "WIN32", Opts);
5529 DefineStd(Builder, "WINNT", Opts);
5530 Builder.defineMacro("_ARM_");
5531 addMinGWDefines(Opts, Builder);
5532 }
5533};
5534
5535// ARM Cygwin target
5536class CygwinARMTargetInfo : public ARMleTargetInfo {
5537public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005538 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5539 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005540 TLSSupported = false;
5541 WCharType = UnsignedShort;
5542 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005543 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005544 }
5545 void getTargetDefines(const LangOptions &Opts,
5546 MacroBuilder &Builder) const override {
5547 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5548 Builder.defineMacro("_ARM_");
5549 Builder.defineMacro("__CYGWIN__");
5550 Builder.defineMacro("__CYGWIN32__");
5551 DefineStd(Builder, "unix", Opts);
5552 if (Opts.CPlusPlus)
5553 Builder.defineMacro("_GNU_SOURCE");
5554 }
5555};
5556
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005557class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005558protected:
Craig Topper3164f332014-03-11 03:39:26 +00005559 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5560 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005561 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005562 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005563
Torok Edwinb2b37c62009-06-30 17:10:35 +00005564public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005565 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5566 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005567 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005568 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005569 // FIXME: This should be based off of the target features in
5570 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005571 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005572
Tim Northoverd88ecb32016-01-27 19:32:40 +00005573 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005574 // Darwin on iOS uses a variant of the ARM C++ ABI.
5575 TheCXXABI.set(TargetCXXABI::WatchOS);
5576
5577 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5578 // size_t is long, it's a bit weird for it to be int.
5579 PtrDiffType = SignedLong;
5580
5581 // BOOL should be a real boolean on the new ABI
5582 UseSignedCharForObjCBool = false;
5583 } else
5584 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005585 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005586};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005587
Tim Northover573cbee2014-05-24 12:52:07 +00005588class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005589 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005590 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5591 static const char *const GCCRegNames[];
5592
James Molloy75f5f9e2014-04-16 15:33:48 +00005593 enum FPUModeEnum {
5594 FPUMode,
5595 NeonMode
5596 };
5597
5598 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005599 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005600 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005601 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005602 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005603
Tim Northovera2ee4332014-03-29 15:09:45 +00005604 static const Builtin::Info BuiltinInfo[];
5605
5606 std::string ABI;
5607
5608public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005609 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005610 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005611 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5612 WCharType = SignedInt;
5613
5614 // NetBSD apparently prefers consistency across ARM targets to consistency
5615 // across 64-bit targets.
5616 Int64Type = SignedLongLong;
5617 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005618 } else {
5619 WCharType = UnsignedInt;
5620 Int64Type = SignedLong;
5621 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005622 }
5623
Tim Northovera2ee4332014-03-29 15:09:45 +00005624 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005625 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005626 MaxAtomicInlineWidth = 128;
5627 MaxAtomicPromoteWidth = 128;
5628
Tim Northovera6a19f12015-02-06 01:25:07 +00005629 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005630 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5631
Tim Northovera2ee4332014-03-29 15:09:45 +00005632 // {} in inline assembly are neon specifiers, not assembly variant
5633 // specifiers.
5634 NoAsmVariants = true;
5635
Tim Northover7ad87af2015-01-16 18:44:04 +00005636 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5637 // contributes to the alignment of the containing aggregate in the same way
5638 // a plain (non bit-field) member of that type would, without exception for
5639 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005640 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005641 UseZeroLengthBitfieldAlignment = true;
5642
Tim Northover573cbee2014-05-24 12:52:07 +00005643 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005644 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005645
5646 if (Triple.getOS() == llvm::Triple::Linux ||
5647 Triple.getOS() == llvm::Triple::UnknownOS)
5648 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005649 }
5650
Alp Toker4925ba72014-06-07 23:30:42 +00005651 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005652 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005653 if (Name != "aapcs" && Name != "darwinpcs")
5654 return false;
5655
5656 ABI = Name;
5657 return true;
5658 }
5659
David Blaikie1cbb9712014-11-14 19:09:44 +00005660 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005661 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005662 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005663 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5664 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005665 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005666 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005667 .Default(false);
5668 return CPUKnown;
5669 }
5670
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005671 void getTargetDefines(const LangOptions &Opts,
5672 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005673 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005674 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005675
5676 // Target properties.
5677 Builder.defineMacro("_LP64");
5678 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005679
5680 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5681 Builder.defineMacro("__ARM_ACLE", "200");
5682 Builder.defineMacro("__ARM_ARCH", "8");
5683 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5684
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005685 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005686 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005687 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005688
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005689 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5690 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5691 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5692 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005693 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005694 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5695 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005696
5697 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5698
5699 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005700 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005701
5702 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5703 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005704 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5705 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005706
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005707 if (Opts.UnsafeFPMath)
5708 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005709
5710 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5711
5712 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5713 Opts.ShortEnums ? "1" : "4");
5714
James Molloy75f5f9e2014-04-16 15:33:48 +00005715 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005716 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005717 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005718 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005719 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005720
Bradley Smith418c5932014-05-02 15:17:51 +00005721 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005722 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005723
James Molloy75f5f9e2014-04-16 15:33:48 +00005724 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005725 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5726
5727 if (Unaligned)
5728 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005729
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005730 if (V8_1A)
5731 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5732
Reid Klecknerd167d422015-05-06 15:31:46 +00005733 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5734 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5735 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5736 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5737 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005738 }
5739
Craig Topper6c03a542015-10-19 04:51:35 +00005740 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5741 return llvm::makeArrayRef(BuiltinInfo,
5742 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005743 }
5744
David Blaikie1cbb9712014-11-14 19:09:44 +00005745 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005746 return Feature == "aarch64" ||
5747 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005748 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005749 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005750 }
5751
James Molloy5e73df52014-04-16 15:06:20 +00005752 bool handleTargetFeatures(std::vector<std::string> &Features,
5753 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005754 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005755 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005756 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005757 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005758 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005759
Eric Christopher610fe112015-08-26 08:21:55 +00005760 for (const auto &Feature : Features) {
5761 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005762 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005763 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005764 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005765 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005766 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005767 if (Feature == "+strict-align")
5768 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005769 if (Feature == "+v8.1a")
5770 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005771 }
5772
James Y Knightb214cbc2016-03-04 19:00:41 +00005773 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005774
5775 return true;
5776 }
5777
John McCall477f2bb2016-03-03 06:39:32 +00005778 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5779 switch (CC) {
5780 case CC_C:
5781 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005782 case CC_PreserveMost:
5783 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005784 return CCCR_OK;
5785 default:
5786 return CCCR_Warning;
5787 }
5788 }
5789
David Blaikie1cbb9712014-11-14 19:09:44 +00005790 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005791
David Blaikie1cbb9712014-11-14 19:09:44 +00005792 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005793 return TargetInfo::AArch64ABIBuiltinVaList;
5794 }
5795
Craig Topperf054e3a2015-10-19 03:52:27 +00005796 ArrayRef<const char *> getGCCRegNames() const override;
5797 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005798
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005799 bool validateAsmConstraint(const char *&Name,
5800 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005801 switch (*Name) {
5802 default:
5803 return false;
5804 case 'w': // Floating point and SIMD registers (V0-V31)
5805 Info.setAllowsRegister();
5806 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005807 case 'I': // Constant that can be used with an ADD instruction
5808 case 'J': // Constant that can be used with a SUB instruction
5809 case 'K': // Constant that can be used with a 32-bit logical instruction
5810 case 'L': // Constant that can be used with a 64-bit logical instruction
5811 case 'M': // Constant that can be used as a 32-bit MOV immediate
5812 case 'N': // Constant that can be used as a 64-bit MOV immediate
5813 case 'Y': // Floating point constant zero
5814 case 'Z': // Integer constant zero
5815 return true;
5816 case 'Q': // A memory reference with base register and no offset
5817 Info.setAllowsMemory();
5818 return true;
5819 case 'S': // A symbolic address
5820 Info.setAllowsRegister();
5821 return true;
5822 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005823 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5824 // Utf: A memory address suitable for ldp/stp in TF mode.
5825 // Usa: An absolute symbolic address.
5826 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5827 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005828 case 'z': // Zero register, wzr or xzr
5829 Info.setAllowsRegister();
5830 return true;
5831 case 'x': // Floating point and SIMD registers (V0-V15)
5832 Info.setAllowsRegister();
5833 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005834 }
5835 return false;
5836 }
5837
Akira Hatanaka987f1862014-08-22 06:05:21 +00005838 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005839 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005840 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005841 // Strip off constraint modifiers.
5842 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5843 Constraint = Constraint.substr(1);
5844
5845 switch (Constraint[0]) {
5846 default:
5847 return true;
5848 case 'z':
5849 case 'r': {
5850 switch (Modifier) {
5851 case 'x':
5852 case 'w':
5853 // For now assume that the person knows what they're
5854 // doing with the modifier.
5855 return true;
5856 default:
5857 // By default an 'r' constraint will be in the 'x'
5858 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005859 if (Size == 64)
5860 return true;
5861
5862 SuggestedModifier = "w";
5863 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005864 }
5865 }
5866 }
5867 }
5868
David Blaikie1cbb9712014-11-14 19:09:44 +00005869 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005870
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005871 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005872 if (RegNo == 0)
5873 return 0;
5874 if (RegNo == 1)
5875 return 1;
5876 return -1;
5877 }
5878};
5879
Tim Northover573cbee2014-05-24 12:52:07 +00005880const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005881 // 32-bit Integer registers
5882 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5883 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5884 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5885
5886 // 64-bit Integer registers
5887 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5888 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5889 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5890
5891 // 32-bit floating point regsisters
5892 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5893 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5894 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5895
5896 // 64-bit floating point regsisters
5897 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5898 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5899 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5900
5901 // Vector registers
5902 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5903 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5904 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5905};
5906
Craig Topperf054e3a2015-10-19 03:52:27 +00005907ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5908 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005909}
5910
Tim Northover573cbee2014-05-24 12:52:07 +00005911const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005912 { { "w31" }, "wsp" },
5913 { { "x29" }, "fp" },
5914 { { "x30" }, "lr" },
5915 { { "x31" }, "sp" },
5916 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5917 // don't want to substitute one of these for a different-sized one.
5918};
5919
Craig Topperf054e3a2015-10-19 03:52:27 +00005920ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5921 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005922}
5923
Tim Northover573cbee2014-05-24 12:52:07 +00005924const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005925#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005926 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005927#include "clang/Basic/BuiltinsNEON.def"
5928
5929#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005930 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005931#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005932};
James Molloy5e73df52014-04-16 15:06:20 +00005933
Tim Northover573cbee2014-05-24 12:52:07 +00005934class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005935 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005936 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005937 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005938 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005939 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005940 }
5941
5942public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005943 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5944 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00005945 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005946 }
James Molloy5e73df52014-04-16 15:06:20 +00005947 void getTargetDefines(const LangOptions &Opts,
5948 MacroBuilder &Builder) const override {
5949 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005950 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005951 }
5952};
5953
Tim Northover573cbee2014-05-24 12:52:07 +00005954class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005955 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005956 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005957 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005958 }
5959
5960public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005961 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5962 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00005963 void getTargetDefines(const LangOptions &Opts,
5964 MacroBuilder &Builder) const override {
5965 Builder.defineMacro("__AARCH64EB__");
5966 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5967 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005968 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005969 }
5970};
Tim Northovera2ee4332014-03-29 15:09:45 +00005971
Tim Northover573cbee2014-05-24 12:52:07 +00005972class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005973protected:
5974 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5975 MacroBuilder &Builder) const override {
5976 Builder.defineMacro("__AARCH64_SIMD__");
5977 Builder.defineMacro("__ARM64_ARCH_8__");
5978 Builder.defineMacro("__ARM_NEON__");
5979 Builder.defineMacro("__LITTLE_ENDIAN__");
5980 Builder.defineMacro("__REGISTER_PREFIX__", "");
5981 Builder.defineMacro("__arm64", "1");
5982 Builder.defineMacro("__arm64__", "1");
5983
5984 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5985 }
5986
Tim Northovera2ee4332014-03-29 15:09:45 +00005987public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005988 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5989 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005990 Int64Type = SignedLongLong;
5991 WCharType = SignedInt;
5992 UseSignedCharForObjCBool = false;
5993
Tim Northovera6a19f12015-02-06 01:25:07 +00005994 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005995 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5996
5997 TheCXXABI.set(TargetCXXABI::iOS64);
5998 }
5999
David Blaikie1cbb9712014-11-14 19:09:44 +00006000 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006001 return TargetInfo::CharPtrBuiltinVaList;
6002 }
6003};
Tim Northovera2ee4332014-03-29 15:09:45 +00006004
Tony Linthicum76329bf2011-12-12 21:14:55 +00006005// Hexagon abstract base class
6006class HexagonTargetInfo : public TargetInfo {
6007 static const Builtin::Info BuiltinInfo[];
6008 static const char * const GCCRegNames[];
6009 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6010 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006011 bool HasHVX, HasHVXDouble;
6012
Tony Linthicum76329bf2011-12-12 21:14:55 +00006013public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006014 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6015 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006016 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006017 // Specify the vector alignment explicitly. For v512x1, the calculated
6018 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6019 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006020 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006021 "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 +00006022 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006023 SizeType = UnsignedInt;
6024 PtrDiffType = SignedInt;
6025 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006026
6027 // {} in inline assembly are packet specifiers, not assembly variant
6028 // specifiers.
6029 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006030
6031 LargeArrayMinWidth = 64;
6032 LargeArrayAlign = 64;
6033 UseBitFieldTypeAlignment = true;
6034 ZeroLengthBitfieldBoundary = 32;
6035 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006036 }
6037
Craig Topper6c03a542015-10-19 04:51:35 +00006038 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6039 return llvm::makeArrayRef(BuiltinInfo,
6040 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006041 }
6042
Craig Topper3164f332014-03-11 03:39:26 +00006043 bool validateAsmConstraint(const char *&Name,
6044 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006045 switch (*Name) {
6046 case 'v':
6047 case 'q':
6048 if (HasHVX) {
6049 Info.setAllowsRegister();
6050 return true;
6051 }
6052 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006053 case 's':
6054 // Relocatable constant.
6055 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006056 }
6057 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006058 }
6059
Craig Topper3164f332014-03-11 03:39:26 +00006060 void getTargetDefines(const LangOptions &Opts,
6061 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006062
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006063 bool isCLZForZeroUndef() const override { return false; }
6064
Craig Topper3164f332014-03-11 03:39:26 +00006065 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006066 return llvm::StringSwitch<bool>(Feature)
6067 .Case("hexagon", true)
6068 .Case("hvx", HasHVX)
6069 .Case("hvx-double", HasHVXDouble)
6070 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006071 }
Craig Topper3164f332014-03-11 03:39:26 +00006072
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006073 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6074 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6075 const override;
6076
6077 bool handleTargetFeatures(std::vector<std::string> &Features,
6078 DiagnosticsEngine &Diags) override;
6079
Craig Topper3164f332014-03-11 03:39:26 +00006080 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006081 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006082 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006083 ArrayRef<const char *> getGCCRegNames() const override;
6084 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006085 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006086 return "";
6087 }
Sebastian Pop86500282012-01-13 20:37:10 +00006088
6089 static const char *getHexagonCPUSuffix(StringRef Name) {
6090 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006091 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006092 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006093 .Case("hexagonv55", "55")
6094 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006095 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006096 }
6097
Craig Topper3164f332014-03-11 03:39:26 +00006098 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006099 if (!getHexagonCPUSuffix(Name))
6100 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006101 CPU = Name;
6102 return true;
6103 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006104
6105 int getEHDataRegisterNumber(unsigned RegNo) const override {
6106 return RegNo < 2 ? RegNo : -1;
6107 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006108};
6109
6110void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006111 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006112 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006113 Builder.defineMacro("__hexagon__", "1");
6114
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006115 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006116 Builder.defineMacro("__HEXAGON_V4__");
6117 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006118 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006119 Builder.defineMacro("__QDSP6_V4__");
6120 Builder.defineMacro("__QDSP6_ARCH__", "4");
6121 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006122 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006123 Builder.defineMacro("__HEXAGON_V5__");
6124 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6125 if(Opts.HexagonQdsp6Compat) {
6126 Builder.defineMacro("__QDSP6_V5__");
6127 Builder.defineMacro("__QDSP6_ARCH__", "5");
6128 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006129 } else if (CPU == "hexagonv55") {
6130 Builder.defineMacro("__HEXAGON_V55__");
6131 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6132 Builder.defineMacro("__QDSP6_V55__");
6133 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006134 } else if (CPU == "hexagonv60") {
6135 Builder.defineMacro("__HEXAGON_V60__");
6136 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6137 Builder.defineMacro("__QDSP6_V60__");
6138 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006139 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006140
6141 if (hasFeature("hvx")) {
6142 Builder.defineMacro("__HVX__");
6143 if (hasFeature("hvx-double"))
6144 Builder.defineMacro("__HVXDBL__");
6145 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006146}
6147
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006148bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6149 DiagnosticsEngine &Diags) {
6150 for (auto &F : Features) {
6151 if (F == "+hvx")
6152 HasHVX = true;
6153 else if (F == "-hvx")
6154 HasHVX = HasHVXDouble = false;
6155 else if (F == "+hvx-double")
6156 HasHVX = HasHVXDouble = true;
6157 else if (F == "-hvx-double")
6158 HasHVXDouble = false;
6159 }
6160 return true;
6161}
6162
6163bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6164 DiagnosticsEngine &Diags, StringRef CPU,
6165 const std::vector<std::string> &FeaturesVec) const {
6166 // Default for v60: -hvx, -hvx-double.
6167 Features["hvx"] = false;
6168 Features["hvx-double"] = false;
6169
6170 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6171}
6172
6173
6174const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006175 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6176 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6177 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6178 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6179 "p0", "p1", "p2", "p3",
6180 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6181};
6182
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006183ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006184 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006185}
6186
Tony Linthicum76329bf2011-12-12 21:14:55 +00006187const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6188 { { "sp" }, "r29" },
6189 { { "fp" }, "r30" },
6190 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006191};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006192
Craig Topperf054e3a2015-10-19 03:52:27 +00006193ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6194 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006195}
6196
6197
6198const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006199#define BUILTIN(ID, TYPE, ATTRS) \
6200 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6201#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6202 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006203#include "clang/Basic/BuiltinsHexagon.def"
6204};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006205
Jacques Pienaard964cc22016-03-28 21:02:54 +00006206class LanaiTargetInfo : public TargetInfo {
6207 // Class for Lanai (32-bit).
6208 // The CPU profiles supported by the Lanai backend
6209 enum CPUKind {
6210 CK_NONE,
6211 CK_V11,
6212 } CPU;
6213
6214 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6215 static const char *const GCCRegNames[];
6216
6217public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006218 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6219 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006220 // Description string has to be kept in sync with backend.
6221 resetDataLayout("E" // Big endian
6222 "-m:e" // ELF name manging
6223 "-p:32:32" // 32 bit pointers, 32 bit aligned
6224 "-i64:64" // 64 bit integers, 64 bit aligned
6225 "-a:0:32" // 32 bit alignment of objects of aggregate type
6226 "-n32" // 32 bit native integer width
6227 "-S64" // 64 bit natural stack alignment
6228 );
6229
6230 // Setting RegParmMax equal to what mregparm was set to in the old
6231 // toolchain
6232 RegParmMax = 4;
6233
6234 // Set the default CPU to V11
6235 CPU = CK_V11;
6236
6237 // Temporary approach to make everything at least word-aligned and allow for
6238 // safely casting between pointers with different alignment requirements.
6239 // TODO: Remove this when there are no more cast align warnings on the
6240 // firmware.
6241 MinGlobalAlign = 32;
6242 }
6243
6244 void getTargetDefines(const LangOptions &Opts,
6245 MacroBuilder &Builder) const override {
6246 // Define __lanai__ when building for target lanai.
6247 Builder.defineMacro("__lanai__");
6248
6249 // Set define for the CPU specified.
6250 switch (CPU) {
6251 case CK_V11:
6252 Builder.defineMacro("__LANAI_V11__");
6253 break;
6254 case CK_NONE:
6255 llvm_unreachable("Unhandled target CPU");
6256 }
6257 }
6258
6259 bool setCPU(const std::string &Name) override {
6260 CPU = llvm::StringSwitch<CPUKind>(Name)
6261 .Case("v11", CK_V11)
6262 .Default(CK_NONE);
6263
6264 return CPU != CK_NONE;
6265 }
6266
6267 bool hasFeature(StringRef Feature) const override {
6268 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6269 }
6270
6271 ArrayRef<const char *> getGCCRegNames() const override;
6272
6273 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6274
6275 BuiltinVaListKind getBuiltinVaListKind() const override {
6276 return TargetInfo::VoidPtrBuiltinVaList;
6277 }
6278
6279 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6280
6281 bool validateAsmConstraint(const char *&Name,
6282 TargetInfo::ConstraintInfo &info) const override {
6283 return false;
6284 }
6285
6286 const char *getClobbers() const override { return ""; }
6287};
6288
6289const char *const LanaiTargetInfo::GCCRegNames[] = {
6290 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6291 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6292 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6293
6294ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6295 return llvm::makeArrayRef(GCCRegNames);
6296}
6297
6298const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6299 {{"pc"}, "r2"},
6300 {{"sp"}, "r4"},
6301 {{"fp"}, "r5"},
6302 {{"rv"}, "r8"},
6303 {{"rr1"}, "r10"},
6304 {{"rr2"}, "r11"},
6305 {{"rca"}, "r15"},
6306};
6307
6308ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6309 return llvm::makeArrayRef(GCCRegAliases);
6310}
6311
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006312// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6313class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006314 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6315 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006316 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006317public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006318 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006319 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006320
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006321 int getEHDataRegisterNumber(unsigned RegNo) const override {
6322 if (RegNo == 0) return 24;
6323 if (RegNo == 1) return 25;
6324 return -1;
6325 }
6326
Craig Topper3164f332014-03-11 03:39:26 +00006327 bool handleTargetFeatures(std::vector<std::string> &Features,
6328 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006329 // The backend doesn't actually handle soft float yet, but in case someone
6330 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006331 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6332 if (Feature != Features.end()) {
6333 SoftFloat = true;
6334 Features.erase(Feature);
6335 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006336 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006337 }
Craig Topper3164f332014-03-11 03:39:26 +00006338 void getTargetDefines(const LangOptions &Opts,
6339 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006340 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006341 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006342
6343 if (SoftFloat)
6344 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006345 }
Craig Topper3164f332014-03-11 03:39:26 +00006346
6347 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006348 return llvm::StringSwitch<bool>(Feature)
6349 .Case("softfloat", SoftFloat)
6350 .Case("sparc", true)
6351 .Default(false);
6352 }
Craig Topper3164f332014-03-11 03:39:26 +00006353
Craig Topper6c03a542015-10-19 04:51:35 +00006354 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006355 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006356 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006357 }
Craig Topper3164f332014-03-11 03:39:26 +00006358 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006359 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006360 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006361 ArrayRef<const char *> getGCCRegNames() const override;
6362 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006363 bool validateAsmConstraint(const char *&Name,
6364 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006365 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006366 switch (*Name) {
6367 case 'I': // Signed 13-bit constant
6368 case 'J': // Zero
6369 case 'K': // 32-bit constant with the low 12 bits clear
6370 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6371 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6372 case 'N': // Same as 'K' but zext (required for SIMode)
6373 case 'O': // The constant 4096
6374 return true;
6375 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006376 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006377 }
Craig Topper3164f332014-03-11 03:39:26 +00006378 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006379 // FIXME: Implement!
6380 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006381 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006382
6383 // No Sparc V7 for now, the backend doesn't support it anyway.
6384 enum CPUKind {
6385 CK_GENERIC,
6386 CK_V8,
6387 CK_SUPERSPARC,
6388 CK_SPARCLITE,
6389 CK_F934,
6390 CK_HYPERSPARC,
6391 CK_SPARCLITE86X,
6392 CK_SPARCLET,
6393 CK_TSC701,
6394 CK_V9,
6395 CK_ULTRASPARC,
6396 CK_ULTRASPARC3,
6397 CK_NIAGARA,
6398 CK_NIAGARA2,
6399 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006400 CK_NIAGARA4,
6401 CK_MYRIAD2_1,
6402 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006403 } CPU = CK_GENERIC;
6404
6405 enum CPUGeneration {
6406 CG_V8,
6407 CG_V9,
6408 };
6409
6410 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6411 switch (Kind) {
6412 case CK_GENERIC:
6413 case CK_V8:
6414 case CK_SUPERSPARC:
6415 case CK_SPARCLITE:
6416 case CK_F934:
6417 case CK_HYPERSPARC:
6418 case CK_SPARCLITE86X:
6419 case CK_SPARCLET:
6420 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006421 case CK_MYRIAD2_1:
6422 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006423 return CG_V8;
6424 case CK_V9:
6425 case CK_ULTRASPARC:
6426 case CK_ULTRASPARC3:
6427 case CK_NIAGARA:
6428 case CK_NIAGARA2:
6429 case CK_NIAGARA3:
6430 case CK_NIAGARA4:
6431 return CG_V9;
6432 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006433 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006434 }
6435
6436 CPUKind getCPUKind(StringRef Name) const {
6437 return llvm::StringSwitch<CPUKind>(Name)
6438 .Case("v8", CK_V8)
6439 .Case("supersparc", CK_SUPERSPARC)
6440 .Case("sparclite", CK_SPARCLITE)
6441 .Case("f934", CK_F934)
6442 .Case("hypersparc", CK_HYPERSPARC)
6443 .Case("sparclite86x", CK_SPARCLITE86X)
6444 .Case("sparclet", CK_SPARCLET)
6445 .Case("tsc701", CK_TSC701)
6446 .Case("v9", CK_V9)
6447 .Case("ultrasparc", CK_ULTRASPARC)
6448 .Case("ultrasparc3", CK_ULTRASPARC3)
6449 .Case("niagara", CK_NIAGARA)
6450 .Case("niagara2", CK_NIAGARA2)
6451 .Case("niagara3", CK_NIAGARA3)
6452 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006453 .Case("myriad2", CK_MYRIAD2_1)
6454 .Case("myriad2.1", CK_MYRIAD2_1)
6455 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006456 .Default(CK_GENERIC);
6457 }
6458
6459 bool setCPU(const std::string &Name) override {
6460 CPU = getCPUKind(Name);
6461 return CPU != CK_GENERIC;
6462 }
Gabor Greif49991682008-02-21 16:29:08 +00006463};
6464
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006465const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006466 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6467 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6468 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6469 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6470};
6471
Craig Topperf054e3a2015-10-19 03:52:27 +00006472ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6473 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006474}
6475
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006476const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006477 { { "g0" }, "r0" },
6478 { { "g1" }, "r1" },
6479 { { "g2" }, "r2" },
6480 { { "g3" }, "r3" },
6481 { { "g4" }, "r4" },
6482 { { "g5" }, "r5" },
6483 { { "g6" }, "r6" },
6484 { { "g7" }, "r7" },
6485 { { "o0" }, "r8" },
6486 { { "o1" }, "r9" },
6487 { { "o2" }, "r10" },
6488 { { "o3" }, "r11" },
6489 { { "o4" }, "r12" },
6490 { { "o5" }, "r13" },
6491 { { "o6", "sp" }, "r14" },
6492 { { "o7" }, "r15" },
6493 { { "l0" }, "r16" },
6494 { { "l1" }, "r17" },
6495 { { "l2" }, "r18" },
6496 { { "l3" }, "r19" },
6497 { { "l4" }, "r20" },
6498 { { "l5" }, "r21" },
6499 { { "l6" }, "r22" },
6500 { { "l7" }, "r23" },
6501 { { "i0" }, "r24" },
6502 { { "i1" }, "r25" },
6503 { { "i2" }, "r26" },
6504 { { "i3" }, "r27" },
6505 { { "i4" }, "r28" },
6506 { { "i5" }, "r29" },
6507 { { "i6", "fp" }, "r30" },
6508 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006509};
6510
Craig Topperf054e3a2015-10-19 03:52:27 +00006511ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6512 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006513}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006514
6515// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6516class SparcV8TargetInfo : public SparcTargetInfo {
6517public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006518 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6519 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006520 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006521 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6522 switch (getTriple().getOS()) {
6523 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006524 SizeType = UnsignedInt;
6525 IntPtrType = SignedInt;
6526 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006527 break;
6528 case llvm::Triple::NetBSD:
6529 case llvm::Triple::OpenBSD:
6530 SizeType = UnsignedLong;
6531 IntPtrType = SignedLong;
6532 PtrDiffType = SignedLong;
6533 break;
Brad Smith56495d52015-08-13 22:00:53 +00006534 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006535 }
6536
Craig Topper3164f332014-03-11 03:39:26 +00006537 void getTargetDefines(const LangOptions &Opts,
6538 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006539 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006540 switch (getCPUGeneration(CPU)) {
6541 case CG_V8:
6542 Builder.defineMacro("__sparcv8");
6543 if (getTriple().getOS() != llvm::Triple::Solaris)
6544 Builder.defineMacro("__sparcv8__");
6545 break;
6546 case CG_V9:
6547 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006548 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006549 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006550 Builder.defineMacro("__sparc_v9__");
6551 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006552 break;
6553 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006554 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6555 switch (CPU) {
6556 case CK_MYRIAD2_1:
6557 Builder.defineMacro("__myriad2", "1");
6558 Builder.defineMacro("__myriad2__", "1");
6559 break;
6560 case CK_MYRIAD2_2:
6561 Builder.defineMacro("__myriad2", "2");
6562 Builder.defineMacro("__myriad2__", "2");
6563 break;
6564 default:
6565 break;
6566 }
6567 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006568 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006569
6570 bool hasSjLjLowering() const override {
6571 return true;
6572 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006573};
6574
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006575// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6576class SparcV8elTargetInfo : public SparcV8TargetInfo {
6577 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006578 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6579 : SparcV8TargetInfo(Triple, Opts) {
6580 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6581 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006582 }
6583};
6584
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006585// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6586class SparcV9TargetInfo : public SparcTargetInfo {
6587public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006588 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6589 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006590 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006591 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006592 // This is an LP64 platform.
6593 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006594
6595 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006596 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006597 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006598 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006599 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006600 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006601
6602 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6603 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6604 LongDoubleWidth = 128;
6605 LongDoubleAlign = 128;
6606 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006607 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006608 }
6609
Craig Topper3164f332014-03-11 03:39:26 +00006610 void getTargetDefines(const LangOptions &Opts,
6611 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006612 SparcTargetInfo::getTargetDefines(Opts, Builder);
6613 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006614 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006615 // Solaris doesn't need these variants, but the BSDs do.
6616 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006617 Builder.defineMacro("__sparc64__");
6618 Builder.defineMacro("__sparc_v9__");
6619 Builder.defineMacro("__sparcv9__");
6620 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006621 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006622
Craig Topper3164f332014-03-11 03:39:26 +00006623 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006624 if (!SparcTargetInfo::setCPU(Name))
6625 return false;
6626 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006627 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006628};
6629
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006630class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006631 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006632 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006633 std::string CPU;
6634 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006635 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006636
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006638 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006639 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6640 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006641 IntMaxType = SignedLong;
6642 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006643 TLSSupported = true;
6644 IntWidth = IntAlign = 32;
6645 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6646 PointerWidth = PointerAlign = 64;
6647 LongDoubleWidth = 128;
6648 LongDoubleAlign = 64;
6649 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006650 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006651 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006652 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 +00006653 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6654 }
6655 void getTargetDefines(const LangOptions &Opts,
6656 MacroBuilder &Builder) const override {
6657 Builder.defineMacro("__s390__");
6658 Builder.defineMacro("__s390x__");
6659 Builder.defineMacro("__zarch__");
6660 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006661
6662 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6663 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6664 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6665 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6666
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006667 if (HasTransactionalExecution)
6668 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006669 if (Opts.ZVector)
6670 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006671 }
Craig Topper6c03a542015-10-19 04:51:35 +00006672 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6673 return llvm::makeArrayRef(BuiltinInfo,
6674 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006675 }
6676
Craig Topperf054e3a2015-10-19 03:52:27 +00006677 ArrayRef<const char *> getGCCRegNames() const override;
6678 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006679 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006680 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006681 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006682 bool validateAsmConstraint(const char *&Name,
6683 TargetInfo::ConstraintInfo &info) const override;
6684 const char *getClobbers() const override {
6685 // FIXME: Is this really right?
6686 return "";
6687 }
6688 BuiltinVaListKind getBuiltinVaListKind() const override {
6689 return TargetInfo::SystemZBuiltinVaList;
6690 }
6691 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006692 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006693 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6694 .Case("z10", true)
6695 .Case("z196", true)
6696 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006697 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006698 .Default(false);
6699
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006700 return CPUKnown;
6701 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006702 bool
6703 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6704 StringRef CPU,
6705 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006706 if (CPU == "zEC12")
6707 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006708 if (CPU == "z13") {
6709 Features["transactional-execution"] = true;
6710 Features["vector"] = true;
6711 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006712 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006713 }
6714
6715 bool handleTargetFeatures(std::vector<std::string> &Features,
6716 DiagnosticsEngine &Diags) override {
6717 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006718 for (const auto &Feature : Features) {
6719 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006720 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006721 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006722 HasVector = true;
6723 }
6724 // If we use the vector ABI, vector types are 64-bit aligned.
6725 if (HasVector) {
6726 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006727 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6728 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006729 }
6730 return true;
6731 }
6732
6733 bool hasFeature(StringRef Feature) const override {
6734 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006735 .Case("systemz", true)
6736 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006737 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006738 .Default(false);
6739 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006740
Bryan Chane3f1ed52016-04-28 13:56:43 +00006741 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6742 switch (CC) {
6743 case CC_C:
6744 case CC_Swift:
6745 return CCCR_OK;
6746 default:
6747 return CCCR_Warning;
6748 }
6749 }
6750
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006751 StringRef getABI() const override {
6752 if (HasVector)
6753 return "vector";
6754 return "";
6755 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006756
6757 bool useFloat128ManglingForLongDouble() const override {
6758 return true;
6759 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006760};
6761
6762const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6763#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006764 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006765#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6766 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006767#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006768};
6769
6770const char *const SystemZTargetInfo::GCCRegNames[] = {
6771 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6772 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6773 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6774 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6775};
6776
Craig Topperf054e3a2015-10-19 03:52:27 +00006777ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6778 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006779}
6780
6781bool SystemZTargetInfo::
6782validateAsmConstraint(const char *&Name,
6783 TargetInfo::ConstraintInfo &Info) const {
6784 switch (*Name) {
6785 default:
6786 return false;
6787
6788 case 'a': // Address register
6789 case 'd': // Data register (equivalent to 'r')
6790 case 'f': // Floating-point register
6791 Info.setAllowsRegister();
6792 return true;
6793
6794 case 'I': // Unsigned 8-bit constant
6795 case 'J': // Unsigned 12-bit constant
6796 case 'K': // Signed 16-bit constant
6797 case 'L': // Signed 20-bit displacement (on all targets we support)
6798 case 'M': // 0x7fffffff
6799 return true;
6800
6801 case 'Q': // Memory with base and unsigned 12-bit displacement
6802 case 'R': // Likewise, plus an index
6803 case 'S': // Memory with base and signed 20-bit displacement
6804 case 'T': // Likewise, plus an index
6805 Info.setAllowsMemory();
6806 return true;
6807 }
6808}
Ulrich Weigand47445072013-05-06 16:26:41 +00006809
Eric Christopherc48497a2015-09-18 21:26:24 +00006810class MSP430TargetInfo : public TargetInfo {
6811 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006812
Eric Christopherc48497a2015-09-18 21:26:24 +00006813public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006814 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6815 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006816 BigEndian = false;
6817 TLSSupported = false;
6818 IntWidth = 16;
6819 IntAlign = 16;
6820 LongWidth = 32;
6821 LongLongWidth = 64;
6822 LongAlign = LongLongAlign = 16;
6823 PointerWidth = 16;
6824 PointerAlign = 16;
6825 SuitableAlign = 16;
6826 SizeType = UnsignedInt;
6827 IntMaxType = SignedLongLong;
6828 IntPtrType = SignedInt;
6829 PtrDiffType = SignedInt;
6830 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006831 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006832 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006833 void getTargetDefines(const LangOptions &Opts,
6834 MacroBuilder &Builder) const override {
6835 Builder.defineMacro("MSP430");
6836 Builder.defineMacro("__MSP430__");
6837 // FIXME: defines for different 'flavours' of MCU
6838 }
Craig Topper6c03a542015-10-19 04:51:35 +00006839 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006840 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006841 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006842 }
6843 bool hasFeature(StringRef Feature) const override {
6844 return Feature == "msp430";
6845 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006846 ArrayRef<const char *> getGCCRegNames() const override;
6847 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006848 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006849 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006850 }
6851 bool validateAsmConstraint(const char *&Name,
6852 TargetInfo::ConstraintInfo &info) const override {
6853 // FIXME: implement
6854 switch (*Name) {
6855 case 'K': // the constant 1
6856 case 'L': // constant -1^20 .. 1^19
6857 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006858 return true;
6859 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006860 // No target constraints for now.
6861 return false;
6862 }
6863 const char *getClobbers() const override {
6864 // FIXME: Is this really right?
6865 return "";
6866 }
6867 BuiltinVaListKind getBuiltinVaListKind() const override {
6868 // FIXME: implement
6869 return TargetInfo::CharPtrBuiltinVaList;
6870 }
6871};
6872
6873const char *const MSP430TargetInfo::GCCRegNames[] = {
6874 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6875 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6876
Craig Topperf054e3a2015-10-19 03:52:27 +00006877ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6878 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006879}
6880
6881// LLVM and Clang cannot be used directly to output native binaries for
6882// target, but is used to compile C code to llvm bitcode with correct
6883// type and alignment information.
6884//
6885// TCE uses the llvm bitcode as input and uses it for generating customized
6886// target processor and program binary. TCE co-design environment is
6887// publicly available in http://tce.cs.tut.fi
6888
6889static const unsigned TCEOpenCLAddrSpaceMap[] = {
6890 3, // opencl_global
6891 4, // opencl_local
6892 5, // opencl_constant
6893 // FIXME: generic has to be added to the target
6894 0, // opencl_generic
6895 0, // cuda_device
6896 0, // cuda_constant
6897 0 // cuda_shared
6898};
6899
6900class TCETargetInfo : public TargetInfo {
6901public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006902 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6903 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006904 TLSSupported = false;
6905 IntWidth = 32;
6906 LongWidth = LongLongWidth = 32;
6907 PointerWidth = 32;
6908 IntAlign = 32;
6909 LongAlign = LongLongAlign = 32;
6910 PointerAlign = 32;
6911 SuitableAlign = 32;
6912 SizeType = UnsignedInt;
6913 IntMaxType = SignedLong;
6914 IntPtrType = SignedInt;
6915 PtrDiffType = SignedInt;
6916 FloatWidth = 32;
6917 FloatAlign = 32;
6918 DoubleWidth = 32;
6919 DoubleAlign = 32;
6920 LongDoubleWidth = 32;
6921 LongDoubleAlign = 32;
6922 FloatFormat = &llvm::APFloat::IEEEsingle;
6923 DoubleFormat = &llvm::APFloat::IEEEsingle;
6924 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006925 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6926 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006927 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6928 UseAddrSpaceMapMangling = true;
6929 }
6930
6931 void getTargetDefines(const LangOptions &Opts,
6932 MacroBuilder &Builder) const override {
6933 DefineStd(Builder, "tce", Opts);
6934 Builder.defineMacro("__TCE__");
6935 Builder.defineMacro("__TCE_V1__");
6936 }
6937 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6938
Craig Topper6c03a542015-10-19 04:51:35 +00006939 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006940 const char *getClobbers() const override { return ""; }
6941 BuiltinVaListKind getBuiltinVaListKind() const override {
6942 return TargetInfo::VoidPtrBuiltinVaList;
6943 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006944 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006945 bool validateAsmConstraint(const char *&Name,
6946 TargetInfo::ConstraintInfo &info) const override {
6947 return true;
6948 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006949 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6950 return None;
6951 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006952};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006953
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006954class BPFTargetInfo : public TargetInfo {
6955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006956 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6957 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006958 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6959 SizeType = UnsignedLong;
6960 PtrDiffType = SignedLong;
6961 IntPtrType = SignedLong;
6962 IntMaxType = SignedLong;
6963 Int64Type = SignedLong;
6964 RegParmMax = 5;
6965 if (Triple.getArch() == llvm::Triple::bpfeb) {
6966 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006967 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006968 } else {
6969 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006970 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006971 }
6972 MaxAtomicPromoteWidth = 64;
6973 MaxAtomicInlineWidth = 64;
6974 TLSSupported = false;
6975 }
6976 void getTargetDefines(const LangOptions &Opts,
6977 MacroBuilder &Builder) const override {
6978 DefineStd(Builder, "bpf", Opts);
6979 Builder.defineMacro("__BPF__");
6980 }
6981 bool hasFeature(StringRef Feature) const override {
6982 return Feature == "bpf";
6983 }
6984
Craig Topper6c03a542015-10-19 04:51:35 +00006985 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006986 const char *getClobbers() const override {
6987 return "";
6988 }
6989 BuiltinVaListKind getBuiltinVaListKind() const override {
6990 return TargetInfo::VoidPtrBuiltinVaList;
6991 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006992 ArrayRef<const char *> getGCCRegNames() const override {
6993 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006994 }
6995 bool validateAsmConstraint(const char *&Name,
6996 TargetInfo::ConstraintInfo &info) const override {
6997 return true;
6998 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006999 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7000 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007001 }
7002};
7003
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007004class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00007005 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00007006
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007007 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007008 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007009 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007010 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007011 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007012 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007013 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007014 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007015 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007016 enum DspRevEnum {
7017 NoDSP, DSP1, DSP2
7018 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007019 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007020
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007021protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007022 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007023 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007024
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007025public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007026 MipsTargetInfoBase(const llvm::Triple &Triple, const TargetOptions &,
7027 const std::string &ABIStr, const std::string &CPUStr)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007028 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007029 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007030 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
7031 TheCXXABI.set(TargetCXXABI::GenericMIPS);
7032 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007033
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007034 bool isNaN2008Default() const {
7035 return CPU == "mips32r6" || CPU == "mips64r6";
7036 }
7037
7038 bool isFP64Default() const {
7039 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7040 }
7041
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007042 bool isNan2008() const override {
7043 return IsNan2008;
7044 }
7045
Alp Toker4925ba72014-06-07 23:30:42 +00007046 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00007047 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007048 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
7049 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00007050 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007051 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007052 .Case("mips1", IsMips32)
7053 .Case("mips2", IsMips32)
7054 .Case("mips3", true)
7055 .Case("mips4", true)
7056 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007057 .Case("mips32", IsMips32)
7058 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007059 .Case("mips32r3", IsMips32)
7060 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007061 .Case("mips32r6", IsMips32)
7062 .Case("mips64", true)
7063 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007064 .Case("mips64r3", true)
7065 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007066 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007067 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00007068 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007069 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007070 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007071 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007072 bool
7073 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7074 StringRef CPU,
7075 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007076 if (CPU.empty())
7077 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007078 if (CPU == "octeon")
7079 Features["mips64r2"] = Features["cnmips"] = true;
7080 else
7081 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007082 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007083 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007084
Craig Topper3164f332014-03-11 03:39:26 +00007085 void getTargetDefines(const LangOptions &Opts,
7086 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007087 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007088 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007089 if (Opts.GNUMode)
7090 Builder.defineMacro("mips");
7091
Simon Atanasyan683535b2012-08-29 19:14:58 +00007092 Builder.defineMacro("__REGISTER_PREFIX__", "");
7093
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007094 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007095 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007096 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007097 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007098 case SoftFloat:
7099 Builder.defineMacro("__mips_soft_float", Twine(1));
7100 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007101 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007102
Simon Atanasyan16071912013-04-14 14:07:30 +00007103 if (IsSingleFloat)
7104 Builder.defineMacro("__mips_single_float", Twine(1));
7105
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007106 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7107 Builder.defineMacro("_MIPS_FPSET",
7108 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7109
Simon Atanasyan72244b62012-07-05 16:06:06 +00007110 if (IsMips16)
7111 Builder.defineMacro("__mips16", Twine(1));
7112
Simon Atanasyan60777612013-04-14 14:07:51 +00007113 if (IsMicromips)
7114 Builder.defineMacro("__mips_micromips", Twine(1));
7115
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007116 if (IsNan2008)
7117 Builder.defineMacro("__mips_nan2008", Twine(1));
7118
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007119 switch (DspRev) {
7120 default:
7121 break;
7122 case DSP1:
7123 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7124 Builder.defineMacro("__mips_dsp", Twine(1));
7125 break;
7126 case DSP2:
7127 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7128 Builder.defineMacro("__mips_dspr2", Twine(1));
7129 Builder.defineMacro("__mips_dsp", Twine(1));
7130 break;
7131 }
7132
Jack Carter44ff1e52013-08-12 17:20:29 +00007133 if (HasMSA)
7134 Builder.defineMacro("__mips_msa", Twine(1));
7135
Simon Atanasyan26f19672012-04-05 19:28:31 +00007136 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7137 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7138 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007139
7140 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7141 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007142
7143 // These shouldn't be defined for MIPS-I but there's no need to check
7144 // for that since MIPS-I isn't supported.
7145 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7146 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7147 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007148 }
7149
Craig Topper6c03a542015-10-19 04:51:35 +00007150 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7151 return llvm::makeArrayRef(BuiltinInfo,
7152 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007153 }
Craig Topper3164f332014-03-11 03:39:26 +00007154 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007155 return llvm::StringSwitch<bool>(Feature)
7156 .Case("mips", true)
7157 .Case("fp64", HasFP64)
7158 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007159 }
Craig Topper3164f332014-03-11 03:39:26 +00007160 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007161 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007162 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007163 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007164 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007165 // CPU register names
7166 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007167 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7168 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7169 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007170 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7171 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007172 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7173 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7174 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7175 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007176 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007177 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007178 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7179 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007180 // MSA register names
7181 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7182 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7183 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7184 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7185 // MSA control register names
7186 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7187 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007188 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007189 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007190 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007191 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00007192 bool validateAsmConstraint(const char *&Name,
7193 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007194 switch (*Name) {
7195 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007196 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007197 case 'r': // CPU registers.
7198 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007199 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007200 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007201 case 'c': // $25 for indirect jumps
7202 case 'l': // lo register
7203 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007204 Info.setAllowsRegister();
7205 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007206 case 'I': // Signed 16-bit constant
7207 case 'J': // Integer 0
7208 case 'K': // Unsigned 16-bit constant
7209 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7210 case 'M': // Constants not loadable via lui, addiu, or ori
7211 case 'N': // Constant -1 to -65535
7212 case 'O': // A signed 15-bit constant
7213 case 'P': // A constant between 1 go 65535
7214 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007215 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007216 Info.setAllowsMemory();
7217 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007218 case 'Z':
7219 if (Name[1] == 'C') { // An address usable by ll, and sc.
7220 Info.setAllowsMemory();
7221 Name++; // Skip over 'Z'.
7222 return true;
7223 }
7224 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007225 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007226 }
7227
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007228 std::string convertConstraint(const char *&Constraint) const override {
7229 std::string R;
7230 switch (*Constraint) {
7231 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7232 if (Constraint[1] == 'C') {
7233 R = std::string("^") + std::string(Constraint, 2);
7234 Constraint++;
7235 return R;
7236 }
7237 break;
7238 }
7239 return TargetInfo::convertConstraint(Constraint);
7240 }
7241
Craig Topper3164f332014-03-11 03:39:26 +00007242 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007243 // In GCC, $1 is not widely used in generated code (it's used only in a few
7244 // specific situations), so there is no real need for users to add it to
7245 // the clobbers list if they want to use it in their inline assembly code.
7246 //
7247 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7248 // code generation, so using it in inline assembly without adding it to the
7249 // clobbers list can cause conflicts between the inline assembly code and
7250 // the surrounding generated code.
7251 //
7252 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7253 // operands, which will conflict with the ".set at" assembler option (which
7254 // we use only for inline assembly, in order to maintain compatibility with
7255 // GCC) and will also conflict with the user's usage of $1.
7256 //
7257 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7258 // register for generated code is to automatically clobber $1 for all inline
7259 // assembly code.
7260 //
7261 // FIXME: We should automatically clobber $1 only for inline assembly code
7262 // which actually uses it. This would allow LLVM to use $1 for inline
7263 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007264 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007265 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007266
Craig Topper3164f332014-03-11 03:39:26 +00007267 bool handleTargetFeatures(std::vector<std::string> &Features,
7268 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007269 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007270 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007271 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007272 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007273 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007274 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007275 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007276
Eric Christopher610fe112015-08-26 08:21:55 +00007277 for (const auto &Feature : Features) {
7278 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007279 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007280 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007281 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007282 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007283 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007284 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007285 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007286 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007287 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007288 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007289 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007290 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007291 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007292 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007293 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007294 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007295 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007296 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007297 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007298 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007299 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007300 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007301
James Y Knightb214cbc2016-03-04 19:00:41 +00007302 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007303
Rafael Espindolaeb265472013-08-21 21:59:03 +00007304 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007305 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007306
Craig Topper3164f332014-03-11 03:39:26 +00007307 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007308 if (RegNo == 0) return 4;
7309 if (RegNo == 1) return 5;
7310 return -1;
7311 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007312
7313 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007314};
7315
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007316const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007317#define BUILTIN(ID, TYPE, ATTRS) \
7318 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7319#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7320 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007321#include "clang/Basic/BuiltinsMips.def"
7322};
7323
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007324class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007325public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007326 Mips32TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7327 : MipsTargetInfoBase(Triple, Opts, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007328 SizeType = UnsignedInt;
7329 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007330 Int64Type = SignedLongLong;
7331 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007332 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007333 }
Craig Topper3164f332014-03-11 03:39:26 +00007334 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007335 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007336 ABI = Name;
7337 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007338 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007339 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007340 }
Craig Topper3164f332014-03-11 03:39:26 +00007341 void getTargetDefines(const LangOptions &Opts,
7342 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007343 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007344
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007345 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007346 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7347
7348 const std::string& CPUStr = getCPU();
7349 if (CPUStr == "mips32")
7350 Builder.defineMacro("__mips_isa_rev", "1");
7351 else if (CPUStr == "mips32r2")
7352 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007353 else if (CPUStr == "mips32r3")
7354 Builder.defineMacro("__mips_isa_rev", "3");
7355 else if (CPUStr == "mips32r5")
7356 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007357 else if (CPUStr == "mips32r6")
7358 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007359
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007360 if (ABI == "o32") {
7361 Builder.defineMacro("__mips_o32");
7362 Builder.defineMacro("_ABIO32", "1");
7363 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7364 }
7365 else if (ABI == "eabi")
7366 Builder.defineMacro("__mips_eabi");
7367 else
David Blaikie83d382b2011-09-23 05:06:16 +00007368 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007369 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007370 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007371 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7372 { { "at" }, "$1" },
7373 { { "v0" }, "$2" },
7374 { { "v1" }, "$3" },
7375 { { "a0" }, "$4" },
7376 { { "a1" }, "$5" },
7377 { { "a2" }, "$6" },
7378 { { "a3" }, "$7" },
7379 { { "t0" }, "$8" },
7380 { { "t1" }, "$9" },
7381 { { "t2" }, "$10" },
7382 { { "t3" }, "$11" },
7383 { { "t4" }, "$12" },
7384 { { "t5" }, "$13" },
7385 { { "t6" }, "$14" },
7386 { { "t7" }, "$15" },
7387 { { "s0" }, "$16" },
7388 { { "s1" }, "$17" },
7389 { { "s2" }, "$18" },
7390 { { "s3" }, "$19" },
7391 { { "s4" }, "$20" },
7392 { { "s5" }, "$21" },
7393 { { "s6" }, "$22" },
7394 { { "s7" }, "$23" },
7395 { { "t8" }, "$24" },
7396 { { "t9" }, "$25" },
7397 { { "k0" }, "$26" },
7398 { { "k1" }, "$27" },
7399 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007400 { { "sp","$sp" }, "$29" },
7401 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007402 { { "ra" }, "$31" }
7403 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007404 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007405 }
7406};
7407
7408class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007409 void setDataLayout() override {
7410 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007411 }
7412
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007413public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007414 Mips32EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7415 : Mips32TargetInfoBase(Triple, Opts) {
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00007416 }
Craig Topper3164f332014-03-11 03:39:26 +00007417 void getTargetDefines(const LangOptions &Opts,
7418 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007419 DefineStd(Builder, "MIPSEB", Opts);
7420 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007421 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007422 }
7423};
7424
7425class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007426 void setDataLayout() override {
7427 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007428 }
7429
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007430public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007431 Mips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7432 : Mips32TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007433 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007434 }
Craig Topper3164f332014-03-11 03:39:26 +00007435 void getTargetDefines(const LangOptions &Opts,
7436 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007437 DefineStd(Builder, "MIPSEL", Opts);
7438 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007439 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007440 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007441};
Akira Hatanakabef17452011-09-20 19:21:49 +00007442
7443class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007444public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007445 Mips64TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7446 : MipsTargetInfoBase(Triple, Opts, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007447 LongDoubleWidth = LongDoubleAlign = 128;
7448 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007449 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7450 LongDoubleWidth = LongDoubleAlign = 64;
7451 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7452 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007453 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007454 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007455 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007456 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007457
7458 void setN64ABITypes() {
7459 LongWidth = LongAlign = 64;
7460 PointerWidth = PointerAlign = 64;
7461 SizeType = UnsignedLong;
7462 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007463 Int64Type = SignedLong;
7464 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007465 }
7466
7467 void setN32ABITypes() {
7468 LongWidth = LongAlign = 32;
7469 PointerWidth = PointerAlign = 32;
7470 SizeType = UnsignedInt;
7471 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007472 Int64Type = SignedLongLong;
7473 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007474 }
7475
Craig Topper3164f332014-03-11 03:39:26 +00007476 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007477 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007478 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007479 ABI = Name;
7480 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007481 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007482 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007483 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007484 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007485 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007486 }
7487 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007488 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007489
Craig Topper3164f332014-03-11 03:39:26 +00007490 void getTargetDefines(const LangOptions &Opts,
7491 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007492 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007493
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007494 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007495 Builder.defineMacro("__mips64");
7496 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007497 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7498
7499 const std::string& CPUStr = getCPU();
7500 if (CPUStr == "mips64")
7501 Builder.defineMacro("__mips_isa_rev", "1");
7502 else if (CPUStr == "mips64r2")
7503 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007504 else if (CPUStr == "mips64r3")
7505 Builder.defineMacro("__mips_isa_rev", "3");
7506 else if (CPUStr == "mips64r5")
7507 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007508 else if (CPUStr == "mips64r6")
7509 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007510
Akira Hatanakabef17452011-09-20 19:21:49 +00007511 if (ABI == "n32") {
7512 Builder.defineMacro("__mips_n32");
7513 Builder.defineMacro("_ABIN32", "2");
7514 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7515 }
7516 else if (ABI == "n64") {
7517 Builder.defineMacro("__mips_n64");
7518 Builder.defineMacro("_ABI64", "3");
7519 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7520 }
7521 else
David Blaikie83d382b2011-09-23 05:06:16 +00007522 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007523
7524 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007525 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007526 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007527 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7528 { { "at" }, "$1" },
7529 { { "v0" }, "$2" },
7530 { { "v1" }, "$3" },
7531 { { "a0" }, "$4" },
7532 { { "a1" }, "$5" },
7533 { { "a2" }, "$6" },
7534 { { "a3" }, "$7" },
7535 { { "a4" }, "$8" },
7536 { { "a5" }, "$9" },
7537 { { "a6" }, "$10" },
7538 { { "a7" }, "$11" },
7539 { { "t0" }, "$12" },
7540 { { "t1" }, "$13" },
7541 { { "t2" }, "$14" },
7542 { { "t3" }, "$15" },
7543 { { "s0" }, "$16" },
7544 { { "s1" }, "$17" },
7545 { { "s2" }, "$18" },
7546 { { "s3" }, "$19" },
7547 { { "s4" }, "$20" },
7548 { { "s5" }, "$21" },
7549 { { "s6" }, "$22" },
7550 { { "s7" }, "$23" },
7551 { { "t8" }, "$24" },
7552 { { "t9" }, "$25" },
7553 { { "k0" }, "$26" },
7554 { { "k1" }, "$27" },
7555 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007556 { { "sp","$sp" }, "$29" },
7557 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007558 { { "ra" }, "$31" }
7559 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007560 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007561 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007562
7563 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007564};
7565
7566class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007567 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007568 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007569 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 +00007570 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007571 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007572 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007573
Akira Hatanakabef17452011-09-20 19:21:49 +00007574public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007575 Mips64EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7576 : Mips64TargetInfoBase(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00007577 void getTargetDefines(const LangOptions &Opts,
7578 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007579 DefineStd(Builder, "MIPSEB", Opts);
7580 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007581 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007582 }
7583};
7584
7585class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007586 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007587 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007588 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 +00007589 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007590 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007591 }
7592public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007593 Mips64ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7594 : Mips64TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007595 // Default ABI is n64.
7596 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007597 }
Craig Topper3164f332014-03-11 03:39:26 +00007598 void getTargetDefines(const LangOptions &Opts,
7599 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007600 DefineStd(Builder, "MIPSEL", Opts);
7601 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007602 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007603 }
7604};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007605
Ivan Krasindd7403e2011-08-24 20:22:22 +00007606class PNaClTargetInfo : public TargetInfo {
7607public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007608 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7609 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007610 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007611 this->LongAlign = 32;
7612 this->LongWidth = 32;
7613 this->PointerAlign = 32;
7614 this->PointerWidth = 32;
7615 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007616 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007617 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007618 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007619 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007620 this->SizeType = TargetInfo::UnsignedInt;
7621 this->PtrDiffType = TargetInfo::SignedInt;
7622 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007623 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007624 }
7625
Craig Toppere6f17d02014-03-11 04:07:52 +00007626 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007627 Builder.defineMacro("__le32__");
7628 Builder.defineMacro("__pnacl__");
7629 }
Craig Topper3164f332014-03-11 03:39:26 +00007630 void getTargetDefines(const LangOptions &Opts,
7631 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007632 getArchDefines(Opts, Builder);
7633 }
Craig Topper3164f332014-03-11 03:39:26 +00007634 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007635 return Feature == "pnacl";
7636 }
Craig Topper6c03a542015-10-19 04:51:35 +00007637 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007638 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007639 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007640 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007641 ArrayRef<const char *> getGCCRegNames() const override;
7642 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007643 bool validateAsmConstraint(const char *&Name,
7644 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007645 return false;
7646 }
7647
Craig Topper3164f332014-03-11 03:39:26 +00007648 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007649 return "";
7650 }
7651};
7652
Craig Topperf054e3a2015-10-19 03:52:27 +00007653ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7654 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007655}
7656
Craig Topperf054e3a2015-10-19 03:52:27 +00007657ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7658 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007659}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007660
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007661// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7662class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7663public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007664 NaClMips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7665 : Mips32ELTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007666
7667 BuiltinVaListKind getBuiltinVaListKind() const override {
7668 return TargetInfo::PNaClABIBuiltinVaList;
7669 }
7670};
7671
JF Bastien643817d2014-09-12 17:52:47 +00007672class Le64TargetInfo : public TargetInfo {
7673 static const Builtin::Info BuiltinInfo[];
7674
7675public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007676 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7677 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007678 BigEndian = false;
7679 NoAsmVariants = true;
7680 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7681 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007682 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007683 }
7684
7685 void getTargetDefines(const LangOptions &Opts,
7686 MacroBuilder &Builder) const override {
7687 DefineStd(Builder, "unix", Opts);
7688 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7689 Builder.defineMacro("__ELF__");
7690 }
Craig Topper6c03a542015-10-19 04:51:35 +00007691 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7692 return llvm::makeArrayRef(BuiltinInfo,
7693 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007694 }
7695 BuiltinVaListKind getBuiltinVaListKind() const override {
7696 return TargetInfo::PNaClABIBuiltinVaList;
7697 }
7698 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007699 ArrayRef<const char *> getGCCRegNames() const override {
7700 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007701 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007702 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7703 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007704 }
7705 bool validateAsmConstraint(const char *&Name,
7706 TargetInfo::ConstraintInfo &Info) const override {
7707 return false;
7708 }
7709
7710 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007711};
Dan Gohmanc2853072015-09-03 22:51:53 +00007712
7713class WebAssemblyTargetInfo : public TargetInfo {
7714 static const Builtin::Info BuiltinInfo[];
7715
7716 enum SIMDEnum {
7717 NoSIMD,
7718 SIMD128,
7719 } SIMDLevel;
7720
7721public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007722 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007723 : TargetInfo(T), SIMDLevel(NoSIMD) {
7724 BigEndian = false;
7725 NoAsmVariants = true;
7726 SuitableAlign = 128;
7727 LargeArrayMinWidth = 128;
7728 LargeArrayAlign = 128;
7729 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007730 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007731 LongDoubleWidth = LongDoubleAlign = 128;
7732 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007733 }
7734
7735protected:
7736 void getTargetDefines(const LangOptions &Opts,
7737 MacroBuilder &Builder) const override {
7738 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7739 if (SIMDLevel >= SIMD128)
7740 Builder.defineMacro("__wasm_simd128__");
7741 }
7742
7743private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007744 bool
7745 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7746 StringRef CPU,
7747 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007748 if (CPU == "bleeding-edge")
7749 Features["simd128"] = true;
7750 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7751 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007752 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007753 return llvm::StringSwitch<bool>(Feature)
7754 .Case("simd128", SIMDLevel >= SIMD128)
7755 .Default(false);
7756 }
7757 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007758 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007759 for (const auto &Feature : Features) {
7760 if (Feature == "+simd128") {
7761 SIMDLevel = std::max(SIMDLevel, SIMD128);
7762 continue;
7763 }
7764 if (Feature == "-simd128") {
7765 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7766 continue;
7767 }
7768
7769 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7770 << "-target-feature";
7771 return false;
7772 }
7773 return true;
7774 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007775 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007776 return llvm::StringSwitch<bool>(Name)
7777 .Case("mvp", true)
7778 .Case("bleeding-edge", true)
7779 .Case("generic", true)
7780 .Default(false);
7781 }
Craig Topper6c03a542015-10-19 04:51:35 +00007782 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7783 return llvm::makeArrayRef(BuiltinInfo,
7784 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007785 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007786 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007787 return VoidPtrBuiltinVaList;
7788 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007789 ArrayRef<const char *> getGCCRegNames() const final {
7790 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007791 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007792 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7793 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007794 }
7795 bool
7796 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007797 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007798 return false;
7799 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007800 const char *getClobbers() const final { return ""; }
7801 bool isCLZForZeroUndef() const final { return false; }
7802 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007803 IntType getIntTypeByWidth(unsigned BitWidth,
7804 bool IsSigned) const final {
7805 // WebAssembly prefers long long for explicitly 64-bit integers.
7806 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7807 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7808 }
7809 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7810 bool IsSigned) const final {
7811 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7812 return BitWidth == 64
7813 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7814 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7815 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007816};
7817
7818const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7819#define BUILTIN(ID, TYPE, ATTRS) \
7820 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7821#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7822 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7823#include "clang/Basic/BuiltinsWebAssembly.def"
7824};
7825
7826class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7827public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007828 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7829 const TargetOptions &Opts)
7830 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007831 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007832 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007833 }
7834
7835protected:
7836 void getTargetDefines(const LangOptions &Opts,
7837 MacroBuilder &Builder) const override {
7838 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7839 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7840 }
7841};
7842
7843class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007845 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7846 const TargetOptions &Opts)
7847 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007848 LongAlign = LongWidth = 64;
7849 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007850 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007851 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007852 }
7853
7854protected:
7855 void getTargetDefines(const LangOptions &Opts,
7856 MacroBuilder &Builder) const override {
7857 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7858 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7859 }
7860};
7861
JF Bastien643817d2014-09-12 17:52:47 +00007862const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7863#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007864 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007865#include "clang/Basic/BuiltinsLe64.def"
7866};
7867
Eric Christopherc48497a2015-09-18 21:26:24 +00007868static const unsigned SPIRAddrSpaceMap[] = {
7869 1, // opencl_global
7870 3, // opencl_local
7871 2, // opencl_constant
7872 4, // opencl_generic
7873 0, // cuda_device
7874 0, // cuda_constant
7875 0 // cuda_shared
7876};
7877class SPIRTargetInfo : public TargetInfo {
7878public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007879 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7880 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007881 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7882 "SPIR target must use unknown OS");
7883 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7884 "SPIR target must use unknown environment type");
7885 BigEndian = false;
7886 TLSSupported = false;
7887 LongWidth = LongAlign = 64;
7888 AddrSpaceMap = &SPIRAddrSpaceMap;
7889 UseAddrSpaceMapMangling = true;
7890 // Define available target features
7891 // These must be defined in sorted order!
7892 NoAsmVariants = true;
7893 }
7894 void getTargetDefines(const LangOptions &Opts,
7895 MacroBuilder &Builder) const override {
7896 DefineStd(Builder, "SPIR", Opts);
7897 }
7898 bool hasFeature(StringRef Feature) const override {
7899 return Feature == "spir";
7900 }
Craig Topper3164f332014-03-11 03:39:26 +00007901
Craig Topper6c03a542015-10-19 04:51:35 +00007902 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007903 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007904 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007905 bool validateAsmConstraint(const char *&Name,
7906 TargetInfo::ConstraintInfo &info) const override {
7907 return true;
7908 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007909 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7910 return None;
7911 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007912 BuiltinVaListKind getBuiltinVaListKind() const override {
7913 return TargetInfo::VoidPtrBuiltinVaList;
7914 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007915
Eric Christopherc48497a2015-09-18 21:26:24 +00007916 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7917 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7918 : CCCR_Warning;
7919 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007920
Eric Christopherc48497a2015-09-18 21:26:24 +00007921 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7922 return CC_SpirFunction;
7923 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007924
7925 void setSupportedOpenCLOpts() override {
7926 // Assume all OpenCL extensions and optional core features are supported
7927 // for SPIR since it is a generic target.
7928 getSupportedOpenCLOpts().setAll();
7929 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007930};
Guy Benyeib798fc92012-12-11 21:38:14 +00007931
Eric Christopherc48497a2015-09-18 21:26:24 +00007932class SPIR32TargetInfo : public SPIRTargetInfo {
7933public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007934 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7935 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007936 PointerWidth = PointerAlign = 32;
7937 SizeType = TargetInfo::UnsignedInt;
7938 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007939 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7940 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007941 }
7942 void getTargetDefines(const LangOptions &Opts,
7943 MacroBuilder &Builder) const override {
7944 DefineStd(Builder, "SPIR32", Opts);
7945 }
7946};
Guy Benyeib798fc92012-12-11 21:38:14 +00007947
Eric Christopherc48497a2015-09-18 21:26:24 +00007948class SPIR64TargetInfo : public SPIRTargetInfo {
7949public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007950 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7951 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007952 PointerWidth = PointerAlign = 64;
7953 SizeType = TargetInfo::UnsignedLong;
7954 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007955 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7956 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007957 }
7958 void getTargetDefines(const LangOptions &Opts,
7959 MacroBuilder &Builder) const override {
7960 DefineStd(Builder, "SPIR64", Opts);
7961 }
7962};
Guy Benyeib798fc92012-12-11 21:38:14 +00007963
Robert Lytton0e076492013-08-13 09:43:10 +00007964class XCoreTargetInfo : public TargetInfo {
7965 static const Builtin::Info BuiltinInfo[];
7966public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007967 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7968 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007969 BigEndian = false;
7970 NoAsmVariants = true;
7971 LongLongAlign = 32;
7972 SuitableAlign = 32;
7973 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007974 SizeType = UnsignedInt;
7975 PtrDiffType = SignedInt;
7976 IntPtrType = SignedInt;
7977 WCharType = UnsignedChar;
7978 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007979 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007980 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7981 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007982 }
Craig Topper3164f332014-03-11 03:39:26 +00007983 void getTargetDefines(const LangOptions &Opts,
7984 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007985 Builder.defineMacro("__XS1B__");
7986 }
Craig Topper6c03a542015-10-19 04:51:35 +00007987 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7988 return llvm::makeArrayRef(BuiltinInfo,
7989 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007990 }
Craig Topper3164f332014-03-11 03:39:26 +00007991 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007992 return TargetInfo::VoidPtrBuiltinVaList;
7993 }
Craig Topper3164f332014-03-11 03:39:26 +00007994 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007995 return "";
7996 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007997 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007998 static const char * const GCCRegNames[] = {
7999 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8000 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8001 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008002 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008003 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008004 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8005 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008006 }
Craig Topper3164f332014-03-11 03:39:26 +00008007 bool validateAsmConstraint(const char *&Name,
8008 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008009 return false;
8010 }
Craig Topper3164f332014-03-11 03:39:26 +00008011 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008012 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8013 return (RegNo < 2)? RegNo : -1;
8014 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008015 bool allowsLargerPreferedTypeAlignment() const override {
8016 return false;
8017 }
Robert Lytton0e076492013-08-13 09:43:10 +00008018};
8019
8020const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008021#define BUILTIN(ID, TYPE, ATTRS) \
8022 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8023#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8024 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008025#include "clang/Basic/BuiltinsXCore.def"
8026};
Robert Lytton0e076492013-08-13 09:43:10 +00008027
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008028// x86_32 Android target
8029class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8030public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008031 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8032 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008033 SuitableAlign = 32;
8034 LongDoubleWidth = 64;
8035 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8036 }
8037};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008038
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008039// x86_64 Android target
8040class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8041public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008042 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8043 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008044 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8045 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008046
8047 bool useFloat128ManglingForLongDouble() const override {
8048 return true;
8049 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008050};
8051} // end anonymous namespace
8052
Chris Lattner5ba61f02006-10-14 07:39:34 +00008053//===----------------------------------------------------------------------===//
8054// Driver code
8055//===----------------------------------------------------------------------===//
8056
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008057static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8058 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008059 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008060
Daniel Dunbar52322032009-08-18 05:47:58 +00008061 switch (Triple.getArch()) {
8062 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008063 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008064
Tim Northover2a0783d2014-05-30 14:14:07 +00008065 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008066 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008067
8068 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008069 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008070
Jacques Pienaard964cc22016-03-28 21:02:54 +00008071 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008072 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008073
Tim Northover2a0783d2014-05-30 14:14:07 +00008074 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008075 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008076 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008077
8078 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008079 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008080 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008081 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008082 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008083 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008084 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008085 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008086 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008087 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008088 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008089 }
8090
Christian Pirker9b019ae2014-02-25 13:51:00 +00008091 case llvm::Triple::aarch64_be:
8092 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008093 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008094 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008095 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008096 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008097 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008098 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008099 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008100 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008101 }
8102
Daniel Dunbar52322032009-08-18 05:47:58 +00008103 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008104 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008105 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008106 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008107
Daniel Dunbar52322032009-08-18 05:47:58 +00008108 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008109 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008110 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008111 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008112 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008113 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008114 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008115 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008116 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008117 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008118 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008119 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008120 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008121 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008122 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008123 case llvm::Triple::Win32:
8124 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008125 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008126 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008127 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008128 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008129 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008130 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008131 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008132 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008133 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008134 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008135 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008136 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008137 }
8138
8139 case llvm::Triple::armeb:
8140 case llvm::Triple::thumbeb:
8141 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008142 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008143
8144 switch (os) {
8145 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008146 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008147 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008148 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008149 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008150 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008151 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008152 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008153 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008154 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008155 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008156 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008157 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008158 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008159 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008160 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008161 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008162
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008163 case llvm::Triple::bpfeb:
8164 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008165 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008166
Daniel Dunbar52322032009-08-18 05:47:58 +00008167 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008168 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008169
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008170 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008171 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008172 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008173 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008174 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008175 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008176 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008177 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008178 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008179 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008180 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008181 return new Mips32EBTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008182 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008183
8184 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008185 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008186 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008187 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008188 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008189 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008190 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008191 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008192 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008193 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008194 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008195 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008196 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008197 return new Mips32ELTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008198 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008199
Akira Hatanakabef17452011-09-20 19:21:49 +00008200 case llvm::Triple::mips64:
8201 switch (os) {
8202 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008203 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008204 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008205 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008206 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008207 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008208 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008209 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008210 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008211 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008212 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008213 return new Mips64EBTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008214 }
8215
8216 case llvm::Triple::mips64el:
8217 switch (os) {
8218 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008219 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008220 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008222 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008224 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008226 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008228 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new Mips64ELTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008230 }
8231
Ivan Krasindd7403e2011-08-24 20:22:22 +00008232 case llvm::Triple::le32:
8233 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008234 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008236 default:
8237 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008238 }
8239
JF Bastien643817d2014-09-12 17:52:47 +00008240 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008242
Daniel Dunbar52322032009-08-18 05:47:58 +00008243 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008244 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008246 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008247 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008248 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008249 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008250 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008251 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008252 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008253 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008254 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008255 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008256 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008257 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008258 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008259 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008260
8261 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008262 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008264 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008265 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008266 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008267 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008268 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008269 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008270 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008271 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008272 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008273 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008274 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008275 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008276
Bill Schmidt778d3872013-07-26 01:36:11 +00008277 case llvm::Triple::ppc64le:
8278 switch (os) {
8279 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008280 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008281 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008282 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008283 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008284 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008285 }
8286
Peter Collingbournec947aae2012-05-20 23:28:41 +00008287 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008288 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008289 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008290 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008291
Tom Stellardd8e38a32015-01-06 20:34:47 +00008292 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008293 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008294 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008295
Daniel Dunbar52322032009-08-18 05:47:58 +00008296 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008297 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008298 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008299 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008300 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008302 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008304 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008306 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008308 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008310 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008311
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008312 // The 'sparcel' architecture copies all the above cases except for Solaris.
8313 case llvm::Triple::sparcel:
8314 switch (os) {
8315 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008316 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008317 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008318 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008319 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008320 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008321 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008322 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008323 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008324 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008325 }
8326
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008327 case llvm::Triple::sparcv9:
8328 switch (os) {
8329 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008330 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008331 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008332 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008333 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008334 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008335 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008336 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008337 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008338 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008339 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008340 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008341 }
8342
Ulrich Weigand47445072013-05-06 16:26:41 +00008343 case llvm::Triple::systemz:
8344 switch (os) {
8345 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008346 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008347 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008348 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008349 }
8350
Eli Friedmana9c3d712009-08-19 20:47:07 +00008351 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008352 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008353
Daniel Dunbar52322032009-08-18 05:47:58 +00008354 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008355 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008356 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008357
Daniel Dunbar52322032009-08-18 05:47:58 +00008358 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008359 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008360 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008361 case llvm::Triple::Linux: {
8362 switch (Triple.getEnvironment()) {
8363 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008364 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008365 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008366 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008367 }
8368 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008369 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008370 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008371 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008372 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008373 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008374 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008375 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008376 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008377 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008378 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008379 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008381 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008383 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008384 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008385 case llvm::Triple::Win32: {
8386 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008387 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008388 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008389 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008391 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008392 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008393 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008394 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008395 }
8396 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008397 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008398 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008399 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008401 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008402 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008403 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008404 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008405 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008406 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008407 }
8408
8409 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008410 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008411 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008412
Daniel Dunbar52322032009-08-18 05:47:58 +00008413 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008414 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008415 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008416 case llvm::Triple::Linux: {
8417 switch (Triple.getEnvironment()) {
8418 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008419 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008420 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008421 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008422 }
8423 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008424 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008425 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008426 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008428 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008430 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008431 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008432 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008433 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008434 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008436 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008437 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008438 case llvm::Triple::Win32: {
8439 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008440 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008441 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008442 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008443 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008444 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008445 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008446 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008447 }
8448 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008449 case llvm::Triple::Haiku:
8450 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008451 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008452 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008453 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008455 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008456 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008457 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008458
Douglas Katzman78d7c542015-05-12 21:18:10 +00008459 case llvm::Triple::spir: {
8460 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8461 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8462 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008464 }
8465 case llvm::Triple::spir64: {
8466 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8467 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8468 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008469 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008470 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008471 case llvm::Triple::wasm32:
8472 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8473 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008474 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008475 case llvm::Triple::wasm64:
8476 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8477 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008478 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008479 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008480}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008481
8482/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008483/// options.
Alp Toker80758082014-07-06 05:26:44 +00008484TargetInfo *
8485TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008486 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008487 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008488
8489 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008490 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008491 if (!Target) {
8492 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008493 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008494 }
Alp Toker80758082014-07-06 05:26:44 +00008495 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008496
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008497 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008498 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8499 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008500 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008501 }
8502
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008503 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008504 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8505 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008506 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008507 }
8508
Rafael Espindolaeb265472013-08-21 21:59:03 +00008509 // Set the fp math unit.
8510 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8511 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008512 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008513 }
8514
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008515 // Compute the default target features, we need the target to handle this
8516 // because features may have dependencies on one another.
8517 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008518 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8519 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008520 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008521
8522 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008523 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008524 for (const auto &F : Features)
8525 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8526
Eric Christopher3ff21b32013-10-16 21:26:26 +00008527 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008528 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008529
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008530 Target->setSupportedOpenCLOpts();
8531
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008532 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008533}