blob: f3ab8346b8e66969d2451f491a258d4cca90c302 [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)
3756 .Case("sse4.1", true)
3757 .Case("sse4.2", true)
3758 .Case("avx", true)
3759 .Case("avx2", true)
3760 .Case("sse4a", true)
3761 .Case("fma4", true)
3762 .Case("xop", true)
3763 .Case("fma", true)
3764 .Case("avx512f", true)
3765 .Case("bmi", true)
3766 .Case("bmi2", true)
3767 .Default(false);
3768}
3769
Eli Friedman3fd920a2008-08-20 02:34:37 +00003770bool
Anders Carlsson58436352009-02-28 17:11:49 +00003771X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003772 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003773 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003774 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003775 // Constant constraints.
3776 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3777 // instructions.
3778 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3779 // x86_64 instructions.
3780 case 's':
3781 Info.setRequiresImmediate();
3782 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003783 case 'I':
3784 Info.setRequiresImmediate(0, 31);
3785 return true;
3786 case 'J':
3787 Info.setRequiresImmediate(0, 63);
3788 return true;
3789 case 'K':
3790 Info.setRequiresImmediate(-128, 127);
3791 return true;
3792 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003793 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003794 return true;
3795 case 'M':
3796 Info.setRequiresImmediate(0, 3);
3797 return true;
3798 case 'N':
3799 Info.setRequiresImmediate(0, 255);
3800 return true;
3801 case 'O':
3802 Info.setRequiresImmediate(0, 127);
3803 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003804 // Register constraints.
3805 case 'Y': // 'Y' is the first character for several 2-character constraints.
3806 // Shift the pointer to the second character of the constraint.
3807 Name++;
3808 switch (*Name) {
3809 default:
3810 return false;
3811 case '0': // First SSE register.
3812 case 't': // Any SSE register, when SSE2 is enabled.
3813 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3814 case 'm': // Any MMX register, when inter-unit moves enabled.
3815 Info.setAllowsRegister();
3816 return true;
3817 }
3818 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003819 // Constraint 'f' cannot be used for output operands.
3820 if (Info.ConstraintStr[0] == '=')
3821 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003822 Info.setAllowsRegister();
3823 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003824 case 'a': // eax.
3825 case 'b': // ebx.
3826 case 'c': // ecx.
3827 case 'd': // edx.
3828 case 'S': // esi.
3829 case 'D': // edi.
3830 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003831 case 't': // Top of floating point stack.
3832 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003833 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003834 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003835 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003836 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003837 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3838 case 'l': // "Index" registers: any general register that can be used as an
3839 // index in a base+index memory access.
3840 Info.setAllowsRegister();
3841 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003842 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003843 case 'C': // SSE floating point constant.
3844 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003845 return true;
3846 }
3847}
3848
Akira Hatanaka974131e2014-09-18 18:17:18 +00003849bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3850 unsigned Size) const {
3851 // Strip off constraint modifiers.
3852 while (Constraint[0] == '=' ||
3853 Constraint[0] == '+' ||
3854 Constraint[0] == '&')
3855 Constraint = Constraint.substr(1);
3856
3857 return validateOperandSize(Constraint, Size);
3858}
3859
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003860bool X86TargetInfo::validateInputSize(StringRef Constraint,
3861 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003862 return validateOperandSize(Constraint, Size);
3863}
3864
3865bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3866 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003867 switch (Constraint[0]) {
3868 default: break;
3869 case 'y':
3870 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003871 case 'f':
3872 case 't':
3873 case 'u':
3874 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003875 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003876 if (SSELevel >= AVX512F)
3877 // 512-bit zmm registers can be used if target supports AVX512F.
3878 return Size <= 512U;
3879 else if (SSELevel >= AVX)
3880 // 256-bit ymm registers can be used if target supports AVX.
3881 return Size <= 256U;
3882 return Size <= 128U;
3883 case 'Y':
3884 // 'Y' is the first character for several 2-character constraints.
3885 switch (Constraint[1]) {
3886 default: break;
3887 case 'm':
3888 // 'Ym' is synonymous with 'y'.
3889 return Size <= 64;
3890 case 'i':
3891 case 't':
3892 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3893 if (SSELevel >= AVX512F)
3894 return Size <= 512U;
3895 else if (SSELevel >= AVX)
3896 return Size <= 256U;
3897 return SSELevel >= SSE2 && Size <= 128U;
3898 }
3899
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003900 }
3901
3902 return true;
3903}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003904
Eli Friedman3fd920a2008-08-20 02:34:37 +00003905std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003906X86TargetInfo::convertConstraint(const char *&Constraint) const {
3907 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003908 case 'a': return std::string("{ax}");
3909 case 'b': return std::string("{bx}");
3910 case 'c': return std::string("{cx}");
3911 case 'd': return std::string("{dx}");
3912 case 'S': return std::string("{si}");
3913 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003914 case 'p': // address
3915 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003916 case 't': // top of floating point stack.
3917 return std::string("{st}");
3918 case 'u': // second from top of floating point stack.
3919 return std::string("{st(1)}"); // second from top of floating point stack.
3920 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003921 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003922 }
3923}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003924
Eli Friedman3fd920a2008-08-20 02:34:37 +00003925// X86-32 generic target
3926class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003927public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003928 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3929 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003930 DoubleAlign = LongLongAlign = 32;
3931 LongDoubleWidth = 96;
3932 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003933 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003934 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003935 SizeType = UnsignedInt;
3936 PtrDiffType = SignedInt;
3937 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003938 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003939
3940 // Use fpret for all types.
3941 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3942 (1 << TargetInfo::Double) |
3943 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003944
3945 // x86-32 has atomics up to 8 bytes
3946 // FIXME: Check that we actually have cmpxchg8b before setting
3947 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3948 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003949 }
Craig Topper3164f332014-03-11 03:39:26 +00003950 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003951 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003952 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003953
Craig Topper3164f332014-03-11 03:39:26 +00003954 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003955 if (RegNo == 0) return 0;
3956 if (RegNo == 1) return 2;
3957 return -1;
3958 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003959 bool validateOperandSize(StringRef Constraint,
3960 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003961 switch (Constraint[0]) {
3962 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003963 case 'R':
3964 case 'q':
3965 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003966 case 'a':
3967 case 'b':
3968 case 'c':
3969 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003970 case 'S':
3971 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003972 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003973 case 'A':
3974 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003975 }
3976
Akira Hatanaka974131e2014-09-18 18:17:18 +00003977 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003978 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003979};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003980
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003981class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3982public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003983 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3984 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003985
Craig Topper3164f332014-03-11 03:39:26 +00003986 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003987 unsigned Major, Minor, Micro;
3988 getTriple().getOSVersion(Major, Minor, Micro);
3989 // New NetBSD uses the default rounding mode.
3990 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3991 return X86_32TargetInfo::getFloatEvalMethod();
3992 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003993 return 1;
3994 }
3995};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003996
Eli Friedmane3aa4542009-07-05 18:47:56 +00003997class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3998public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003999 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4000 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004001 SizeType = UnsignedLong;
4002 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004003 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004004 }
4005};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004006
Eli Friedman9fa28852012-08-08 23:57:20 +00004007class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4008public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004009 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4010 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004011 SizeType = UnsignedLong;
4012 IntPtrType = SignedLong;
4013 PtrDiffType = SignedLong;
4014 }
4015};
Eli Friedman9fa28852012-08-08 23:57:20 +00004016
Torok Edwinb2b37c62009-06-30 17:10:35 +00004017class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004018public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004019 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4020 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004021 LongDoubleWidth = 128;
4022 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004023 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004024 MaxVectorAlign = 256;
4025 // The watchOS simulator uses the builtin bool type for Objective-C.
4026 llvm::Triple T = llvm::Triple(Triple);
4027 if (T.isWatchOS())
4028 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004029 SizeType = UnsignedLong;
4030 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004031 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004032 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004033 }
4034
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004035 bool handleTargetFeatures(std::vector<std::string> &Features,
4036 DiagnosticsEngine &Diags) override {
4037 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4038 Diags))
4039 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004040 // We now know the features we have: we can decide how to align vectors.
4041 MaxVectorAlign =
4042 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004043 return true;
4044 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004045};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004046
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004047// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004048class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004049public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004050 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4051 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004052 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004053 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004054 bool IsWinCOFF =
4055 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004056 resetDataLayout(IsWinCOFF
4057 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4058 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004059 }
Craig Topper3164f332014-03-11 03:39:26 +00004060 void getTargetDefines(const LangOptions &Opts,
4061 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004062 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4063 }
4064};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004065
4066// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004067class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004068public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004069 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4070 const TargetOptions &Opts)
4071 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004072 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004073 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4074 }
Craig Topper3164f332014-03-11 03:39:26 +00004075 void getTargetDefines(const LangOptions &Opts,
4076 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004077 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4078 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4079 // The value of the following reflects processor type.
4080 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4081 // We lost the original triple, so we use the default.
4082 Builder.defineMacro("_M_IX86", "600");
4083 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004084};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004085
David Majnemerae1ed0e2015-05-28 04:36:18 +00004086static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004087 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4088 // supports __declspec natively under -fms-extensions, but we define a no-op
4089 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004090 if (Opts.MicrosoftExt)
4091 Builder.defineMacro("__declspec", "__declspec");
4092 else
4093 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4094
4095 if (!Opts.MicrosoftExt) {
4096 // Provide macros for all the calling convention keywords. Provide both
4097 // single and double underscore prefixed variants. These are available on
4098 // x64 as well as x86, even though they have no effect.
4099 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4100 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004101 std::string GCCSpelling = "__attribute__((__";
4102 GCCSpelling += CC;
4103 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004104 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4105 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4106 }
4107 }
4108}
4109
David Majnemerae1ed0e2015-05-28 04:36:18 +00004110static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4111 Builder.defineMacro("__MSVCRT__");
4112 Builder.defineMacro("__MINGW32__");
4113 addCygMingDefines(Opts, Builder);
4114}
4115
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004116// x86-32 MinGW target
4117class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4118public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004119 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4120 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004121 void getTargetDefines(const LangOptions &Opts,
4122 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004123 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004124 DefineStd(Builder, "WIN32", Opts);
4125 DefineStd(Builder, "WINNT", Opts);
4126 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004127 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004128 }
4129};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004130
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004131// x86-32 Cygwin target
4132class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4133public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004134 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4135 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004136 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004137 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004138 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 +00004139 }
Craig Topper3164f332014-03-11 03:39:26 +00004140 void getTargetDefines(const LangOptions &Opts,
4141 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004142 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004143 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004144 Builder.defineMacro("__CYGWIN__");
4145 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004146 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004147 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004148 if (Opts.CPlusPlus)
4149 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004150 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004151};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004152
Chris Lattnerb986aba2010-04-11 19:29:39 +00004153// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004154class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004155public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004156 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004157 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004158 }
Craig Topper3164f332014-03-11 03:39:26 +00004159 void getTargetDefines(const LangOptions &Opts,
4160 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004161 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004162 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004163 }
4164};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004165
Alexey Bataevc99b0492015-11-25 09:24:26 +00004166// X86-32 MCU target
4167class MCUX86_32TargetInfo : public X86_32TargetInfo {
4168public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004169 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4170 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004171 LongDoubleWidth = 64;
4172 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004173 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 +00004174 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004175 }
4176
4177 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4178 // On MCU we support only C calling convention.
4179 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4180 }
4181
4182 void getTargetDefines(const LangOptions &Opts,
4183 MacroBuilder &Builder) const override {
4184 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4185 Builder.defineMacro("__iamcu");
4186 Builder.defineMacro("__iamcu__");
4187 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004188
4189 bool allowsLargerPreferedTypeAlignment() const override {
4190 return false;
4191 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004192};
4193
Douglas Gregor9fabd852011-07-01 22:41:14 +00004194// RTEMS Target
4195template<typename Target>
4196class RTEMSTargetInfo : public OSTargetInfo<Target> {
4197protected:
Craig Topper3164f332014-03-11 03:39:26 +00004198 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4199 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004200 // RTEMS defines; list based off of gcc output
4201
Douglas Gregor9fabd852011-07-01 22:41:14 +00004202 Builder.defineMacro("__rtems__");
4203 Builder.defineMacro("__ELF__");
4204 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004205
Douglas Gregor9fabd852011-07-01 22:41:14 +00004206public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004207 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4208 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004209 switch (Triple.getArch()) {
4210 default:
4211 case llvm::Triple::x86:
4212 // this->MCountName = ".mcount";
4213 break;
4214 case llvm::Triple::mips:
4215 case llvm::Triple::mipsel:
4216 case llvm::Triple::ppc:
4217 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004218 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004219 // this->MCountName = "_mcount";
4220 break;
4221 case llvm::Triple::arm:
4222 // this->MCountName = "__mcount";
4223 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004224 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004225 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004226};
4227
Douglas Gregor9fabd852011-07-01 22:41:14 +00004228// x86-32 RTEMS target
4229class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004231 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4232 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004233 SizeType = UnsignedLong;
4234 IntPtrType = SignedLong;
4235 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004236 }
Craig Topper3164f332014-03-11 03:39:26 +00004237 void getTargetDefines(const LangOptions &Opts,
4238 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004239 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4240 Builder.defineMacro("__INTEL__");
4241 Builder.defineMacro("__rtems__");
4242 }
4243};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004244
Eli Friedman3fd920a2008-08-20 02:34:37 +00004245// x86-64 generic target
4246class X86_64TargetInfo : public X86TargetInfo {
4247public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004248 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4249 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004250 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004251 bool IsWinCOFF =
4252 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004253 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004254 LongDoubleWidth = 128;
4255 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004256 LargeArrayMinWidth = 128;
4257 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004258 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004259 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4260 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4261 IntPtrType = IsX32 ? SignedInt : SignedLong;
4262 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004263 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004264 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004265
Eric Christopher917e9522014-11-18 22:36:15 +00004266 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004267 resetDataLayout(IsX32
4268 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4269 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4270 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004271
4272 // Use fpret only for long double.
4273 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004274
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004275 // Use fp2ret for _Complex long double.
4276 ComplexLongDoubleUsesFP2Ret = true;
4277
Charles Davisc7d5c942015-09-17 20:55:33 +00004278 // Make __builtin_ms_va_list available.
4279 HasBuiltinMSVaList = true;
4280
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004281 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004282 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004283 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004284 }
Craig Topper3164f332014-03-11 03:39:26 +00004285 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004286 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004287 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004288
Craig Topper3164f332014-03-11 03:39:26 +00004289 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004290 if (RegNo == 0) return 0;
4291 if (RegNo == 1) return 1;
4292 return -1;
4293 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004294
Craig Topper3164f332014-03-11 03:39:26 +00004295 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004296 switch (CC) {
4297 case CC_C:
4298 case CC_Swift:
4299 case CC_X86VectorCall:
4300 case CC_IntelOclBicc:
4301 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004302 case CC_PreserveMost:
4303 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004304 return CCCR_OK;
4305 default:
4306 return CCCR_Warning;
4307 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004308 }
4309
Craig Topper3164f332014-03-11 03:39:26 +00004310 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004311 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004312 }
4313
Pavel Chupinfd223e12014-08-04 12:39:43 +00004314 // for x32 we need it here explicitly
4315 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004316 unsigned getUnwindWordWidth() const override { return 64; }
4317 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004318
4319 bool validateGlobalRegisterVariable(StringRef RegName,
4320 unsigned RegSize,
4321 bool &HasSizeMismatch) const override {
4322 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4323 // handle.
4324 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4325 // Check that the register size is 64-bit.
4326 HasSizeMismatch = RegSize != 64;
4327 return true;
4328 }
4329
4330 // Check if the register is a 32-bit register the backend can handle.
4331 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4332 HasSizeMismatch);
4333 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004334};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004335
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004336// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004337class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004338public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004339 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4340 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004341 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004342 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004343 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004344 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004345 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004346 SizeType = UnsignedLongLong;
4347 PtrDiffType = SignedLongLong;
4348 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004349 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004350
Craig Topper3164f332014-03-11 03:39:26 +00004351 void getTargetDefines(const LangOptions &Opts,
4352 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004353 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004354 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004355 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004356
Craig Topper3164f332014-03-11 03:39:26 +00004357 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004358 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004359 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004360
Craig Topper3164f332014-03-11 03:39:26 +00004361 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004362 switch (CC) {
4363 case CC_X86StdCall:
4364 case CC_X86ThisCall:
4365 case CC_X86FastCall:
4366 return CCCR_Ignore;
4367 case CC_C:
4368 case CC_X86VectorCall:
4369 case CC_IntelOclBicc:
4370 case CC_X86_64SysV:
4371 return CCCR_OK;
4372 default:
4373 return CCCR_Warning;
4374 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004375 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004376};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004377
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004378// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004379class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004380public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004381 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4382 const TargetOptions &Opts)
4383 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004384 LongDoubleWidth = LongDoubleAlign = 64;
4385 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004386 }
Craig Topper3164f332014-03-11 03:39:26 +00004387 void getTargetDefines(const LangOptions &Opts,
4388 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004389 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4390 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004391 Builder.defineMacro("_M_X64", "100");
4392 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004393 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004394};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004395
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004396// x86-64 MinGW target
4397class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4398public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004399 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4400 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004401 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4402 // with x86 FP ops. Weird.
4403 LongDoubleWidth = LongDoubleAlign = 128;
4404 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4405 }
4406
Craig Topper3164f332014-03-11 03:39:26 +00004407 void getTargetDefines(const LangOptions &Opts,
4408 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004409 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004410 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004411 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004412 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004413
4414 // GCC defines this macro when it is using __gxx_personality_seh0.
4415 if (!Opts.SjLjExceptions)
4416 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004417 }
4418};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004419
Yaron Kerend030d112015-07-22 17:38:19 +00004420// x86-64 Cygwin target
4421class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4422public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004423 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4424 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004425 TLSSupported = false;
4426 WCharType = UnsignedShort;
4427 }
4428 void getTargetDefines(const LangOptions &Opts,
4429 MacroBuilder &Builder) const override {
4430 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4431 Builder.defineMacro("__x86_64__");
4432 Builder.defineMacro("__CYGWIN__");
4433 Builder.defineMacro("__CYGWIN64__");
4434 addCygMingDefines(Opts, Builder);
4435 DefineStd(Builder, "unix", Opts);
4436 if (Opts.CPlusPlus)
4437 Builder.defineMacro("_GNU_SOURCE");
4438
4439 // GCC defines this macro when it is using __gxx_personality_seh0.
4440 if (!Opts.SjLjExceptions)
4441 Builder.defineMacro("__SEH__");
4442 }
4443};
4444
Eli Friedman2857ccb2009-07-01 03:36:11 +00004445class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004447 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4448 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004449 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004450 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4451 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004452 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004453 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004454 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004455 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004456
4457 bool handleTargetFeatures(std::vector<std::string> &Features,
4458 DiagnosticsEngine &Diags) override {
4459 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4460 Diags))
4461 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004462 // We now know the features we have: we can decide how to align vectors.
4463 MaxVectorAlign =
4464 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004465 return true;
4466 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004467};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004468
Eli Friedman245f2292009-07-05 22:31:18 +00004469class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4470public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004471 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4472 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004473 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004474 Int64Type = SignedLongLong;
4475 }
4476};
Eli Friedman245f2292009-07-05 22:31:18 +00004477
Eli Friedman9fa28852012-08-08 23:57:20 +00004478class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4479public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004480 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4481 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004482 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004483 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004484 }
4485};
Tim Northover9bb857a2013-01-31 12:13:10 +00004486
Eli Friedmanf05b7722008-08-20 07:44:10 +00004487class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004488 // Possible FPU choices.
4489 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004490 VFP2FPU = (1 << 0),
4491 VFP3FPU = (1 << 1),
4492 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004493 NeonFPU = (1 << 3),
4494 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004495 };
4496
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004497 // Possible HWDiv features.
4498 enum HWDivMode {
4499 HWDivThumb = (1 << 0),
4500 HWDivARM = (1 << 1)
4501 };
4502
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004503 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004504 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004505 }
4506
4507 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4508 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004509
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004510 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004511
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004512 StringRef CPUProfile;
4513 StringRef CPUAttr;
4514
Rafael Espindolaeb265472013-08-21 21:59:03 +00004515 enum {
4516 FP_Default,
4517 FP_VFP,
4518 FP_Neon
4519 } FPMath;
4520
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004521 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004522 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004523 unsigned ArchProfile;
4524 unsigned ArchVersion;
4525
Bernard Ogdenda13af32013-10-24 18:32:51 +00004526 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004527
Logan Chien57086ce2012-10-10 06:56:20 +00004528 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004529 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004530
4531 // Initialized via features.
4532 unsigned SoftFloat : 1;
4533 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004534
Bernard Ogden18b57012013-10-29 09:47:51 +00004535 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004536 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004537 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004538 unsigned Unaligned : 1;
4539
4540 enum {
4541 LDREX_B = (1 << 0), /// byte (8-bit)
4542 LDREX_H = (1 << 1), /// half (16-bit)
4543 LDREX_W = (1 << 2), /// word (32-bit)
4544 LDREX_D = (1 << 3), /// double (64-bit)
4545 };
4546
4547 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004548
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004549 // ACLE 6.5.1 Hardware floating point
4550 enum {
4551 HW_FP_HP = (1 << 1), /// half (16-bit)
4552 HW_FP_SP = (1 << 2), /// single (32-bit)
4553 HW_FP_DP = (1 << 3), /// double (64-bit)
4554 };
4555 uint32_t HW_FP;
4556
Chris Lattner5cc15e02010-03-03 19:03:45 +00004557 static const Builtin::Info BuiltinInfo[];
4558
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004559 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004560 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004561
4562 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004563 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004564
Renato Golin9ba39232015-02-27 16:35:48 +00004565 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4566 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4567 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004568 SizeType = UnsignedLong;
4569 else
4570 SizeType = UnsignedInt;
4571
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004572 switch (T.getOS()) {
4573 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004574 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004575 break;
4576 case llvm::Triple::Win32:
4577 WCharType = UnsignedShort;
4578 break;
4579 case llvm::Triple::Linux:
4580 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004581 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4582 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004583 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004584 }
4585
4586 UseBitFieldTypeAlignment = true;
4587
4588 ZeroLengthBitfieldBoundary = 0;
4589
Tim Northover147cd2f2014-10-14 22:12:21 +00004590 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4591 // so set preferred for small types to 32.
4592 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004593 resetDataLayout(BigEndian
4594 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4595 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004596 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004597 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004598 resetDataLayout("e"
4599 "-m:w"
4600 "-p:32:32"
4601 "-i64:64"
4602 "-v128:64:128"
4603 "-a:0:32"
4604 "-n32"
4605 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004606 } else if (T.isOSNaCl()) {
4607 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004608 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004609 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004610 resetDataLayout(BigEndian
4611 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4612 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004613 }
4614
4615 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004616 }
4617
Tim Northover5627d392015-10-30 16:30:45 +00004618 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004619 const llvm::Triple &T = getTriple();
4620
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004621 IsAAPCS = false;
4622
Tim Northover5627d392015-10-30 16:30:45 +00004623 if (IsAAPCS16)
4624 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4625 else
4626 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004627
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004628 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004629 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004630 SizeType = UnsignedInt;
4631 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004632 SizeType = UnsignedLong;
4633
4634 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4635 WCharType = SignedInt;
4636
4637 // Do not respect the alignment of bit-field types when laying out
4638 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4639 UseBitFieldTypeAlignment = false;
4640
4641 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4642 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4643 /// gcc.
4644 ZeroLengthBitfieldBoundary = 32;
4645
Tim Northover5627d392015-10-30 16:30:45 +00004646 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4647 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004648 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004649 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004650 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004651 BigEndian
4652 ? "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 +00004653 : "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 +00004654 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004655 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004656 BigEndian
4657 ? "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 +00004658 : "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 +00004659
4660 // FIXME: Override "preferred align" for double and long long.
4661 }
4662
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004663 void setArchInfo() {
4664 StringRef ArchName = getTriple().getArchName();
4665
Renato Goline84b0002015-10-08 16:43:26 +00004666 ArchISA = llvm::ARM::parseArchISA(ArchName);
4667 CPU = llvm::ARM::getDefaultCPU(ArchName);
4668 unsigned AK = llvm::ARM::parseArch(ArchName);
4669 if (AK != llvm::ARM::AK_INVALID)
4670 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004671 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004672 }
4673
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004674 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004675 StringRef SubArch;
4676
4677 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004678 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004679 SubArch = llvm::ARM::getSubArch(ArchKind);
4680 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4681 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004682
4683 // cache CPU related strings
4684 CPUAttr = getCPUAttr();
4685 CPUProfile = getCPUProfile();
4686 }
4687
4688 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004689 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004690 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004691 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004692 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4693 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004694 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004695 if (ArchProfile == llvm::ARM::PK_M) {
4696 MaxAtomicPromoteWidth = 32;
4697 if (ShouldUseInlineAtomic)
4698 MaxAtomicInlineWidth = 32;
4699 }
4700 else {
4701 MaxAtomicPromoteWidth = 64;
4702 if (ShouldUseInlineAtomic)
4703 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004704 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004705 }
4706
4707 bool isThumb() const {
4708 return (ArchISA == llvm::ARM::IK_THUMB);
4709 }
4710
4711 bool supportsThumb() const {
4712 return CPUAttr.count('T') || ArchVersion >= 6;
4713 }
4714
4715 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004716 return CPUAttr.equals("6T2") ||
4717 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004718 }
4719
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004720 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004721 // For most sub-arches, the build attribute CPU name is enough.
4722 // For Cortex variants, it's slightly different.
4723 switch(ArchKind) {
4724 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004725 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004726 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004727 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004728 case llvm::ARM::AK_ARMV7S:
4729 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004730 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004731 return "7A";
4732 case llvm::ARM::AK_ARMV7R:
4733 return "7R";
4734 case llvm::ARM::AK_ARMV7M:
4735 return "7M";
4736 case llvm::ARM::AK_ARMV7EM:
4737 return "7EM";
4738 case llvm::ARM::AK_ARMV8A:
4739 return "8A";
4740 case llvm::ARM::AK_ARMV8_1A:
4741 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004742 case llvm::ARM::AK_ARMV8_2A:
4743 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004744 case llvm::ARM::AK_ARMV8MBaseline:
4745 return "8M_BASE";
4746 case llvm::ARM::AK_ARMV8MMainline:
4747 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004748 }
4749 }
4750
4751 StringRef getCPUProfile() const {
4752 switch(ArchProfile) {
4753 case llvm::ARM::PK_A:
4754 return "A";
4755 case llvm::ARM::PK_R:
4756 return "R";
4757 case llvm::ARM::PK_M:
4758 return "M";
4759 default:
4760 return "";
4761 }
4762 }
4763
Chris Lattner17df24e2008-04-21 18:56:49 +00004764public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004765 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4766 bool IsBigEndian)
4767 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4768 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004769 BigEndian = IsBigEndian;
4770
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004771 switch (getTriple().getOS()) {
4772 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004773 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004774 break;
4775 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004776 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004777 break;
4778 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004779
Renato Goline84b0002015-10-08 16:43:26 +00004780 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004781 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004782
Chris Lattner1a8f3942010-04-23 16:29:58 +00004783 // {} in inline assembly are neon specifiers, not assembly variant
4784 // specifiers.
4785 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004786
Eric Christopher0e261882014-12-05 01:06:59 +00004787 // FIXME: This duplicates code from the driver that sets the -target-abi
4788 // option - this code is used if -target-abi isn't passed and should
4789 // be unified in some way.
4790 if (Triple.isOSBinFormatMachO()) {
4791 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4792 // the frontend matches that.
4793 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4794 Triple.getOS() == llvm::Triple::UnknownOS ||
4795 StringRef(CPU).startswith("cortex-m")) {
4796 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004797 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004798 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004799 } else {
4800 setABI("apcs-gnu");
4801 }
4802 } else if (Triple.isOSWindows()) {
4803 // FIXME: this is invalid for WindowsCE
4804 setABI("aapcs");
4805 } else {
4806 // Select the default based on the platform.
4807 switch (Triple.getEnvironment()) {
4808 case llvm::Triple::Android:
4809 case llvm::Triple::GNUEABI:
4810 case llvm::Triple::GNUEABIHF:
4811 setABI("aapcs-linux");
4812 break;
4813 case llvm::Triple::EABIHF:
4814 case llvm::Triple::EABI:
4815 setABI("aapcs");
4816 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004817 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004818 setABI("apcs-gnu");
4819 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004820 default:
4821 if (Triple.getOS() == llvm::Triple::NetBSD)
4822 setABI("apcs-gnu");
4823 else
4824 setABI("aapcs");
4825 break;
4826 }
4827 }
John McCall86353412010-08-21 22:46:04 +00004828
4829 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004830 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004831
Renato Golin15b86152015-07-03 16:41:13 +00004832 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004833 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004834
James Molloya7139222012-03-12 09:14:10 +00004835 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004836 // the alignment of the zero-length bitfield is greater than the member
4837 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004838 // zero length bitfield.
4839 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004840
4841 if (Triple.getOS() == llvm::Triple::Linux ||
4842 Triple.getOS() == llvm::Triple::UnknownOS)
4843 this->MCountName =
4844 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004845 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004846
Alp Toker4925ba72014-06-07 23:30:42 +00004847 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004848
Craig Topper3164f332014-03-11 03:39:26 +00004849 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004850 ABI = Name;
4851
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004852 // The defaults (above) are for AAPCS, check if we need to change them.
4853 //
4854 // FIXME: We need support for -meabi... we could just mangle it into the
4855 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004856 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004857 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004858 return true;
4859 }
4860 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4861 setABIAAPCS();
4862 return true;
4863 }
4864 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004865 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004866
Renato Golinf5c4dec2015-05-27 13:33:00 +00004867 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004868 bool
4869 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4870 StringRef CPU,
4871 const std::vector<std::string> &FeaturesVec) const override {
4872
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004873 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004874 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004875
4876 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004877 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004878 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4879
4880 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004881 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004882 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4883
4884 for (const char *Feature : TargetFeatures)
4885 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004886 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004887
Eric Christopher007b0a02015-08-28 22:32:01 +00004888 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004889 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004890
Craig Topper3164f332014-03-11 03:39:26 +00004891 bool handleTargetFeatures(std::vector<std::string> &Features,
4892 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004893 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004894 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004895 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004896 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004897 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004898 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004899 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004900
Ranjeet Singhac08e532015-06-24 23:39:25 +00004901 // This does not diagnose illegal cases like having both
4902 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4903 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004904 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004905 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004906 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004907 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004908 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004909 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004910 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004911 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004912 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004913 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004914 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004915 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004916 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004917 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004918 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004919 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004920 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004921 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004922 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004923 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004924 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004925 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004926 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004927 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004928 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004929 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004930 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004931 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004932 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004933 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004934 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004935 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004936 } else if (Feature == "+strict-align") {
4937 Unaligned = 0;
4938 } else if (Feature == "+fp16") {
4939 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004940 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004941 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004942 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004943
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004944 switch (ArchVersion) {
4945 case 6:
4946 if (ArchProfile == llvm::ARM::PK_M)
4947 LDREX = 0;
4948 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4949 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4950 else
4951 LDREX = LDREX_W;
4952 break;
4953 case 7:
4954 if (ArchProfile == llvm::ARM::PK_M)
4955 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4956 else
4957 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4958 break;
4959 case 8:
4960 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4961 }
4962
Rafael Espindolaeb265472013-08-21 21:59:03 +00004963 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4964 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4965 return false;
4966 }
4967
4968 if (FPMath == FP_Neon)
4969 Features.push_back("+neonfp");
4970 else if (FPMath == FP_VFP)
4971 Features.push_back("-neonfp");
4972
Daniel Dunbar893d4752009-12-19 04:15:38 +00004973 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004974 auto Feature =
4975 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4976 if (Feature != Features.end())
4977 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004978
Rafael Espindolaeb265472013-08-21 21:59:03 +00004979 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004980 }
4981
Craig Topper3164f332014-03-11 03:39:26 +00004982 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004983 return llvm::StringSwitch<bool>(Feature)
4984 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004985 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004986 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004987 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004988 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004989 .Case("hwdiv", HWDiv & HWDivThumb)
4990 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004991 .Default(false);
4992 }
Renato Golin15b86152015-07-03 16:41:13 +00004993
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004994 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004995 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004996 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004997
Renato Golin15b86152015-07-03 16:41:13 +00004998 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004999 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005000 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005001 CPU = Name;
5002 return true;
5003 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005004
Craig Topper3164f332014-03-11 03:39:26 +00005005 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005006
Craig Topper3164f332014-03-11 03:39:26 +00005007 void getTargetDefines(const LangOptions &Opts,
5008 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005009 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005010 Builder.defineMacro("__arm");
5011 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005012 // For bare-metal none-eabi.
5013 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5014 getTriple().getEnvironment() == llvm::Triple::EABI)
5015 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005016
Chris Lattnerecd49032009-03-02 22:27:17 +00005017 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005018 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005019
5020 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5021 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005022 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005023 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5024
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005025 if (!CPUAttr.empty())
5026 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005027
5028 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005029 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005030 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005031
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005032 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005033 // ACLE 6.5.7 Crypto Extension
5034 if (Crypto)
5035 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5036 // ACLE 6.5.8 CRC32 Extension
5037 if (CRC)
5038 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5039 // ACLE 6.5.10 Numeric Maximum and Minimum
5040 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5041 // ACLE 6.5.9 Directed Rounding
5042 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005043 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005044
5045 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5046 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005047 // NOTE that the default profile is assumed to be 'A'
5048 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005049 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5050
Bradley Smithf4affc12016-03-03 13:52:22 +00005051 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5052 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5053 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5054 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005055 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005056 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005057 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005058 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5059
5060 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5061 // instruction set such as ARM or Thumb.
5062 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5063
5064 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5065
5066 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005067 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005068 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005069
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005070 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005071 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005072 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005073
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005074 // ACLE 6.4.4 LDREX/STREX
5075 if (LDREX)
5076 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5077
5078 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005079 if (ArchVersion == 5 ||
5080 (ArchVersion == 6 && CPUProfile != "M") ||
5081 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005082 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5083
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005084 // ACLE 6.5.1 Hardware Floating Point
5085 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005086 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005087
Yi Konga44c4d72014-06-27 21:25:42 +00005088 // ACLE predefines.
5089 Builder.defineMacro("__ARM_ACLE", "200");
5090
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005091 // FP16 support (we currently only support IEEE format).
5092 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5093 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5094
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005095 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005096 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005097 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5098
Mike Stump9d54bd72009-04-08 02:07:04 +00005099 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005100
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005101 // FIXME: It's more complicated than this and we don't really support
5102 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005103 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005104 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005105 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005106
David Tweed8f676532012-10-25 13:33:01 +00005107 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005108 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005109 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005110 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005111 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005112 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005113 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005114
Tim Northover28fc0e12016-04-28 13:59:55 +00005115 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5116 ABI == "aapcs16")
5117 Builder.defineMacro("__ARM_PCS_VFP", "1");
5118
Daniel Dunbar893d4752009-12-19 04:15:38 +00005119 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005120 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005121
5122 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005123 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005124
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005125 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005126 Builder.defineMacro("__THUMBEL__");
5127 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005128 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005129 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005130 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005131
5132 // ACLE 6.4.9 32-bit SIMD instructions
5133 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5134 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5135
5136 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005137 if (((HWDiv & HWDivThumb) && isThumb()) ||
5138 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005139 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005140 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005141 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005142
5143 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005144 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005145
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005146 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005147 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005148 if (FPU & VFP2FPU)
5149 Builder.defineMacro("__ARM_VFPV2__");
5150 if (FPU & VFP3FPU)
5151 Builder.defineMacro("__ARM_VFPV3__");
5152 if (FPU & VFP4FPU)
5153 Builder.defineMacro("__ARM_VFPV4__");
5154 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005155
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005156 // This only gets set when Neon instructions are actually available, unlike
5157 // the VFP define, hence the soft float and arch check. This is subtly
5158 // different from gcc, we follow the intent which was that it should be set
5159 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005160 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005161 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005162 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005163 // current AArch32 NEON implementations do not support double-precision
5164 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005165 Builder.defineMacro("__ARM_NEON_FP",
5166 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005167 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005168
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005169 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5170 Opts.ShortWChar ? "2" : "4");
5171
5172 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5173 Opts.ShortEnums ? "1" : "4");
5174
Bradley Smithf4affc12016-03-03 13:52:22 +00005175 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005176 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5177 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5178 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5179 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5180 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005181
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005182 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005183 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005184 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005185 }
5186
5187 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005188 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005189 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5190 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005191 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005192 }
5193
5194 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005195 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005196 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005197
5198 if (Opts.UnsafeFPMath)
5199 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005200
5201 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5202 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005203 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005204
Craig Topper6c03a542015-10-19 04:51:35 +00005205 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5206 return llvm::makeArrayRef(BuiltinInfo,
5207 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005208 }
Craig Topper3164f332014-03-11 03:39:26 +00005209 bool isCLZForZeroUndef() const override { return false; }
5210 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005211 return IsAAPCS
5212 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005213 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5214 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005215 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005216 ArrayRef<const char *> getGCCRegNames() const override;
5217 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005218 bool validateAsmConstraint(const char *&Name,
5219 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005220 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005221 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005222 case 'l': // r0-r7
5223 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005224 case 't': // VFP Floating point register single precision
5225 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005226 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005227 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005228 case 'I':
5229 case 'J':
5230 case 'K':
5231 case 'L':
5232 case 'M':
5233 // FIXME
5234 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005235 case 'Q': // A memory address that is a single base register.
5236 Info.setAllowsMemory();
5237 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005238 case 'U': // a memory reference...
5239 switch (Name[1]) {
5240 case 'q': // ...ARMV4 ldrsb
5241 case 'v': // ...VFP load/store (reg+constant offset)
5242 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005243 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005244 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005245 case 'n': // valid address for Neon doubleword vector load/store
5246 case 'm': // valid address for Neon element and structure load/store
5247 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005248 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005249 Info.setAllowsMemory();
5250 Name++;
5251 return true;
5252 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005253 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005254 return false;
5255 }
Craig Topper3164f332014-03-11 03:39:26 +00005256 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005257 std::string R;
5258 switch (*Constraint) {
5259 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005260 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005261 Constraint++;
5262 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005263 case 'p': // 'p' should be translated to 'r' by default.
5264 R = std::string("r");
5265 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005266 default:
5267 return std::string(1, *Constraint);
5268 }
5269 return R;
5270 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005271 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005272 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005273 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005274 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005275 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005276
Bill Wendling9d1ee112012-10-25 23:28:48 +00005277 // Strip off constraint modifiers.
5278 while (Constraint[0] == '=' ||
5279 Constraint[0] == '+' ||
5280 Constraint[0] == '&')
5281 Constraint = Constraint.substr(1);
5282
5283 switch (Constraint[0]) {
5284 default: break;
5285 case 'r': {
5286 switch (Modifier) {
5287 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005288 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005289 case 'q':
5290 // A register of size 32 cannot fit a vector type.
5291 return false;
5292 }
5293 }
5294 }
5295
5296 return true;
5297 }
Craig Topper3164f332014-03-11 03:39:26 +00005298 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005299 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005300 return "";
5301 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005302
Craig Topper3164f332014-03-11 03:39:26 +00005303 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005304 switch (CC) {
5305 case CC_AAPCS:
5306 case CC_AAPCS_VFP:
5307 case CC_Swift:
5308 return CCCR_OK;
5309 default:
5310 return CCCR_Warning;
5311 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005312 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005313
Craig Topper3164f332014-03-11 03:39:26 +00005314 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005315 if (RegNo == 0) return 0;
5316 if (RegNo == 1) return 1;
5317 return -1;
5318 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005319
5320 bool hasSjLjLowering() const override {
5321 return true;
5322 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005323};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005324
Rafael Espindolaeb265472013-08-21 21:59:03 +00005325bool ARMTargetInfo::setFPMath(StringRef Name) {
5326 if (Name == "neon") {
5327 FPMath = FP_Neon;
5328 return true;
5329 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5330 Name == "vfp4") {
5331 FPMath = FP_VFP;
5332 return true;
5333 }
5334 return false;
5335}
5336
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005337const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005338 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005339 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005340 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5341
5342 // Float registers
5343 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5344 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5345 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005346 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005347
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005348 // Double registers
5349 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5350 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005351 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5352 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005353
5354 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005355 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5356 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005357};
5358
Craig Topperf054e3a2015-10-19 03:52:27 +00005359ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5360 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005361}
5362
5363const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005364 { { "a1" }, "r0" },
5365 { { "a2" }, "r1" },
5366 { { "a3" }, "r2" },
5367 { { "a4" }, "r3" },
5368 { { "v1" }, "r4" },
5369 { { "v2" }, "r5" },
5370 { { "v3" }, "r6" },
5371 { { "v4" }, "r7" },
5372 { { "v5" }, "r8" },
5373 { { "v6", "rfp" }, "r9" },
5374 { { "sl" }, "r10" },
5375 { { "fp" }, "r11" },
5376 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005377 { { "r13" }, "sp" },
5378 { { "r14" }, "lr" },
5379 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005380 // The S, D and Q registers overlap, but aren't really aliases; we
5381 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005382};
5383
Craig Topperf054e3a2015-10-19 03:52:27 +00005384ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5385 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005386}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005387
5388const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005389#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005390 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005391#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5392 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005393#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005394
Craig Topper07d3b622015-08-07 05:14:44 +00005395#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005396 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005397#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005398 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005399#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5400 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005401#include "clang/Basic/BuiltinsARM.def"
5402};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005403
5404class ARMleTargetInfo : public ARMTargetInfo {
5405public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005406 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5407 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005408 void getTargetDefines(const LangOptions &Opts,
5409 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005410 Builder.defineMacro("__ARMEL__");
5411 ARMTargetInfo::getTargetDefines(Opts, Builder);
5412 }
5413};
5414
5415class ARMbeTargetInfo : public ARMTargetInfo {
5416public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005417 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5418 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
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("__ARMEB__");
5422 Builder.defineMacro("__ARM_BIG_ENDIAN");
5423 ARMTargetInfo::getTargetDefines(Opts, Builder);
5424 }
5425};
Chris Lattner17df24e2008-04-21 18:56:49 +00005426
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005427class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5428 const llvm::Triple Triple;
5429public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005430 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5431 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005432 WCharType = UnsignedShort;
5433 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005434 }
5435 void getVisualStudioDefines(const LangOptions &Opts,
5436 MacroBuilder &Builder) const {
5437 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5438
5439 // FIXME: this is invalid for WindowsCE
5440 Builder.defineMacro("_M_ARM_NT", "1");
5441 Builder.defineMacro("_M_ARMT", "_M_ARM");
5442 Builder.defineMacro("_M_THUMB", "_M_ARM");
5443
5444 assert((Triple.getArch() == llvm::Triple::arm ||
5445 Triple.getArch() == llvm::Triple::thumb) &&
5446 "invalid architecture for Windows ARM target info");
5447 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5448 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5449
5450 // TODO map the complete set of values
5451 // 31: VFPv3 40: VFPv4
5452 Builder.defineMacro("_M_ARM_FP", "31");
5453 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005454 BuiltinVaListKind getBuiltinVaListKind() const override {
5455 return TargetInfo::CharPtrBuiltinVaList;
5456 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005457 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5458 switch (CC) {
5459 case CC_X86StdCall:
5460 case CC_X86ThisCall:
5461 case CC_X86FastCall:
5462 case CC_X86VectorCall:
5463 return CCCR_Ignore;
5464 case CC_C:
5465 return CCCR_OK;
5466 default:
5467 return CCCR_Warning;
5468 }
5469 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005470};
5471
5472// Windows ARM + Itanium C++ ABI Target
5473class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5474public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005475 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5476 const TargetOptions &Opts)
5477 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005478 TheCXXABI.set(TargetCXXABI::GenericARM);
5479 }
5480
5481 void getTargetDefines(const LangOptions &Opts,
5482 MacroBuilder &Builder) const override {
5483 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5484
5485 if (Opts.MSVCCompat)
5486 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5487 }
5488};
5489
5490// Windows ARM, MS (C++) ABI
5491class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5492public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005493 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5494 const TargetOptions &Opts)
5495 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005496 TheCXXABI.set(TargetCXXABI::Microsoft);
5497 }
5498
5499 void getTargetDefines(const LangOptions &Opts,
5500 MacroBuilder &Builder) const override {
5501 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5502 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5503 }
5504};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005505
Yaron Keren321249c2015-07-15 13:32:23 +00005506// ARM MinGW target
5507class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5508public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005509 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5510 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005511 TheCXXABI.set(TargetCXXABI::GenericARM);
5512 }
5513
5514 void getTargetDefines(const LangOptions &Opts,
5515 MacroBuilder &Builder) const override {
5516 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5517 DefineStd(Builder, "WIN32", Opts);
5518 DefineStd(Builder, "WINNT", Opts);
5519 Builder.defineMacro("_ARM_");
5520 addMinGWDefines(Opts, Builder);
5521 }
5522};
5523
5524// ARM Cygwin target
5525class CygwinARMTargetInfo : public ARMleTargetInfo {
5526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005527 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5528 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005529 TLSSupported = false;
5530 WCharType = UnsignedShort;
5531 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005532 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005533 }
5534 void getTargetDefines(const LangOptions &Opts,
5535 MacroBuilder &Builder) const override {
5536 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5537 Builder.defineMacro("_ARM_");
5538 Builder.defineMacro("__CYGWIN__");
5539 Builder.defineMacro("__CYGWIN32__");
5540 DefineStd(Builder, "unix", Opts);
5541 if (Opts.CPlusPlus)
5542 Builder.defineMacro("_GNU_SOURCE");
5543 }
5544};
5545
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005546class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005547protected:
Craig Topper3164f332014-03-11 03:39:26 +00005548 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5549 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005550 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005551 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005552
Torok Edwinb2b37c62009-06-30 17:10:35 +00005553public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005554 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5555 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005556 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005557 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005558 // FIXME: This should be based off of the target features in
5559 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005560 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005561
Tim Northoverd88ecb32016-01-27 19:32:40 +00005562 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005563 // Darwin on iOS uses a variant of the ARM C++ ABI.
5564 TheCXXABI.set(TargetCXXABI::WatchOS);
5565
5566 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5567 // size_t is long, it's a bit weird for it to be int.
5568 PtrDiffType = SignedLong;
5569
5570 // BOOL should be a real boolean on the new ABI
5571 UseSignedCharForObjCBool = false;
5572 } else
5573 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005574 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005575};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005576
Tim Northover573cbee2014-05-24 12:52:07 +00005577class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005578 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005579 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5580 static const char *const GCCRegNames[];
5581
James Molloy75f5f9e2014-04-16 15:33:48 +00005582 enum FPUModeEnum {
5583 FPUMode,
5584 NeonMode
5585 };
5586
5587 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005588 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005589 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005590 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005591 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005592
Tim Northovera2ee4332014-03-29 15:09:45 +00005593 static const Builtin::Info BuiltinInfo[];
5594
5595 std::string ABI;
5596
5597public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005598 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005599 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005600 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5601 WCharType = SignedInt;
5602
5603 // NetBSD apparently prefers consistency across ARM targets to consistency
5604 // across 64-bit targets.
5605 Int64Type = SignedLongLong;
5606 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005607 } else {
5608 WCharType = UnsignedInt;
5609 Int64Type = SignedLong;
5610 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005611 }
5612
Tim Northovera2ee4332014-03-29 15:09:45 +00005613 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005614 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005615 MaxAtomicInlineWidth = 128;
5616 MaxAtomicPromoteWidth = 128;
5617
Tim Northovera6a19f12015-02-06 01:25:07 +00005618 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005619 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5620
Tim Northovera2ee4332014-03-29 15:09:45 +00005621 // {} in inline assembly are neon specifiers, not assembly variant
5622 // specifiers.
5623 NoAsmVariants = true;
5624
Tim Northover7ad87af2015-01-16 18:44:04 +00005625 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5626 // contributes to the alignment of the containing aggregate in the same way
5627 // a plain (non bit-field) member of that type would, without exception for
5628 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005629 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005630 UseZeroLengthBitfieldAlignment = true;
5631
Tim Northover573cbee2014-05-24 12:52:07 +00005632 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005633 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005634
5635 if (Triple.getOS() == llvm::Triple::Linux ||
5636 Triple.getOS() == llvm::Triple::UnknownOS)
5637 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005638 }
5639
Alp Toker4925ba72014-06-07 23:30:42 +00005640 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005641 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005642 if (Name != "aapcs" && Name != "darwinpcs")
5643 return false;
5644
5645 ABI = Name;
5646 return true;
5647 }
5648
David Blaikie1cbb9712014-11-14 19:09:44 +00005649 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005650 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005651 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005652 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5653 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005654 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005655 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005656 .Default(false);
5657 return CPUKnown;
5658 }
5659
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005660 void getTargetDefines(const LangOptions &Opts,
5661 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005662 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005663 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005664
5665 // Target properties.
5666 Builder.defineMacro("_LP64");
5667 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005668
5669 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5670 Builder.defineMacro("__ARM_ACLE", "200");
5671 Builder.defineMacro("__ARM_ARCH", "8");
5672 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5673
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005674 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005675 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005676 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005677
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005678 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5679 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5680 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5681 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005682 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005683 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5684 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005685
5686 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5687
5688 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005689 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005690
5691 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5692 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005693 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5694 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005695
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005696 if (Opts.UnsafeFPMath)
5697 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005698
5699 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5700
5701 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5702 Opts.ShortEnums ? "1" : "4");
5703
James Molloy75f5f9e2014-04-16 15:33:48 +00005704 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005705 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005706 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005707 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005708 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005709
Bradley Smith418c5932014-05-02 15:17:51 +00005710 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005711 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005712
James Molloy75f5f9e2014-04-16 15:33:48 +00005713 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005714 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5715
5716 if (Unaligned)
5717 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005718
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005719 if (V8_1A)
5720 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5721
Reid Klecknerd167d422015-05-06 15:31:46 +00005722 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5723 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5724 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5725 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5726 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005727 }
5728
Craig Topper6c03a542015-10-19 04:51:35 +00005729 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5730 return llvm::makeArrayRef(BuiltinInfo,
5731 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005732 }
5733
David Blaikie1cbb9712014-11-14 19:09:44 +00005734 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005735 return Feature == "aarch64" ||
5736 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005737 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005738 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005739 }
5740
James Molloy5e73df52014-04-16 15:06:20 +00005741 bool handleTargetFeatures(std::vector<std::string> &Features,
5742 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005743 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005744 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005745 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005746 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005747 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005748
Eric Christopher610fe112015-08-26 08:21:55 +00005749 for (const auto &Feature : Features) {
5750 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005751 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005752 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005753 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005754 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005755 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005756 if (Feature == "+strict-align")
5757 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005758 if (Feature == "+v8.1a")
5759 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005760 }
5761
James Y Knightb214cbc2016-03-04 19:00:41 +00005762 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005763
5764 return true;
5765 }
5766
John McCall477f2bb2016-03-03 06:39:32 +00005767 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5768 switch (CC) {
5769 case CC_C:
5770 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005771 case CC_PreserveMost:
5772 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005773 return CCCR_OK;
5774 default:
5775 return CCCR_Warning;
5776 }
5777 }
5778
David Blaikie1cbb9712014-11-14 19:09:44 +00005779 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005780
David Blaikie1cbb9712014-11-14 19:09:44 +00005781 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005782 return TargetInfo::AArch64ABIBuiltinVaList;
5783 }
5784
Craig Topperf054e3a2015-10-19 03:52:27 +00005785 ArrayRef<const char *> getGCCRegNames() const override;
5786 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005787
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005788 bool validateAsmConstraint(const char *&Name,
5789 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005790 switch (*Name) {
5791 default:
5792 return false;
5793 case 'w': // Floating point and SIMD registers (V0-V31)
5794 Info.setAllowsRegister();
5795 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005796 case 'I': // Constant that can be used with an ADD instruction
5797 case 'J': // Constant that can be used with a SUB instruction
5798 case 'K': // Constant that can be used with a 32-bit logical instruction
5799 case 'L': // Constant that can be used with a 64-bit logical instruction
5800 case 'M': // Constant that can be used as a 32-bit MOV immediate
5801 case 'N': // Constant that can be used as a 64-bit MOV immediate
5802 case 'Y': // Floating point constant zero
5803 case 'Z': // Integer constant zero
5804 return true;
5805 case 'Q': // A memory reference with base register and no offset
5806 Info.setAllowsMemory();
5807 return true;
5808 case 'S': // A symbolic address
5809 Info.setAllowsRegister();
5810 return true;
5811 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005812 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5813 // Utf: A memory address suitable for ldp/stp in TF mode.
5814 // Usa: An absolute symbolic address.
5815 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5816 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005817 case 'z': // Zero register, wzr or xzr
5818 Info.setAllowsRegister();
5819 return true;
5820 case 'x': // Floating point and SIMD registers (V0-V15)
5821 Info.setAllowsRegister();
5822 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005823 }
5824 return false;
5825 }
5826
Akira Hatanaka987f1862014-08-22 06:05:21 +00005827 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005828 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005829 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005830 // Strip off constraint modifiers.
5831 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5832 Constraint = Constraint.substr(1);
5833
5834 switch (Constraint[0]) {
5835 default:
5836 return true;
5837 case 'z':
5838 case 'r': {
5839 switch (Modifier) {
5840 case 'x':
5841 case 'w':
5842 // For now assume that the person knows what they're
5843 // doing with the modifier.
5844 return true;
5845 default:
5846 // By default an 'r' constraint will be in the 'x'
5847 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005848 if (Size == 64)
5849 return true;
5850
5851 SuggestedModifier = "w";
5852 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005853 }
5854 }
5855 }
5856 }
5857
David Blaikie1cbb9712014-11-14 19:09:44 +00005858 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005859
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005860 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005861 if (RegNo == 0)
5862 return 0;
5863 if (RegNo == 1)
5864 return 1;
5865 return -1;
5866 }
5867};
5868
Tim Northover573cbee2014-05-24 12:52:07 +00005869const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005870 // 32-bit Integer registers
5871 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5872 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5873 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5874
5875 // 64-bit Integer registers
5876 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5877 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5878 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5879
5880 // 32-bit floating point regsisters
5881 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5882 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5883 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5884
5885 // 64-bit floating point regsisters
5886 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5887 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5888 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5889
5890 // Vector registers
5891 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5892 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5893 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5894};
5895
Craig Topperf054e3a2015-10-19 03:52:27 +00005896ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5897 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005898}
5899
Tim Northover573cbee2014-05-24 12:52:07 +00005900const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005901 { { "w31" }, "wsp" },
5902 { { "x29" }, "fp" },
5903 { { "x30" }, "lr" },
5904 { { "x31" }, "sp" },
5905 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5906 // don't want to substitute one of these for a different-sized one.
5907};
5908
Craig Topperf054e3a2015-10-19 03:52:27 +00005909ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5910 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005911}
5912
Tim Northover573cbee2014-05-24 12:52:07 +00005913const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005914#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005915 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005916#include "clang/Basic/BuiltinsNEON.def"
5917
5918#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005919 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005920#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005921};
James Molloy5e73df52014-04-16 15:06:20 +00005922
Tim Northover573cbee2014-05-24 12:52:07 +00005923class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005924 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005925 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005926 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005927 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005928 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005929 }
5930
5931public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005932 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5933 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00005934 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005935 }
James Molloy5e73df52014-04-16 15:06:20 +00005936 void getTargetDefines(const LangOptions &Opts,
5937 MacroBuilder &Builder) const override {
5938 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005939 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005940 }
5941};
5942
Tim Northover573cbee2014-05-24 12:52:07 +00005943class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005944 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005945 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005946 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005947 }
5948
5949public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005950 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5951 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00005952 void getTargetDefines(const LangOptions &Opts,
5953 MacroBuilder &Builder) const override {
5954 Builder.defineMacro("__AARCH64EB__");
5955 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5956 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005957 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005958 }
5959};
Tim Northovera2ee4332014-03-29 15:09:45 +00005960
Tim Northover573cbee2014-05-24 12:52:07 +00005961class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005962protected:
5963 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5964 MacroBuilder &Builder) const override {
5965 Builder.defineMacro("__AARCH64_SIMD__");
5966 Builder.defineMacro("__ARM64_ARCH_8__");
5967 Builder.defineMacro("__ARM_NEON__");
5968 Builder.defineMacro("__LITTLE_ENDIAN__");
5969 Builder.defineMacro("__REGISTER_PREFIX__", "");
5970 Builder.defineMacro("__arm64", "1");
5971 Builder.defineMacro("__arm64__", "1");
5972
5973 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5974 }
5975
Tim Northovera2ee4332014-03-29 15:09:45 +00005976public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005977 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5978 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005979 Int64Type = SignedLongLong;
5980 WCharType = SignedInt;
5981 UseSignedCharForObjCBool = false;
5982
Tim Northovera6a19f12015-02-06 01:25:07 +00005983 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005984 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5985
5986 TheCXXABI.set(TargetCXXABI::iOS64);
5987 }
5988
David Blaikie1cbb9712014-11-14 19:09:44 +00005989 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005990 return TargetInfo::CharPtrBuiltinVaList;
5991 }
5992};
Tim Northovera2ee4332014-03-29 15:09:45 +00005993
Tony Linthicum76329bf2011-12-12 21:14:55 +00005994// Hexagon abstract base class
5995class HexagonTargetInfo : public TargetInfo {
5996 static const Builtin::Info BuiltinInfo[];
5997 static const char * const GCCRegNames[];
5998 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5999 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006000 bool HasHVX, HasHVXDouble;
6001
Tony Linthicum76329bf2011-12-12 21:14:55 +00006002public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006003 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6004 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006005 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006006 // Specify the vector alignment explicitly. For v512x1, the calculated
6007 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6008 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006009 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006010 "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 +00006011 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006012 SizeType = UnsignedInt;
6013 PtrDiffType = SignedInt;
6014 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006015
6016 // {} in inline assembly are packet specifiers, not assembly variant
6017 // specifiers.
6018 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006019
6020 LargeArrayMinWidth = 64;
6021 LargeArrayAlign = 64;
6022 UseBitFieldTypeAlignment = true;
6023 ZeroLengthBitfieldBoundary = 32;
6024 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006025 }
6026
Craig Topper6c03a542015-10-19 04:51:35 +00006027 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6028 return llvm::makeArrayRef(BuiltinInfo,
6029 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006030 }
6031
Craig Topper3164f332014-03-11 03:39:26 +00006032 bool validateAsmConstraint(const char *&Name,
6033 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006034 switch (*Name) {
6035 case 'v':
6036 case 'q':
6037 if (HasHVX) {
6038 Info.setAllowsRegister();
6039 return true;
6040 }
6041 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006042 case 's':
6043 // Relocatable constant.
6044 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006045 }
6046 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006047 }
6048
Craig Topper3164f332014-03-11 03:39:26 +00006049 void getTargetDefines(const LangOptions &Opts,
6050 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006051
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006052 bool isCLZForZeroUndef() const override { return false; }
6053
Craig Topper3164f332014-03-11 03:39:26 +00006054 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006055 return llvm::StringSwitch<bool>(Feature)
6056 .Case("hexagon", true)
6057 .Case("hvx", HasHVX)
6058 .Case("hvx-double", HasHVXDouble)
6059 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006060 }
Craig Topper3164f332014-03-11 03:39:26 +00006061
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006062 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6063 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6064 const override;
6065
6066 bool handleTargetFeatures(std::vector<std::string> &Features,
6067 DiagnosticsEngine &Diags) override;
6068
Craig Topper3164f332014-03-11 03:39:26 +00006069 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006070 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006071 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006072 ArrayRef<const char *> getGCCRegNames() const override;
6073 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006074 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006075 return "";
6076 }
Sebastian Pop86500282012-01-13 20:37:10 +00006077
6078 static const char *getHexagonCPUSuffix(StringRef Name) {
6079 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006080 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006081 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006082 .Case("hexagonv55", "55")
6083 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006084 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006085 }
6086
Craig Topper3164f332014-03-11 03:39:26 +00006087 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006088 if (!getHexagonCPUSuffix(Name))
6089 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006090 CPU = Name;
6091 return true;
6092 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006093
6094 int getEHDataRegisterNumber(unsigned RegNo) const override {
6095 return RegNo < 2 ? RegNo : -1;
6096 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006097};
6098
6099void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006100 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006101 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006102 Builder.defineMacro("__hexagon__", "1");
6103
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006104 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006105 Builder.defineMacro("__HEXAGON_V4__");
6106 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006107 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006108 Builder.defineMacro("__QDSP6_V4__");
6109 Builder.defineMacro("__QDSP6_ARCH__", "4");
6110 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006111 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006112 Builder.defineMacro("__HEXAGON_V5__");
6113 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6114 if(Opts.HexagonQdsp6Compat) {
6115 Builder.defineMacro("__QDSP6_V5__");
6116 Builder.defineMacro("__QDSP6_ARCH__", "5");
6117 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006118 } else if (CPU == "hexagonv55") {
6119 Builder.defineMacro("__HEXAGON_V55__");
6120 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6121 Builder.defineMacro("__QDSP6_V55__");
6122 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006123 } else if (CPU == "hexagonv60") {
6124 Builder.defineMacro("__HEXAGON_V60__");
6125 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6126 Builder.defineMacro("__QDSP6_V60__");
6127 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006128 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006129
6130 if (hasFeature("hvx")) {
6131 Builder.defineMacro("__HVX__");
6132 if (hasFeature("hvx-double"))
6133 Builder.defineMacro("__HVXDBL__");
6134 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006135}
6136
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006137bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6138 DiagnosticsEngine &Diags) {
6139 for (auto &F : Features) {
6140 if (F == "+hvx")
6141 HasHVX = true;
6142 else if (F == "-hvx")
6143 HasHVX = HasHVXDouble = false;
6144 else if (F == "+hvx-double")
6145 HasHVX = HasHVXDouble = true;
6146 else if (F == "-hvx-double")
6147 HasHVXDouble = false;
6148 }
6149 return true;
6150}
6151
6152bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6153 DiagnosticsEngine &Diags, StringRef CPU,
6154 const std::vector<std::string> &FeaturesVec) const {
6155 // Default for v60: -hvx, -hvx-double.
6156 Features["hvx"] = false;
6157 Features["hvx-double"] = false;
6158
6159 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6160}
6161
6162
6163const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006164 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6165 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6166 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6167 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6168 "p0", "p1", "p2", "p3",
6169 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6170};
6171
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006172ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006173 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006174}
6175
Tony Linthicum76329bf2011-12-12 21:14:55 +00006176const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6177 { { "sp" }, "r29" },
6178 { { "fp" }, "r30" },
6179 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006180};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006181
Craig Topperf054e3a2015-10-19 03:52:27 +00006182ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6183 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006184}
6185
6186
6187const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006188#define BUILTIN(ID, TYPE, ATTRS) \
6189 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6190#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6191 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006192#include "clang/Basic/BuiltinsHexagon.def"
6193};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006194
Jacques Pienaard964cc22016-03-28 21:02:54 +00006195class LanaiTargetInfo : public TargetInfo {
6196 // Class for Lanai (32-bit).
6197 // The CPU profiles supported by the Lanai backend
6198 enum CPUKind {
6199 CK_NONE,
6200 CK_V11,
6201 } CPU;
6202
6203 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6204 static const char *const GCCRegNames[];
6205
6206public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006207 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6208 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006209 // Description string has to be kept in sync with backend.
6210 resetDataLayout("E" // Big endian
6211 "-m:e" // ELF name manging
6212 "-p:32:32" // 32 bit pointers, 32 bit aligned
6213 "-i64:64" // 64 bit integers, 64 bit aligned
6214 "-a:0:32" // 32 bit alignment of objects of aggregate type
6215 "-n32" // 32 bit native integer width
6216 "-S64" // 64 bit natural stack alignment
6217 );
6218
6219 // Setting RegParmMax equal to what mregparm was set to in the old
6220 // toolchain
6221 RegParmMax = 4;
6222
6223 // Set the default CPU to V11
6224 CPU = CK_V11;
6225
6226 // Temporary approach to make everything at least word-aligned and allow for
6227 // safely casting between pointers with different alignment requirements.
6228 // TODO: Remove this when there are no more cast align warnings on the
6229 // firmware.
6230 MinGlobalAlign = 32;
6231 }
6232
6233 void getTargetDefines(const LangOptions &Opts,
6234 MacroBuilder &Builder) const override {
6235 // Define __lanai__ when building for target lanai.
6236 Builder.defineMacro("__lanai__");
6237
6238 // Set define for the CPU specified.
6239 switch (CPU) {
6240 case CK_V11:
6241 Builder.defineMacro("__LANAI_V11__");
6242 break;
6243 case CK_NONE:
6244 llvm_unreachable("Unhandled target CPU");
6245 }
6246 }
6247
6248 bool setCPU(const std::string &Name) override {
6249 CPU = llvm::StringSwitch<CPUKind>(Name)
6250 .Case("v11", CK_V11)
6251 .Default(CK_NONE);
6252
6253 return CPU != CK_NONE;
6254 }
6255
6256 bool hasFeature(StringRef Feature) const override {
6257 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6258 }
6259
6260 ArrayRef<const char *> getGCCRegNames() const override;
6261
6262 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6263
6264 BuiltinVaListKind getBuiltinVaListKind() const override {
6265 return TargetInfo::VoidPtrBuiltinVaList;
6266 }
6267
6268 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6269
6270 bool validateAsmConstraint(const char *&Name,
6271 TargetInfo::ConstraintInfo &info) const override {
6272 return false;
6273 }
6274
6275 const char *getClobbers() const override { return ""; }
6276};
6277
6278const char *const LanaiTargetInfo::GCCRegNames[] = {
6279 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6280 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6281 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6282
6283ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6284 return llvm::makeArrayRef(GCCRegNames);
6285}
6286
6287const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6288 {{"pc"}, "r2"},
6289 {{"sp"}, "r4"},
6290 {{"fp"}, "r5"},
6291 {{"rv"}, "r8"},
6292 {{"rr1"}, "r10"},
6293 {{"rr2"}, "r11"},
6294 {{"rca"}, "r15"},
6295};
6296
6297ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6298 return llvm::makeArrayRef(GCCRegAliases);
6299}
6300
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006301// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6302class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006303 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6304 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006305 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006306public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006307 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006308 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006309
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006310 int getEHDataRegisterNumber(unsigned RegNo) const override {
6311 if (RegNo == 0) return 24;
6312 if (RegNo == 1) return 25;
6313 return -1;
6314 }
6315
Craig Topper3164f332014-03-11 03:39:26 +00006316 bool handleTargetFeatures(std::vector<std::string> &Features,
6317 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006318 // The backend doesn't actually handle soft float yet, but in case someone
6319 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006320 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6321 if (Feature != Features.end()) {
6322 SoftFloat = true;
6323 Features.erase(Feature);
6324 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006325 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006326 }
Craig Topper3164f332014-03-11 03:39:26 +00006327 void getTargetDefines(const LangOptions &Opts,
6328 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006329 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006330 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006331
6332 if (SoftFloat)
6333 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006334 }
Craig Topper3164f332014-03-11 03:39:26 +00006335
6336 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006337 return llvm::StringSwitch<bool>(Feature)
6338 .Case("softfloat", SoftFloat)
6339 .Case("sparc", true)
6340 .Default(false);
6341 }
Craig Topper3164f332014-03-11 03:39:26 +00006342
Craig Topper6c03a542015-10-19 04:51:35 +00006343 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006344 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006345 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006346 }
Craig Topper3164f332014-03-11 03:39:26 +00006347 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006348 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006349 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006350 ArrayRef<const char *> getGCCRegNames() const override;
6351 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006352 bool validateAsmConstraint(const char *&Name,
6353 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006354 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006355 switch (*Name) {
6356 case 'I': // Signed 13-bit constant
6357 case 'J': // Zero
6358 case 'K': // 32-bit constant with the low 12 bits clear
6359 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6360 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6361 case 'N': // Same as 'K' but zext (required for SIMode)
6362 case 'O': // The constant 4096
6363 return true;
6364 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006365 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006366 }
Craig Topper3164f332014-03-11 03:39:26 +00006367 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006368 // FIXME: Implement!
6369 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006370 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006371
6372 // No Sparc V7 for now, the backend doesn't support it anyway.
6373 enum CPUKind {
6374 CK_GENERIC,
6375 CK_V8,
6376 CK_SUPERSPARC,
6377 CK_SPARCLITE,
6378 CK_F934,
6379 CK_HYPERSPARC,
6380 CK_SPARCLITE86X,
6381 CK_SPARCLET,
6382 CK_TSC701,
6383 CK_V9,
6384 CK_ULTRASPARC,
6385 CK_ULTRASPARC3,
6386 CK_NIAGARA,
6387 CK_NIAGARA2,
6388 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006389 CK_NIAGARA4,
6390 CK_MYRIAD2_1,
6391 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006392 } CPU = CK_GENERIC;
6393
6394 enum CPUGeneration {
6395 CG_V8,
6396 CG_V9,
6397 };
6398
6399 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6400 switch (Kind) {
6401 case CK_GENERIC:
6402 case CK_V8:
6403 case CK_SUPERSPARC:
6404 case CK_SPARCLITE:
6405 case CK_F934:
6406 case CK_HYPERSPARC:
6407 case CK_SPARCLITE86X:
6408 case CK_SPARCLET:
6409 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006410 case CK_MYRIAD2_1:
6411 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006412 return CG_V8;
6413 case CK_V9:
6414 case CK_ULTRASPARC:
6415 case CK_ULTRASPARC3:
6416 case CK_NIAGARA:
6417 case CK_NIAGARA2:
6418 case CK_NIAGARA3:
6419 case CK_NIAGARA4:
6420 return CG_V9;
6421 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006422 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006423 }
6424
6425 CPUKind getCPUKind(StringRef Name) const {
6426 return llvm::StringSwitch<CPUKind>(Name)
6427 .Case("v8", CK_V8)
6428 .Case("supersparc", CK_SUPERSPARC)
6429 .Case("sparclite", CK_SPARCLITE)
6430 .Case("f934", CK_F934)
6431 .Case("hypersparc", CK_HYPERSPARC)
6432 .Case("sparclite86x", CK_SPARCLITE86X)
6433 .Case("sparclet", CK_SPARCLET)
6434 .Case("tsc701", CK_TSC701)
6435 .Case("v9", CK_V9)
6436 .Case("ultrasparc", CK_ULTRASPARC)
6437 .Case("ultrasparc3", CK_ULTRASPARC3)
6438 .Case("niagara", CK_NIAGARA)
6439 .Case("niagara2", CK_NIAGARA2)
6440 .Case("niagara3", CK_NIAGARA3)
6441 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006442 .Case("myriad2", CK_MYRIAD2_1)
6443 .Case("myriad2.1", CK_MYRIAD2_1)
6444 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006445 .Default(CK_GENERIC);
6446 }
6447
6448 bool setCPU(const std::string &Name) override {
6449 CPU = getCPUKind(Name);
6450 return CPU != CK_GENERIC;
6451 }
Gabor Greif49991682008-02-21 16:29:08 +00006452};
6453
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006454const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006455 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6456 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6457 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6458 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6459};
6460
Craig Topperf054e3a2015-10-19 03:52:27 +00006461ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6462 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006463}
6464
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006465const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006466 { { "g0" }, "r0" },
6467 { { "g1" }, "r1" },
6468 { { "g2" }, "r2" },
6469 { { "g3" }, "r3" },
6470 { { "g4" }, "r4" },
6471 { { "g5" }, "r5" },
6472 { { "g6" }, "r6" },
6473 { { "g7" }, "r7" },
6474 { { "o0" }, "r8" },
6475 { { "o1" }, "r9" },
6476 { { "o2" }, "r10" },
6477 { { "o3" }, "r11" },
6478 { { "o4" }, "r12" },
6479 { { "o5" }, "r13" },
6480 { { "o6", "sp" }, "r14" },
6481 { { "o7" }, "r15" },
6482 { { "l0" }, "r16" },
6483 { { "l1" }, "r17" },
6484 { { "l2" }, "r18" },
6485 { { "l3" }, "r19" },
6486 { { "l4" }, "r20" },
6487 { { "l5" }, "r21" },
6488 { { "l6" }, "r22" },
6489 { { "l7" }, "r23" },
6490 { { "i0" }, "r24" },
6491 { { "i1" }, "r25" },
6492 { { "i2" }, "r26" },
6493 { { "i3" }, "r27" },
6494 { { "i4" }, "r28" },
6495 { { "i5" }, "r29" },
6496 { { "i6", "fp" }, "r30" },
6497 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006498};
6499
Craig Topperf054e3a2015-10-19 03:52:27 +00006500ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6501 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006502}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006503
6504// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6505class SparcV8TargetInfo : public SparcTargetInfo {
6506public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006507 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6508 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006509 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006510 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6511 switch (getTriple().getOS()) {
6512 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006513 SizeType = UnsignedInt;
6514 IntPtrType = SignedInt;
6515 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006516 break;
6517 case llvm::Triple::NetBSD:
6518 case llvm::Triple::OpenBSD:
6519 SizeType = UnsignedLong;
6520 IntPtrType = SignedLong;
6521 PtrDiffType = SignedLong;
6522 break;
Brad Smith56495d52015-08-13 22:00:53 +00006523 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006524 }
6525
Craig Topper3164f332014-03-11 03:39:26 +00006526 void getTargetDefines(const LangOptions &Opts,
6527 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006528 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006529 switch (getCPUGeneration(CPU)) {
6530 case CG_V8:
6531 Builder.defineMacro("__sparcv8");
6532 if (getTriple().getOS() != llvm::Triple::Solaris)
6533 Builder.defineMacro("__sparcv8__");
6534 break;
6535 case CG_V9:
6536 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006537 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006538 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006539 Builder.defineMacro("__sparc_v9__");
6540 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006541 break;
6542 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006543 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6544 switch (CPU) {
6545 case CK_MYRIAD2_1:
6546 Builder.defineMacro("__myriad2", "1");
6547 Builder.defineMacro("__myriad2__", "1");
6548 break;
6549 case CK_MYRIAD2_2:
6550 Builder.defineMacro("__myriad2", "2");
6551 Builder.defineMacro("__myriad2__", "2");
6552 break;
6553 default:
6554 break;
6555 }
6556 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006557 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006558
6559 bool hasSjLjLowering() const override {
6560 return true;
6561 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006562};
6563
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006564// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6565class SparcV8elTargetInfo : public SparcV8TargetInfo {
6566 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006567 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6568 : SparcV8TargetInfo(Triple, Opts) {
6569 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6570 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006571 }
6572};
6573
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006574// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6575class SparcV9TargetInfo : public SparcTargetInfo {
6576public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006577 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6578 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006579 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006580 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006581 // This is an LP64 platform.
6582 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006583
6584 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006585 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006586 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006587 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006588 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006589 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006590
6591 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6592 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6593 LongDoubleWidth = 128;
6594 LongDoubleAlign = 128;
6595 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006596 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006597 }
6598
Craig Topper3164f332014-03-11 03:39:26 +00006599 void getTargetDefines(const LangOptions &Opts,
6600 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006601 SparcTargetInfo::getTargetDefines(Opts, Builder);
6602 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006603 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006604 // Solaris doesn't need these variants, but the BSDs do.
6605 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006606 Builder.defineMacro("__sparc64__");
6607 Builder.defineMacro("__sparc_v9__");
6608 Builder.defineMacro("__sparcv9__");
6609 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006610 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006611
Craig Topper3164f332014-03-11 03:39:26 +00006612 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006613 if (!SparcTargetInfo::setCPU(Name))
6614 return false;
6615 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006616 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006617};
6618
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006619class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006620 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006621 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006622 std::string CPU;
6623 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006624 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006625
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006626public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006627 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006628 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6629 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006630 IntMaxType = SignedLong;
6631 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006632 TLSSupported = true;
6633 IntWidth = IntAlign = 32;
6634 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6635 PointerWidth = PointerAlign = 64;
6636 LongDoubleWidth = 128;
6637 LongDoubleAlign = 64;
6638 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006639 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006640 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006641 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 +00006642 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6643 }
6644 void getTargetDefines(const LangOptions &Opts,
6645 MacroBuilder &Builder) const override {
6646 Builder.defineMacro("__s390__");
6647 Builder.defineMacro("__s390x__");
6648 Builder.defineMacro("__zarch__");
6649 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006650
6651 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6652 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6653 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6654 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6655
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006656 if (HasTransactionalExecution)
6657 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006658 if (Opts.ZVector)
6659 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006660 }
Craig Topper6c03a542015-10-19 04:51:35 +00006661 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6662 return llvm::makeArrayRef(BuiltinInfo,
6663 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006664 }
6665
Craig Topperf054e3a2015-10-19 03:52:27 +00006666 ArrayRef<const char *> getGCCRegNames() const override;
6667 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006668 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006669 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006670 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006671 bool validateAsmConstraint(const char *&Name,
6672 TargetInfo::ConstraintInfo &info) const override;
6673 const char *getClobbers() const override {
6674 // FIXME: Is this really right?
6675 return "";
6676 }
6677 BuiltinVaListKind getBuiltinVaListKind() const override {
6678 return TargetInfo::SystemZBuiltinVaList;
6679 }
6680 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006681 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006682 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6683 .Case("z10", true)
6684 .Case("z196", true)
6685 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006686 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006687 .Default(false);
6688
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006689 return CPUKnown;
6690 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006691 bool
6692 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6693 StringRef CPU,
6694 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006695 if (CPU == "zEC12")
6696 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006697 if (CPU == "z13") {
6698 Features["transactional-execution"] = true;
6699 Features["vector"] = true;
6700 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006701 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006702 }
6703
6704 bool handleTargetFeatures(std::vector<std::string> &Features,
6705 DiagnosticsEngine &Diags) override {
6706 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006707 for (const auto &Feature : Features) {
6708 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006709 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006710 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006711 HasVector = true;
6712 }
6713 // If we use the vector ABI, vector types are 64-bit aligned.
6714 if (HasVector) {
6715 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006716 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6717 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006718 }
6719 return true;
6720 }
6721
6722 bool hasFeature(StringRef Feature) const override {
6723 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006724 .Case("systemz", true)
6725 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006726 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006727 .Default(false);
6728 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006729
Bryan Chane3f1ed52016-04-28 13:56:43 +00006730 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6731 switch (CC) {
6732 case CC_C:
6733 case CC_Swift:
6734 return CCCR_OK;
6735 default:
6736 return CCCR_Warning;
6737 }
6738 }
6739
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006740 StringRef getABI() const override {
6741 if (HasVector)
6742 return "vector";
6743 return "";
6744 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006745
6746 bool useFloat128ManglingForLongDouble() const override {
6747 return true;
6748 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006749};
6750
6751const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6752#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006753 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006754#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6755 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006756#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006757};
6758
6759const char *const SystemZTargetInfo::GCCRegNames[] = {
6760 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6761 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6762 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6763 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6764};
6765
Craig Topperf054e3a2015-10-19 03:52:27 +00006766ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6767 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006768}
6769
6770bool SystemZTargetInfo::
6771validateAsmConstraint(const char *&Name,
6772 TargetInfo::ConstraintInfo &Info) const {
6773 switch (*Name) {
6774 default:
6775 return false;
6776
6777 case 'a': // Address register
6778 case 'd': // Data register (equivalent to 'r')
6779 case 'f': // Floating-point register
6780 Info.setAllowsRegister();
6781 return true;
6782
6783 case 'I': // Unsigned 8-bit constant
6784 case 'J': // Unsigned 12-bit constant
6785 case 'K': // Signed 16-bit constant
6786 case 'L': // Signed 20-bit displacement (on all targets we support)
6787 case 'M': // 0x7fffffff
6788 return true;
6789
6790 case 'Q': // Memory with base and unsigned 12-bit displacement
6791 case 'R': // Likewise, plus an index
6792 case 'S': // Memory with base and signed 20-bit displacement
6793 case 'T': // Likewise, plus an index
6794 Info.setAllowsMemory();
6795 return true;
6796 }
6797}
Ulrich Weigand47445072013-05-06 16:26:41 +00006798
Eric Christopherc48497a2015-09-18 21:26:24 +00006799class MSP430TargetInfo : public TargetInfo {
6800 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006801
Eric Christopherc48497a2015-09-18 21:26:24 +00006802public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006803 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6804 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006805 BigEndian = false;
6806 TLSSupported = false;
6807 IntWidth = 16;
6808 IntAlign = 16;
6809 LongWidth = 32;
6810 LongLongWidth = 64;
6811 LongAlign = LongLongAlign = 16;
6812 PointerWidth = 16;
6813 PointerAlign = 16;
6814 SuitableAlign = 16;
6815 SizeType = UnsignedInt;
6816 IntMaxType = SignedLongLong;
6817 IntPtrType = SignedInt;
6818 PtrDiffType = SignedInt;
6819 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006820 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006821 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006822 void getTargetDefines(const LangOptions &Opts,
6823 MacroBuilder &Builder) const override {
6824 Builder.defineMacro("MSP430");
6825 Builder.defineMacro("__MSP430__");
6826 // FIXME: defines for different 'flavours' of MCU
6827 }
Craig Topper6c03a542015-10-19 04:51:35 +00006828 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006829 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006830 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006831 }
6832 bool hasFeature(StringRef Feature) const override {
6833 return Feature == "msp430";
6834 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006835 ArrayRef<const char *> getGCCRegNames() const override;
6836 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006837 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006838 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006839 }
6840 bool validateAsmConstraint(const char *&Name,
6841 TargetInfo::ConstraintInfo &info) const override {
6842 // FIXME: implement
6843 switch (*Name) {
6844 case 'K': // the constant 1
6845 case 'L': // constant -1^20 .. 1^19
6846 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006847 return true;
6848 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006849 // No target constraints for now.
6850 return false;
6851 }
6852 const char *getClobbers() const override {
6853 // FIXME: Is this really right?
6854 return "";
6855 }
6856 BuiltinVaListKind getBuiltinVaListKind() const override {
6857 // FIXME: implement
6858 return TargetInfo::CharPtrBuiltinVaList;
6859 }
6860};
6861
6862const char *const MSP430TargetInfo::GCCRegNames[] = {
6863 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6864 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6865
Craig Topperf054e3a2015-10-19 03:52:27 +00006866ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6867 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006868}
6869
6870// LLVM and Clang cannot be used directly to output native binaries for
6871// target, but is used to compile C code to llvm bitcode with correct
6872// type and alignment information.
6873//
6874// TCE uses the llvm bitcode as input and uses it for generating customized
6875// target processor and program binary. TCE co-design environment is
6876// publicly available in http://tce.cs.tut.fi
6877
6878static const unsigned TCEOpenCLAddrSpaceMap[] = {
6879 3, // opencl_global
6880 4, // opencl_local
6881 5, // opencl_constant
6882 // FIXME: generic has to be added to the target
6883 0, // opencl_generic
6884 0, // cuda_device
6885 0, // cuda_constant
6886 0 // cuda_shared
6887};
6888
6889class TCETargetInfo : public TargetInfo {
6890public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006891 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6892 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006893 TLSSupported = false;
6894 IntWidth = 32;
6895 LongWidth = LongLongWidth = 32;
6896 PointerWidth = 32;
6897 IntAlign = 32;
6898 LongAlign = LongLongAlign = 32;
6899 PointerAlign = 32;
6900 SuitableAlign = 32;
6901 SizeType = UnsignedInt;
6902 IntMaxType = SignedLong;
6903 IntPtrType = SignedInt;
6904 PtrDiffType = SignedInt;
6905 FloatWidth = 32;
6906 FloatAlign = 32;
6907 DoubleWidth = 32;
6908 DoubleAlign = 32;
6909 LongDoubleWidth = 32;
6910 LongDoubleAlign = 32;
6911 FloatFormat = &llvm::APFloat::IEEEsingle;
6912 DoubleFormat = &llvm::APFloat::IEEEsingle;
6913 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006914 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6915 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006916 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6917 UseAddrSpaceMapMangling = true;
6918 }
6919
6920 void getTargetDefines(const LangOptions &Opts,
6921 MacroBuilder &Builder) const override {
6922 DefineStd(Builder, "tce", Opts);
6923 Builder.defineMacro("__TCE__");
6924 Builder.defineMacro("__TCE_V1__");
6925 }
6926 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6927
Craig Topper6c03a542015-10-19 04:51:35 +00006928 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006929 const char *getClobbers() const override { return ""; }
6930 BuiltinVaListKind getBuiltinVaListKind() const override {
6931 return TargetInfo::VoidPtrBuiltinVaList;
6932 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006933 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006934 bool validateAsmConstraint(const char *&Name,
6935 TargetInfo::ConstraintInfo &info) const override {
6936 return true;
6937 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006938 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6939 return None;
6940 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006941};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006942
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006943class BPFTargetInfo : public TargetInfo {
6944public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006945 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6946 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006947 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6948 SizeType = UnsignedLong;
6949 PtrDiffType = SignedLong;
6950 IntPtrType = SignedLong;
6951 IntMaxType = SignedLong;
6952 Int64Type = SignedLong;
6953 RegParmMax = 5;
6954 if (Triple.getArch() == llvm::Triple::bpfeb) {
6955 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006956 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006957 } else {
6958 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006959 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006960 }
6961 MaxAtomicPromoteWidth = 64;
6962 MaxAtomicInlineWidth = 64;
6963 TLSSupported = false;
6964 }
6965 void getTargetDefines(const LangOptions &Opts,
6966 MacroBuilder &Builder) const override {
6967 DefineStd(Builder, "bpf", Opts);
6968 Builder.defineMacro("__BPF__");
6969 }
6970 bool hasFeature(StringRef Feature) const override {
6971 return Feature == "bpf";
6972 }
6973
Craig Topper6c03a542015-10-19 04:51:35 +00006974 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006975 const char *getClobbers() const override {
6976 return "";
6977 }
6978 BuiltinVaListKind getBuiltinVaListKind() const override {
6979 return TargetInfo::VoidPtrBuiltinVaList;
6980 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006981 ArrayRef<const char *> getGCCRegNames() const override {
6982 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006983 }
6984 bool validateAsmConstraint(const char *&Name,
6985 TargetInfo::ConstraintInfo &info) const override {
6986 return true;
6987 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006988 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6989 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006990 }
6991};
6992
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006993class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006994 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006995
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006996 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006997 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006998 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006999 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007000 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007001 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007002 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007003 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007004 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007005 enum DspRevEnum {
7006 NoDSP, DSP1, DSP2
7007 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007008 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007009
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007010protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007011 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007012 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007013
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007014public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007015 MipsTargetInfoBase(const llvm::Triple &Triple, const TargetOptions &,
7016 const std::string &ABIStr, const std::string &CPUStr)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007017 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007018 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007019 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
7020 TheCXXABI.set(TargetCXXABI::GenericMIPS);
7021 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007022
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007023 bool isNaN2008Default() const {
7024 return CPU == "mips32r6" || CPU == "mips64r6";
7025 }
7026
7027 bool isFP64Default() const {
7028 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7029 }
7030
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007031 bool isNan2008() const override {
7032 return IsNan2008;
7033 }
7034
Alp Toker4925ba72014-06-07 23:30:42 +00007035 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00007036 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007037 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
7038 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00007039 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007040 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007041 .Case("mips1", IsMips32)
7042 .Case("mips2", IsMips32)
7043 .Case("mips3", true)
7044 .Case("mips4", true)
7045 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007046 .Case("mips32", IsMips32)
7047 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007048 .Case("mips32r3", IsMips32)
7049 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007050 .Case("mips32r6", IsMips32)
7051 .Case("mips64", true)
7052 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007053 .Case("mips64r3", true)
7054 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007055 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007056 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00007057 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007058 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007059 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007060 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007061 bool
7062 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7063 StringRef CPU,
7064 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007065 if (CPU.empty())
7066 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007067 if (CPU == "octeon")
7068 Features["mips64r2"] = Features["cnmips"] = true;
7069 else
7070 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007071 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007072 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007073
Craig Topper3164f332014-03-11 03:39:26 +00007074 void getTargetDefines(const LangOptions &Opts,
7075 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007076 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007077 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007078 if (Opts.GNUMode)
7079 Builder.defineMacro("mips");
7080
Simon Atanasyan683535b2012-08-29 19:14:58 +00007081 Builder.defineMacro("__REGISTER_PREFIX__", "");
7082
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007083 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007084 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007085 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007086 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007087 case SoftFloat:
7088 Builder.defineMacro("__mips_soft_float", Twine(1));
7089 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007090 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007091
Simon Atanasyan16071912013-04-14 14:07:30 +00007092 if (IsSingleFloat)
7093 Builder.defineMacro("__mips_single_float", Twine(1));
7094
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007095 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7096 Builder.defineMacro("_MIPS_FPSET",
7097 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7098
Simon Atanasyan72244b62012-07-05 16:06:06 +00007099 if (IsMips16)
7100 Builder.defineMacro("__mips16", Twine(1));
7101
Simon Atanasyan60777612013-04-14 14:07:51 +00007102 if (IsMicromips)
7103 Builder.defineMacro("__mips_micromips", Twine(1));
7104
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007105 if (IsNan2008)
7106 Builder.defineMacro("__mips_nan2008", Twine(1));
7107
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007108 switch (DspRev) {
7109 default:
7110 break;
7111 case DSP1:
7112 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7113 Builder.defineMacro("__mips_dsp", Twine(1));
7114 break;
7115 case DSP2:
7116 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7117 Builder.defineMacro("__mips_dspr2", Twine(1));
7118 Builder.defineMacro("__mips_dsp", Twine(1));
7119 break;
7120 }
7121
Jack Carter44ff1e52013-08-12 17:20:29 +00007122 if (HasMSA)
7123 Builder.defineMacro("__mips_msa", Twine(1));
7124
Simon Atanasyan26f19672012-04-05 19:28:31 +00007125 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7126 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7127 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007128
7129 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7130 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007131
7132 // These shouldn't be defined for MIPS-I but there's no need to check
7133 // for that since MIPS-I isn't supported.
7134 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7135 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7136 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007137 }
7138
Craig Topper6c03a542015-10-19 04:51:35 +00007139 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7140 return llvm::makeArrayRef(BuiltinInfo,
7141 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007142 }
Craig Topper3164f332014-03-11 03:39:26 +00007143 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007144 return llvm::StringSwitch<bool>(Feature)
7145 .Case("mips", true)
7146 .Case("fp64", HasFP64)
7147 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007148 }
Craig Topper3164f332014-03-11 03:39:26 +00007149 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007150 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007151 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007152 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007153 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007154 // CPU register names
7155 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007156 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7157 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7158 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007159 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7160 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007161 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7162 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7163 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7164 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007165 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007166 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007167 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7168 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007169 // MSA register names
7170 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7171 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7172 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7173 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7174 // MSA control register names
7175 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7176 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007177 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007178 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007179 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007180 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00007181 bool validateAsmConstraint(const char *&Name,
7182 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007183 switch (*Name) {
7184 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007185 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007186 case 'r': // CPU registers.
7187 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007188 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007189 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007190 case 'c': // $25 for indirect jumps
7191 case 'l': // lo register
7192 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007193 Info.setAllowsRegister();
7194 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007195 case 'I': // Signed 16-bit constant
7196 case 'J': // Integer 0
7197 case 'K': // Unsigned 16-bit constant
7198 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7199 case 'M': // Constants not loadable via lui, addiu, or ori
7200 case 'N': // Constant -1 to -65535
7201 case 'O': // A signed 15-bit constant
7202 case 'P': // A constant between 1 go 65535
7203 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007204 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007205 Info.setAllowsMemory();
7206 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007207 case 'Z':
7208 if (Name[1] == 'C') { // An address usable by ll, and sc.
7209 Info.setAllowsMemory();
7210 Name++; // Skip over 'Z'.
7211 return true;
7212 }
7213 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007214 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007215 }
7216
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007217 std::string convertConstraint(const char *&Constraint) const override {
7218 std::string R;
7219 switch (*Constraint) {
7220 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7221 if (Constraint[1] == 'C') {
7222 R = std::string("^") + std::string(Constraint, 2);
7223 Constraint++;
7224 return R;
7225 }
7226 break;
7227 }
7228 return TargetInfo::convertConstraint(Constraint);
7229 }
7230
Craig Topper3164f332014-03-11 03:39:26 +00007231 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007232 // In GCC, $1 is not widely used in generated code (it's used only in a few
7233 // specific situations), so there is no real need for users to add it to
7234 // the clobbers list if they want to use it in their inline assembly code.
7235 //
7236 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7237 // code generation, so using it in inline assembly without adding it to the
7238 // clobbers list can cause conflicts between the inline assembly code and
7239 // the surrounding generated code.
7240 //
7241 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7242 // operands, which will conflict with the ".set at" assembler option (which
7243 // we use only for inline assembly, in order to maintain compatibility with
7244 // GCC) and will also conflict with the user's usage of $1.
7245 //
7246 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7247 // register for generated code is to automatically clobber $1 for all inline
7248 // assembly code.
7249 //
7250 // FIXME: We should automatically clobber $1 only for inline assembly code
7251 // which actually uses it. This would allow LLVM to use $1 for inline
7252 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007253 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007254 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007255
Craig Topper3164f332014-03-11 03:39:26 +00007256 bool handleTargetFeatures(std::vector<std::string> &Features,
7257 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007258 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007259 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007260 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007261 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007262 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007263 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007264 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007265
Eric Christopher610fe112015-08-26 08:21:55 +00007266 for (const auto &Feature : Features) {
7267 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007268 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007269 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007270 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007271 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007272 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007273 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007274 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007275 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007276 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007277 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007278 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007279 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007280 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007281 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007282 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007283 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007284 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007285 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007286 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007287 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007288 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007289 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007290
James Y Knightb214cbc2016-03-04 19:00:41 +00007291 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007292
Rafael Espindolaeb265472013-08-21 21:59:03 +00007293 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007294 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007295
Craig Topper3164f332014-03-11 03:39:26 +00007296 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007297 if (RegNo == 0) return 4;
7298 if (RegNo == 1) return 5;
7299 return -1;
7300 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007301
7302 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007303};
7304
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007305const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007306#define BUILTIN(ID, TYPE, ATTRS) \
7307 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7308#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7309 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007310#include "clang/Basic/BuiltinsMips.def"
7311};
7312
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007313class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007314public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007315 Mips32TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7316 : MipsTargetInfoBase(Triple, Opts, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007317 SizeType = UnsignedInt;
7318 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007319 Int64Type = SignedLongLong;
7320 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007321 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007322 }
Craig Topper3164f332014-03-11 03:39:26 +00007323 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007324 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007325 ABI = Name;
7326 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007327 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007328 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007329 }
Craig Topper3164f332014-03-11 03:39:26 +00007330 void getTargetDefines(const LangOptions &Opts,
7331 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007332 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007333
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007334 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007335 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7336
7337 const std::string& CPUStr = getCPU();
7338 if (CPUStr == "mips32")
7339 Builder.defineMacro("__mips_isa_rev", "1");
7340 else if (CPUStr == "mips32r2")
7341 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007342 else if (CPUStr == "mips32r3")
7343 Builder.defineMacro("__mips_isa_rev", "3");
7344 else if (CPUStr == "mips32r5")
7345 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007346 else if (CPUStr == "mips32r6")
7347 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007348
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007349 if (ABI == "o32") {
7350 Builder.defineMacro("__mips_o32");
7351 Builder.defineMacro("_ABIO32", "1");
7352 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7353 }
7354 else if (ABI == "eabi")
7355 Builder.defineMacro("__mips_eabi");
7356 else
David Blaikie83d382b2011-09-23 05:06:16 +00007357 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007358 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007359 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007360 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7361 { { "at" }, "$1" },
7362 { { "v0" }, "$2" },
7363 { { "v1" }, "$3" },
7364 { { "a0" }, "$4" },
7365 { { "a1" }, "$5" },
7366 { { "a2" }, "$6" },
7367 { { "a3" }, "$7" },
7368 { { "t0" }, "$8" },
7369 { { "t1" }, "$9" },
7370 { { "t2" }, "$10" },
7371 { { "t3" }, "$11" },
7372 { { "t4" }, "$12" },
7373 { { "t5" }, "$13" },
7374 { { "t6" }, "$14" },
7375 { { "t7" }, "$15" },
7376 { { "s0" }, "$16" },
7377 { { "s1" }, "$17" },
7378 { { "s2" }, "$18" },
7379 { { "s3" }, "$19" },
7380 { { "s4" }, "$20" },
7381 { { "s5" }, "$21" },
7382 { { "s6" }, "$22" },
7383 { { "s7" }, "$23" },
7384 { { "t8" }, "$24" },
7385 { { "t9" }, "$25" },
7386 { { "k0" }, "$26" },
7387 { { "k1" }, "$27" },
7388 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007389 { { "sp","$sp" }, "$29" },
7390 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007391 { { "ra" }, "$31" }
7392 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007393 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007394 }
7395};
7396
7397class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007398 void setDataLayout() override {
7399 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007400 }
7401
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007402public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007403 Mips32EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7404 : Mips32TargetInfoBase(Triple, Opts) {
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00007405 }
Craig Topper3164f332014-03-11 03:39:26 +00007406 void getTargetDefines(const LangOptions &Opts,
7407 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007408 DefineStd(Builder, "MIPSEB", Opts);
7409 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007410 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007411 }
7412};
7413
7414class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007415 void setDataLayout() override {
7416 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007417 }
7418
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007419public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007420 Mips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7421 : Mips32TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007422 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007423 }
Craig Topper3164f332014-03-11 03:39:26 +00007424 void getTargetDefines(const LangOptions &Opts,
7425 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007426 DefineStd(Builder, "MIPSEL", Opts);
7427 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007428 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007429 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007430};
Akira Hatanakabef17452011-09-20 19:21:49 +00007431
7432class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007433public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007434 Mips64TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7435 : MipsTargetInfoBase(Triple, Opts, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007436 LongDoubleWidth = LongDoubleAlign = 128;
7437 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007438 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7439 LongDoubleWidth = LongDoubleAlign = 64;
7440 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7441 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007442 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007443 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007444 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007445 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007446
7447 void setN64ABITypes() {
7448 LongWidth = LongAlign = 64;
7449 PointerWidth = PointerAlign = 64;
7450 SizeType = UnsignedLong;
7451 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007452 Int64Type = SignedLong;
7453 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007454 }
7455
7456 void setN32ABITypes() {
7457 LongWidth = LongAlign = 32;
7458 PointerWidth = PointerAlign = 32;
7459 SizeType = UnsignedInt;
7460 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007461 Int64Type = SignedLongLong;
7462 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007463 }
7464
Craig Topper3164f332014-03-11 03:39:26 +00007465 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007466 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007467 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007468 ABI = Name;
7469 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007470 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007471 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007472 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007473 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007474 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007475 }
7476 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007477 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007478
Craig Topper3164f332014-03-11 03:39:26 +00007479 void getTargetDefines(const LangOptions &Opts,
7480 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007481 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007482
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007483 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007484 Builder.defineMacro("__mips64");
7485 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007486 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7487
7488 const std::string& CPUStr = getCPU();
7489 if (CPUStr == "mips64")
7490 Builder.defineMacro("__mips_isa_rev", "1");
7491 else if (CPUStr == "mips64r2")
7492 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007493 else if (CPUStr == "mips64r3")
7494 Builder.defineMacro("__mips_isa_rev", "3");
7495 else if (CPUStr == "mips64r5")
7496 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007497 else if (CPUStr == "mips64r6")
7498 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007499
Akira Hatanakabef17452011-09-20 19:21:49 +00007500 if (ABI == "n32") {
7501 Builder.defineMacro("__mips_n32");
7502 Builder.defineMacro("_ABIN32", "2");
7503 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7504 }
7505 else if (ABI == "n64") {
7506 Builder.defineMacro("__mips_n64");
7507 Builder.defineMacro("_ABI64", "3");
7508 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7509 }
7510 else
David Blaikie83d382b2011-09-23 05:06:16 +00007511 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007512
7513 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007514 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007515 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007516 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7517 { { "at" }, "$1" },
7518 { { "v0" }, "$2" },
7519 { { "v1" }, "$3" },
7520 { { "a0" }, "$4" },
7521 { { "a1" }, "$5" },
7522 { { "a2" }, "$6" },
7523 { { "a3" }, "$7" },
7524 { { "a4" }, "$8" },
7525 { { "a5" }, "$9" },
7526 { { "a6" }, "$10" },
7527 { { "a7" }, "$11" },
7528 { { "t0" }, "$12" },
7529 { { "t1" }, "$13" },
7530 { { "t2" }, "$14" },
7531 { { "t3" }, "$15" },
7532 { { "s0" }, "$16" },
7533 { { "s1" }, "$17" },
7534 { { "s2" }, "$18" },
7535 { { "s3" }, "$19" },
7536 { { "s4" }, "$20" },
7537 { { "s5" }, "$21" },
7538 { { "s6" }, "$22" },
7539 { { "s7" }, "$23" },
7540 { { "t8" }, "$24" },
7541 { { "t9" }, "$25" },
7542 { { "k0" }, "$26" },
7543 { { "k1" }, "$27" },
7544 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007545 { { "sp","$sp" }, "$29" },
7546 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007547 { { "ra" }, "$31" }
7548 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007549 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007550 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007551
7552 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007553};
7554
7555class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007556 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007557 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007558 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 +00007559 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007560 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007561 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007562
Akira Hatanakabef17452011-09-20 19:21:49 +00007563public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007564 Mips64EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7565 : Mips64TargetInfoBase(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00007566 void getTargetDefines(const LangOptions &Opts,
7567 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007568 DefineStd(Builder, "MIPSEB", Opts);
7569 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007570 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007571 }
7572};
7573
7574class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007575 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007576 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007577 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 +00007578 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007579 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007580 }
7581public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007582 Mips64ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7583 : Mips64TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007584 // Default ABI is n64.
7585 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007586 }
Craig Topper3164f332014-03-11 03:39:26 +00007587 void getTargetDefines(const LangOptions &Opts,
7588 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007589 DefineStd(Builder, "MIPSEL", Opts);
7590 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007591 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007592 }
7593};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007594
Ivan Krasindd7403e2011-08-24 20:22:22 +00007595class PNaClTargetInfo : public TargetInfo {
7596public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007597 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7598 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007599 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007600 this->LongAlign = 32;
7601 this->LongWidth = 32;
7602 this->PointerAlign = 32;
7603 this->PointerWidth = 32;
7604 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007605 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007606 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007607 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007608 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007609 this->SizeType = TargetInfo::UnsignedInt;
7610 this->PtrDiffType = TargetInfo::SignedInt;
7611 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007612 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007613 }
7614
Craig Toppere6f17d02014-03-11 04:07:52 +00007615 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007616 Builder.defineMacro("__le32__");
7617 Builder.defineMacro("__pnacl__");
7618 }
Craig Topper3164f332014-03-11 03:39:26 +00007619 void getTargetDefines(const LangOptions &Opts,
7620 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007621 getArchDefines(Opts, Builder);
7622 }
Craig Topper3164f332014-03-11 03:39:26 +00007623 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007624 return Feature == "pnacl";
7625 }
Craig Topper6c03a542015-10-19 04:51:35 +00007626 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007627 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007628 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007629 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007630 ArrayRef<const char *> getGCCRegNames() const override;
7631 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007632 bool validateAsmConstraint(const char *&Name,
7633 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007634 return false;
7635 }
7636
Craig Topper3164f332014-03-11 03:39:26 +00007637 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007638 return "";
7639 }
7640};
7641
Craig Topperf054e3a2015-10-19 03:52:27 +00007642ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7643 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007644}
7645
Craig Topperf054e3a2015-10-19 03:52:27 +00007646ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7647 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007648}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007649
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007650// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7651class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7652public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007653 NaClMips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7654 : Mips32ELTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007655
7656 BuiltinVaListKind getBuiltinVaListKind() const override {
7657 return TargetInfo::PNaClABIBuiltinVaList;
7658 }
7659};
7660
JF Bastien643817d2014-09-12 17:52:47 +00007661class Le64TargetInfo : public TargetInfo {
7662 static const Builtin::Info BuiltinInfo[];
7663
7664public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007665 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7666 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007667 BigEndian = false;
7668 NoAsmVariants = true;
7669 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7670 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007671 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007672 }
7673
7674 void getTargetDefines(const LangOptions &Opts,
7675 MacroBuilder &Builder) const override {
7676 DefineStd(Builder, "unix", Opts);
7677 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7678 Builder.defineMacro("__ELF__");
7679 }
Craig Topper6c03a542015-10-19 04:51:35 +00007680 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7681 return llvm::makeArrayRef(BuiltinInfo,
7682 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007683 }
7684 BuiltinVaListKind getBuiltinVaListKind() const override {
7685 return TargetInfo::PNaClABIBuiltinVaList;
7686 }
7687 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007688 ArrayRef<const char *> getGCCRegNames() const override {
7689 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007690 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007691 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7692 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007693 }
7694 bool validateAsmConstraint(const char *&Name,
7695 TargetInfo::ConstraintInfo &Info) const override {
7696 return false;
7697 }
7698
7699 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007700};
Dan Gohmanc2853072015-09-03 22:51:53 +00007701
7702class WebAssemblyTargetInfo : public TargetInfo {
7703 static const Builtin::Info BuiltinInfo[];
7704
7705 enum SIMDEnum {
7706 NoSIMD,
7707 SIMD128,
7708 } SIMDLevel;
7709
7710public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007711 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007712 : TargetInfo(T), SIMDLevel(NoSIMD) {
7713 BigEndian = false;
7714 NoAsmVariants = true;
7715 SuitableAlign = 128;
7716 LargeArrayMinWidth = 128;
7717 LargeArrayAlign = 128;
7718 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007719 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007720 LongDoubleWidth = LongDoubleAlign = 128;
7721 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007722 }
7723
7724protected:
7725 void getTargetDefines(const LangOptions &Opts,
7726 MacroBuilder &Builder) const override {
7727 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7728 if (SIMDLevel >= SIMD128)
7729 Builder.defineMacro("__wasm_simd128__");
7730 }
7731
7732private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007733 bool
7734 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7735 StringRef CPU,
7736 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007737 if (CPU == "bleeding-edge")
7738 Features["simd128"] = true;
7739 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7740 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007741 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007742 return llvm::StringSwitch<bool>(Feature)
7743 .Case("simd128", SIMDLevel >= SIMD128)
7744 .Default(false);
7745 }
7746 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007747 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007748 for (const auto &Feature : Features) {
7749 if (Feature == "+simd128") {
7750 SIMDLevel = std::max(SIMDLevel, SIMD128);
7751 continue;
7752 }
7753 if (Feature == "-simd128") {
7754 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7755 continue;
7756 }
7757
7758 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7759 << "-target-feature";
7760 return false;
7761 }
7762 return true;
7763 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007764 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007765 return llvm::StringSwitch<bool>(Name)
7766 .Case("mvp", true)
7767 .Case("bleeding-edge", true)
7768 .Case("generic", true)
7769 .Default(false);
7770 }
Craig Topper6c03a542015-10-19 04:51:35 +00007771 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7772 return llvm::makeArrayRef(BuiltinInfo,
7773 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007774 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007775 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007776 return VoidPtrBuiltinVaList;
7777 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007778 ArrayRef<const char *> getGCCRegNames() const final {
7779 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007780 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007781 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7782 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007783 }
7784 bool
7785 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007786 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007787 return false;
7788 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007789 const char *getClobbers() const final { return ""; }
7790 bool isCLZForZeroUndef() const final { return false; }
7791 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007792 IntType getIntTypeByWidth(unsigned BitWidth,
7793 bool IsSigned) const final {
7794 // WebAssembly prefers long long for explicitly 64-bit integers.
7795 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7796 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7797 }
7798 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7799 bool IsSigned) const final {
7800 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7801 return BitWidth == 64
7802 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7803 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7804 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007805};
7806
7807const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7808#define BUILTIN(ID, TYPE, ATTRS) \
7809 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7810#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7811 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7812#include "clang/Basic/BuiltinsWebAssembly.def"
7813};
7814
7815class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7816public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007817 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7818 const TargetOptions &Opts)
7819 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007820 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007821 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007822 }
7823
7824protected:
7825 void getTargetDefines(const LangOptions &Opts,
7826 MacroBuilder &Builder) const override {
7827 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7828 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7829 }
7830};
7831
7832class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7833public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007834 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7835 const TargetOptions &Opts)
7836 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007837 LongAlign = LongWidth = 64;
7838 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007839 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007840 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007841 }
7842
7843protected:
7844 void getTargetDefines(const LangOptions &Opts,
7845 MacroBuilder &Builder) const override {
7846 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7847 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7848 }
7849};
7850
JF Bastien643817d2014-09-12 17:52:47 +00007851const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7852#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007853 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007854#include "clang/Basic/BuiltinsLe64.def"
7855};
7856
Eric Christopherc48497a2015-09-18 21:26:24 +00007857static const unsigned SPIRAddrSpaceMap[] = {
7858 1, // opencl_global
7859 3, // opencl_local
7860 2, // opencl_constant
7861 4, // opencl_generic
7862 0, // cuda_device
7863 0, // cuda_constant
7864 0 // cuda_shared
7865};
7866class SPIRTargetInfo : public TargetInfo {
7867public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007868 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7869 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007870 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7871 "SPIR target must use unknown OS");
7872 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7873 "SPIR target must use unknown environment type");
7874 BigEndian = false;
7875 TLSSupported = false;
7876 LongWidth = LongAlign = 64;
7877 AddrSpaceMap = &SPIRAddrSpaceMap;
7878 UseAddrSpaceMapMangling = true;
7879 // Define available target features
7880 // These must be defined in sorted order!
7881 NoAsmVariants = true;
7882 }
7883 void getTargetDefines(const LangOptions &Opts,
7884 MacroBuilder &Builder) const override {
7885 DefineStd(Builder, "SPIR", Opts);
7886 }
7887 bool hasFeature(StringRef Feature) const override {
7888 return Feature == "spir";
7889 }
Craig Topper3164f332014-03-11 03:39:26 +00007890
Craig Topper6c03a542015-10-19 04:51:35 +00007891 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007892 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007893 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007894 bool validateAsmConstraint(const char *&Name,
7895 TargetInfo::ConstraintInfo &info) const override {
7896 return true;
7897 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007898 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7899 return None;
7900 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007901 BuiltinVaListKind getBuiltinVaListKind() const override {
7902 return TargetInfo::VoidPtrBuiltinVaList;
7903 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007904
Eric Christopherc48497a2015-09-18 21:26:24 +00007905 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7906 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7907 : CCCR_Warning;
7908 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007909
Eric Christopherc48497a2015-09-18 21:26:24 +00007910 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7911 return CC_SpirFunction;
7912 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007913
7914 void setSupportedOpenCLOpts() override {
7915 // Assume all OpenCL extensions and optional core features are supported
7916 // for SPIR since it is a generic target.
7917 getSupportedOpenCLOpts().setAll();
7918 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007919};
Guy Benyeib798fc92012-12-11 21:38:14 +00007920
Eric Christopherc48497a2015-09-18 21:26:24 +00007921class SPIR32TargetInfo : public SPIRTargetInfo {
7922public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007923 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7924 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007925 PointerWidth = PointerAlign = 32;
7926 SizeType = TargetInfo::UnsignedInt;
7927 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007928 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7929 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007930 }
7931 void getTargetDefines(const LangOptions &Opts,
7932 MacroBuilder &Builder) const override {
7933 DefineStd(Builder, "SPIR32", Opts);
7934 }
7935};
Guy Benyeib798fc92012-12-11 21:38:14 +00007936
Eric Christopherc48497a2015-09-18 21:26:24 +00007937class SPIR64TargetInfo : public SPIRTargetInfo {
7938public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007939 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7940 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007941 PointerWidth = PointerAlign = 64;
7942 SizeType = TargetInfo::UnsignedLong;
7943 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007944 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7945 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007946 }
7947 void getTargetDefines(const LangOptions &Opts,
7948 MacroBuilder &Builder) const override {
7949 DefineStd(Builder, "SPIR64", Opts);
7950 }
7951};
Guy Benyeib798fc92012-12-11 21:38:14 +00007952
Robert Lytton0e076492013-08-13 09:43:10 +00007953class XCoreTargetInfo : public TargetInfo {
7954 static const Builtin::Info BuiltinInfo[];
7955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007956 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7957 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007958 BigEndian = false;
7959 NoAsmVariants = true;
7960 LongLongAlign = 32;
7961 SuitableAlign = 32;
7962 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007963 SizeType = UnsignedInt;
7964 PtrDiffType = SignedInt;
7965 IntPtrType = SignedInt;
7966 WCharType = UnsignedChar;
7967 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007968 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007969 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7970 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007971 }
Craig Topper3164f332014-03-11 03:39:26 +00007972 void getTargetDefines(const LangOptions &Opts,
7973 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007974 Builder.defineMacro("__XS1B__");
7975 }
Craig Topper6c03a542015-10-19 04:51:35 +00007976 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7977 return llvm::makeArrayRef(BuiltinInfo,
7978 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007979 }
Craig Topper3164f332014-03-11 03:39:26 +00007980 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007981 return TargetInfo::VoidPtrBuiltinVaList;
7982 }
Craig Topper3164f332014-03-11 03:39:26 +00007983 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007984 return "";
7985 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007986 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007987 static const char * const GCCRegNames[] = {
7988 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7989 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7990 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007991 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007992 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007993 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7994 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007995 }
Craig Topper3164f332014-03-11 03:39:26 +00007996 bool validateAsmConstraint(const char *&Name,
7997 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007998 return false;
7999 }
Craig Topper3164f332014-03-11 03:39:26 +00008000 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008001 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8002 return (RegNo < 2)? RegNo : -1;
8003 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008004 bool allowsLargerPreferedTypeAlignment() const override {
8005 return false;
8006 }
Robert Lytton0e076492013-08-13 09:43:10 +00008007};
8008
8009const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008010#define BUILTIN(ID, TYPE, ATTRS) \
8011 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8012#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8013 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008014#include "clang/Basic/BuiltinsXCore.def"
8015};
Robert Lytton0e076492013-08-13 09:43:10 +00008016
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008017// x86_32 Android target
8018class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8019public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008020 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8021 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008022 SuitableAlign = 32;
8023 LongDoubleWidth = 64;
8024 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8025 }
8026};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008027
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008028// x86_64 Android target
8029class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8030public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008031 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8032 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008033 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8034 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008035
8036 bool useFloat128ManglingForLongDouble() const override {
8037 return true;
8038 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008039};
8040} // end anonymous namespace
8041
Chris Lattner5ba61f02006-10-14 07:39:34 +00008042//===----------------------------------------------------------------------===//
8043// Driver code
8044//===----------------------------------------------------------------------===//
8045
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008046static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8047 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008048 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008049
Daniel Dunbar52322032009-08-18 05:47:58 +00008050 switch (Triple.getArch()) {
8051 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008052 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008053
Tim Northover2a0783d2014-05-30 14:14:07 +00008054 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008055 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008056
8057 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008058 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008059
Jacques Pienaard964cc22016-03-28 21:02:54 +00008060 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008061 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008062
Tim Northover2a0783d2014-05-30 14:14:07 +00008063 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008064 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008065 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008066
8067 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008068 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008069 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008070 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008071 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008072 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008073 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008074 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008075 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008076 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008077 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008078 }
8079
Christian Pirker9b019ae2014-02-25 13:51:00 +00008080 case llvm::Triple::aarch64_be:
8081 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008082 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008083 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008084 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008085 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008086 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008087 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008088 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008089 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008090 }
8091
Daniel Dunbar52322032009-08-18 05:47:58 +00008092 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008093 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008094 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008095 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008096
Daniel Dunbar52322032009-08-18 05:47:58 +00008097 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008098 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008099 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008100 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008101 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008102 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008103 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008104 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008105 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008106 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008107 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008108 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008109 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008110 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008111 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008112 case llvm::Triple::Win32:
8113 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008114 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008115 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008116 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008117 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008118 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008119 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008120 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008121 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008122 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008123 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008124 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008125 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008126 }
8127
8128 case llvm::Triple::armeb:
8129 case llvm::Triple::thumbeb:
8130 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008131 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008132
8133 switch (os) {
8134 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008135 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008136 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008137 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008138 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008139 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008140 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008141 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008142 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008143 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008144 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008145 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008146 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008147 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008148 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008149 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008150 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008151
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008152 case llvm::Triple::bpfeb:
8153 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008154 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008155
Daniel Dunbar52322032009-08-18 05:47:58 +00008156 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008157 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008158
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008159 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008160 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008161 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008162 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008163 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008164 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008165 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008166 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008167 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008168 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008169 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008170 return new Mips32EBTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008171 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008172
8173 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008174 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008175 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008176 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008177 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008178 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008179 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008180 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008181 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008182 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008183 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008184 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008185 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008186 return new Mips32ELTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008187 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008188
Akira Hatanakabef17452011-09-20 19:21:49 +00008189 case llvm::Triple::mips64:
8190 switch (os) {
8191 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008192 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008193 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008194 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008195 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008196 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008197 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008198 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008199 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008200 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008201 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008202 return new Mips64EBTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008203 }
8204
8205 case llvm::Triple::mips64el:
8206 switch (os) {
8207 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008208 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008209 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008210 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008211 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008212 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008213 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008214 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008215 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008216 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008217 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008218 return new Mips64ELTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008219 }
8220
Ivan Krasindd7403e2011-08-24 20:22:22 +00008221 case llvm::Triple::le32:
8222 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008223 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008224 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008225 default:
8226 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008227 }
8228
JF Bastien643817d2014-09-12 17:52:47 +00008229 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008230 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008231
Daniel Dunbar52322032009-08-18 05:47:58 +00008232 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008233 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008234 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008235 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008236 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008238 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008240 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008242 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008244 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008246 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008247 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008248 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008249
8250 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008251 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008252 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008253 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008254 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008256 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008257 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008258 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008260 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008262 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008264 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008265
Bill Schmidt778d3872013-07-26 01:36:11 +00008266 case llvm::Triple::ppc64le:
8267 switch (os) {
8268 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008269 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008270 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008272 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008274 }
8275
Peter Collingbournec947aae2012-05-20 23:28:41 +00008276 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008277 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008278 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008279 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008280
Tom Stellardd8e38a32015-01-06 20:34:47 +00008281 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008282 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008283 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008284
Daniel Dunbar52322032009-08-18 05:47:58 +00008285 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008286 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008287 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008288 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008289 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008290 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008291 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008292 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008293 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008294 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008295 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008296 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008297 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008298 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008299 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008300
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008301 // The 'sparcel' architecture copies all the above cases except for Solaris.
8302 case llvm::Triple::sparcel:
8303 switch (os) {
8304 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008306 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008308 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008310 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008312 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008313 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008314 }
8315
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008316 case llvm::Triple::sparcv9:
8317 switch (os) {
8318 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008319 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008320 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008321 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008322 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008323 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008324 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008325 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008326 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008328 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008330 }
8331
Ulrich Weigand47445072013-05-06 16:26:41 +00008332 case llvm::Triple::systemz:
8333 switch (os) {
8334 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008336 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008337 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008338 }
8339
Eli Friedmana9c3d712009-08-19 20:47:07 +00008340 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008341 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008342
Daniel Dunbar52322032009-08-18 05:47:58 +00008343 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008344 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008345 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008346
Daniel Dunbar52322032009-08-18 05:47:58 +00008347 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008348 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008350 case llvm::Triple::Linux: {
8351 switch (Triple.getEnvironment()) {
8352 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008353 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008354 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008356 }
8357 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008358 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008359 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008360 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008361 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008362 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008363 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008364 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008366 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008367 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008368 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008370 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008371 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008372 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008373 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008374 case llvm::Triple::Win32: {
8375 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008376 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008377 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008378 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008379 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008380 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008381 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008382 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008383 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008384 }
8385 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008386 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008387 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008388 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008389 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008390 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008391 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008392 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008394 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008395 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008396 }
8397
8398 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008399 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008401
Daniel Dunbar52322032009-08-18 05:47:58 +00008402 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008403 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008404 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008405 case llvm::Triple::Linux: {
8406 switch (Triple.getEnvironment()) {
8407 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008408 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008409 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008410 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008411 }
8412 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008413 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008414 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008415 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008416 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008417 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008418 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008419 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008420 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008421 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008422 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008423 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008424 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008425 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008426 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008427 case llvm::Triple::Win32: {
8428 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008429 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008430 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008431 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008432 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008433 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008434 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008436 }
8437 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008438 case llvm::Triple::Haiku:
8439 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008440 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008441 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008442 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008443 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008444 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008445 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008446 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008447
Douglas Katzman78d7c542015-05-12 21:18:10 +00008448 case llvm::Triple::spir: {
8449 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8450 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8451 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008452 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008453 }
8454 case llvm::Triple::spir64: {
8455 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8456 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8457 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008458 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008459 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008460 case llvm::Triple::wasm32:
8461 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8462 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008464 case llvm::Triple::wasm64:
8465 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8466 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008467 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008468 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008469}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008470
8471/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008472/// options.
Alp Toker80758082014-07-06 05:26:44 +00008473TargetInfo *
8474TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008475 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008476 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008477
8478 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008480 if (!Target) {
8481 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008482 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008483 }
Alp Toker80758082014-07-06 05:26:44 +00008484 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008485
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008486 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008487 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8488 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008489 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008490 }
8491
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008492 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008493 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8494 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008495 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008496 }
8497
Rafael Espindolaeb265472013-08-21 21:59:03 +00008498 // Set the fp math unit.
8499 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8500 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008501 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008502 }
8503
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008504 // Compute the default target features, we need the target to handle this
8505 // because features may have dependencies on one another.
8506 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008507 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8508 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008509 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008510
8511 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008512 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008513 for (const auto &F : Features)
8514 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8515
Eric Christopher3ff21b32013-10-16 21:26:26 +00008516 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008517 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008518
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008519 Target->setSupportedOpenCLOpts();
8520
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008521 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008522}