blob: 6b26d14dc5a97c141d1db364ef9dedf891c95ac9 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Saleem Abdulrasool10a49722016-04-08 16:52:00 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Justin Lebar76945b22016-04-29 23:05:19 +000068static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
69 const TargetOptions &Opts);
70
Chris Lattner09d98f52008-10-05 21:50:58 +000071//===----------------------------------------------------------------------===//
72// Defines specific to certain operating systems.
73//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000074
Torok Edwinb2b37c62009-06-30 17:10:35 +000075namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076template<typename TgtInfo>
77class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000078protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000079 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000082 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
83 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000084 void getTargetDefines(const LangOptions &Opts,
85 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000086 TgtInfo::getTargetDefines(Opts, Builder);
87 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000088 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000089
90};
Chris Lattner30ba6742009-08-10 19:03:04 +000091
Eric Christopher7d0c7252015-09-24 21:17:04 +000092// CloudABI Target
93template <typename Target>
94class CloudABITargetInfo : public OSTargetInfo<Target> {
95protected:
96 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
97 MacroBuilder &Builder) const override {
98 Builder.defineMacro("__CloudABI__");
99 Builder.defineMacro("__ELF__");
100
101 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
102 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
103 Builder.defineMacro("__STDC_UTF_16__");
104 Builder.defineMacro("__STDC_UTF_32__");
105 }
106
107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000108 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
109 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000110};
111
Daniel Dunbard86666f2010-01-26 01:44:04 +0000112static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000114 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000116 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000119 // AddressSanitizer doesn't play well with source fortification, which is on
120 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000121 if (Opts.Sanitize.has(SanitizerKind::Address))
122 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000123
John McCall460ce582015-10-22 18:38:17 +0000124 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
125 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000126 // __weak is always defined, for use in blocks and with objc pointers.
127 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000128 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000129 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000130 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000131
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000136
137 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 if (Triple.isMacOSX()) {
143 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000146 Triple.getOSVersion(Maj, Min, Rev);
147 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000148 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000149
Sebastian Pop422377c2012-01-20 22:01:23 +0000150 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000151 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000152 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153 if (PlatformName == "win32") {
154 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
155 return;
156 }
157
Evan Cheng31dd9a62014-01-26 23:12:43 +0000158 // Set the appropriate OS version define.
159 if (Triple.isiOS()) {
160 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
161 char Str[6];
162 Str[0] = '0' + Maj;
163 Str[1] = '0' + (Min / 10);
164 Str[2] = '0' + (Min % 10);
165 Str[3] = '0' + (Rev / 10);
166 Str[4] = '0' + (Rev % 10);
167 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000168 if (Triple.isTvOS())
169 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
170 else
171 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
172 Str);
173
174 } else if (Triple.isWatchOS()) {
175 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
176 char Str[6];
177 Str[0] = '0' + Maj;
178 Str[1] = '0' + (Min / 10);
179 Str[2] = '0' + (Min % 10);
180 Str[3] = '0' + (Rev / 10);
181 Str[4] = '0' + (Rev % 10);
182 Str[5] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000184 } else if (Triple.isMacOSX()) {
185 // Note that the Driver allows versions which aren't representable in the
186 // define (because we only get a single digit for the minor and micro
187 // revision numbers). So, we limit them to the maximum representable
188 // version.
189 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000190 char Str[7];
191 if (Maj < 10 || (Maj == 10 && Min < 10)) {
192 Str[0] = '0' + (Maj / 10);
193 Str[1] = '0' + (Maj % 10);
194 Str[2] = '0' + std::min(Min, 9U);
195 Str[3] = '0' + std::min(Rev, 9U);
196 Str[4] = '\0';
197 } else {
198 // Handle versions > 10.9.
199 Str[0] = '0' + (Maj / 10);
200 Str[1] = '0' + (Maj % 10);
201 Str[2] = '0' + (Min / 10);
202 Str[3] = '0' + (Min % 10);
203 Str[4] = '0' + (Rev / 10);
204 Str[5] = '0' + (Rev % 10);
205 Str[6] = '\0';
206 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000207 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000208 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210 // Tell users about the kernel if there is one.
211 if (Triple.isOSDarwin())
212 Builder.defineMacro("__MACH__");
213
Chris Bieneman46977b62016-04-29 17:53:00 +0000214 // The Watch ABI uses Dwarf EH.
215 if(Triple.isWatchABI())
216 Builder.defineMacro("__ARM_DWARF_EH__");
217
Daniel Dunbarecf13562011-04-19 21:40:34 +0000218 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000219}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000220
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221template<typename Target>
222class DarwinTargetInfo : public OSTargetInfo<Target> {
223protected:
Craig Topper3164f332014-03-11 03:39:26 +0000224 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
225 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000226 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000227 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228 }
Mike Stump11289f42009-09-09 15:08:12 +0000229
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000231 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
232 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000233 // By default, no TLS, and we whitelist permitted architecture/OS
234 // combinations.
235 this->TLSSupported = false;
236
237 if (Triple.isMacOSX())
238 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
239 else if (Triple.isiOS()) {
240 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
241 if (Triple.getArch() == llvm::Triple::x86_64 ||
242 Triple.getArch() == llvm::Triple::aarch64)
243 this->TLSSupported = !Triple.isOSVersionLT(8);
244 else if (Triple.getArch() == llvm::Triple::x86 ||
245 Triple.getArch() == llvm::Triple::arm ||
246 Triple.getArch() == llvm::Triple::thumb)
247 this->TLSSupported = !Triple.isOSVersionLT(9);
248 } else if (Triple.isWatchOS())
249 this->TLSSupported = !Triple.isOSVersionLT(2);
250
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000251 this->MCountName = "\01mcount";
252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000255 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000256 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000257 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000258 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000259 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000260 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000261 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000262
Craig Topper3164f332014-03-11 03:39:26 +0000263 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000264 // FIXME: We should return 0 when building kexts.
265 return "__TEXT,__StaticInit,regular,pure_instructions";
266 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000267
John McCalleed64c72012-01-29 01:20:30 +0000268 /// Darwin does not support protected visibility. Darwin's "default"
269 /// is very similar to ELF's "protected"; Darwin requires a "weak"
270 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000271 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000272 return false;
273 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000274
275 unsigned getExnObjectAlignment() const override {
276 // The alignment of an exception object is 8-bytes for darwin since
277 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
278 // and therefore doesn't guarantee 16-byte alignment.
279 return 64;
280 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281};
282
Chris Lattner30ba6742009-08-10 19:03:04 +0000283
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284// DragonFlyBSD Target
285template<typename Target>
286class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
287protected:
Craig Topper3164f332014-03-11 03:39:26 +0000288 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__DragonFly__");
292 Builder.defineMacro("__DragonFly_cc_version", "100001");
293 Builder.defineMacro("__ELF__");
294 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
295 Builder.defineMacro("__tune_i386__");
296 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297 }
298public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000299 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
300 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000301 switch (Triple.getArch()) {
302 default:
303 case llvm::Triple::x86:
304 case llvm::Triple::x86_64:
305 this->MCountName = ".mcount";
306 break;
307 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000308 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000309};
310
311// FreeBSD Target
312template<typename Target>
313class FreeBSDTargetInfo : public OSTargetInfo<Target> {
314protected:
Craig Topper3164f332014-03-11 03:39:26 +0000315 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
316 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000317 // FreeBSD defines; list based off of gcc output
318
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000319 unsigned Release = Triple.getOSMajorVersion();
320 if (Release == 0U)
321 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000323 Builder.defineMacro("__FreeBSD__", Twine(Release));
324 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000325 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
326 DefineStd(Builder, "unix", Opts);
327 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000328
329 // On FreeBSD, wchar_t contains the number of the code point as
330 // used by the character set of the locale. These character sets are
331 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000332 //
333 // FIXME: This is wrong; the macro refers to the numerical values
334 // of wchar_t *literals*, which are not locale-dependent. However,
335 // FreeBSD systems apparently depend on us getting this wrong, and
336 // setting this to 1 is conforming even if all the basic source
337 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000338 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000339 }
340public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000341 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
342 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000343 switch (Triple.getArch()) {
344 default:
345 case llvm::Triple::x86:
346 case llvm::Triple::x86_64:
347 this->MCountName = ".mcount";
348 break;
349 case llvm::Triple::mips:
350 case llvm::Triple::mipsel:
351 case llvm::Triple::ppc:
352 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000353 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000354 this->MCountName = "_mcount";
355 break;
356 case llvm::Triple::arm:
357 this->MCountName = "__mcount";
358 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000359 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000360 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000361};
362
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000363// GNU/kFreeBSD Target
364template<typename Target>
365class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
366protected:
Craig Topper3164f332014-03-11 03:39:26 +0000367 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
368 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000369 // GNU/kFreeBSD defines; list based off of gcc output
370
371 DefineStd(Builder, "unix", Opts);
372 Builder.defineMacro("__FreeBSD_kernel__");
373 Builder.defineMacro("__GLIBC__");
374 Builder.defineMacro("__ELF__");
375 if (Opts.POSIXThreads)
376 Builder.defineMacro("_REENTRANT");
377 if (Opts.CPlusPlus)
378 Builder.defineMacro("_GNU_SOURCE");
379 }
380public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000381 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
382 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383};
384
Chris Lattner3e2ee142010-07-07 16:01:42 +0000385// Minix Target
386template<typename Target>
387class MinixTargetInfo : public OSTargetInfo<Target> {
388protected:
Craig Topper3164f332014-03-11 03:39:26 +0000389 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
390 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000391 // Minix defines
392
393 Builder.defineMacro("__minix", "3");
394 Builder.defineMacro("_EM_WSIZE", "4");
395 Builder.defineMacro("_EM_PSIZE", "4");
396 Builder.defineMacro("_EM_SSIZE", "2");
397 Builder.defineMacro("_EM_LSIZE", "4");
398 Builder.defineMacro("_EM_FSIZE", "4");
399 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000400 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000401 DefineStd(Builder, "unix", Opts);
402 }
403public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000404 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
405 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000406};
407
Torok Edwinb2b37c62009-06-30 17:10:35 +0000408// Linux target
409template<typename Target>
410class LinuxTargetInfo : public OSTargetInfo<Target> {
411protected:
Craig Topper3164f332014-03-11 03:39:26 +0000412 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
413 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000414 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000415 DefineStd(Builder, "unix", Opts);
416 DefineStd(Builder, "linux", Opts);
417 Builder.defineMacro("__gnu_linux__");
418 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000419 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000420 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000421 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000422 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000423 this->PlatformName = "android";
424 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
425 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000426 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000427 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000428 if (Opts.CPlusPlus)
429 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000430 }
431public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000432 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
433 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000434 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000435
436 switch (Triple.getArch()) {
437 default:
438 break;
439 case llvm::Triple::ppc:
440 case llvm::Triple::ppc64:
441 case llvm::Triple::ppc64le:
442 this->MCountName = "_mcount";
443 break;
444 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000445 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000446
Craig Topper3164f332014-03-11 03:39:26 +0000447 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000448 return ".text.startup";
449 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000450};
451
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000452// NetBSD Target
453template<typename Target>
454class NetBSDTargetInfo : public OSTargetInfo<Target> {
455protected:
Craig Topper3164f332014-03-11 03:39:26 +0000456 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
457 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000458 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 Builder.defineMacro("__NetBSD__");
460 Builder.defineMacro("__unix__");
461 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000462 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000463 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000464
465 switch (Triple.getArch()) {
466 default:
467 break;
468 case llvm::Triple::arm:
469 case llvm::Triple::armeb:
470 case llvm::Triple::thumb:
471 case llvm::Triple::thumbeb:
472 Builder.defineMacro("__ARM_DWARF_EH__");
473 break;
474 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000479 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000480 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000481};
482
Torok Edwinb2b37c62009-06-30 17:10:35 +0000483// OpenBSD Target
484template<typename Target>
485class OpenBSDTargetInfo : public OSTargetInfo<Target> {
486protected:
Craig Topper3164f332014-03-11 03:39:26 +0000487 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
488 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000489 // OpenBSD defines; list based off of gcc output
490
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000491 Builder.defineMacro("__OpenBSD__");
492 DefineStd(Builder, "unix", Opts);
493 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000494 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000495 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000496 }
497public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000498 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
499 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000500 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000501
Eli Friedman3715d1f2011-12-15 02:15:56 +0000502 switch (Triple.getArch()) {
503 default:
504 case llvm::Triple::x86:
505 case llvm::Triple::x86_64:
506 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000507 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000508 this->MCountName = "__mcount";
509 break;
510 case llvm::Triple::mips64:
511 case llvm::Triple::mips64el:
512 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000513 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000514 this->MCountName = "_mcount";
515 break;
516 }
517 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000518};
519
Eli Friedman9fa28852012-08-08 23:57:20 +0000520// Bitrig Target
521template<typename Target>
522class BitrigTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000526 // Bitrig defines; list based off of gcc output
527
528 Builder.defineMacro("__Bitrig__");
529 DefineStd(Builder, "unix", Opts);
530 Builder.defineMacro("__ELF__");
531 if (Opts.POSIXThreads)
532 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000533
534 switch (Triple.getArch()) {
535 default:
536 break;
537 case llvm::Triple::arm:
538 case llvm::Triple::armeb:
539 case llvm::Triple::thumb:
540 case llvm::Triple::thumbeb:
541 Builder.defineMacro("__ARM_DWARF_EH__");
542 break;
543 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000544 }
545public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000546 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
547 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000548 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000549 }
550};
551
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000552// PSP Target
553template<typename Target>
554class PSPTargetInfo : public OSTargetInfo<Target> {
555protected:
Craig Topper3164f332014-03-11 03:39:26 +0000556 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
557 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000558 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000559 Builder.defineMacro("PSP");
560 Builder.defineMacro("_PSP");
561 Builder.defineMacro("__psp__");
562 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000563 }
564public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000565 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000566};
567
John Thompsone467e192009-11-19 17:18:50 +0000568// PS3 PPU Target
569template<typename Target>
570class PS3PPUTargetInfo : public OSTargetInfo<Target> {
571protected:
Craig Topper3164f332014-03-11 03:39:26 +0000572 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
573 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000574 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000575 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000576 Builder.defineMacro("__PPU__");
577 Builder.defineMacro("__CELLOS_LV2__");
578 Builder.defineMacro("__ELF__");
579 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000580 Builder.defineMacro("_ARCH_PPC64");
581 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000582 }
583public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000584 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
585 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000586 this->LongWidth = this->LongAlign = 32;
587 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000588 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000589 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000590 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000591 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000592 }
593};
594
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000595template <typename Target>
596class PS4OSTargetInfo : public OSTargetInfo<Target> {
597protected:
598 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
599 MacroBuilder &Builder) const override {
600 Builder.defineMacro("__FreeBSD__", "9");
601 Builder.defineMacro("__FreeBSD_cc_version", "900001");
602 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
603 DefineStd(Builder, "unix", Opts);
604 Builder.defineMacro("__ELF__");
605 Builder.defineMacro("__PS4__");
606 }
607public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000608 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
609 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000610 this->WCharType = this->UnsignedShort;
611
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000612 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
613 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000614
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000615 // On PS4, do not honor explicit bit field alignment,
616 // as in "__attribute__((aligned(2))) int b : 1;".
617 this->UseExplicitBitFieldAlignment = false;
618
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000619 switch (Triple.getArch()) {
620 default:
621 case llvm::Triple::x86_64:
622 this->MCountName = ".mcount";
623 break;
624 }
625 }
626};
627
Torok Edwinb2b37c62009-06-30 17:10:35 +0000628// Solaris target
629template<typename Target>
630class SolarisTargetInfo : public OSTargetInfo<Target> {
631protected:
Craig Topper3164f332014-03-11 03:39:26 +0000632 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
633 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000634 DefineStd(Builder, "sun", Opts);
635 DefineStd(Builder, "unix", Opts);
636 Builder.defineMacro("__ELF__");
637 Builder.defineMacro("__svr4__");
638 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000639 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
640 // newer, but to 500 for everything else. feature_test.h has a check to
641 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000642 // with a new version.
643 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000644 Builder.defineMacro("_XOPEN_SOURCE", "600");
645 else
646 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000647 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000648 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000649 Builder.defineMacro("_LARGEFILE_SOURCE");
650 Builder.defineMacro("_LARGEFILE64_SOURCE");
651 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000652 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000653 }
654public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000655 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
656 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000657 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000658 // FIXME: WIntType should be SignedLong
659 }
660};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000661
662// Windows target
663template<typename Target>
664class WindowsTargetInfo : public OSTargetInfo<Target> {
665protected:
Craig Topper3164f332014-03-11 03:39:26 +0000666 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
667 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000668 Builder.defineMacro("_WIN32");
669 }
670 void getVisualStudioDefines(const LangOptions &Opts,
671 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000672 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000673 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000674 Builder.defineMacro("_CPPRTTI");
675
Reid Kleckner16514352015-01-30 21:42:55 +0000676 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000677 Builder.defineMacro("_CPPUNWIND");
678 }
679
David Majnemer6a658902015-07-22 22:36:26 +0000680 if (Opts.Bool)
681 Builder.defineMacro("__BOOL_DEFINED");
682
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000683 if (!Opts.CharIsSigned)
684 Builder.defineMacro("_CHAR_UNSIGNED");
685
686 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
687 // but it works for now.
688 if (Opts.POSIXThreads)
689 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000690
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000691 if (Opts.MSCompatibilityVersion) {
692 Builder.defineMacro("_MSC_VER",
693 Twine(Opts.MSCompatibilityVersion / 100000));
694 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000695 // FIXME We cannot encode the revision information into 32-bits
696 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000697
David Majnemerb710a932015-05-11 03:57:49 +0000698 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000699 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000700 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000701
702 if (Opts.MicrosoftExt) {
703 Builder.defineMacro("_MSC_EXTENSIONS");
704
705 if (Opts.CPlusPlus11) {
706 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
707 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
708 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
709 }
710 }
711
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000712 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000713 }
714
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000715public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000716 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
717 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000718};
719
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000720template <typename Target>
721class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000722protected:
Craig Topper3164f332014-03-11 03:39:26 +0000723 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
724 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000725 if (Opts.POSIXThreads)
726 Builder.defineMacro("_REENTRANT");
727 if (Opts.CPlusPlus)
728 Builder.defineMacro("_GNU_SOURCE");
729
730 DefineStd(Builder, "unix", Opts);
731 Builder.defineMacro("__ELF__");
732 Builder.defineMacro("__native_client__");
733 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000734
735public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000736 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
737 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000738 this->LongAlign = 32;
739 this->LongWidth = 32;
740 this->PointerAlign = 32;
741 this->PointerWidth = 32;
742 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000743 this->Int64Type = TargetInfo::SignedLongLong;
744 this->DoubleAlign = 64;
745 this->LongDoubleWidth = 64;
746 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000747 this->LongLongWidth = 64;
748 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000749 this->SizeType = TargetInfo::UnsignedInt;
750 this->PtrDiffType = TargetInfo::SignedInt;
751 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000752 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000753 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000754 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000755 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000756 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000757 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000758 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000759 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000760 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000761 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000762 } else {
763 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000764 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000765 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000766 }
767};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000768
Dan Gohmanc2853072015-09-03 22:51:53 +0000769// WebAssembly target
770template <typename Target>
771class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
772 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000773 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000774 // A common platform macro.
775 if (Opts.POSIXThreads)
776 Builder.defineMacro("_REENTRANT");
777 // Follow g++ convention and predefine _GNU_SOURCE for C++.
778 if (Opts.CPlusPlus)
779 Builder.defineMacro("_GNU_SOURCE");
780 }
781
782 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000783 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000784 return ".text.__startup";
785 }
786
787public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000788 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
789 const TargetOptions &Opts)
790 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000791 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000792 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
793 }
794};
Dan Gohmanc2853072015-09-03 22:51:53 +0000795
Chris Lattner09d98f52008-10-05 21:50:58 +0000796//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000797// Specific target implementations.
798//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000799
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000800// PPC abstract base class
801class PPCTargetInfo : public TargetInfo {
802 static const Builtin::Info BuiltinInfo[];
803 static const char * const GCCRegNames[];
804 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000805 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000806
807 // Target cpu features.
808 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000809 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000810 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000811 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000812 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000813 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000814 bool HasBPERMD;
815 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000816
Ulrich Weigand8afad612014-07-28 13:17:52 +0000817protected:
818 std::string ABI;
819
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000820public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000821 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000822 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
823 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000824 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000825 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000826 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000827 LongDoubleWidth = LongDoubleAlign = 128;
828 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
829 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000830
Hal Finkel6b984f02012-07-03 16:51:04 +0000831 /// \brief Flags for architecture specific defines.
832 typedef enum {
833 ArchDefineNone = 0,
834 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
835 ArchDefinePpcgr = 1 << 1,
836 ArchDefinePpcsq = 1 << 2,
837 ArchDefine440 = 1 << 3,
838 ArchDefine603 = 1 << 4,
839 ArchDefine604 = 1 << 5,
840 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000841 ArchDefinePwr5 = 1 << 7,
842 ArchDefinePwr5x = 1 << 8,
843 ArchDefinePwr6 = 1 << 9,
844 ArchDefinePwr6x = 1 << 10,
845 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000846 ArchDefinePwr8 = 1 << 12,
847 ArchDefineA2 = 1 << 13,
848 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000849 } ArchDefineTypes;
850
Bill Schmidt38378a02013-02-01 20:23:10 +0000851 // Note: GCC recognizes the following additional cpus:
852 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
853 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
854 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000855 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000856 bool CPUKnown = llvm::StringSwitch<bool>(Name)
857 .Case("generic", true)
858 .Case("440", true)
859 .Case("450", true)
860 .Case("601", true)
861 .Case("602", true)
862 .Case("603", true)
863 .Case("603e", true)
864 .Case("603ev", true)
865 .Case("604", true)
866 .Case("604e", true)
867 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000868 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000869 .Case("g3", true)
870 .Case("7400", true)
871 .Case("g4", true)
872 .Case("7450", true)
873 .Case("g4+", true)
874 .Case("750", true)
875 .Case("970", true)
876 .Case("g5", true)
877 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000878 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000879 .Case("e500mc", true)
880 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000881 .Case("power3", true)
882 .Case("pwr3", true)
883 .Case("power4", true)
884 .Case("pwr4", true)
885 .Case("power5", true)
886 .Case("pwr5", true)
887 .Case("power5x", true)
888 .Case("pwr5x", true)
889 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000890 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000891 .Case("power6x", true)
892 .Case("pwr6x", true)
893 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000894 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000895 .Case("power8", true)
896 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000897 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000898 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000899 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000900 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000901 .Case("powerpc64le", true)
902 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000903 .Default(false);
904
905 if (CPUKnown)
906 CPU = Name;
907
908 return CPUKnown;
909 }
910
Ulrich Weigand8afad612014-07-28 13:17:52 +0000911
912 StringRef getABI() const override { return ABI; }
913
Craig Topper6c03a542015-10-19 04:51:35 +0000914 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
915 return llvm::makeArrayRef(BuiltinInfo,
916 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000917 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000918
Craig Topper3164f332014-03-11 03:39:26 +0000919 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000920
Craig Topper3164f332014-03-11 03:39:26 +0000921 void getTargetDefines(const LangOptions &Opts,
922 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000923
Eric Christopher8c47b422015-10-09 18:39:55 +0000924 bool
925 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
926 StringRef CPU,
927 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000928
Craig Topper3164f332014-03-11 03:39:26 +0000929 bool handleTargetFeatures(std::vector<std::string> &Features,
930 DiagnosticsEngine &Diags) override;
931 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000932 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
933 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000934
Craig Topperf054e3a2015-10-19 03:52:27 +0000935 ArrayRef<const char *> getGCCRegNames() const override;
936 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000937 bool validateAsmConstraint(const char *&Name,
938 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000939 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000940 default: return false;
941 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000942 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000943 case 'b': // Base register
944 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000945 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000946 break;
947 // FIXME: The following are added to allow parsing.
948 // I just took a guess at what the actions should be.
949 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000951 case 'v': // Altivec vector register
952 Info.setAllowsRegister();
953 break;
954 case 'w':
955 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000956 case 'd':// VSX vector register to hold vector double data
957 case 'f':// VSX vector register to hold vector float data
958 case 's':// VSX vector register to hold scalar float data
959 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000960 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000961 break;
962 default:
963 return false;
964 }
965 Info.setAllowsRegister();
966 Name++; // Skip over 'w'.
967 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000968 case 'h': // `MQ', `CTR', or `LINK' register
969 case 'q': // `MQ' register
970 case 'c': // `CTR' register
971 case 'l': // `LINK' register
972 case 'x': // `CR' register (condition register) number 0
973 case 'y': // `CR' register (condition register)
974 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000975 Info.setAllowsRegister();
976 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000977 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000978 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000979 // (use `L' instead for SImode constants)
980 case 'K': // Unsigned 16-bit constant
981 case 'L': // Signed 16-bit constant shifted left 16 bits
982 case 'M': // Constant larger than 31
983 case 'N': // Exact power of 2
984 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000985 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000986 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000987 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000988 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000989 break;
990 case 'm': // Memory operand. Note that on PowerPC targets, m can
991 // include addresses that update the base register. It
992 // is therefore only safe to use `m' in an asm statement
993 // if that asm statement accesses the operand exactly once.
994 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000995 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000997 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000998 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000999 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1000 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 // register to be updated.
1002 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001003 if (Name[1] != 's')
1004 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001005 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001006 // include any automodification of the base register. Unlike
1007 // `m', this constraint can be used in asm statements that
1008 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001009 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001010 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001011 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001012 break;
1013 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001014 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001015 case 'Z': // Memory operand that is an indexed or indirect from a
1016 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001017 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001018 Info.setAllowsMemory();
1019 Info.setAllowsRegister();
1020 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001021 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001022 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001023 // register (`p' is preferable for asm statements)
1024 case 'S': // Constant suitable as a 64-bit mask operand
1025 case 'T': // Constant suitable as a 32-bit mask operand
1026 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001027 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 // instructions
1029 case 'W': // Vector constant that does not require memory
1030 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001031 break;
1032 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001033 }
John Thompson07a61a42010-06-24 22:44:13 +00001034 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001035 }
Craig Topper3164f332014-03-11 03:39:26 +00001036 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001037 std::string R;
1038 switch (*Constraint) {
1039 case 'e':
1040 case 'w':
1041 // Two-character constraint; add "^" hint for later parsing.
1042 R = std::string("^") + std::string(Constraint, 2);
1043 Constraint++;
1044 break;
1045 default:
1046 return TargetInfo::convertConstraint(Constraint);
1047 }
1048 return R;
1049 }
Craig Topper3164f332014-03-11 03:39:26 +00001050 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001051 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001052 }
Craig Topper3164f332014-03-11 03:39:26 +00001053 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001054 if (RegNo == 0) return 3;
1055 if (RegNo == 1) return 4;
1056 return -1;
1057 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001058
1059 bool hasSjLjLowering() const override {
1060 return true;
1061 }
David Majnemer2617ea62015-06-09 18:05:33 +00001062
1063 bool useFloat128ManglingForLongDouble() const override {
1064 return LongDoubleWidth == 128 &&
1065 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1066 getTriple().isOSBinFormatELF();
1067 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001068};
Anders Carlssonf511f642007-11-27 04:11:28 +00001069
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001070const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001071#define BUILTIN(ID, TYPE, ATTRS) \
1072 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1073#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1074 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001075#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001076};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001077
Eric Christopher917e9522014-11-18 22:36:15 +00001078/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001079/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001080bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001081 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001082 for (const auto &Feature : Features) {
1083 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001084 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001085 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001086 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001087 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001088 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001089 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001090 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001091 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001092 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001093 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001094 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001095 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001096 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001097 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001098 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001099 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001100 // TODO: Finish this list and add an assert that we've handled them
1101 // all.
1102 }
Eric Christopher02c33352015-08-25 00:59:11 +00001103
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001104 return true;
1105}
1106
Chris Lattnerecd49032009-03-02 22:27:17 +00001107/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1108/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001109void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001110 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001111 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001112 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001113 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001114 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001115 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001116 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001117 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001118 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001119 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001120 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001121 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001122 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001123
Chris Lattnerecd49032009-03-02 22:27:17 +00001124 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001125 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1126 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001127 } else {
1128 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1129 getTriple().getOS() != llvm::Triple::OpenBSD)
1130 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001131 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001132
Ulrich Weigand8afad612014-07-28 13:17:52 +00001133 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001134 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001135 Builder.defineMacro("_CALL_ELF", "1");
1136 if (ABI == "elfv2")
1137 Builder.defineMacro("_CALL_ELF", "2");
1138
Chris Lattnerecd49032009-03-02 22:27:17 +00001139 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001140 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1141 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001142
Chris Lattnerecd49032009-03-02 22:27:17 +00001143 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001144 if (LongDoubleWidth == 128)
1145 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001146
John Thompsone467e192009-11-19 17:18:50 +00001147 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001148 Builder.defineMacro("__VEC__", "10206");
1149 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001150 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001151
1152 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001153 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1154 .Case("440", ArchDefineName)
1155 .Case("450", ArchDefineName | ArchDefine440)
1156 .Case("601", ArchDefineName)
1157 .Case("602", ArchDefineName | ArchDefinePpcgr)
1158 .Case("603", ArchDefineName | ArchDefinePpcgr)
1159 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1160 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1161 .Case("604", ArchDefineName | ArchDefinePpcgr)
1162 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1163 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001164 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001165 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1166 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1167 .Case("750", ArchDefineName | ArchDefinePpcgr)
1168 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1169 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001170 .Case("a2", ArchDefineA2)
1171 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001172 .Case("pwr3", ArchDefinePpcgr)
1173 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1174 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1175 | ArchDefinePpcsq)
1176 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1177 | ArchDefinePpcgr | ArchDefinePpcsq)
1178 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1179 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1180 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1181 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1182 | ArchDefinePpcsq)
1183 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1184 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001185 | ArchDefinePpcgr | ArchDefinePpcsq)
1186 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1187 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1188 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001189 .Case("power3", ArchDefinePpcgr)
1190 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1191 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1192 | ArchDefinePpcsq)
1193 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1194 | ArchDefinePpcgr | ArchDefinePpcsq)
1195 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1196 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1197 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1198 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1199 | ArchDefinePpcsq)
1200 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1201 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001202 | ArchDefinePpcgr | ArchDefinePpcsq)
1203 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1204 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1205 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001206 .Default(ArchDefineNone);
1207
1208 if (defs & ArchDefineName)
1209 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1210 if (defs & ArchDefinePpcgr)
1211 Builder.defineMacro("_ARCH_PPCGR");
1212 if (defs & ArchDefinePpcsq)
1213 Builder.defineMacro("_ARCH_PPCSQ");
1214 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001215 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001216 if (defs & ArchDefine603)
1217 Builder.defineMacro("_ARCH_603");
1218 if (defs & ArchDefine604)
1219 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001220 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001221 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001222 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001223 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001224 if (defs & ArchDefinePwr5x)
1225 Builder.defineMacro("_ARCH_PWR5X");
1226 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001227 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 if (defs & ArchDefinePwr6x)
1229 Builder.defineMacro("_ARCH_PWR6X");
1230 if (defs & ArchDefinePwr7)
1231 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001232 if (defs & ArchDefinePwr8)
1233 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001234 if (defs & ArchDefineA2)
1235 Builder.defineMacro("_ARCH_A2");
1236 if (defs & ArchDefineA2q) {
1237 Builder.defineMacro("_ARCH_A2Q");
1238 Builder.defineMacro("_ARCH_QP");
1239 }
1240
1241 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1242 Builder.defineMacro("__bg__");
1243 Builder.defineMacro("__THW_BLUEGENE__");
1244 Builder.defineMacro("__bgq__");
1245 Builder.defineMacro("__TOS_BGQ__");
1246 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001247
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001248 if (HasVSX)
1249 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001250 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001251 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001252 if (HasP8Crypto)
1253 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001254 if (HasHTM)
1255 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001256
1257 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1258 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1259 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1260 if (PointerWidth == 64)
1261 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001262
Bill Schmidt38378a02013-02-01 20:23:10 +00001263 // FIXME: The following are not yet generated here by Clang, but are
1264 // generated by GCC:
1265 //
1266 // _SOFT_FLOAT_
1267 // __RECIP_PRECISION__
1268 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001269 // __RECIP__
1270 // __RECIPF__
1271 // __RSQRTE__
1272 // __RSQRTEF__
1273 // _SOFT_DOUBLE_
1274 // __NO_LWSYNC__
1275 // __HAVE_BSWAP__
1276 // __LONGDOUBLE128
1277 // __CMODEL_MEDIUM__
1278 // __CMODEL_LARGE__
1279 // _CALL_SYSV
1280 // _CALL_DARWIN
1281 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001282}
1283
Eric Christophera8a14c32015-08-31 18:39:16 +00001284// Handle explicit options being passed to the compiler here: if we've
1285// explicitly turned off vsx and turned on power8-vector or direct-move then
1286// go ahead and error since the customer has expressed a somewhat incompatible
1287// set of options.
1288static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001289 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001290
1291 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1292 FeaturesVec.end()) {
1293 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1294 FeaturesVec.end()) {
1295 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1296 << "-mno-vsx";
1297 return false;
1298 }
1299
1300 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1301 FeaturesVec.end()) {
1302 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1303 << "-mno-vsx";
1304 return false;
1305 }
1306 }
1307
1308 return true;
1309}
1310
Eric Christopher8c47b422015-10-09 18:39:55 +00001311bool PPCTargetInfo::initFeatureMap(
1312 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1313 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001314 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1315 .Case("7400", true)
1316 .Case("g4", true)
1317 .Case("7450", true)
1318 .Case("g4+", true)
1319 .Case("970", true)
1320 .Case("g5", true)
1321 .Case("pwr6", true)
1322 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001323 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001324 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001325 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001326 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001327
1328 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001329 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1330 .Case("ppc64le", true)
1331 .Case("pwr8", true)
1332 .Default(false);
1333 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1334 .Case("ppc64le", true)
1335 .Case("pwr8", true)
1336 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001337 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1338 .Case("ppc64le", true)
1339 .Case("pwr8", true)
1340 .Case("pwr7", true)
1341 .Default(false);
1342 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1343 .Case("ppc64le", true)
1344 .Case("pwr8", true)
1345 .Case("pwr7", true)
1346 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001347 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1348 .Case("ppc64le", true)
1349 .Case("pwr8", true)
1350 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001351 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1352 .Case("ppc64le", true)
1353 .Case("pwr8", true)
1354 .Case("pwr7", true)
1355 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001356
Eric Christophera8a14c32015-08-31 18:39:16 +00001357 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1358 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001359
Eric Christopher007b0a02015-08-28 22:32:01 +00001360 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001361}
1362
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001363bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001364 return llvm::StringSwitch<bool>(Feature)
1365 .Case("powerpc", true)
1366 .Case("vsx", HasVSX)
1367 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001368 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001369 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001370 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001371 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001372 .Case("bpermd", HasBPERMD)
1373 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001374 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001375}
Chris Lattner17df24e2008-04-21 18:56:49 +00001376
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001377void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1378 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001379 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1380 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1381 // incompatible options.
1382 if (Enabled) {
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +00001383 if (Name == "vsx") {
1384 Features[Name] = true;
1385 } else if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001386 Features[Name] = Features["vsx"] = true;
1387 } else if (Name == "power8-vector") {
1388 Features[Name] = Features["vsx"] = true;
1389 } else {
1390 Features[Name] = true;
1391 }
1392 } else {
1393 if (Name == "vsx") {
1394 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +00001395 false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001396 } else {
1397 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001398 }
1399 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001400}
1401
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001402const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001403 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1404 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1405 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1406 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1407 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1408 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1409 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1410 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001411 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001412 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001413 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001414 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1415 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1416 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1417 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001418 "vrsave", "vscr",
1419 "spe_acc", "spefscr",
1420 "sfp"
1421};
Chris Lattner10a5b382007-01-29 05:24:35 +00001422
Craig Topperf054e3a2015-10-19 03:52:27 +00001423ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1424 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001425}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001426
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001427const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1428 // While some of these aliases do map to different registers
1429 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001430 { { "0" }, "r0" },
1431 { { "1"}, "r1" },
1432 { { "2" }, "r2" },
1433 { { "3" }, "r3" },
1434 { { "4" }, "r4" },
1435 { { "5" }, "r5" },
1436 { { "6" }, "r6" },
1437 { { "7" }, "r7" },
1438 { { "8" }, "r8" },
1439 { { "9" }, "r9" },
1440 { { "10" }, "r10" },
1441 { { "11" }, "r11" },
1442 { { "12" }, "r12" },
1443 { { "13" }, "r13" },
1444 { { "14" }, "r14" },
1445 { { "15" }, "r15" },
1446 { { "16" }, "r16" },
1447 { { "17" }, "r17" },
1448 { { "18" }, "r18" },
1449 { { "19" }, "r19" },
1450 { { "20" }, "r20" },
1451 { { "21" }, "r21" },
1452 { { "22" }, "r22" },
1453 { { "23" }, "r23" },
1454 { { "24" }, "r24" },
1455 { { "25" }, "r25" },
1456 { { "26" }, "r26" },
1457 { { "27" }, "r27" },
1458 { { "28" }, "r28" },
1459 { { "29" }, "r29" },
1460 { { "30" }, "r30" },
1461 { { "31" }, "r31" },
1462 { { "fr0" }, "f0" },
1463 { { "fr1" }, "f1" },
1464 { { "fr2" }, "f2" },
1465 { { "fr3" }, "f3" },
1466 { { "fr4" }, "f4" },
1467 { { "fr5" }, "f5" },
1468 { { "fr6" }, "f6" },
1469 { { "fr7" }, "f7" },
1470 { { "fr8" }, "f8" },
1471 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001472 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001473 { { "fr11" }, "f11" },
1474 { { "fr12" }, "f12" },
1475 { { "fr13" }, "f13" },
1476 { { "fr14" }, "f14" },
1477 { { "fr15" }, "f15" },
1478 { { "fr16" }, "f16" },
1479 { { "fr17" }, "f17" },
1480 { { "fr18" }, "f18" },
1481 { { "fr19" }, "f19" },
1482 { { "fr20" }, "f20" },
1483 { { "fr21" }, "f21" },
1484 { { "fr22" }, "f22" },
1485 { { "fr23" }, "f23" },
1486 { { "fr24" }, "f24" },
1487 { { "fr25" }, "f25" },
1488 { { "fr26" }, "f26" },
1489 { { "fr27" }, "f27" },
1490 { { "fr28" }, "f28" },
1491 { { "fr29" }, "f29" },
1492 { { "fr30" }, "f30" },
1493 { { "fr31" }, "f31" },
1494 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001495};
1496
Craig Topperf054e3a2015-10-19 03:52:27 +00001497ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1498 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001499}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001500
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001501class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001502public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001503 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1504 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001505 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001506
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001507 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001508 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001509 case llvm::Triple::FreeBSD:
1510 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001511 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001512 PtrDiffType = SignedInt;
1513 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001514 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001515 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001516 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001517 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001518
Roman Divacky3ffe7462012-03-13 19:20:17 +00001519 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1520 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001521 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001522 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001523
1524 // PPC32 supports atomics up to 4 bytes.
1525 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001526 }
1527
Craig Topper3164f332014-03-11 03:39:26 +00001528 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001529 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001530 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001531 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001532};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001533
Bill Schmidt778d3872013-07-26 01:36:11 +00001534// Note: ABI differences may eventually require us to have a separate
1535// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001536class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001537public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001538 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1539 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001540 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001541 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001542 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001543
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001544 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001545 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001546 ABI = "elfv2";
1547 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001548 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001549 ABI = "elfv1";
1550 }
1551
1552 switch (getTriple().getOS()) {
1553 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001554 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001555 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001556 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001557 case llvm::Triple::NetBSD:
1558 IntMaxType = SignedLongLong;
1559 Int64Type = SignedLongLong;
1560 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001561 default:
1562 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001563 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001564
1565 // PPC64 supports atomics up to 8 bytes.
1566 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001567 }
Craig Topper3164f332014-03-11 03:39:26 +00001568 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001569 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001570 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001571 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001572 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001573 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001574 ABI = Name;
1575 return true;
1576 }
1577 return false;
1578 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001579};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001580
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001581class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001582public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001583 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1584 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001585 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001586 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001587 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001588 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001589 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001590 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001591 }
Craig Topper3164f332014-03-11 03:39:26 +00001592 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001593 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001594 }
1595};
1596
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001597class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001598public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001599 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1600 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001601 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001602 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001603 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001604 }
1605};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001606
Eric Christopherc48497a2015-09-18 21:26:24 +00001607static const unsigned NVPTXAddrSpaceMap[] = {
1608 1, // opencl_global
1609 3, // opencl_local
1610 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001611 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001612 0, // opencl_generic
1613 1, // cuda_device
1614 4, // cuda_constant
1615 3, // cuda_shared
1616};
1617
1618class NVPTXTargetInfo : public TargetInfo {
1619 static const char *const GCCRegNames[];
1620 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001621
1622 // The GPU profiles supported by the NVPTX backend
1623 enum GPUKind {
1624 GK_NONE,
1625 GK_SM20,
1626 GK_SM21,
1627 GK_SM30,
1628 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001629 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001630 } GPU;
1631
Eric Christopherc48497a2015-09-18 21:26:24 +00001632public:
Justin Lebar76945b22016-04-29 23:05:19 +00001633 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001634 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001635 BigEndian = false;
1636 TLSSupported = false;
1637 LongWidth = LongAlign = 64;
1638 AddrSpaceMap = &NVPTXAddrSpaceMap;
1639 UseAddrSpaceMapMangling = true;
1640 // Define available target features
1641 // These must be defined in sorted order!
1642 NoAsmVariants = true;
1643 // Set the default GPU to sm20
1644 GPU = GK_SM20;
Justin Lebar76945b22016-04-29 23:05:19 +00001645
1646 // If possible, get a TargetInfo for our host triple, so we can match its
1647 // types.
1648 llvm::Triple HostTriple(Opts.HostTriple);
1649 if (HostTriple.isNVPTX())
1650 return;
1651 std::unique_ptr<TargetInfo> HostTarget(
1652 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1653 if (!HostTarget) {
1654 return;
1655 }
1656
1657 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1658 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1659 BoolWidth = HostTarget->getBoolWidth();
1660 BoolAlign = HostTarget->getBoolAlign();
1661 IntWidth = HostTarget->getIntWidth();
1662 IntAlign = HostTarget->getIntAlign();
1663 HalfWidth = HostTarget->getHalfWidth();
1664 HalfAlign = HostTarget->getHalfAlign();
1665 FloatWidth = HostTarget->getFloatWidth();
1666 FloatAlign = HostTarget->getFloatAlign();
1667 DoubleWidth = HostTarget->getDoubleWidth();
1668 DoubleAlign = HostTarget->getDoubleAlign();
1669 LongWidth = HostTarget->getLongWidth();
1670 LongAlign = HostTarget->getLongAlign();
1671 LongLongWidth = HostTarget->getLongLongWidth();
1672 LongLongAlign = HostTarget->getLongLongAlign();
1673 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1674 DefaultAlignForAttributeAligned =
1675 HostTarget->getDefaultAlignForAttributeAligned();
1676 SizeType = HostTarget->getSizeType();
1677 IntMaxType = HostTarget->getIntMaxType();
1678 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1679 IntPtrType = HostTarget->getIntPtrType();
1680 WCharType = HostTarget->getWCharType();
1681 WIntType = HostTarget->getWIntType();
1682 Char16Type = HostTarget->getChar16Type();
1683 Char32Type = HostTarget->getChar32Type();
1684 Int64Type = HostTarget->getInt64Type();
1685 SigAtomicType = HostTarget->getSigAtomicType();
1686 ProcessIDType = HostTarget->getProcessIDType();
1687
1688 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1689 UseZeroLengthBitfieldAlignment =
1690 HostTarget->useZeroLengthBitfieldAlignment();
1691 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1692 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1693
1694 // Properties intentionally not copied from host:
1695 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1696 // host/device boundary.
1697 // - SuitableAlign: Not visible across the host/device boundary, and may
1698 // correctly be different on host/device, e.g. if host has wider vector
1699 // types than device.
1700 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1701 // as its double type, but that's not necessarily true on the host.
1702 // TODO: nvcc emits a warning when using long double on device; we should
1703 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001704 }
1705 void getTargetDefines(const LangOptions &Opts,
1706 MacroBuilder &Builder) const override {
1707 Builder.defineMacro("__PTX__");
1708 Builder.defineMacro("__NVPTX__");
1709 if (Opts.CUDAIsDevice) {
1710 // Set __CUDA_ARCH__ for the GPU specified.
1711 std::string CUDAArchCode;
1712 switch (GPU) {
1713 case GK_SM20:
1714 CUDAArchCode = "200";
1715 break;
1716 case GK_SM21:
1717 CUDAArchCode = "210";
1718 break;
1719 case GK_SM30:
1720 CUDAArchCode = "300";
1721 break;
1722 case GK_SM35:
1723 CUDAArchCode = "350";
1724 break;
1725 case GK_SM37:
1726 CUDAArchCode = "370";
1727 break;
1728 default:
1729 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001730 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001731 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001732 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001733 }
Craig Topper6c03a542015-10-19 04:51:35 +00001734 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1735 return llvm::makeArrayRef(BuiltinInfo,
1736 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001737 }
1738 bool hasFeature(StringRef Feature) const override {
1739 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001740 }
1741
Craig Topperf054e3a2015-10-19 03:52:27 +00001742 ArrayRef<const char *> getGCCRegNames() const override;
1743 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001744 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001745 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001746 }
1747 bool validateAsmConstraint(const char *&Name,
1748 TargetInfo::ConstraintInfo &Info) const override {
1749 switch (*Name) {
1750 default:
1751 return false;
1752 case 'c':
1753 case 'h':
1754 case 'r':
1755 case 'l':
1756 case 'f':
1757 case 'd':
1758 Info.setAllowsRegister();
1759 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001760 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001761 }
1762 const char *getClobbers() const override {
1763 // FIXME: Is this really right?
1764 return "";
1765 }
1766 BuiltinVaListKind getBuiltinVaListKind() const override {
1767 // FIXME: implement
1768 return TargetInfo::CharPtrBuiltinVaList;
1769 }
1770 bool setCPU(const std::string &Name) override {
1771 GPU = llvm::StringSwitch<GPUKind>(Name)
1772 .Case("sm_20", GK_SM20)
1773 .Case("sm_21", GK_SM21)
1774 .Case("sm_30", GK_SM30)
1775 .Case("sm_35", GK_SM35)
1776 .Case("sm_37", GK_SM37)
1777 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001778
Eric Christopherc48497a2015-09-18 21:26:24 +00001779 return GPU != GK_NONE;
1780 }
1781};
1782
1783const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1784#define BUILTIN(ID, TYPE, ATTRS) \
1785 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1786#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1787 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1788#include "clang/Basic/BuiltinsNVPTX.def"
1789};
1790
1791const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1792
Craig Topperf054e3a2015-10-19 03:52:27 +00001793ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1794 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001795}
1796
1797class NVPTX32TargetInfo : public NVPTXTargetInfo {
1798public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001799 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1800 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001801 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001802 PointerWidth = PointerAlign = 32;
1803 SizeType = TargetInfo::UnsignedInt;
1804 PtrDiffType = TargetInfo::SignedInt;
1805 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001806 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001807 }
1808};
1809
1810class NVPTX64TargetInfo : public NVPTXTargetInfo {
1811public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001812 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1813 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001814 PointerWidth = PointerAlign = 64;
1815 SizeType = TargetInfo::UnsignedLong;
1816 PtrDiffType = TargetInfo::SignedLong;
1817 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001818 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001819 }
1820};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001821
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001822static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001823 1, // opencl_global
1824 3, // opencl_local
1825 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001826 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001827 1, // cuda_device
1828 2, // cuda_constant
1829 3 // cuda_shared
1830};
1831
Tom Stellarda96344b2014-08-21 13:58:40 +00001832// If you edit the description strings, make sure you update
1833// getPointerWidthV().
1834
Craig Topper273dbc62015-10-18 05:29:26 +00001835static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001836 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1837 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001838
Craig Topper273dbc62015-10-18 05:29:26 +00001839static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001840 "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 +00001841 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1842 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001843
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001844class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001845 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001846 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001847
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001848 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001849 enum GPUKind {
1850 GK_NONE,
1851 GK_R600,
1852 GK_R600_DOUBLE_OPS,
1853 GK_R700,
1854 GK_R700_DOUBLE_OPS,
1855 GK_EVERGREEN,
1856 GK_EVERGREEN_DOUBLE_OPS,
1857 GK_NORTHERN_ISLANDS,
1858 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001859 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001860 GK_SEA_ISLANDS,
1861 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001862 } GPU;
1863
Jan Veselyeebeaea2015-05-04 19:53:36 +00001864 bool hasFP64:1;
1865 bool hasFMAF:1;
1866 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001867
Eli Friedmand13b41e2012-10-12 23:32:00 +00001868public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001869 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
1870 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001871 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001872 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001873 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001874 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001875 hasFMAF = true;
1876 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001877 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001878 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001879 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001880 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001881 hasFMAF = false;
1882 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001883 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001884 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001885 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001886 }
1887
Tom Stellarda96344b2014-08-21 13:58:40 +00001888 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1889 if (GPU <= GK_CAYMAN)
1890 return 32;
1891
1892 switch(AddrSpace) {
1893 default:
1894 return 64;
1895 case 0:
1896 case 3:
1897 case 5:
1898 return 32;
1899 }
1900 }
1901
Craig Topper3164f332014-03-11 03:39:26 +00001902 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001903 return "";
1904 }
1905
Craig Topperf054e3a2015-10-19 03:52:27 +00001906 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001907
Craig Topperf054e3a2015-10-19 03:52:27 +00001908 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1909 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001910 }
1911
Craig Topper3164f332014-03-11 03:39:26 +00001912 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001913 TargetInfo::ConstraintInfo &Info) const override {
1914 switch (*Name) {
1915 default: break;
1916 case 'v': // vgpr
1917 case 's': // sgpr
1918 Info.setAllowsRegister();
1919 return true;
1920 }
1921 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001922 }
1923
Craig Topper6c03a542015-10-19 04:51:35 +00001924 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1925 return llvm::makeArrayRef(BuiltinInfo,
1926 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001927 }
1928
Craig Topper3164f332014-03-11 03:39:26 +00001929 void getTargetDefines(const LangOptions &Opts,
1930 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001931 if (getTriple().getArch() == llvm::Triple::amdgcn)
1932 Builder.defineMacro("__AMDGCN__");
1933 else
1934 Builder.defineMacro("__R600__");
1935
Jan Veselyeebeaea2015-05-04 19:53:36 +00001936 if (hasFMAF)
1937 Builder.defineMacro("__HAS_FMAF__");
1938 if (hasLDEXPF)
1939 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001940 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001941 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001942 if (Opts.OpenCL) {
1943 if (GPU >= GK_NORTHERN_ISLANDS) {
1944 Builder.defineMacro("cl_khr_byte_addressable_store");
1945 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1946 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1947 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1948 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1949 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001950 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001951 }
1952
Craig Topper3164f332014-03-11 03:39:26 +00001953 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001954 return TargetInfo::CharPtrBuiltinVaList;
1955 }
1956
Craig Topper3164f332014-03-11 03:39:26 +00001957 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001958 GPU = llvm::StringSwitch<GPUKind>(Name)
1959 .Case("r600" , GK_R600)
1960 .Case("rv610", GK_R600)
1961 .Case("rv620", GK_R600)
1962 .Case("rv630", GK_R600)
1963 .Case("rv635", GK_R600)
1964 .Case("rs780", GK_R600)
1965 .Case("rs880", GK_R600)
1966 .Case("rv670", GK_R600_DOUBLE_OPS)
1967 .Case("rv710", GK_R700)
1968 .Case("rv730", GK_R700)
1969 .Case("rv740", GK_R700_DOUBLE_OPS)
1970 .Case("rv770", GK_R700_DOUBLE_OPS)
1971 .Case("palm", GK_EVERGREEN)
1972 .Case("cedar", GK_EVERGREEN)
1973 .Case("sumo", GK_EVERGREEN)
1974 .Case("sumo2", GK_EVERGREEN)
1975 .Case("redwood", GK_EVERGREEN)
1976 .Case("juniper", GK_EVERGREEN)
1977 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1978 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1979 .Case("barts", GK_NORTHERN_ISLANDS)
1980 .Case("turks", GK_NORTHERN_ISLANDS)
1981 .Case("caicos", GK_NORTHERN_ISLANDS)
1982 .Case("cayman", GK_CAYMAN)
1983 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001984 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001985 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1986 .Case("verde", GK_SOUTHERN_ISLANDS)
1987 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001988 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001989 .Case("bonaire", GK_SEA_ISLANDS)
1990 .Case("kabini", GK_SEA_ISLANDS)
1991 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001992 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001993 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001994 .Case("tonga", GK_VOLCANIC_ISLANDS)
1995 .Case("iceland", GK_VOLCANIC_ISLANDS)
1996 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00001997 .Case("fiji", GK_VOLCANIC_ISLANDS)
1998 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001999 .Default(GK_NONE);
2000
2001 if (GPU == GK_NONE) {
2002 return false;
2003 }
2004
2005 // Set the correct data layout
2006 switch (GPU) {
2007 case GK_NONE:
2008 case GK_R600:
2009 case GK_R700:
2010 case GK_EVERGREEN:
2011 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002012 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002013 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002014 hasFMAF = false;
2015 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002016 break;
2017 case GK_R600_DOUBLE_OPS:
2018 case GK_R700_DOUBLE_OPS:
2019 case GK_EVERGREEN_DOUBLE_OPS:
2020 case GK_CAYMAN:
Matt Arsenaultedc7c6b2016-03-30 21:32:37 +00002021 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002022 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002023 hasFMAF = true;
2024 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002025 break;
2026 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00002027 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00002028 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002029 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002030 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002031 hasFMAF = true;
2032 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002033 break;
2034 }
2035
2036 return true;
2037 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002038};
2039
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002040const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002041#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002042 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002043#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002044};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002045const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002046 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2047 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2048 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2049 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2050 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2051 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2052 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2053 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2054 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2055 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2056 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2057 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2058 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2059 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2060 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2061 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2062 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2063 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2064 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2065 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2066 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2067 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2068 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2069 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2070 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2071 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2072 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2073 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2074 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2075 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2076 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2077 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2078 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2079 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2080 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2081 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2082 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2083 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2084 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2085 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2086 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2087 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2088 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2089 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2090 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2091 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2092 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002093 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002094 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2095 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002096};
2097
Craig Topperf054e3a2015-10-19 03:52:27 +00002098ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2099 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002100}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002101
Eli Friedman3fd920a2008-08-20 02:34:37 +00002102// Namespace for x86 abstract base class
2103const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002104#define BUILTIN(ID, TYPE, ATTRS) \
2105 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002106#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002107 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002108#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002109 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002110#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002111};
Eli Friedmanb5366062008-05-20 14:21:01 +00002112
Nuno Lopescfca1f02009-12-23 17:49:57 +00002113static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002114 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2115 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002116 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002117 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2118 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2119 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002120 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002121 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2122 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002123 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2124 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2125 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2126 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2127 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2128 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2129 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2130 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002131};
2132
Eric Christophercdd36352011-06-21 00:05:20 +00002133const TargetInfo::AddlRegName AddlRegNames[] = {
2134 { { "al", "ah", "eax", "rax" }, 0 },
2135 { { "bl", "bh", "ebx", "rbx" }, 3 },
2136 { { "cl", "ch", "ecx", "rcx" }, 2 },
2137 { { "dl", "dh", "edx", "rdx" }, 1 },
2138 { { "esi", "rsi" }, 4 },
2139 { { "edi", "rdi" }, 5 },
2140 { { "esp", "rsp" }, 7 },
2141 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002142 { { "r8d", "r8w", "r8b" }, 38 },
2143 { { "r9d", "r9w", "r9b" }, 39 },
2144 { { "r10d", "r10w", "r10b" }, 40 },
2145 { { "r11d", "r11w", "r11b" }, 41 },
2146 { { "r12d", "r12w", "r12b" }, 42 },
2147 { { "r13d", "r13w", "r13b" }, 43 },
2148 { { "r14d", "r14w", "r14b" }, 44 },
2149 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002150};
2151
2152// X86 target abstract base class; x86-32 and x86-64 are very close, so
2153// most of the implementation can be shared.
2154class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002155 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002156 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002157 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002158 enum MMX3DNowEnum {
2159 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002160 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002161 enum XOPEnum {
2162 NoXOP,
2163 SSE4A,
2164 FMA4,
2165 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002166 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002167
Craig Topper543f3bd2015-10-14 23:47:57 +00002168 bool HasAES = false;
2169 bool HasPCLMUL = false;
2170 bool HasLZCNT = false;
2171 bool HasRDRND = false;
2172 bool HasFSGSBASE = false;
2173 bool HasBMI = false;
2174 bool HasBMI2 = false;
2175 bool HasPOPCNT = false;
2176 bool HasRTM = false;
2177 bool HasPRFCHW = false;
2178 bool HasRDSEED = false;
2179 bool HasADX = false;
2180 bool HasTBM = false;
2181 bool HasFMA = false;
2182 bool HasF16C = false;
2183 bool HasAVX512CD = false;
2184 bool HasAVX512ER = false;
2185 bool HasAVX512PF = false;
2186 bool HasAVX512DQ = false;
2187 bool HasAVX512BW = false;
2188 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002189 bool HasAVX512VBMI = false;
2190 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002191 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002192 bool HasMPX = false;
2193 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002194 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002195 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002196 bool HasXSAVE = false;
2197 bool HasXSAVEOPT = false;
2198 bool HasXSAVEC = false;
2199 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002200 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002201 bool HasCLFLUSHOPT = false;
2202 bool HasPCOMMIT = false;
2203 bool HasCLWB = false;
2204 bool HasUMIP = false;
2205 bool HasMOVBE = false;
2206 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002207
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002208 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2209 ///
2210 /// Each enumeration represents a particular CPU supported by Clang. These
2211 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2212 enum CPUKind {
2213 CK_Generic,
2214
2215 /// \name i386
2216 /// i386-generation processors.
2217 //@{
2218 CK_i386,
2219 //@}
2220
2221 /// \name i486
2222 /// i486-generation processors.
2223 //@{
2224 CK_i486,
2225 CK_WinChipC6,
2226 CK_WinChip2,
2227 CK_C3,
2228 //@}
2229
2230 /// \name i586
2231 /// i586-generation processors, P5 microarchitecture based.
2232 //@{
2233 CK_i586,
2234 CK_Pentium,
2235 CK_PentiumMMX,
2236 //@}
2237
2238 /// \name i686
2239 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2240 //@{
2241 CK_i686,
2242 CK_PentiumPro,
2243 CK_Pentium2,
2244 CK_Pentium3,
2245 CK_Pentium3M,
2246 CK_PentiumM,
2247 CK_C3_2,
2248
2249 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2250 /// Clang however has some logic to suport this.
2251 // FIXME: Warn, deprecate, and potentially remove this.
2252 CK_Yonah,
2253 //@}
2254
2255 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002256 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002257 //@{
2258 CK_Pentium4,
2259 CK_Pentium4M,
2260 CK_Prescott,
2261 CK_Nocona,
2262 //@}
2263
2264 /// \name Core
2265 /// Core microarchitecture based processors.
2266 //@{
2267 CK_Core2,
2268
2269 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2270 /// codename which GCC no longer accepts as an option to -march, but Clang
2271 /// has some logic for recognizing it.
2272 // FIXME: Warn, deprecate, and potentially remove this.
2273 CK_Penryn,
2274 //@}
2275
2276 /// \name Atom
2277 /// Atom processors
2278 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002279 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002280 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002281 //@}
2282
2283 /// \name Nehalem
2284 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002285 CK_Nehalem,
2286
2287 /// \name Westmere
2288 /// Westmere microarchitecture based processors.
2289 CK_Westmere,
2290
2291 /// \name Sandy Bridge
2292 /// Sandy Bridge microarchitecture based processors.
2293 CK_SandyBridge,
2294
2295 /// \name Ivy Bridge
2296 /// Ivy Bridge microarchitecture based processors.
2297 CK_IvyBridge,
2298
2299 /// \name Haswell
2300 /// Haswell microarchitecture based processors.
2301 CK_Haswell,
2302
2303 /// \name Broadwell
2304 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002305 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002306
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002307 /// \name Skylake Client
2308 /// Skylake client microarchitecture based processors.
2309 CK_SkylakeClient,
2310
2311 /// \name Skylake Server
2312 /// Skylake server microarchitecture based processors.
2313 CK_SkylakeServer,
2314
2315 /// \name Cannonlake Client
2316 /// Cannonlake client microarchitecture based processors.
2317 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002318
Craig Topper449314e2013-08-20 07:09:39 +00002319 /// \name Knights Landing
2320 /// Knights Landing processor.
2321 CK_KNL,
2322
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002323 /// \name Lakemont
2324 /// Lakemont microarchitecture based processors.
2325 CK_Lakemont,
2326
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002327 /// \name K6
2328 /// K6 architecture processors.
2329 //@{
2330 CK_K6,
2331 CK_K6_2,
2332 CK_K6_3,
2333 //@}
2334
2335 /// \name K7
2336 /// K7 architecture processors.
2337 //@{
2338 CK_Athlon,
2339 CK_AthlonThunderbird,
2340 CK_Athlon4,
2341 CK_AthlonXP,
2342 CK_AthlonMP,
2343 //@}
2344
2345 /// \name K8
2346 /// K8 architecture processors.
2347 //@{
2348 CK_Athlon64,
2349 CK_Athlon64SSE3,
2350 CK_AthlonFX,
2351 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002352 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002353 CK_Opteron,
2354 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002355 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002356 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002357
Benjamin Kramer569f2152012-01-10 11:50:18 +00002358 /// \name Bobcat
2359 /// Bobcat architecture processors.
2360 //@{
2361 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002362 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002363 //@}
2364
2365 /// \name Bulldozer
2366 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002367 //@{
2368 CK_BDVER1,
2369 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002370 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002371 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002372 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002373
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002374 /// This specification is deprecated and will be removed in the future.
2375 /// Users should prefer \see CK_K8.
2376 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002377 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002378 CK_x86_64,
2379 //@}
2380
2381 /// \name Geode
2382 /// Geode processors.
2383 //@{
2384 CK_Geode
2385 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002386 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002387
Eric Christopherc50738f2015-08-27 00:05:50 +00002388 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002389 return llvm::StringSwitch<CPUKind>(CPU)
2390 .Case("i386", CK_i386)
2391 .Case("i486", CK_i486)
2392 .Case("winchip-c6", CK_WinChipC6)
2393 .Case("winchip2", CK_WinChip2)
2394 .Case("c3", CK_C3)
2395 .Case("i586", CK_i586)
2396 .Case("pentium", CK_Pentium)
2397 .Case("pentium-mmx", CK_PentiumMMX)
2398 .Case("i686", CK_i686)
2399 .Case("pentiumpro", CK_PentiumPro)
2400 .Case("pentium2", CK_Pentium2)
2401 .Case("pentium3", CK_Pentium3)
2402 .Case("pentium3m", CK_Pentium3M)
2403 .Case("pentium-m", CK_PentiumM)
2404 .Case("c3-2", CK_C3_2)
2405 .Case("yonah", CK_Yonah)
2406 .Case("pentium4", CK_Pentium4)
2407 .Case("pentium4m", CK_Pentium4M)
2408 .Case("prescott", CK_Prescott)
2409 .Case("nocona", CK_Nocona)
2410 .Case("core2", CK_Core2)
2411 .Case("penryn", CK_Penryn)
2412 .Case("bonnell", CK_Bonnell)
2413 .Case("atom", CK_Bonnell) // Legacy name.
2414 .Case("silvermont", CK_Silvermont)
2415 .Case("slm", CK_Silvermont) // Legacy name.
2416 .Case("nehalem", CK_Nehalem)
2417 .Case("corei7", CK_Nehalem) // Legacy name.
2418 .Case("westmere", CK_Westmere)
2419 .Case("sandybridge", CK_SandyBridge)
2420 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2421 .Case("ivybridge", CK_IvyBridge)
2422 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2423 .Case("haswell", CK_Haswell)
2424 .Case("core-avx2", CK_Haswell) // Legacy name.
2425 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002426 .Case("skylake", CK_SkylakeClient)
2427 .Case("skylake-avx512", CK_SkylakeServer)
2428 .Case("skx", CK_SkylakeServer) // Legacy name.
2429 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002430 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002431 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002432 .Case("k6", CK_K6)
2433 .Case("k6-2", CK_K6_2)
2434 .Case("k6-3", CK_K6_3)
2435 .Case("athlon", CK_Athlon)
2436 .Case("athlon-tbird", CK_AthlonThunderbird)
2437 .Case("athlon-4", CK_Athlon4)
2438 .Case("athlon-xp", CK_AthlonXP)
2439 .Case("athlon-mp", CK_AthlonMP)
2440 .Case("athlon64", CK_Athlon64)
2441 .Case("athlon64-sse3", CK_Athlon64SSE3)
2442 .Case("athlon-fx", CK_AthlonFX)
2443 .Case("k8", CK_K8)
2444 .Case("k8-sse3", CK_K8SSE3)
2445 .Case("opteron", CK_Opteron)
2446 .Case("opteron-sse3", CK_OpteronSSE3)
2447 .Case("barcelona", CK_AMDFAM10)
2448 .Case("amdfam10", CK_AMDFAM10)
2449 .Case("btver1", CK_BTVER1)
2450 .Case("btver2", CK_BTVER2)
2451 .Case("bdver1", CK_BDVER1)
2452 .Case("bdver2", CK_BDVER2)
2453 .Case("bdver3", CK_BDVER3)
2454 .Case("bdver4", CK_BDVER4)
2455 .Case("x86-64", CK_x86_64)
2456 .Case("geode", CK_Geode)
2457 .Default(CK_Generic);
2458 }
2459
Rafael Espindolaeb265472013-08-21 21:59:03 +00002460 enum FPMathKind {
2461 FP_Default,
2462 FP_SSE,
2463 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002464 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002465
Eli Friedman3fd920a2008-08-20 02:34:37 +00002466public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002467 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2468 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002469 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002470 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002471 }
Craig Topper3164f332014-03-11 03:39:26 +00002472 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002473 // X87 evaluates with 80 bits "long double" precision.
2474 return SSELevel == NoSSE ? 2 : 0;
2475 }
Craig Topper6c03a542015-10-19 04:51:35 +00002476 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2477 return llvm::makeArrayRef(BuiltinInfo,
2478 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002479 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002480 ArrayRef<const char *> getGCCRegNames() const override {
2481 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002482 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002483 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2484 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002485 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002486 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2487 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002488 }
Eric Christopherd9832702015-06-29 21:00:05 +00002489 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002490 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002491 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002492
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002493 bool validateGlobalRegisterVariable(StringRef RegName,
2494 unsigned RegSize,
2495 bool &HasSizeMismatch) const override {
2496 // esp and ebp are the only 32-bit registers the x86 backend can currently
2497 // handle.
2498 if (RegName.equals("esp") || RegName.equals("ebp")) {
2499 // Check that the register size is 32-bit.
2500 HasSizeMismatch = RegSize != 32;
2501 return true;
2502 }
2503
2504 return false;
2505 }
2506
Akira Hatanaka974131e2014-09-18 18:17:18 +00002507 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2508
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002509 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2510
Akira Hatanaka974131e2014-09-18 18:17:18 +00002511 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2512
Craig Topper3164f332014-03-11 03:39:26 +00002513 std::string convertConstraint(const char *&Constraint) const override;
2514 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002515 return "~{dirflag},~{fpsr},~{flags}";
2516 }
Craig Topper3164f332014-03-11 03:39:26 +00002517 void getTargetDefines(const LangOptions &Opts,
2518 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002519 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2520 bool Enabled);
2521 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2522 bool Enabled);
2523 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2524 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002525 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2526 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002527 setFeatureEnabledImpl(Features, Name, Enabled);
2528 }
2529 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002530 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002531 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2532 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002533 bool
2534 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2535 StringRef CPU,
2536 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002537 bool hasFeature(StringRef Feature) const override;
2538 bool handleTargetFeatures(std::vector<std::string> &Features,
2539 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002540 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002541 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2542 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002543 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002544 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002545 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002546 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002547 return "no-mmx";
2548 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002549 }
Craig Topper3164f332014-03-11 03:39:26 +00002550 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002551 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002552
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002553 // Perform any per-CPU checks necessary to determine if this CPU is
2554 // acceptable.
2555 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2556 // invalid without explaining *why*.
2557 switch (CPU) {
2558 case CK_Generic:
2559 // No processor selected!
2560 return false;
2561
2562 case CK_i386:
2563 case CK_i486:
2564 case CK_WinChipC6:
2565 case CK_WinChip2:
2566 case CK_C3:
2567 case CK_i586:
2568 case CK_Pentium:
2569 case CK_PentiumMMX:
2570 case CK_i686:
2571 case CK_PentiumPro:
2572 case CK_Pentium2:
2573 case CK_Pentium3:
2574 case CK_Pentium3M:
2575 case CK_PentiumM:
2576 case CK_Yonah:
2577 case CK_C3_2:
2578 case CK_Pentium4:
2579 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002580 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002581 case CK_Prescott:
2582 case CK_K6:
2583 case CK_K6_2:
2584 case CK_K6_3:
2585 case CK_Athlon:
2586 case CK_AthlonThunderbird:
2587 case CK_Athlon4:
2588 case CK_AthlonXP:
2589 case CK_AthlonMP:
2590 case CK_Geode:
2591 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002592 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002593 return false;
2594
2595 // Fallthrough
2596 case CK_Nocona:
2597 case CK_Core2:
2598 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002599 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002600 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002601 case CK_Nehalem:
2602 case CK_Westmere:
2603 case CK_SandyBridge:
2604 case CK_IvyBridge:
2605 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002606 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002607 case CK_SkylakeClient:
2608 case CK_SkylakeServer:
2609 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002610 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002611 case CK_Athlon64:
2612 case CK_Athlon64SSE3:
2613 case CK_AthlonFX:
2614 case CK_K8:
2615 case CK_K8SSE3:
2616 case CK_Opteron:
2617 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002618 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002619 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002620 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002621 case CK_BDVER1:
2622 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002623 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002624 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002625 case CK_x86_64:
2626 return true;
2627 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002628 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002629 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002630
Craig Topper3164f332014-03-11 03:39:26 +00002631 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002632
Craig Topper3164f332014-03-11 03:39:26 +00002633 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002634 // Most of the non-ARM calling conventions are i386 conventions.
2635 switch (CC) {
2636 case CC_X86ThisCall:
2637 case CC_X86FastCall:
2638 case CC_X86StdCall:
2639 case CC_X86VectorCall:
2640 case CC_C:
2641 case CC_Swift:
2642 case CC_X86Pascal:
2643 case CC_IntelOclBicc:
2644 return CCCR_OK;
2645 default:
2646 return CCCR_Warning;
2647 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002648 }
2649
Craig Topper3164f332014-03-11 03:39:26 +00002650 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002651 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002652 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002653
2654 bool hasSjLjLowering() const override {
2655 return true;
2656 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002657};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002658
Rafael Espindolaeb265472013-08-21 21:59:03 +00002659bool X86TargetInfo::setFPMath(StringRef Name) {
2660 if (Name == "387") {
2661 FPMath = FP_387;
2662 return true;
2663 }
2664 if (Name == "sse") {
2665 FPMath = FP_SSE;
2666 return true;
2667 }
2668 return false;
2669}
2670
Eric Christopher007b0a02015-08-28 22:32:01 +00002671bool X86TargetInfo::initFeatureMap(
2672 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002673 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002674 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002675 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002676 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002677 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002678
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002679 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002680
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002681 // Enable X87 for all X86 processors but Lakemont.
2682 if (Kind != CK_Lakemont)
2683 setFeatureEnabledImpl(Features, "x87", true);
2684
2685 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002686 case CK_Generic:
2687 case CK_i386:
2688 case CK_i486:
2689 case CK_i586:
2690 case CK_Pentium:
2691 case CK_i686:
2692 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002693 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002694 break;
2695 case CK_PentiumMMX:
2696 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002697 case CK_K6:
2698 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002699 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002700 break;
2701 case CK_Pentium3:
2702 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002703 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002704 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002705 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002706 break;
2707 case CK_PentiumM:
2708 case CK_Pentium4:
2709 case CK_Pentium4M:
2710 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002711 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002712 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002713 break;
2714 case CK_Yonah:
2715 case CK_Prescott:
2716 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002717 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002718 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002719 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002720 break;
2721 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002722 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002723 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002724 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002725 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002726 break;
2727 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002728 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002729 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002730 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002731 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002732 case CK_Cannonlake:
2733 setFeatureEnabledImpl(Features, "avx512ifma", true);
2734 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2735 setFeatureEnabledImpl(Features, "sha", true);
2736 setFeatureEnabledImpl(Features, "umip", true);
2737 // FALLTHROUGH
2738 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002739 setFeatureEnabledImpl(Features, "avx512f", true);
2740 setFeatureEnabledImpl(Features, "avx512cd", true);
2741 setFeatureEnabledImpl(Features, "avx512dq", true);
2742 setFeatureEnabledImpl(Features, "avx512bw", true);
2743 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002744 setFeatureEnabledImpl(Features, "pku", true);
2745 setFeatureEnabledImpl(Features, "pcommit", true);
2746 setFeatureEnabledImpl(Features, "clwb", true);
2747 // FALLTHROUGH
2748 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002749 setFeatureEnabledImpl(Features, "xsavec", true);
2750 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002751 setFeatureEnabledImpl(Features, "mpx", true);
2752 setFeatureEnabledImpl(Features, "sgx", true);
2753 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002754 // FALLTHROUGH
2755 case CK_Broadwell:
2756 setFeatureEnabledImpl(Features, "rdseed", true);
2757 setFeatureEnabledImpl(Features, "adx", true);
2758 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002759 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002760 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002761 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002762 setFeatureEnabledImpl(Features, "bmi", true);
2763 setFeatureEnabledImpl(Features, "bmi2", true);
2764 setFeatureEnabledImpl(Features, "rtm", true);
2765 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002766 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002767 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002768 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002769 setFeatureEnabledImpl(Features, "rdrnd", true);
2770 setFeatureEnabledImpl(Features, "f16c", true);
2771 setFeatureEnabledImpl(Features, "fsgsbase", true);
2772 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002773 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002774 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002775 setFeatureEnabledImpl(Features, "xsave", true);
2776 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002777 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002778 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002779 case CK_Silvermont:
2780 setFeatureEnabledImpl(Features, "aes", true);
2781 setFeatureEnabledImpl(Features, "pclmul", true);
2782 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002783 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002784 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002785 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002786 setFeatureEnabledImpl(Features, "cx16", true);
2787 break;
2788 case CK_KNL:
2789 setFeatureEnabledImpl(Features, "avx512f", true);
2790 setFeatureEnabledImpl(Features, "avx512cd", true);
2791 setFeatureEnabledImpl(Features, "avx512er", true);
2792 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002793 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002794 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002795 setFeatureEnabledImpl(Features, "rdseed", true);
2796 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002797 setFeatureEnabledImpl(Features, "lzcnt", true);
2798 setFeatureEnabledImpl(Features, "bmi", true);
2799 setFeatureEnabledImpl(Features, "bmi2", true);
2800 setFeatureEnabledImpl(Features, "rtm", true);
2801 setFeatureEnabledImpl(Features, "fma", true);
2802 setFeatureEnabledImpl(Features, "rdrnd", true);
2803 setFeatureEnabledImpl(Features, "f16c", true);
2804 setFeatureEnabledImpl(Features, "fsgsbase", true);
2805 setFeatureEnabledImpl(Features, "aes", true);
2806 setFeatureEnabledImpl(Features, "pclmul", true);
2807 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002808 setFeatureEnabledImpl(Features, "xsaveopt", true);
2809 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002810 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002811 break;
2812 case CK_K6_2:
2813 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002814 case CK_WinChip2:
2815 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002816 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002817 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002818 case CK_Athlon:
2819 case CK_AthlonThunderbird:
2820 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002821 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002822 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002823 case CK_Athlon4:
2824 case CK_AthlonXP:
2825 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002826 setFeatureEnabledImpl(Features, "sse", true);
2827 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002828 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002829 break;
2830 case CK_K8:
2831 case CK_Opteron:
2832 case CK_Athlon64:
2833 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002834 setFeatureEnabledImpl(Features, "sse2", true);
2835 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002836 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002837 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002838 case CK_AMDFAM10:
2839 setFeatureEnabledImpl(Features, "sse4a", true);
2840 setFeatureEnabledImpl(Features, "lzcnt", true);
2841 setFeatureEnabledImpl(Features, "popcnt", true);
2842 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002843 case CK_K8SSE3:
2844 case CK_OpteronSSE3:
2845 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002846 setFeatureEnabledImpl(Features, "sse3", true);
2847 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002848 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002849 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002850 case CK_BTVER2:
2851 setFeatureEnabledImpl(Features, "avx", true);
2852 setFeatureEnabledImpl(Features, "aes", true);
2853 setFeatureEnabledImpl(Features, "pclmul", true);
2854 setFeatureEnabledImpl(Features, "bmi", true);
2855 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002856 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002857 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002858 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002859 setFeatureEnabledImpl(Features, "ssse3", true);
2860 setFeatureEnabledImpl(Features, "sse4a", true);
2861 setFeatureEnabledImpl(Features, "lzcnt", true);
2862 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002863 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002864 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002865 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002866 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002867 case CK_BDVER4:
2868 setFeatureEnabledImpl(Features, "avx2", true);
2869 setFeatureEnabledImpl(Features, "bmi2", true);
2870 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002871 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002872 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002873 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002874 // FALLTHROUGH
2875 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002876 setFeatureEnabledImpl(Features, "bmi", true);
2877 setFeatureEnabledImpl(Features, "fma", true);
2878 setFeatureEnabledImpl(Features, "f16c", true);
2879 setFeatureEnabledImpl(Features, "tbm", true);
2880 // FALLTHROUGH
2881 case CK_BDVER1:
2882 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002883 setFeatureEnabledImpl(Features, "xop", true);
2884 setFeatureEnabledImpl(Features, "lzcnt", true);
2885 setFeatureEnabledImpl(Features, "aes", true);
2886 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002887 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002888 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002889 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002890 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002891 break;
Eli Friedman33465822011-07-08 23:31:17 +00002892 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002893 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2894 return false;
2895
2896 // Can't do this earlier because we need to be able to explicitly enable
2897 // or disable these features and the things that they depend upon.
2898
2899 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2900 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002901 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002902 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2903 FeaturesVec.end())
2904 Features["popcnt"] = true;
2905
2906 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2907 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002908 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002909 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2910 FeaturesVec.end())
2911 Features["prfchw"] = true;
2912
Eric Christophera7260af2015-10-08 20:10:18 +00002913 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2914 // then enable MMX.
2915 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002916 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002917 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2918 FeaturesVec.end())
2919 Features["mmx"] = true;
2920
Eric Christopherbbd746d2015-10-08 20:10:14 +00002921 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002922}
2923
Rafael Espindolae62e2792013-08-20 13:44:29 +00002924void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002925 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002926 if (Enabled) {
2927 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002928 case AVX512F:
2929 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002930 case AVX2:
2931 Features["avx2"] = true;
2932 case AVX:
2933 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002934 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002935 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002936 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002937 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002938 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002939 case SSSE3:
2940 Features["ssse3"] = true;
2941 case SSE3:
2942 Features["sse3"] = true;
2943 case SSE2:
2944 Features["sse2"] = true;
2945 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002946 Features["sse"] = true;
2947 case NoSSE:
2948 break;
2949 }
2950 return;
2951 }
2952
2953 switch (Level) {
2954 case NoSSE:
2955 case SSE1:
2956 Features["sse"] = false;
2957 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002958 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2959 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002960 case SSE3:
2961 Features["sse3"] = false;
2962 setXOPLevel(Features, NoXOP, false);
2963 case SSSE3:
2964 Features["ssse3"] = false;
2965 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002966 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002967 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002968 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002969 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002970 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2971 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002972 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002973 case AVX2:
2974 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002975 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002976 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002977 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00002978 Features["avx512vl"] = Features["avx512vbmi"] =
2979 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002980 }
2981}
2982
2983void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002984 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002985 if (Enabled) {
2986 switch (Level) {
2987 case AMD3DNowAthlon:
2988 Features["3dnowa"] = true;
2989 case AMD3DNow:
2990 Features["3dnow"] = true;
2991 case MMX:
2992 Features["mmx"] = true;
2993 case NoMMX3DNow:
2994 break;
2995 }
2996 return;
2997 }
2998
2999 switch (Level) {
3000 case NoMMX3DNow:
3001 case MMX:
3002 Features["mmx"] = false;
3003 case AMD3DNow:
3004 Features["3dnow"] = false;
3005 case AMD3DNowAthlon:
3006 Features["3dnowa"] = false;
3007 }
3008}
3009
3010void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003011 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003012 if (Enabled) {
3013 switch (Level) {
3014 case XOP:
3015 Features["xop"] = true;
3016 case FMA4:
3017 Features["fma4"] = true;
3018 setSSELevel(Features, AVX, true);
3019 case SSE4A:
3020 Features["sse4a"] = true;
3021 setSSELevel(Features, SSE3, true);
3022 case NoXOP:
3023 break;
3024 }
3025 return;
3026 }
3027
3028 switch (Level) {
3029 case NoXOP:
3030 case SSE4A:
3031 Features["sse4a"] = false;
3032 case FMA4:
3033 Features["fma4"] = false;
3034 case XOP:
3035 Features["xop"] = false;
3036 }
3037}
3038
Craig Topper86d79ef2013-09-17 04:51:29 +00003039void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3040 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003041 // This is a bit of a hack to deal with the sse4 target feature when used
3042 // as part of the target attribute. We handle sse4 correctly everywhere
3043 // else. See below for more information on how we handle the sse4 options.
3044 if (Name != "sse4")
3045 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003046
Craig Topper29561122013-09-19 01:13:07 +00003047 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003048 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003049 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003050 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003051 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003052 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003053 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003054 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003055 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003056 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003057 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003058 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003059 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003060 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003061 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003062 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003063 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003064 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003065 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003066 if (Enabled)
3067 setSSELevel(Features, SSE2, Enabled);
3068 } else if (Name == "pclmul") {
3069 if (Enabled)
3070 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003071 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003072 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003073 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003074 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003075 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003076 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003077 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3078 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3079 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003080 if (Enabled)
3081 setSSELevel(Features, AVX512F, Enabled);
3082 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003083 if (Enabled)
3084 setSSELevel(Features, AVX, Enabled);
3085 } else if (Name == "fma4") {
3086 setXOPLevel(Features, FMA4, Enabled);
3087 } else if (Name == "xop") {
3088 setXOPLevel(Features, XOP, Enabled);
3089 } else if (Name == "sse4a") {
3090 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003091 } else if (Name == "f16c") {
3092 if (Enabled)
3093 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003094 } else if (Name == "sha") {
3095 if (Enabled)
3096 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003097 } else if (Name == "sse4") {
3098 // We can get here via the __target__ attribute since that's not controlled
3099 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3100 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3101 // disabled.
3102 if (Enabled)
3103 setSSELevel(Features, SSE42, Enabled);
3104 else
3105 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003106 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003107 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003108 Features["xsaveopt"] = false;
3109 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003110 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003111 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003112 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003113}
3114
Eric Christopher3ff21b32013-10-16 21:26:26 +00003115/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003116/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003117bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003118 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003119 for (const auto &Feature : Features) {
3120 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003121 continue;
3122
Eric Christopher610fe112015-08-26 08:21:55 +00003123 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003124 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003125 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003126 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003127 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003128 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003129 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003130 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003131 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003132 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003133 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003134 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003135 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003136 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003137 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003138 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003139 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003140 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003141 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003142 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003143 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003144 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003145 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003146 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003147 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003148 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003149 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003150 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003151 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003152 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003153 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003154 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003155 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003156 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003157 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003158 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003159 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003160 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003161 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003162 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003163 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003164 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003165 } else if (Feature == "+avx512vbmi") {
3166 HasAVX512VBMI = true;
3167 } else if (Feature == "+avx512ifma") {
3168 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003169 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003170 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003171 } else if (Feature == "+mpx") {
3172 HasMPX = true;
3173 } else if (Feature == "+movbe") {
3174 HasMOVBE = true;
3175 } else if (Feature == "+sgx") {
3176 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003177 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003178 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003179 } else if (Feature == "+fxsr") {
3180 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003181 } else if (Feature == "+xsave") {
3182 HasXSAVE = true;
3183 } else if (Feature == "+xsaveopt") {
3184 HasXSAVEOPT = true;
3185 } else if (Feature == "+xsavec") {
3186 HasXSAVEC = true;
3187 } else if (Feature == "+xsaves") {
3188 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003189 } else if (Feature == "+pku") {
3190 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003191 } else if (Feature == "+clflushopt") {
3192 HasCLFLUSHOPT = true;
3193 } else if (Feature == "+pcommit") {
3194 HasPCOMMIT = true;
3195 } else if (Feature == "+clwb") {
3196 HasCLWB = true;
3197 } else if (Feature == "+umip") {
3198 HasUMIP = true;
3199 } else if (Feature == "+prefetchwt1") {
3200 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003201 }
3202
Benjamin Kramer27402c62012-03-05 15:10:44 +00003203 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003204 .Case("+avx512f", AVX512F)
3205 .Case("+avx2", AVX2)
3206 .Case("+avx", AVX)
3207 .Case("+sse4.2", SSE42)
3208 .Case("+sse4.1", SSE41)
3209 .Case("+ssse3", SSSE3)
3210 .Case("+sse3", SSE3)
3211 .Case("+sse2", SSE2)
3212 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003213 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003214 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003215
Eli Friedman33465822011-07-08 23:31:17 +00003216 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003217 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003218 .Case("+3dnowa", AMD3DNowAthlon)
3219 .Case("+3dnow", AMD3DNow)
3220 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003221 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003222 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003223
3224 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003225 .Case("+xop", XOP)
3226 .Case("+fma4", FMA4)
3227 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003228 .Default(NoXOP);
3229 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003230 }
Eli Friedman33465822011-07-08 23:31:17 +00003231
Rafael Espindolaeb265472013-08-21 21:59:03 +00003232 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3233 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003234 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3235 (FPMath == FP_387 && SSELevel >= SSE1)) {
3236 Diags.Report(diag::err_target_unsupported_fpmath) <<
3237 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003238 return false;
3239 }
3240
Alexey Bataev00396512015-07-02 03:40:19 +00003241 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003242 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003243 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003244}
Chris Lattnerecd49032009-03-02 22:27:17 +00003245
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003246/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3247/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003248void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003249 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003250 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003251 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003252 Builder.defineMacro("__amd64__");
3253 Builder.defineMacro("__amd64");
3254 Builder.defineMacro("__x86_64");
3255 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003256 if (getTriple().getArchName() == "x86_64h") {
3257 Builder.defineMacro("__x86_64h");
3258 Builder.defineMacro("__x86_64h__");
3259 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003260 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003261 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003262 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003263
Chris Lattnerecd49032009-03-02 22:27:17 +00003264 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003265 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3266 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003267 switch (CPU) {
3268 case CK_Generic:
3269 break;
3270 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003271 // The rest are coming from the i386 define above.
3272 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003273 break;
3274 case CK_i486:
3275 case CK_WinChipC6:
3276 case CK_WinChip2:
3277 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003278 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003279 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003280 case CK_PentiumMMX:
3281 Builder.defineMacro("__pentium_mmx__");
3282 Builder.defineMacro("__tune_pentium_mmx__");
3283 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003284 case CK_i586:
3285 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003286 defineCPUMacros(Builder, "i586");
3287 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003288 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003289 case CK_Pentium3:
3290 case CK_Pentium3M:
3291 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003292 Builder.defineMacro("__tune_pentium3__");
3293 // Fallthrough
3294 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003295 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003296 Builder.defineMacro("__tune_pentium2__");
3297 // Fallthrough
3298 case CK_PentiumPro:
3299 Builder.defineMacro("__tune_i686__");
3300 Builder.defineMacro("__tune_pentiumpro__");
3301 // Fallthrough
3302 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003303 Builder.defineMacro("__i686");
3304 Builder.defineMacro("__i686__");
3305 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3306 Builder.defineMacro("__pentiumpro");
3307 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003308 break;
3309 case CK_Pentium4:
3310 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003311 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003312 break;
3313 case CK_Yonah:
3314 case CK_Prescott:
3315 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003316 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003317 break;
3318 case CK_Core2:
3319 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003320 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003321 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003322 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003323 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003324 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003325 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003326 defineCPUMacros(Builder, "slm");
3327 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003328 case CK_Nehalem:
3329 case CK_Westmere:
3330 case CK_SandyBridge:
3331 case CK_IvyBridge:
3332 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003333 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003334 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003335 // FIXME: Historically, we defined this legacy name, it would be nice to
3336 // remove it at some point. We've never exposed fine-grained names for
3337 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003338 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003339 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003340 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003341 defineCPUMacros(Builder, "skx");
3342 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003343 case CK_Cannonlake:
3344 break;
Craig Topper449314e2013-08-20 07:09:39 +00003345 case CK_KNL:
3346 defineCPUMacros(Builder, "knl");
3347 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003348 case CK_Lakemont:
3349 Builder.defineMacro("__tune_lakemont__");
3350 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003351 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003352 Builder.defineMacro("__k6_2__");
3353 Builder.defineMacro("__tune_k6_2__");
3354 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003355 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003356 if (CPU != CK_K6_2) { // In case of fallthrough
3357 // FIXME: GCC may be enabling these in cases where some other k6
3358 // architecture is specified but -m3dnow is explicitly provided. The
3359 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003360 Builder.defineMacro("__k6_3__");
3361 Builder.defineMacro("__tune_k6_3__");
3362 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003363 // Fallthrough
3364 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003365 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003366 break;
3367 case CK_Athlon:
3368 case CK_AthlonThunderbird:
3369 case CK_Athlon4:
3370 case CK_AthlonXP:
3371 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003372 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003373 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003374 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003375 Builder.defineMacro("__tune_athlon_sse__");
3376 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003377 break;
3378 case CK_K8:
3379 case CK_K8SSE3:
3380 case CK_x86_64:
3381 case CK_Opteron:
3382 case CK_OpteronSSE3:
3383 case CK_Athlon64:
3384 case CK_Athlon64SSE3:
3385 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003386 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003387 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003388 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003389 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003390 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003391 case CK_BTVER1:
3392 defineCPUMacros(Builder, "btver1");
3393 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003394 case CK_BTVER2:
3395 defineCPUMacros(Builder, "btver2");
3396 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003397 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003398 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003399 break;
3400 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003401 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003402 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003403 case CK_BDVER3:
3404 defineCPUMacros(Builder, "bdver3");
3405 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003406 case CK_BDVER4:
3407 defineCPUMacros(Builder, "bdver4");
3408 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003409 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003410 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003411 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003412 }
Chris Lattner96e43572009-03-02 22:40:39 +00003413
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003414 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003415 Builder.defineMacro("__REGISTER_PREFIX__", "");
3416
Chris Lattner6df41af2009-04-19 17:32:33 +00003417 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3418 // functions in glibc header files that use FP Stack inline asm which the
3419 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003420 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003421
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003422 if (HasAES)
3423 Builder.defineMacro("__AES__");
3424
Craig Topper3f122a72012-05-31 05:18:48 +00003425 if (HasPCLMUL)
3426 Builder.defineMacro("__PCLMUL__");
3427
Craig Topper22967d42011-12-25 05:06:45 +00003428 if (HasLZCNT)
3429 Builder.defineMacro("__LZCNT__");
3430
Benjamin Kramer1e250392012-07-07 09:39:18 +00003431 if (HasRDRND)
3432 Builder.defineMacro("__RDRND__");
3433
Craig Topper8c7f2512014-11-03 06:51:41 +00003434 if (HasFSGSBASE)
3435 Builder.defineMacro("__FSGSBASE__");
3436
Craig Topper22967d42011-12-25 05:06:45 +00003437 if (HasBMI)
3438 Builder.defineMacro("__BMI__");
3439
3440 if (HasBMI2)
3441 Builder.defineMacro("__BMI2__");
3442
Craig Topper1de83482011-12-29 16:10:46 +00003443 if (HasPOPCNT)
3444 Builder.defineMacro("__POPCNT__");
3445
Michael Liao625a8752012-11-10 05:17:46 +00003446 if (HasRTM)
3447 Builder.defineMacro("__RTM__");
3448
Michael Liao74f4eaf2013-03-26 17:52:08 +00003449 if (HasPRFCHW)
3450 Builder.defineMacro("__PRFCHW__");
3451
Michael Liaoffaae352013-03-29 05:17:55 +00003452 if (HasRDSEED)
3453 Builder.defineMacro("__RDSEED__");
3454
Robert Khasanov50e6f582014-09-19 09:53:48 +00003455 if (HasADX)
3456 Builder.defineMacro("__ADX__");
3457
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003458 if (HasTBM)
3459 Builder.defineMacro("__TBM__");
3460
Rafael Espindolae62e2792013-08-20 13:44:29 +00003461 switch (XOPLevel) {
3462 case XOP:
3463 Builder.defineMacro("__XOP__");
3464 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003465 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003466 case SSE4A:
3467 Builder.defineMacro("__SSE4A__");
3468 case NoXOP:
3469 break;
3470 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003471
Craig Topperbba778b2012-06-03 21:46:30 +00003472 if (HasFMA)
3473 Builder.defineMacro("__FMA__");
3474
Manman Rena45358c2012-10-11 00:59:55 +00003475 if (HasF16C)
3476 Builder.defineMacro("__F16C__");
3477
Craig Topper679b53a2013-08-21 05:29:10 +00003478 if (HasAVX512CD)
3479 Builder.defineMacro("__AVX512CD__");
3480 if (HasAVX512ER)
3481 Builder.defineMacro("__AVX512ER__");
3482 if (HasAVX512PF)
3483 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003484 if (HasAVX512DQ)
3485 Builder.defineMacro("__AVX512DQ__");
3486 if (HasAVX512BW)
3487 Builder.defineMacro("__AVX512BW__");
3488 if (HasAVX512VL)
3489 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003490 if (HasAVX512VBMI)
3491 Builder.defineMacro("__AVX512VBMI__");
3492 if (HasAVX512IFMA)
3493 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003494
Ben Langmuir58078d02013-09-19 13:22:04 +00003495 if (HasSHA)
3496 Builder.defineMacro("__SHA__");
3497
Craig Toppere33f51f2015-10-16 06:22:36 +00003498 if (HasFXSR)
3499 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003500 if (HasXSAVE)
3501 Builder.defineMacro("__XSAVE__");
3502 if (HasXSAVEOPT)
3503 Builder.defineMacro("__XSAVEOPT__");
3504 if (HasXSAVEC)
3505 Builder.defineMacro("__XSAVEC__");
3506 if (HasXSAVES)
3507 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003508 if (HasPKU)
3509 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003510 if (HasCX16)
3511 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3512
Chris Lattner96e43572009-03-02 22:40:39 +00003513 // Each case falls through to the previous one here.
3514 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003515 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003516 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003517 case AVX2:
3518 Builder.defineMacro("__AVX2__");
3519 case AVX:
3520 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003521 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003522 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003523 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003524 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003525 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003526 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003527 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003528 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003529 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003530 Builder.defineMacro("__SSE2__");
3531 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003532 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003533 Builder.defineMacro("__SSE__");
3534 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003535 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003536 break;
3537 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003538
Derek Schuffc7dd7222012-10-11 15:52:22 +00003539 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003540 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003541 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003542 case AVX2:
3543 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003544 case SSE42:
3545 case SSE41:
3546 case SSSE3:
3547 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003548 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003549 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003550 break;
3551 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003552 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003553 break;
3554 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003555 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003556 }
3557 }
3558
Anders Carlssone437c682010-01-27 03:47:49 +00003559 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003560 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003561 case AMD3DNowAthlon:
3562 Builder.defineMacro("__3dNOW_A__");
3563 case AMD3DNow:
3564 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003565 case MMX:
3566 Builder.defineMacro("__MMX__");
3567 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003568 break;
3569 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003570
3571 if (CPU >= CK_i486) {
3572 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3573 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3574 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3575 }
3576 if (CPU >= CK_i586)
3577 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003578}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003579
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003580bool X86TargetInfo::hasFeature(StringRef Feature) const {
3581 return llvm::StringSwitch<bool>(Feature)
3582 .Case("aes", HasAES)
3583 .Case("avx", SSELevel >= AVX)
3584 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003585 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003586 .Case("avx512cd", HasAVX512CD)
3587 .Case("avx512er", HasAVX512ER)
3588 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003589 .Case("avx512dq", HasAVX512DQ)
3590 .Case("avx512bw", HasAVX512BW)
3591 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003592 .Case("avx512vbmi", HasAVX512VBMI)
3593 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003594 .Case("bmi", HasBMI)
3595 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003596 .Case("clflushopt", HasCLFLUSHOPT)
3597 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003598 .Case("cx16", HasCX16)
3599 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003600 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003601 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003602 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003603 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003604 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003605 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3606 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3607 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003608 .Case("movbe", HasMOVBE)
3609 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003610 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003611 .Case("pcommit", HasPCOMMIT)
3612 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003613 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003614 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003615 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003616 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003617 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003618 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003619 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003620 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003621 .Case("sse", SSELevel >= SSE1)
3622 .Case("sse2", SSELevel >= SSE2)
3623 .Case("sse3", SSELevel >= SSE3)
3624 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003625 .Case("sse4.1", SSELevel >= SSE41)
3626 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003627 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003628 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003629 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003630 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003631 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3632 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003633 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003634 .Case("xsave", HasXSAVE)
3635 .Case("xsavec", HasXSAVEC)
3636 .Case("xsaves", HasXSAVES)
3637 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003638 .Default(false);
3639}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003640
Eric Christopherd9832702015-06-29 21:00:05 +00003641// We can't use a generic validation scheme for the features accepted here
3642// versus subtarget features accepted in the target attribute because the
3643// bitfield structure that's initialized in the runtime only supports the
3644// below currently rather than the full range of subtarget features. (See
3645// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3646bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3647 return llvm::StringSwitch<bool>(FeatureStr)
3648 .Case("cmov", true)
3649 .Case("mmx", true)
3650 .Case("popcnt", true)
3651 .Case("sse", true)
3652 .Case("sse2", true)
3653 .Case("sse3", true)
3654 .Case("sse4.1", true)
3655 .Case("sse4.2", true)
3656 .Case("avx", true)
3657 .Case("avx2", true)
3658 .Case("sse4a", true)
3659 .Case("fma4", true)
3660 .Case("xop", true)
3661 .Case("fma", true)
3662 .Case("avx512f", true)
3663 .Case("bmi", true)
3664 .Case("bmi2", true)
3665 .Default(false);
3666}
3667
Eli Friedman3fd920a2008-08-20 02:34:37 +00003668bool
Anders Carlsson58436352009-02-28 17:11:49 +00003669X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003670 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003671 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003672 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003673 // Constant constraints.
3674 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3675 // instructions.
3676 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3677 // x86_64 instructions.
3678 case 's':
3679 Info.setRequiresImmediate();
3680 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003681 case 'I':
3682 Info.setRequiresImmediate(0, 31);
3683 return true;
3684 case 'J':
3685 Info.setRequiresImmediate(0, 63);
3686 return true;
3687 case 'K':
3688 Info.setRequiresImmediate(-128, 127);
3689 return true;
3690 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003691 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003692 return true;
3693 case 'M':
3694 Info.setRequiresImmediate(0, 3);
3695 return true;
3696 case 'N':
3697 Info.setRequiresImmediate(0, 255);
3698 return true;
3699 case 'O':
3700 Info.setRequiresImmediate(0, 127);
3701 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003702 // Register constraints.
3703 case 'Y': // 'Y' is the first character for several 2-character constraints.
3704 // Shift the pointer to the second character of the constraint.
3705 Name++;
3706 switch (*Name) {
3707 default:
3708 return false;
3709 case '0': // First SSE register.
3710 case 't': // Any SSE register, when SSE2 is enabled.
3711 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3712 case 'm': // Any MMX register, when inter-unit moves enabled.
3713 Info.setAllowsRegister();
3714 return true;
3715 }
3716 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003717 // Constraint 'f' cannot be used for output operands.
3718 if (Info.ConstraintStr[0] == '=')
3719 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003720 Info.setAllowsRegister();
3721 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003722 case 'a': // eax.
3723 case 'b': // ebx.
3724 case 'c': // ecx.
3725 case 'd': // edx.
3726 case 'S': // esi.
3727 case 'D': // edi.
3728 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003729 case 't': // Top of floating point stack.
3730 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003731 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003732 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003733 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003734 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003735 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3736 case 'l': // "Index" registers: any general register that can be used as an
3737 // index in a base+index memory access.
3738 Info.setAllowsRegister();
3739 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003740 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003741 case 'C': // SSE floating point constant.
3742 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003743 return true;
3744 }
3745}
3746
Akira Hatanaka974131e2014-09-18 18:17:18 +00003747bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3748 unsigned Size) const {
3749 // Strip off constraint modifiers.
3750 while (Constraint[0] == '=' ||
3751 Constraint[0] == '+' ||
3752 Constraint[0] == '&')
3753 Constraint = Constraint.substr(1);
3754
3755 return validateOperandSize(Constraint, Size);
3756}
3757
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003758bool X86TargetInfo::validateInputSize(StringRef Constraint,
3759 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003760 return validateOperandSize(Constraint, Size);
3761}
3762
3763bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3764 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003765 switch (Constraint[0]) {
3766 default: break;
3767 case 'y':
3768 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003769 case 'f':
3770 case 't':
3771 case 'u':
3772 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003773 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003774 if (SSELevel >= AVX512F)
3775 // 512-bit zmm registers can be used if target supports AVX512F.
3776 return Size <= 512U;
3777 else if (SSELevel >= AVX)
3778 // 256-bit ymm registers can be used if target supports AVX.
3779 return Size <= 256U;
3780 return Size <= 128U;
3781 case 'Y':
3782 // 'Y' is the first character for several 2-character constraints.
3783 switch (Constraint[1]) {
3784 default: break;
3785 case 'm':
3786 // 'Ym' is synonymous with 'y'.
3787 return Size <= 64;
3788 case 'i':
3789 case 't':
3790 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3791 if (SSELevel >= AVX512F)
3792 return Size <= 512U;
3793 else if (SSELevel >= AVX)
3794 return Size <= 256U;
3795 return SSELevel >= SSE2 && Size <= 128U;
3796 }
3797
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003798 }
3799
3800 return true;
3801}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003802
Eli Friedman3fd920a2008-08-20 02:34:37 +00003803std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003804X86TargetInfo::convertConstraint(const char *&Constraint) const {
3805 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003806 case 'a': return std::string("{ax}");
3807 case 'b': return std::string("{bx}");
3808 case 'c': return std::string("{cx}");
3809 case 'd': return std::string("{dx}");
3810 case 'S': return std::string("{si}");
3811 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003812 case 'p': // address
3813 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003814 case 't': // top of floating point stack.
3815 return std::string("{st}");
3816 case 'u': // second from top of floating point stack.
3817 return std::string("{st(1)}"); // second from top of floating point stack.
3818 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003819 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003820 }
3821}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003822
Eli Friedman3fd920a2008-08-20 02:34:37 +00003823// X86-32 generic target
3824class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003825public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003826 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3827 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003828 DoubleAlign = LongLongAlign = 32;
3829 LongDoubleWidth = 96;
3830 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003831 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003832 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003833 SizeType = UnsignedInt;
3834 PtrDiffType = SignedInt;
3835 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003836 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003837
3838 // Use fpret for all types.
3839 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3840 (1 << TargetInfo::Double) |
3841 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003842
3843 // x86-32 has atomics up to 8 bytes
3844 // FIXME: Check that we actually have cmpxchg8b before setting
3845 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3846 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003847 }
Craig Topper3164f332014-03-11 03:39:26 +00003848 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003849 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003850 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003851
Craig Topper3164f332014-03-11 03:39:26 +00003852 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003853 if (RegNo == 0) return 0;
3854 if (RegNo == 1) return 2;
3855 return -1;
3856 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003857 bool validateOperandSize(StringRef Constraint,
3858 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003859 switch (Constraint[0]) {
3860 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003861 case 'R':
3862 case 'q':
3863 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003864 case 'a':
3865 case 'b':
3866 case 'c':
3867 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003868 case 'S':
3869 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003870 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003871 case 'A':
3872 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003873 }
3874
Akira Hatanaka974131e2014-09-18 18:17:18 +00003875 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003876 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003877};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003878
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003879class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3880public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003881 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3882 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003883
Craig Topper3164f332014-03-11 03:39:26 +00003884 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003885 unsigned Major, Minor, Micro;
3886 getTriple().getOSVersion(Major, Minor, Micro);
3887 // New NetBSD uses the default rounding mode.
3888 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3889 return X86_32TargetInfo::getFloatEvalMethod();
3890 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003891 return 1;
3892 }
3893};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003894
Eli Friedmane3aa4542009-07-05 18:47:56 +00003895class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3896public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003897 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3898 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003899 SizeType = UnsignedLong;
3900 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003901 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003902 }
3903};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003904
Eli Friedman9fa28852012-08-08 23:57:20 +00003905class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3906public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003907 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3908 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003909 SizeType = UnsignedLong;
3910 IntPtrType = SignedLong;
3911 PtrDiffType = SignedLong;
3912 }
3913};
Eli Friedman9fa28852012-08-08 23:57:20 +00003914
Torok Edwinb2b37c62009-06-30 17:10:35 +00003915class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003916public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003917 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3918 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003919 LongDoubleWidth = 128;
3920 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003921 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003922 MaxVectorAlign = 256;
3923 // The watchOS simulator uses the builtin bool type for Objective-C.
3924 llvm::Triple T = llvm::Triple(Triple);
3925 if (T.isWatchOS())
3926 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003927 SizeType = UnsignedLong;
3928 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00003929 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00003930 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003931 }
3932
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003933 bool handleTargetFeatures(std::vector<std::string> &Features,
3934 DiagnosticsEngine &Diags) override {
3935 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3936 Diags))
3937 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003938 // We now know the features we have: we can decide how to align vectors.
3939 MaxVectorAlign =
3940 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003941 return true;
3942 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003943};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003944
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003945// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003946class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003947public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003948 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3949 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003950 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003951 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003952 bool IsWinCOFF =
3953 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00003954 resetDataLayout(IsWinCOFF
3955 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3956 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003957 }
Craig Topper3164f332014-03-11 03:39:26 +00003958 void getTargetDefines(const LangOptions &Opts,
3959 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003960 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3961 }
3962};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003963
3964// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003965class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003966public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003967 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
3968 const TargetOptions &Opts)
3969 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00003970 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003971 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3972 }
Craig Topper3164f332014-03-11 03:39:26 +00003973 void getTargetDefines(const LangOptions &Opts,
3974 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003975 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3976 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3977 // The value of the following reflects processor type.
3978 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3979 // We lost the original triple, so we use the default.
3980 Builder.defineMacro("_M_IX86", "600");
3981 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003982};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003983
David Majnemerae1ed0e2015-05-28 04:36:18 +00003984static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003985 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3986 // supports __declspec natively under -fms-extensions, but we define a no-op
3987 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003988 if (Opts.MicrosoftExt)
3989 Builder.defineMacro("__declspec", "__declspec");
3990 else
3991 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3992
3993 if (!Opts.MicrosoftExt) {
3994 // Provide macros for all the calling convention keywords. Provide both
3995 // single and double underscore prefixed variants. These are available on
3996 // x64 as well as x86, even though they have no effect.
3997 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3998 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003999 std::string GCCSpelling = "__attribute__((__";
4000 GCCSpelling += CC;
4001 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004002 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4003 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4004 }
4005 }
4006}
4007
David Majnemerae1ed0e2015-05-28 04:36:18 +00004008static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4009 Builder.defineMacro("__MSVCRT__");
4010 Builder.defineMacro("__MINGW32__");
4011 addCygMingDefines(Opts, Builder);
4012}
4013
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004014// x86-32 MinGW target
4015class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4016public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004017 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4018 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004019 void getTargetDefines(const LangOptions &Opts,
4020 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004021 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004022 DefineStd(Builder, "WIN32", Opts);
4023 DefineStd(Builder, "WINNT", Opts);
4024 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004025 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004026 }
4027};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004028
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004029// x86-32 Cygwin target
4030class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4031public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004032 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4033 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004034 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004035 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004036 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 +00004037 }
Craig Topper3164f332014-03-11 03:39:26 +00004038 void getTargetDefines(const LangOptions &Opts,
4039 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004040 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004041 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004042 Builder.defineMacro("__CYGWIN__");
4043 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004044 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004045 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004046 if (Opts.CPlusPlus)
4047 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004048 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004049};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004050
Chris Lattnerb986aba2010-04-11 19:29:39 +00004051// x86-32 Haiku target
4052class HaikuX86_32TargetInfo : public X86_32TargetInfo {
4053public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004054 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4055 : X86_32TargetInfo(Triple, Opts) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004056 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00004057 IntPtrType = SignedLong;
4058 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00004059 ProcessIDType = SignedLong;
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00004060 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00004061 }
Craig Topper3164f332014-03-11 03:39:26 +00004062 void getTargetDefines(const LangOptions &Opts,
4063 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004064 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4065 Builder.defineMacro("__INTEL__");
4066 Builder.defineMacro("__HAIKU__");
4067 }
4068};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004069
Alexey Bataevc99b0492015-11-25 09:24:26 +00004070// X86-32 MCU target
4071class MCUX86_32TargetInfo : public X86_32TargetInfo {
4072public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004073 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4074 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004075 LongDoubleWidth = 64;
4076 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004077 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 +00004078 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004079 }
4080
4081 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4082 // On MCU we support only C calling convention.
4083 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4084 }
4085
4086 void getTargetDefines(const LangOptions &Opts,
4087 MacroBuilder &Builder) const override {
4088 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4089 Builder.defineMacro("__iamcu");
4090 Builder.defineMacro("__iamcu__");
4091 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004092
4093 bool allowsLargerPreferedTypeAlignment() const override {
4094 return false;
4095 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004096};
4097
Douglas Gregor9fabd852011-07-01 22:41:14 +00004098// RTEMS Target
4099template<typename Target>
4100class RTEMSTargetInfo : public OSTargetInfo<Target> {
4101protected:
Craig Topper3164f332014-03-11 03:39:26 +00004102 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4103 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004104 // RTEMS defines; list based off of gcc output
4105
Douglas Gregor9fabd852011-07-01 22:41:14 +00004106 Builder.defineMacro("__rtems__");
4107 Builder.defineMacro("__ELF__");
4108 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004109
Douglas Gregor9fabd852011-07-01 22:41:14 +00004110public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004111 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4112 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004113 switch (Triple.getArch()) {
4114 default:
4115 case llvm::Triple::x86:
4116 // this->MCountName = ".mcount";
4117 break;
4118 case llvm::Triple::mips:
4119 case llvm::Triple::mipsel:
4120 case llvm::Triple::ppc:
4121 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004122 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004123 // this->MCountName = "_mcount";
4124 break;
4125 case llvm::Triple::arm:
4126 // this->MCountName = "__mcount";
4127 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004128 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004129 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004130};
4131
Douglas Gregor9fabd852011-07-01 22:41:14 +00004132// x86-32 RTEMS target
4133class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4134public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004135 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4136 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004137 SizeType = UnsignedLong;
4138 IntPtrType = SignedLong;
4139 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004140 }
Craig Topper3164f332014-03-11 03:39:26 +00004141 void getTargetDefines(const LangOptions &Opts,
4142 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004143 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4144 Builder.defineMacro("__INTEL__");
4145 Builder.defineMacro("__rtems__");
4146 }
4147};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004148
Eli Friedman3fd920a2008-08-20 02:34:37 +00004149// x86-64 generic target
4150class X86_64TargetInfo : public X86TargetInfo {
4151public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004152 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4153 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004154 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004155 bool IsWinCOFF =
4156 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004157 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004158 LongDoubleWidth = 128;
4159 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004160 LargeArrayMinWidth = 128;
4161 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004162 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004163 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4164 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4165 IntPtrType = IsX32 ? SignedInt : SignedLong;
4166 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004167 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004168 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004169
Eric Christopher917e9522014-11-18 22:36:15 +00004170 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004171 resetDataLayout(IsX32
4172 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4173 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4174 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004175
4176 // Use fpret only for long double.
4177 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004178
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004179 // Use fp2ret for _Complex long double.
4180 ComplexLongDoubleUsesFP2Ret = true;
4181
Charles Davisc7d5c942015-09-17 20:55:33 +00004182 // Make __builtin_ms_va_list available.
4183 HasBuiltinMSVaList = true;
4184
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004185 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004186 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004187 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004188 }
Craig Topper3164f332014-03-11 03:39:26 +00004189 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004190 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004191 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004192
Craig Topper3164f332014-03-11 03:39:26 +00004193 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004194 if (RegNo == 0) return 0;
4195 if (RegNo == 1) return 1;
4196 return -1;
4197 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004198
Craig Topper3164f332014-03-11 03:39:26 +00004199 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004200 switch (CC) {
4201 case CC_C:
4202 case CC_Swift:
4203 case CC_X86VectorCall:
4204 case CC_IntelOclBicc:
4205 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004206 case CC_PreserveMost:
4207 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004208 return CCCR_OK;
4209 default:
4210 return CCCR_Warning;
4211 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004212 }
4213
Craig Topper3164f332014-03-11 03:39:26 +00004214 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004215 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004216 }
4217
Pavel Chupinfd223e12014-08-04 12:39:43 +00004218 // for x32 we need it here explicitly
4219 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004220 unsigned getUnwindWordWidth() const override { return 64; }
4221 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004222
4223 bool validateGlobalRegisterVariable(StringRef RegName,
4224 unsigned RegSize,
4225 bool &HasSizeMismatch) const override {
4226 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4227 // handle.
4228 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4229 // Check that the register size is 64-bit.
4230 HasSizeMismatch = RegSize != 64;
4231 return true;
4232 }
4233
4234 // Check if the register is a 32-bit register the backend can handle.
4235 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4236 HasSizeMismatch);
4237 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004238};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004239
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004240// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004241class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004242public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004243 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4244 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004245 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004246 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004247 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004248 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004249 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004250 SizeType = UnsignedLongLong;
4251 PtrDiffType = SignedLongLong;
4252 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004253 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004254
Craig Topper3164f332014-03-11 03:39:26 +00004255 void getTargetDefines(const LangOptions &Opts,
4256 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004257 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004258 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004259 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004260
Craig Topper3164f332014-03-11 03:39:26 +00004261 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004262 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004263 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004264
Craig Topper3164f332014-03-11 03:39:26 +00004265 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004266 switch (CC) {
4267 case CC_X86StdCall:
4268 case CC_X86ThisCall:
4269 case CC_X86FastCall:
4270 return CCCR_Ignore;
4271 case CC_C:
4272 case CC_X86VectorCall:
4273 case CC_IntelOclBicc:
4274 case CC_X86_64SysV:
4275 return CCCR_OK;
4276 default:
4277 return CCCR_Warning;
4278 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004279 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004280};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004281
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004282// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004283class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004284public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004285 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4286 const TargetOptions &Opts)
4287 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004288 LongDoubleWidth = LongDoubleAlign = 64;
4289 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004290 }
Craig Topper3164f332014-03-11 03:39:26 +00004291 void getTargetDefines(const LangOptions &Opts,
4292 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004293 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4294 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004295 Builder.defineMacro("_M_X64", "100");
4296 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004297 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004298};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004299
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004300// x86-64 MinGW target
4301class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4302public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004303 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4304 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004305 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4306 // with x86 FP ops. Weird.
4307 LongDoubleWidth = LongDoubleAlign = 128;
4308 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4309 }
4310
Craig Topper3164f332014-03-11 03:39:26 +00004311 void getTargetDefines(const LangOptions &Opts,
4312 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004313 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004314 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004315 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004316 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004317
4318 // GCC defines this macro when it is using __gxx_personality_seh0.
4319 if (!Opts.SjLjExceptions)
4320 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004321 }
4322};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004323
Yaron Kerend030d112015-07-22 17:38:19 +00004324// x86-64 Cygwin target
4325class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4326public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004327 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4328 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004329 TLSSupported = false;
4330 WCharType = UnsignedShort;
4331 }
4332 void getTargetDefines(const LangOptions &Opts,
4333 MacroBuilder &Builder) const override {
4334 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4335 Builder.defineMacro("__x86_64__");
4336 Builder.defineMacro("__CYGWIN__");
4337 Builder.defineMacro("__CYGWIN64__");
4338 addCygMingDefines(Opts, Builder);
4339 DefineStd(Builder, "unix", Opts);
4340 if (Opts.CPlusPlus)
4341 Builder.defineMacro("_GNU_SOURCE");
4342
4343 // GCC defines this macro when it is using __gxx_personality_seh0.
4344 if (!Opts.SjLjExceptions)
4345 Builder.defineMacro("__SEH__");
4346 }
4347};
4348
Eli Friedman2857ccb2009-07-01 03:36:11 +00004349class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4350public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004351 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4352 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004353 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004354 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4355 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004356 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004357 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004358 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004359 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004360
4361 bool handleTargetFeatures(std::vector<std::string> &Features,
4362 DiagnosticsEngine &Diags) override {
4363 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4364 Diags))
4365 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004366 // We now know the features we have: we can decide how to align vectors.
4367 MaxVectorAlign =
4368 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004369 return true;
4370 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004371};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004372
Eli Friedman245f2292009-07-05 22:31:18 +00004373class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4374public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004375 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4376 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004377 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004378 Int64Type = SignedLongLong;
4379 }
4380};
Eli Friedman245f2292009-07-05 22:31:18 +00004381
Eli Friedman9fa28852012-08-08 23:57:20 +00004382class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4383public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004384 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4385 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004386 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004387 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004388 }
4389};
Tim Northover9bb857a2013-01-31 12:13:10 +00004390
Eli Friedmanf05b7722008-08-20 07:44:10 +00004391class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004392 // Possible FPU choices.
4393 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004394 VFP2FPU = (1 << 0),
4395 VFP3FPU = (1 << 1),
4396 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004397 NeonFPU = (1 << 3),
4398 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004399 };
4400
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004401 // Possible HWDiv features.
4402 enum HWDivMode {
4403 HWDivThumb = (1 << 0),
4404 HWDivARM = (1 << 1)
4405 };
4406
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004407 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004408 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004409 }
4410
4411 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4412 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004413
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004414 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004415
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004416 StringRef CPUProfile;
4417 StringRef CPUAttr;
4418
Rafael Espindolaeb265472013-08-21 21:59:03 +00004419 enum {
4420 FP_Default,
4421 FP_VFP,
4422 FP_Neon
4423 } FPMath;
4424
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004425 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004426 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004427 unsigned ArchProfile;
4428 unsigned ArchVersion;
4429
Bernard Ogdenda13af32013-10-24 18:32:51 +00004430 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004431
Logan Chien57086ce2012-10-10 06:56:20 +00004432 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004433 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004434
4435 // Initialized via features.
4436 unsigned SoftFloat : 1;
4437 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004438
Bernard Ogden18b57012013-10-29 09:47:51 +00004439 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004440 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004441 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004442 unsigned Unaligned : 1;
4443
4444 enum {
4445 LDREX_B = (1 << 0), /// byte (8-bit)
4446 LDREX_H = (1 << 1), /// half (16-bit)
4447 LDREX_W = (1 << 2), /// word (32-bit)
4448 LDREX_D = (1 << 3), /// double (64-bit)
4449 };
4450
4451 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004452
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004453 // ACLE 6.5.1 Hardware floating point
4454 enum {
4455 HW_FP_HP = (1 << 1), /// half (16-bit)
4456 HW_FP_SP = (1 << 2), /// single (32-bit)
4457 HW_FP_DP = (1 << 3), /// double (64-bit)
4458 };
4459 uint32_t HW_FP;
4460
Chris Lattner5cc15e02010-03-03 19:03:45 +00004461 static const Builtin::Info BuiltinInfo[];
4462
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004463 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004464 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004465
4466 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004467 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004468
Renato Golin9ba39232015-02-27 16:35:48 +00004469 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4470 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4471 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004472 SizeType = UnsignedLong;
4473 else
4474 SizeType = UnsignedInt;
4475
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004476 switch (T.getOS()) {
4477 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004478 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004479 break;
4480 case llvm::Triple::Win32:
4481 WCharType = UnsignedShort;
4482 break;
4483 case llvm::Triple::Linux:
4484 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004485 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4486 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004487 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004488 }
4489
4490 UseBitFieldTypeAlignment = true;
4491
4492 ZeroLengthBitfieldBoundary = 0;
4493
Tim Northover147cd2f2014-10-14 22:12:21 +00004494 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4495 // so set preferred for small types to 32.
4496 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004497 resetDataLayout(BigEndian
4498 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4499 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004500 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004501 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004502 resetDataLayout("e"
4503 "-m:w"
4504 "-p:32:32"
4505 "-i64:64"
4506 "-v128:64:128"
4507 "-a:0:32"
4508 "-n32"
4509 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004510 } else if (T.isOSNaCl()) {
4511 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004512 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004513 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004514 resetDataLayout(BigEndian
4515 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4516 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004517 }
4518
4519 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004520 }
4521
Tim Northover5627d392015-10-30 16:30:45 +00004522 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004523 const llvm::Triple &T = getTriple();
4524
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004525 IsAAPCS = false;
4526
Tim Northover5627d392015-10-30 16:30:45 +00004527 if (IsAAPCS16)
4528 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4529 else
4530 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004531
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004532 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004533 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004534 SizeType = UnsignedInt;
4535 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004536 SizeType = UnsignedLong;
4537
4538 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4539 WCharType = SignedInt;
4540
4541 // Do not respect the alignment of bit-field types when laying out
4542 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4543 UseBitFieldTypeAlignment = false;
4544
4545 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4546 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4547 /// gcc.
4548 ZeroLengthBitfieldBoundary = 32;
4549
Tim Northover5627d392015-10-30 16:30:45 +00004550 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4551 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004552 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004553 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004554 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004555 BigEndian
4556 ? "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 +00004557 : "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 +00004558 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004559 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004560 BigEndian
4561 ? "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 +00004562 : "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 +00004563
4564 // FIXME: Override "preferred align" for double and long long.
4565 }
4566
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004567 void setArchInfo() {
4568 StringRef ArchName = getTriple().getArchName();
4569
Renato Goline84b0002015-10-08 16:43:26 +00004570 ArchISA = llvm::ARM::parseArchISA(ArchName);
4571 CPU = llvm::ARM::getDefaultCPU(ArchName);
4572 unsigned AK = llvm::ARM::parseArch(ArchName);
4573 if (AK != llvm::ARM::AK_INVALID)
4574 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004575 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004576 }
4577
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004578 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004579 StringRef SubArch;
4580
4581 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004582 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004583 SubArch = llvm::ARM::getSubArch(ArchKind);
4584 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4585 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004586
4587 // cache CPU related strings
4588 CPUAttr = getCPUAttr();
4589 CPUProfile = getCPUProfile();
4590 }
4591
4592 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004593 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004594 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004595 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004596 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4597 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004598 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004599 if (ArchProfile == llvm::ARM::PK_M) {
4600 MaxAtomicPromoteWidth = 32;
4601 if (ShouldUseInlineAtomic)
4602 MaxAtomicInlineWidth = 32;
4603 }
4604 else {
4605 MaxAtomicPromoteWidth = 64;
4606 if (ShouldUseInlineAtomic)
4607 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004608 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004609 }
4610
4611 bool isThumb() const {
4612 return (ArchISA == llvm::ARM::IK_THUMB);
4613 }
4614
4615 bool supportsThumb() const {
4616 return CPUAttr.count('T') || ArchVersion >= 6;
4617 }
4618
4619 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004620 return CPUAttr.equals("6T2") ||
4621 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004622 }
4623
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004624 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004625 // For most sub-arches, the build attribute CPU name is enough.
4626 // For Cortex variants, it's slightly different.
4627 switch(ArchKind) {
4628 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004629 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004630 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004631 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004632 case llvm::ARM::AK_ARMV7S:
4633 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004634 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004635 return "7A";
4636 case llvm::ARM::AK_ARMV7R:
4637 return "7R";
4638 case llvm::ARM::AK_ARMV7M:
4639 return "7M";
4640 case llvm::ARM::AK_ARMV7EM:
4641 return "7EM";
4642 case llvm::ARM::AK_ARMV8A:
4643 return "8A";
4644 case llvm::ARM::AK_ARMV8_1A:
4645 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004646 case llvm::ARM::AK_ARMV8_2A:
4647 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004648 case llvm::ARM::AK_ARMV8MBaseline:
4649 return "8M_BASE";
4650 case llvm::ARM::AK_ARMV8MMainline:
4651 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004652 }
4653 }
4654
4655 StringRef getCPUProfile() const {
4656 switch(ArchProfile) {
4657 case llvm::ARM::PK_A:
4658 return "A";
4659 case llvm::ARM::PK_R:
4660 return "R";
4661 case llvm::ARM::PK_M:
4662 return "M";
4663 default:
4664 return "";
4665 }
4666 }
4667
Chris Lattner17df24e2008-04-21 18:56:49 +00004668public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004669 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4670 bool IsBigEndian)
4671 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4672 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004673 BigEndian = IsBigEndian;
4674
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004675 switch (getTriple().getOS()) {
4676 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004677 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004678 break;
4679 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004680 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004681 break;
4682 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004683
Renato Goline84b0002015-10-08 16:43:26 +00004684 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004685 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004686
Chris Lattner1a8f3942010-04-23 16:29:58 +00004687 // {} in inline assembly are neon specifiers, not assembly variant
4688 // specifiers.
4689 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004690
Eric Christopher0e261882014-12-05 01:06:59 +00004691 // FIXME: This duplicates code from the driver that sets the -target-abi
4692 // option - this code is used if -target-abi isn't passed and should
4693 // be unified in some way.
4694 if (Triple.isOSBinFormatMachO()) {
4695 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4696 // the frontend matches that.
4697 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4698 Triple.getOS() == llvm::Triple::UnknownOS ||
4699 StringRef(CPU).startswith("cortex-m")) {
4700 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004701 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004702 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004703 } else {
4704 setABI("apcs-gnu");
4705 }
4706 } else if (Triple.isOSWindows()) {
4707 // FIXME: this is invalid for WindowsCE
4708 setABI("aapcs");
4709 } else {
4710 // Select the default based on the platform.
4711 switch (Triple.getEnvironment()) {
4712 case llvm::Triple::Android:
4713 case llvm::Triple::GNUEABI:
4714 case llvm::Triple::GNUEABIHF:
4715 setABI("aapcs-linux");
4716 break;
4717 case llvm::Triple::EABIHF:
4718 case llvm::Triple::EABI:
4719 setABI("aapcs");
4720 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004721 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004722 setABI("apcs-gnu");
4723 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004724 default:
4725 if (Triple.getOS() == llvm::Triple::NetBSD)
4726 setABI("apcs-gnu");
4727 else
4728 setABI("aapcs");
4729 break;
4730 }
4731 }
John McCall86353412010-08-21 22:46:04 +00004732
4733 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004734 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004735
Renato Golin15b86152015-07-03 16:41:13 +00004736 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004737 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004738
James Molloya7139222012-03-12 09:14:10 +00004739 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004740 // the alignment of the zero-length bitfield is greater than the member
4741 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004742 // zero length bitfield.
4743 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004744
4745 if (Triple.getOS() == llvm::Triple::Linux ||
4746 Triple.getOS() == llvm::Triple::UnknownOS)
4747 this->MCountName =
4748 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004749 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004750
Alp Toker4925ba72014-06-07 23:30:42 +00004751 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004752
Craig Topper3164f332014-03-11 03:39:26 +00004753 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004754 ABI = Name;
4755
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004756 // The defaults (above) are for AAPCS, check if we need to change them.
4757 //
4758 // FIXME: We need support for -meabi... we could just mangle it into the
4759 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004760 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004761 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004762 return true;
4763 }
4764 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4765 setABIAAPCS();
4766 return true;
4767 }
4768 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004769 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004770
Renato Golinf5c4dec2015-05-27 13:33:00 +00004771 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004772 bool
4773 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4774 StringRef CPU,
4775 const std::vector<std::string> &FeaturesVec) const override {
4776
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004777 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004778 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004779
4780 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004781 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004782 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4783
4784 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004785 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004786 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4787
4788 for (const char *Feature : TargetFeatures)
4789 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004790 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004791
Eric Christopher007b0a02015-08-28 22:32:01 +00004792 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004793 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004794
Craig Topper3164f332014-03-11 03:39:26 +00004795 bool handleTargetFeatures(std::vector<std::string> &Features,
4796 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004797 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004798 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004799 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004800 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004801 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004802 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004803 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004804
Ranjeet Singhac08e532015-06-24 23:39:25 +00004805 // This does not diagnose illegal cases like having both
4806 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4807 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004808 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004809 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004810 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004811 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004812 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004813 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004814 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004815 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004816 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004817 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004818 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004819 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004820 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004821 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004822 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004823 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004824 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004825 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004826 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004827 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004828 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004829 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004830 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004831 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004832 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004833 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004834 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004835 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004836 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004837 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004838 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004839 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004840 } else if (Feature == "+strict-align") {
4841 Unaligned = 0;
4842 } else if (Feature == "+fp16") {
4843 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004844 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004845 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004846 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004847
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004848 switch (ArchVersion) {
4849 case 6:
4850 if (ArchProfile == llvm::ARM::PK_M)
4851 LDREX = 0;
4852 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4853 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4854 else
4855 LDREX = LDREX_W;
4856 break;
4857 case 7:
4858 if (ArchProfile == llvm::ARM::PK_M)
4859 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4860 else
4861 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4862 break;
4863 case 8:
4864 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4865 }
4866
Rafael Espindolaeb265472013-08-21 21:59:03 +00004867 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4868 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4869 return false;
4870 }
4871
4872 if (FPMath == FP_Neon)
4873 Features.push_back("+neonfp");
4874 else if (FPMath == FP_VFP)
4875 Features.push_back("-neonfp");
4876
Daniel Dunbar893d4752009-12-19 04:15:38 +00004877 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004878 auto Feature =
4879 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4880 if (Feature != Features.end())
4881 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004882
Rafael Espindolaeb265472013-08-21 21:59:03 +00004883 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004884 }
4885
Craig Topper3164f332014-03-11 03:39:26 +00004886 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004887 return llvm::StringSwitch<bool>(Feature)
4888 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004889 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004890 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004891 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004892 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004893 .Case("hwdiv", HWDiv & HWDivThumb)
4894 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004895 .Default(false);
4896 }
Renato Golin15b86152015-07-03 16:41:13 +00004897
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004898 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004899 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004900 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004901
Renato Golin15b86152015-07-03 16:41:13 +00004902 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004903 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004904 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004905 CPU = Name;
4906 return true;
4907 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004908
Craig Topper3164f332014-03-11 03:39:26 +00004909 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004910
Craig Topper3164f332014-03-11 03:39:26 +00004911 void getTargetDefines(const LangOptions &Opts,
4912 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004913 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004914 Builder.defineMacro("__arm");
4915 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00004916 // For bare-metal none-eabi.
4917 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
4918 getTriple().getEnvironment() == llvm::Triple::EABI)
4919 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004920
Chris Lattnerecd49032009-03-02 22:27:17 +00004921 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004922 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004923
4924 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4925 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004926 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004927 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4928
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004929 if (!CPUAttr.empty())
4930 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004931
4932 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004933 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004934 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004935
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004936 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004937 // ACLE 6.5.7 Crypto Extension
4938 if (Crypto)
4939 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4940 // ACLE 6.5.8 CRC32 Extension
4941 if (CRC)
4942 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4943 // ACLE 6.5.10 Numeric Maximum and Minimum
4944 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4945 // ACLE 6.5.9 Directed Rounding
4946 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004947 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004948
4949 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4950 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00004951 // NOTE that the default profile is assumed to be 'A'
4952 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004953 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4954
Bradley Smithf4affc12016-03-03 13:52:22 +00004955 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
4956 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
4957 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
4958 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004959 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004960 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004961 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004962 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4963
4964 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4965 // instruction set such as ARM or Thumb.
4966 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4967
4968 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4969
4970 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004971 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004972 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004973
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004974 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004975 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004976 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004977
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004978 // ACLE 6.4.4 LDREX/STREX
4979 if (LDREX)
4980 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4981
4982 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004983 if (ArchVersion == 5 ||
4984 (ArchVersion == 6 && CPUProfile != "M") ||
4985 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004986 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4987
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004988 // ACLE 6.5.1 Hardware Floating Point
4989 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004990 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004991
Yi Konga44c4d72014-06-27 21:25:42 +00004992 // ACLE predefines.
4993 Builder.defineMacro("__ARM_ACLE", "200");
4994
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004995 // FP16 support (we currently only support IEEE format).
4996 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4997 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4998
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004999 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005000 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005001 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5002
Mike Stump9d54bd72009-04-08 02:07:04 +00005003 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005004
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005005 // FIXME: It's more complicated than this and we don't really support
5006 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005007 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005008 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005009 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005010
David Tweed8f676532012-10-25 13:33:01 +00005011 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005012 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005013 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
5014 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005015 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005016 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005017 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005018
Tim Northover28fc0e12016-04-28 13:59:55 +00005019 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5020 ABI == "aapcs16")
5021 Builder.defineMacro("__ARM_PCS_VFP", "1");
5022
Daniel Dunbar893d4752009-12-19 04:15:38 +00005023 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005024 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005025
5026 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005027 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005028
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005029 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005030 Builder.defineMacro("__THUMBEL__");
5031 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005032 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005033 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005034 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005035
5036 // ACLE 6.4.9 32-bit SIMD instructions
5037 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5038 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5039
5040 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005041 if (((HWDiv & HWDivThumb) && isThumb()) ||
5042 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005043 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005044 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005045 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005046
5047 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005048 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005049
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005050 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005051 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005052 if (FPU & VFP2FPU)
5053 Builder.defineMacro("__ARM_VFPV2__");
5054 if (FPU & VFP3FPU)
5055 Builder.defineMacro("__ARM_VFPV3__");
5056 if (FPU & VFP4FPU)
5057 Builder.defineMacro("__ARM_VFPV4__");
5058 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005059
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005060 // This only gets set when Neon instructions are actually available, unlike
5061 // the VFP define, hence the soft float and arch check. This is subtly
5062 // different from gcc, we follow the intent which was that it should be set
5063 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005064 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005065 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005066 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005067 // current AArch32 NEON implementations do not support double-precision
5068 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005069 Builder.defineMacro("__ARM_NEON_FP",
5070 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005071 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005072
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005073 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5074 Opts.ShortWChar ? "2" : "4");
5075
5076 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5077 Opts.ShortEnums ? "1" : "4");
5078
Bradley Smithf4affc12016-03-03 13:52:22 +00005079 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005080 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5081 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5082 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5083 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5084 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005085
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005086 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005087 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005088 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005089 }
5090
5091 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005092 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005093 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5094 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005095 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005096 }
5097
5098 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005099 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005100 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005101
5102 if (Opts.UnsafeFPMath)
5103 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005104
5105 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5106 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005107 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005108
Craig Topper6c03a542015-10-19 04:51:35 +00005109 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5110 return llvm::makeArrayRef(BuiltinInfo,
5111 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005112 }
Craig Topper3164f332014-03-11 03:39:26 +00005113 bool isCLZForZeroUndef() const override { return false; }
5114 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005115 return IsAAPCS
5116 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005117 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5118 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005119 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005120 ArrayRef<const char *> getGCCRegNames() const override;
5121 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005122 bool validateAsmConstraint(const char *&Name,
5123 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005124 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005125 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005126 case 'l': // r0-r7
5127 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005128 case 't': // VFP Floating point register single precision
5129 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005130 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005131 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005132 case 'I':
5133 case 'J':
5134 case 'K':
5135 case 'L':
5136 case 'M':
5137 // FIXME
5138 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005139 case 'Q': // A memory address that is a single base register.
5140 Info.setAllowsMemory();
5141 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005142 case 'U': // a memory reference...
5143 switch (Name[1]) {
5144 case 'q': // ...ARMV4 ldrsb
5145 case 'v': // ...VFP load/store (reg+constant offset)
5146 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005147 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005148 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005149 case 'n': // valid address for Neon doubleword vector load/store
5150 case 'm': // valid address for Neon element and structure load/store
5151 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005152 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005153 Info.setAllowsMemory();
5154 Name++;
5155 return true;
5156 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005157 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005158 return false;
5159 }
Craig Topper3164f332014-03-11 03:39:26 +00005160 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005161 std::string R;
5162 switch (*Constraint) {
5163 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005164 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005165 Constraint++;
5166 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005167 case 'p': // 'p' should be translated to 'r' by default.
5168 R = std::string("r");
5169 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005170 default:
5171 return std::string(1, *Constraint);
5172 }
5173 return R;
5174 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005175 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005176 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005177 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005178 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005179 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005180
Bill Wendling9d1ee112012-10-25 23:28:48 +00005181 // Strip off constraint modifiers.
5182 while (Constraint[0] == '=' ||
5183 Constraint[0] == '+' ||
5184 Constraint[0] == '&')
5185 Constraint = Constraint.substr(1);
5186
5187 switch (Constraint[0]) {
5188 default: break;
5189 case 'r': {
5190 switch (Modifier) {
5191 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005192 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005193 case 'q':
5194 // A register of size 32 cannot fit a vector type.
5195 return false;
5196 }
5197 }
5198 }
5199
5200 return true;
5201 }
Craig Topper3164f332014-03-11 03:39:26 +00005202 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005203 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005204 return "";
5205 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005206
Craig Topper3164f332014-03-11 03:39:26 +00005207 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005208 switch (CC) {
5209 case CC_AAPCS:
5210 case CC_AAPCS_VFP:
5211 case CC_Swift:
5212 return CCCR_OK;
5213 default:
5214 return CCCR_Warning;
5215 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005216 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005217
Craig Topper3164f332014-03-11 03:39:26 +00005218 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005219 if (RegNo == 0) return 0;
5220 if (RegNo == 1) return 1;
5221 return -1;
5222 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005223
5224 bool hasSjLjLowering() const override {
5225 return true;
5226 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005227};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005228
Rafael Espindolaeb265472013-08-21 21:59:03 +00005229bool ARMTargetInfo::setFPMath(StringRef Name) {
5230 if (Name == "neon") {
5231 FPMath = FP_Neon;
5232 return true;
5233 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5234 Name == "vfp4") {
5235 FPMath = FP_VFP;
5236 return true;
5237 }
5238 return false;
5239}
5240
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005241const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005242 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005243 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005244 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5245
5246 // Float registers
5247 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5248 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5249 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005250 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005251
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005252 // Double registers
5253 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5254 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005255 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5256 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005257
5258 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005259 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5260 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005261};
5262
Craig Topperf054e3a2015-10-19 03:52:27 +00005263ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5264 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005265}
5266
5267const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005268 { { "a1" }, "r0" },
5269 { { "a2" }, "r1" },
5270 { { "a3" }, "r2" },
5271 { { "a4" }, "r3" },
5272 { { "v1" }, "r4" },
5273 { { "v2" }, "r5" },
5274 { { "v3" }, "r6" },
5275 { { "v4" }, "r7" },
5276 { { "v5" }, "r8" },
5277 { { "v6", "rfp" }, "r9" },
5278 { { "sl" }, "r10" },
5279 { { "fp" }, "r11" },
5280 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005281 { { "r13" }, "sp" },
5282 { { "r14" }, "lr" },
5283 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005284 // The S, D and Q registers overlap, but aren't really aliases; we
5285 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005286};
5287
Craig Topperf054e3a2015-10-19 03:52:27 +00005288ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5289 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005290}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005291
5292const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005293#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005294 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005295#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5296 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005297#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005298
Craig Topper07d3b622015-08-07 05:14:44 +00005299#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005300 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005301#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005302 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005303#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5304 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005305#include "clang/Basic/BuiltinsARM.def"
5306};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005307
5308class ARMleTargetInfo : public ARMTargetInfo {
5309public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005310 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5311 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005312 void getTargetDefines(const LangOptions &Opts,
5313 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005314 Builder.defineMacro("__ARMEL__");
5315 ARMTargetInfo::getTargetDefines(Opts, Builder);
5316 }
5317};
5318
5319class ARMbeTargetInfo : public ARMTargetInfo {
5320public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005321 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5322 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005323 void getTargetDefines(const LangOptions &Opts,
5324 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005325 Builder.defineMacro("__ARMEB__");
5326 Builder.defineMacro("__ARM_BIG_ENDIAN");
5327 ARMTargetInfo::getTargetDefines(Opts, Builder);
5328 }
5329};
Chris Lattner17df24e2008-04-21 18:56:49 +00005330
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005331class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5332 const llvm::Triple Triple;
5333public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005334 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5335 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005336 WCharType = UnsignedShort;
5337 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005338 }
5339 void getVisualStudioDefines(const LangOptions &Opts,
5340 MacroBuilder &Builder) const {
5341 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5342
5343 // FIXME: this is invalid for WindowsCE
5344 Builder.defineMacro("_M_ARM_NT", "1");
5345 Builder.defineMacro("_M_ARMT", "_M_ARM");
5346 Builder.defineMacro("_M_THUMB", "_M_ARM");
5347
5348 assert((Triple.getArch() == llvm::Triple::arm ||
5349 Triple.getArch() == llvm::Triple::thumb) &&
5350 "invalid architecture for Windows ARM target info");
5351 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5352 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5353
5354 // TODO map the complete set of values
5355 // 31: VFPv3 40: VFPv4
5356 Builder.defineMacro("_M_ARM_FP", "31");
5357 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005358 BuiltinVaListKind getBuiltinVaListKind() const override {
5359 return TargetInfo::CharPtrBuiltinVaList;
5360 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005361 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5362 switch (CC) {
5363 case CC_X86StdCall:
5364 case CC_X86ThisCall:
5365 case CC_X86FastCall:
5366 case CC_X86VectorCall:
5367 return CCCR_Ignore;
5368 case CC_C:
5369 return CCCR_OK;
5370 default:
5371 return CCCR_Warning;
5372 }
5373 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005374};
5375
5376// Windows ARM + Itanium C++ ABI Target
5377class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5378public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005379 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5380 const TargetOptions &Opts)
5381 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005382 TheCXXABI.set(TargetCXXABI::GenericARM);
5383 }
5384
5385 void getTargetDefines(const LangOptions &Opts,
5386 MacroBuilder &Builder) const override {
5387 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5388
5389 if (Opts.MSVCCompat)
5390 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5391 }
5392};
5393
5394// Windows ARM, MS (C++) ABI
5395class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5396public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005397 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5398 const TargetOptions &Opts)
5399 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005400 TheCXXABI.set(TargetCXXABI::Microsoft);
5401 }
5402
5403 void getTargetDefines(const LangOptions &Opts,
5404 MacroBuilder &Builder) const override {
5405 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5406 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5407 }
5408};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005409
Yaron Keren321249c2015-07-15 13:32:23 +00005410// ARM MinGW target
5411class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5412public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005413 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5414 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005415 TheCXXABI.set(TargetCXXABI::GenericARM);
5416 }
5417
5418 void getTargetDefines(const LangOptions &Opts,
5419 MacroBuilder &Builder) const override {
5420 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5421 DefineStd(Builder, "WIN32", Opts);
5422 DefineStd(Builder, "WINNT", Opts);
5423 Builder.defineMacro("_ARM_");
5424 addMinGWDefines(Opts, Builder);
5425 }
5426};
5427
5428// ARM Cygwin target
5429class CygwinARMTargetInfo : public ARMleTargetInfo {
5430public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005431 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5432 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005433 TLSSupported = false;
5434 WCharType = UnsignedShort;
5435 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005436 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005437 }
5438 void getTargetDefines(const LangOptions &Opts,
5439 MacroBuilder &Builder) const override {
5440 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5441 Builder.defineMacro("_ARM_");
5442 Builder.defineMacro("__CYGWIN__");
5443 Builder.defineMacro("__CYGWIN32__");
5444 DefineStd(Builder, "unix", Opts);
5445 if (Opts.CPlusPlus)
5446 Builder.defineMacro("_GNU_SOURCE");
5447 }
5448};
5449
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005450class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005451protected:
Craig Topper3164f332014-03-11 03:39:26 +00005452 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5453 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005454 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005455 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005456
Torok Edwinb2b37c62009-06-30 17:10:35 +00005457public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005458 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5459 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005460 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005461 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005462 // FIXME: This should be based off of the target features in
5463 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005464 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005465
Tim Northoverd88ecb32016-01-27 19:32:40 +00005466 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005467 // Darwin on iOS uses a variant of the ARM C++ ABI.
5468 TheCXXABI.set(TargetCXXABI::WatchOS);
5469
5470 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5471 // size_t is long, it's a bit weird for it to be int.
5472 PtrDiffType = SignedLong;
5473
5474 // BOOL should be a real boolean on the new ABI
5475 UseSignedCharForObjCBool = false;
5476 } else
5477 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005478 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005479};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005480
Tim Northover573cbee2014-05-24 12:52:07 +00005481class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005482 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005483 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5484 static const char *const GCCRegNames[];
5485
James Molloy75f5f9e2014-04-16 15:33:48 +00005486 enum FPUModeEnum {
5487 FPUMode,
5488 NeonMode
5489 };
5490
5491 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005492 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005493 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005494 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005495 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005496
Tim Northovera2ee4332014-03-29 15:09:45 +00005497 static const Builtin::Info BuiltinInfo[];
5498
5499 std::string ABI;
5500
5501public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005502 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005503 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005504 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5505 WCharType = SignedInt;
5506
5507 // NetBSD apparently prefers consistency across ARM targets to consistency
5508 // across 64-bit targets.
5509 Int64Type = SignedLongLong;
5510 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005511 } else {
5512 WCharType = UnsignedInt;
5513 Int64Type = SignedLong;
5514 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005515 }
5516
Tim Northovera2ee4332014-03-29 15:09:45 +00005517 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005518 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005519 MaxAtomicInlineWidth = 128;
5520 MaxAtomicPromoteWidth = 128;
5521
Tim Northovera6a19f12015-02-06 01:25:07 +00005522 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005523 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5524
Tim Northovera2ee4332014-03-29 15:09:45 +00005525 // {} in inline assembly are neon specifiers, not assembly variant
5526 // specifiers.
5527 NoAsmVariants = true;
5528
Tim Northover7ad87af2015-01-16 18:44:04 +00005529 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5530 // contributes to the alignment of the containing aggregate in the same way
5531 // a plain (non bit-field) member of that type would, without exception for
5532 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005533 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005534 UseZeroLengthBitfieldAlignment = true;
5535
Tim Northover573cbee2014-05-24 12:52:07 +00005536 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005537 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005538
5539 if (Triple.getOS() == llvm::Triple::Linux ||
5540 Triple.getOS() == llvm::Triple::UnknownOS)
5541 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005542 }
5543
Alp Toker4925ba72014-06-07 23:30:42 +00005544 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005545 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005546 if (Name != "aapcs" && Name != "darwinpcs")
5547 return false;
5548
5549 ABI = Name;
5550 return true;
5551 }
5552
David Blaikie1cbb9712014-11-14 19:09:44 +00005553 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005554 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005555 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005556 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5557 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005558 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005559 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005560 .Default(false);
5561 return CPUKnown;
5562 }
5563
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005564 void getTargetDefines(const LangOptions &Opts,
5565 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005566 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005567 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005568
5569 // Target properties.
5570 Builder.defineMacro("_LP64");
5571 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005572
5573 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5574 Builder.defineMacro("__ARM_ACLE", "200");
5575 Builder.defineMacro("__ARM_ARCH", "8");
5576 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5577
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005578 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005579 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005580 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005581
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005582 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5583 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5584 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5585 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005586 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005587 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5588 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005589
5590 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5591
5592 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005593 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005594
5595 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5596 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005597 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5598 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005599
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005600 if (Opts.UnsafeFPMath)
5601 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005602
5603 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5604
5605 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5606 Opts.ShortEnums ? "1" : "4");
5607
James Molloy75f5f9e2014-04-16 15:33:48 +00005608 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005609 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005610 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005611 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005612 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005613
Bradley Smith418c5932014-05-02 15:17:51 +00005614 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005615 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005616
James Molloy75f5f9e2014-04-16 15:33:48 +00005617 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005618 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5619
5620 if (Unaligned)
5621 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005622
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005623 if (V8_1A)
5624 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5625
Reid Klecknerd167d422015-05-06 15:31:46 +00005626 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5627 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5628 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5629 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5630 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005631 }
5632
Craig Topper6c03a542015-10-19 04:51:35 +00005633 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5634 return llvm::makeArrayRef(BuiltinInfo,
5635 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005636 }
5637
David Blaikie1cbb9712014-11-14 19:09:44 +00005638 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005639 return Feature == "aarch64" ||
5640 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005641 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005642 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005643 }
5644
James Molloy5e73df52014-04-16 15:06:20 +00005645 bool handleTargetFeatures(std::vector<std::string> &Features,
5646 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005647 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005648 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005649 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005650 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005651 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005652
Eric Christopher610fe112015-08-26 08:21:55 +00005653 for (const auto &Feature : Features) {
5654 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005655 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005656 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005657 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005658 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005659 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005660 if (Feature == "+strict-align")
5661 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005662 if (Feature == "+v8.1a")
5663 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005664 }
5665
James Y Knightb214cbc2016-03-04 19:00:41 +00005666 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005667
5668 return true;
5669 }
5670
John McCall477f2bb2016-03-03 06:39:32 +00005671 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5672 switch (CC) {
5673 case CC_C:
5674 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005675 case CC_PreserveMost:
5676 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005677 return CCCR_OK;
5678 default:
5679 return CCCR_Warning;
5680 }
5681 }
5682
David Blaikie1cbb9712014-11-14 19:09:44 +00005683 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005684
David Blaikie1cbb9712014-11-14 19:09:44 +00005685 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005686 return TargetInfo::AArch64ABIBuiltinVaList;
5687 }
5688
Craig Topperf054e3a2015-10-19 03:52:27 +00005689 ArrayRef<const char *> getGCCRegNames() const override;
5690 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005691
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005692 bool validateAsmConstraint(const char *&Name,
5693 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005694 switch (*Name) {
5695 default:
5696 return false;
5697 case 'w': // Floating point and SIMD registers (V0-V31)
5698 Info.setAllowsRegister();
5699 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005700 case 'I': // Constant that can be used with an ADD instruction
5701 case 'J': // Constant that can be used with a SUB instruction
5702 case 'K': // Constant that can be used with a 32-bit logical instruction
5703 case 'L': // Constant that can be used with a 64-bit logical instruction
5704 case 'M': // Constant that can be used as a 32-bit MOV immediate
5705 case 'N': // Constant that can be used as a 64-bit MOV immediate
5706 case 'Y': // Floating point constant zero
5707 case 'Z': // Integer constant zero
5708 return true;
5709 case 'Q': // A memory reference with base register and no offset
5710 Info.setAllowsMemory();
5711 return true;
5712 case 'S': // A symbolic address
5713 Info.setAllowsRegister();
5714 return true;
5715 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005716 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5717 // Utf: A memory address suitable for ldp/stp in TF mode.
5718 // Usa: An absolute symbolic address.
5719 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5720 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005721 case 'z': // Zero register, wzr or xzr
5722 Info.setAllowsRegister();
5723 return true;
5724 case 'x': // Floating point and SIMD registers (V0-V15)
5725 Info.setAllowsRegister();
5726 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005727 }
5728 return false;
5729 }
5730
Akira Hatanaka987f1862014-08-22 06:05:21 +00005731 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005732 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005733 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005734 // Strip off constraint modifiers.
5735 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5736 Constraint = Constraint.substr(1);
5737
5738 switch (Constraint[0]) {
5739 default:
5740 return true;
5741 case 'z':
5742 case 'r': {
5743 switch (Modifier) {
5744 case 'x':
5745 case 'w':
5746 // For now assume that the person knows what they're
5747 // doing with the modifier.
5748 return true;
5749 default:
5750 // By default an 'r' constraint will be in the 'x'
5751 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005752 if (Size == 64)
5753 return true;
5754
5755 SuggestedModifier = "w";
5756 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005757 }
5758 }
5759 }
5760 }
5761
David Blaikie1cbb9712014-11-14 19:09:44 +00005762 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005763
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005764 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005765 if (RegNo == 0)
5766 return 0;
5767 if (RegNo == 1)
5768 return 1;
5769 return -1;
5770 }
5771};
5772
Tim Northover573cbee2014-05-24 12:52:07 +00005773const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005774 // 32-bit Integer registers
5775 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5776 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5777 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5778
5779 // 64-bit Integer registers
5780 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5781 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5782 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5783
5784 // 32-bit floating point regsisters
5785 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5786 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5787 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5788
5789 // 64-bit floating point regsisters
5790 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5791 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5792 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5793
5794 // Vector registers
5795 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5796 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5797 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5798};
5799
Craig Topperf054e3a2015-10-19 03:52:27 +00005800ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5801 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005802}
5803
Tim Northover573cbee2014-05-24 12:52:07 +00005804const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005805 { { "w31" }, "wsp" },
5806 { { "x29" }, "fp" },
5807 { { "x30" }, "lr" },
5808 { { "x31" }, "sp" },
5809 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5810 // don't want to substitute one of these for a different-sized one.
5811};
5812
Craig Topperf054e3a2015-10-19 03:52:27 +00005813ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5814 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005815}
5816
Tim Northover573cbee2014-05-24 12:52:07 +00005817const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005818#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005819 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005820#include "clang/Basic/BuiltinsNEON.def"
5821
5822#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005823 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005824#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005825};
James Molloy5e73df52014-04-16 15:06:20 +00005826
Tim Northover573cbee2014-05-24 12:52:07 +00005827class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005828 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005829 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005830 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005831 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005832 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005833 }
5834
5835public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005836 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5837 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00005838 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005839 }
James Molloy5e73df52014-04-16 15:06:20 +00005840 void getTargetDefines(const LangOptions &Opts,
5841 MacroBuilder &Builder) const override {
5842 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005843 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005844 }
5845};
5846
Tim Northover573cbee2014-05-24 12:52:07 +00005847class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005848 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005849 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005850 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005851 }
5852
5853public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005854 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5855 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00005856 void getTargetDefines(const LangOptions &Opts,
5857 MacroBuilder &Builder) const override {
5858 Builder.defineMacro("__AARCH64EB__");
5859 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5860 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005861 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005862 }
5863};
Tim Northovera2ee4332014-03-29 15:09:45 +00005864
Tim Northover573cbee2014-05-24 12:52:07 +00005865class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005866protected:
5867 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5868 MacroBuilder &Builder) const override {
5869 Builder.defineMacro("__AARCH64_SIMD__");
5870 Builder.defineMacro("__ARM64_ARCH_8__");
5871 Builder.defineMacro("__ARM_NEON__");
5872 Builder.defineMacro("__LITTLE_ENDIAN__");
5873 Builder.defineMacro("__REGISTER_PREFIX__", "");
5874 Builder.defineMacro("__arm64", "1");
5875 Builder.defineMacro("__arm64__", "1");
5876
5877 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5878 }
5879
Tim Northovera2ee4332014-03-29 15:09:45 +00005880public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005881 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5882 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005883 Int64Type = SignedLongLong;
5884 WCharType = SignedInt;
5885 UseSignedCharForObjCBool = false;
5886
Tim Northovera6a19f12015-02-06 01:25:07 +00005887 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005888 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5889
5890 TheCXXABI.set(TargetCXXABI::iOS64);
5891 }
5892
David Blaikie1cbb9712014-11-14 19:09:44 +00005893 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005894 return TargetInfo::CharPtrBuiltinVaList;
5895 }
5896};
Tim Northovera2ee4332014-03-29 15:09:45 +00005897
Tony Linthicum76329bf2011-12-12 21:14:55 +00005898// Hexagon abstract base class
5899class HexagonTargetInfo : public TargetInfo {
5900 static const Builtin::Info BuiltinInfo[];
5901 static const char * const GCCRegNames[];
5902 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5903 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005904 bool HasHVX, HasHVXDouble;
5905
Tony Linthicum76329bf2011-12-12 21:14:55 +00005906public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005907 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
5908 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005909 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005910 // Specify the vector alignment explicitly. For v512x1, the calculated
5911 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5912 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005913 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005914 "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 +00005915 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005916 SizeType = UnsignedInt;
5917 PtrDiffType = SignedInt;
5918 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005919
5920 // {} in inline assembly are packet specifiers, not assembly variant
5921 // specifiers.
5922 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005923
5924 LargeArrayMinWidth = 64;
5925 LargeArrayAlign = 64;
5926 UseBitFieldTypeAlignment = true;
5927 ZeroLengthBitfieldBoundary = 32;
5928 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005929 }
5930
Craig Topper6c03a542015-10-19 04:51:35 +00005931 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5932 return llvm::makeArrayRef(BuiltinInfo,
5933 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005934 }
5935
Craig Topper3164f332014-03-11 03:39:26 +00005936 bool validateAsmConstraint(const char *&Name,
5937 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005938 return true;
5939 }
5940
Craig Topper3164f332014-03-11 03:39:26 +00005941 void getTargetDefines(const LangOptions &Opts,
5942 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005943
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005944 bool isCLZForZeroUndef() const override { return false; }
5945
Craig Topper3164f332014-03-11 03:39:26 +00005946 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005947 return llvm::StringSwitch<bool>(Feature)
5948 .Case("hexagon", true)
5949 .Case("hvx", HasHVX)
5950 .Case("hvx-double", HasHVXDouble)
5951 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005952 }
Craig Topper3164f332014-03-11 03:39:26 +00005953
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005954 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5955 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5956 const override;
5957
5958 bool handleTargetFeatures(std::vector<std::string> &Features,
5959 DiagnosticsEngine &Diags) override;
5960
Craig Topper3164f332014-03-11 03:39:26 +00005961 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005962 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005963 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005964 ArrayRef<const char *> getGCCRegNames() const override;
5965 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005966 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005967 return "";
5968 }
Sebastian Pop86500282012-01-13 20:37:10 +00005969
5970 static const char *getHexagonCPUSuffix(StringRef Name) {
5971 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005972 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005973 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005974 .Case("hexagonv55", "55")
5975 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005976 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005977 }
5978
Craig Topper3164f332014-03-11 03:39:26 +00005979 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005980 if (!getHexagonCPUSuffix(Name))
5981 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005982 CPU = Name;
5983 return true;
5984 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005985
5986 int getEHDataRegisterNumber(unsigned RegNo) const override {
5987 return RegNo < 2 ? RegNo : -1;
5988 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005989};
5990
5991void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005992 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005993 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005994 Builder.defineMacro("__hexagon__", "1");
5995
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005996 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005997 Builder.defineMacro("__HEXAGON_V4__");
5998 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005999 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006000 Builder.defineMacro("__QDSP6_V4__");
6001 Builder.defineMacro("__QDSP6_ARCH__", "4");
6002 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006003 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006004 Builder.defineMacro("__HEXAGON_V5__");
6005 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6006 if(Opts.HexagonQdsp6Compat) {
6007 Builder.defineMacro("__QDSP6_V5__");
6008 Builder.defineMacro("__QDSP6_ARCH__", "5");
6009 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006010 } else if (CPU == "hexagonv55") {
6011 Builder.defineMacro("__HEXAGON_V55__");
6012 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6013 Builder.defineMacro("__QDSP6_V55__");
6014 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006015 } else if (CPU == "hexagonv60") {
6016 Builder.defineMacro("__HEXAGON_V60__");
6017 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6018 Builder.defineMacro("__QDSP6_V60__");
6019 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006020 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006021
6022 if (hasFeature("hvx")) {
6023 Builder.defineMacro("__HVX__");
6024 if (hasFeature("hvx-double"))
6025 Builder.defineMacro("__HVXDBL__");
6026 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006027}
6028
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006029bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6030 DiagnosticsEngine &Diags) {
6031 for (auto &F : Features) {
6032 if (F == "+hvx")
6033 HasHVX = true;
6034 else if (F == "-hvx")
6035 HasHVX = HasHVXDouble = false;
6036 else if (F == "+hvx-double")
6037 HasHVX = HasHVXDouble = true;
6038 else if (F == "-hvx-double")
6039 HasHVXDouble = false;
6040 }
6041 return true;
6042}
6043
6044bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6045 DiagnosticsEngine &Diags, StringRef CPU,
6046 const std::vector<std::string> &FeaturesVec) const {
6047 // Default for v60: -hvx, -hvx-double.
6048 Features["hvx"] = false;
6049 Features["hvx-double"] = false;
6050
6051 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6052}
6053
6054
6055const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006056 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6057 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6058 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6059 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6060 "p0", "p1", "p2", "p3",
6061 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6062};
6063
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006064ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006065 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006066}
6067
Tony Linthicum76329bf2011-12-12 21:14:55 +00006068const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6069 { { "sp" }, "r29" },
6070 { { "fp" }, "r30" },
6071 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006072};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006073
Craig Topperf054e3a2015-10-19 03:52:27 +00006074ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6075 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006076}
6077
6078
6079const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006080#define BUILTIN(ID, TYPE, ATTRS) \
6081 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6082#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6083 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006084#include "clang/Basic/BuiltinsHexagon.def"
6085};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006086
Jacques Pienaard964cc22016-03-28 21:02:54 +00006087class LanaiTargetInfo : public TargetInfo {
6088 // Class for Lanai (32-bit).
6089 // The CPU profiles supported by the Lanai backend
6090 enum CPUKind {
6091 CK_NONE,
6092 CK_V11,
6093 } CPU;
6094
6095 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6096 static const char *const GCCRegNames[];
6097
6098public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006099 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6100 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006101 // Description string has to be kept in sync with backend.
6102 resetDataLayout("E" // Big endian
6103 "-m:e" // ELF name manging
6104 "-p:32:32" // 32 bit pointers, 32 bit aligned
6105 "-i64:64" // 64 bit integers, 64 bit aligned
6106 "-a:0:32" // 32 bit alignment of objects of aggregate type
6107 "-n32" // 32 bit native integer width
6108 "-S64" // 64 bit natural stack alignment
6109 );
6110
6111 // Setting RegParmMax equal to what mregparm was set to in the old
6112 // toolchain
6113 RegParmMax = 4;
6114
6115 // Set the default CPU to V11
6116 CPU = CK_V11;
6117
6118 // Temporary approach to make everything at least word-aligned and allow for
6119 // safely casting between pointers with different alignment requirements.
6120 // TODO: Remove this when there are no more cast align warnings on the
6121 // firmware.
6122 MinGlobalAlign = 32;
6123 }
6124
6125 void getTargetDefines(const LangOptions &Opts,
6126 MacroBuilder &Builder) const override {
6127 // Define __lanai__ when building for target lanai.
6128 Builder.defineMacro("__lanai__");
6129
6130 // Set define for the CPU specified.
6131 switch (CPU) {
6132 case CK_V11:
6133 Builder.defineMacro("__LANAI_V11__");
6134 break;
6135 case CK_NONE:
6136 llvm_unreachable("Unhandled target CPU");
6137 }
6138 }
6139
6140 bool setCPU(const std::string &Name) override {
6141 CPU = llvm::StringSwitch<CPUKind>(Name)
6142 .Case("v11", CK_V11)
6143 .Default(CK_NONE);
6144
6145 return CPU != CK_NONE;
6146 }
6147
6148 bool hasFeature(StringRef Feature) const override {
6149 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6150 }
6151
6152 ArrayRef<const char *> getGCCRegNames() const override;
6153
6154 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6155
6156 BuiltinVaListKind getBuiltinVaListKind() const override {
6157 return TargetInfo::VoidPtrBuiltinVaList;
6158 }
6159
6160 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6161
6162 bool validateAsmConstraint(const char *&Name,
6163 TargetInfo::ConstraintInfo &info) const override {
6164 return false;
6165 }
6166
6167 const char *getClobbers() const override { return ""; }
6168};
6169
6170const char *const LanaiTargetInfo::GCCRegNames[] = {
6171 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6172 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6173 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6174
6175ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6176 return llvm::makeArrayRef(GCCRegNames);
6177}
6178
6179const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6180 {{"pc"}, "r2"},
6181 {{"sp"}, "r4"},
6182 {{"fp"}, "r5"},
6183 {{"rv"}, "r8"},
6184 {{"rr1"}, "r10"},
6185 {{"rr2"}, "r11"},
6186 {{"rca"}, "r15"},
6187};
6188
6189ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6190 return llvm::makeArrayRef(GCCRegAliases);
6191}
6192
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006193// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6194class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006195 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6196 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006197 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006198public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006199 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006200 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006201
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006202 int getEHDataRegisterNumber(unsigned RegNo) const override {
6203 if (RegNo == 0) return 24;
6204 if (RegNo == 1) return 25;
6205 return -1;
6206 }
6207
Craig Topper3164f332014-03-11 03:39:26 +00006208 bool handleTargetFeatures(std::vector<std::string> &Features,
6209 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006210 // The backend doesn't actually handle soft float yet, but in case someone
6211 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006212 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6213 if (Feature != Features.end()) {
6214 SoftFloat = true;
6215 Features.erase(Feature);
6216 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006217 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006218 }
Craig Topper3164f332014-03-11 03:39:26 +00006219 void getTargetDefines(const LangOptions &Opts,
6220 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006221 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006222 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006223
6224 if (SoftFloat)
6225 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006226 }
Craig Topper3164f332014-03-11 03:39:26 +00006227
6228 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006229 return llvm::StringSwitch<bool>(Feature)
6230 .Case("softfloat", SoftFloat)
6231 .Case("sparc", true)
6232 .Default(false);
6233 }
Craig Topper3164f332014-03-11 03:39:26 +00006234
Craig Topper6c03a542015-10-19 04:51:35 +00006235 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006236 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006237 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006238 }
Craig Topper3164f332014-03-11 03:39:26 +00006239 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006240 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006241 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006242 ArrayRef<const char *> getGCCRegNames() const override;
6243 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006244 bool validateAsmConstraint(const char *&Name,
6245 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006246 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006247 switch (*Name) {
6248 case 'I': // Signed 13-bit constant
6249 case 'J': // Zero
6250 case 'K': // 32-bit constant with the low 12 bits clear
6251 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6252 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6253 case 'N': // Same as 'K' but zext (required for SIMode)
6254 case 'O': // The constant 4096
6255 return true;
6256 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006257 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006258 }
Craig Topper3164f332014-03-11 03:39:26 +00006259 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006260 // FIXME: Implement!
6261 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006262 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006263
6264 // No Sparc V7 for now, the backend doesn't support it anyway.
6265 enum CPUKind {
6266 CK_GENERIC,
6267 CK_V8,
6268 CK_SUPERSPARC,
6269 CK_SPARCLITE,
6270 CK_F934,
6271 CK_HYPERSPARC,
6272 CK_SPARCLITE86X,
6273 CK_SPARCLET,
6274 CK_TSC701,
6275 CK_V9,
6276 CK_ULTRASPARC,
6277 CK_ULTRASPARC3,
6278 CK_NIAGARA,
6279 CK_NIAGARA2,
6280 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006281 CK_NIAGARA4,
6282 CK_MYRIAD2_1,
6283 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006284 } CPU = CK_GENERIC;
6285
6286 enum CPUGeneration {
6287 CG_V8,
6288 CG_V9,
6289 };
6290
6291 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6292 switch (Kind) {
6293 case CK_GENERIC:
6294 case CK_V8:
6295 case CK_SUPERSPARC:
6296 case CK_SPARCLITE:
6297 case CK_F934:
6298 case CK_HYPERSPARC:
6299 case CK_SPARCLITE86X:
6300 case CK_SPARCLET:
6301 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006302 case CK_MYRIAD2_1:
6303 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006304 return CG_V8;
6305 case CK_V9:
6306 case CK_ULTRASPARC:
6307 case CK_ULTRASPARC3:
6308 case CK_NIAGARA:
6309 case CK_NIAGARA2:
6310 case CK_NIAGARA3:
6311 case CK_NIAGARA4:
6312 return CG_V9;
6313 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006314 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006315 }
6316
6317 CPUKind getCPUKind(StringRef Name) const {
6318 return llvm::StringSwitch<CPUKind>(Name)
6319 .Case("v8", CK_V8)
6320 .Case("supersparc", CK_SUPERSPARC)
6321 .Case("sparclite", CK_SPARCLITE)
6322 .Case("f934", CK_F934)
6323 .Case("hypersparc", CK_HYPERSPARC)
6324 .Case("sparclite86x", CK_SPARCLITE86X)
6325 .Case("sparclet", CK_SPARCLET)
6326 .Case("tsc701", CK_TSC701)
6327 .Case("v9", CK_V9)
6328 .Case("ultrasparc", CK_ULTRASPARC)
6329 .Case("ultrasparc3", CK_ULTRASPARC3)
6330 .Case("niagara", CK_NIAGARA)
6331 .Case("niagara2", CK_NIAGARA2)
6332 .Case("niagara3", CK_NIAGARA3)
6333 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006334 .Case("myriad2", CK_MYRIAD2_1)
6335 .Case("myriad2.1", CK_MYRIAD2_1)
6336 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006337 .Default(CK_GENERIC);
6338 }
6339
6340 bool setCPU(const std::string &Name) override {
6341 CPU = getCPUKind(Name);
6342 return CPU != CK_GENERIC;
6343 }
Gabor Greif49991682008-02-21 16:29:08 +00006344};
6345
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006346const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006347 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6348 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6349 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6350 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6351};
6352
Craig Topperf054e3a2015-10-19 03:52:27 +00006353ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6354 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006355}
6356
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006357const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006358 { { "g0" }, "r0" },
6359 { { "g1" }, "r1" },
6360 { { "g2" }, "r2" },
6361 { { "g3" }, "r3" },
6362 { { "g4" }, "r4" },
6363 { { "g5" }, "r5" },
6364 { { "g6" }, "r6" },
6365 { { "g7" }, "r7" },
6366 { { "o0" }, "r8" },
6367 { { "o1" }, "r9" },
6368 { { "o2" }, "r10" },
6369 { { "o3" }, "r11" },
6370 { { "o4" }, "r12" },
6371 { { "o5" }, "r13" },
6372 { { "o6", "sp" }, "r14" },
6373 { { "o7" }, "r15" },
6374 { { "l0" }, "r16" },
6375 { { "l1" }, "r17" },
6376 { { "l2" }, "r18" },
6377 { { "l3" }, "r19" },
6378 { { "l4" }, "r20" },
6379 { { "l5" }, "r21" },
6380 { { "l6" }, "r22" },
6381 { { "l7" }, "r23" },
6382 { { "i0" }, "r24" },
6383 { { "i1" }, "r25" },
6384 { { "i2" }, "r26" },
6385 { { "i3" }, "r27" },
6386 { { "i4" }, "r28" },
6387 { { "i5" }, "r29" },
6388 { { "i6", "fp" }, "r30" },
6389 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006390};
6391
Craig Topperf054e3a2015-10-19 03:52:27 +00006392ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6393 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006394}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006395
6396// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6397class SparcV8TargetInfo : public SparcTargetInfo {
6398public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006399 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6400 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006401 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006402 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6403 switch (getTriple().getOS()) {
6404 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006405 SizeType = UnsignedInt;
6406 IntPtrType = SignedInt;
6407 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006408 break;
6409 case llvm::Triple::NetBSD:
6410 case llvm::Triple::OpenBSD:
6411 SizeType = UnsignedLong;
6412 IntPtrType = SignedLong;
6413 PtrDiffType = SignedLong;
6414 break;
Brad Smith56495d52015-08-13 22:00:53 +00006415 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006416 }
6417
Craig Topper3164f332014-03-11 03:39:26 +00006418 void getTargetDefines(const LangOptions &Opts,
6419 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006420 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006421 switch (getCPUGeneration(CPU)) {
6422 case CG_V8:
6423 Builder.defineMacro("__sparcv8");
6424 if (getTriple().getOS() != llvm::Triple::Solaris)
6425 Builder.defineMacro("__sparcv8__");
6426 break;
6427 case CG_V9:
6428 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006429 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006430 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006431 Builder.defineMacro("__sparc_v9__");
6432 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006433 break;
6434 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006435 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6436 switch (CPU) {
6437 case CK_MYRIAD2_1:
6438 Builder.defineMacro("__myriad2", "1");
6439 Builder.defineMacro("__myriad2__", "1");
6440 break;
6441 case CK_MYRIAD2_2:
6442 Builder.defineMacro("__myriad2", "2");
6443 Builder.defineMacro("__myriad2__", "2");
6444 break;
6445 default:
6446 break;
6447 }
6448 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006449 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006450
6451 bool hasSjLjLowering() const override {
6452 return true;
6453 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006454};
6455
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006456// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6457class SparcV8elTargetInfo : public SparcV8TargetInfo {
6458 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006459 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6460 : SparcV8TargetInfo(Triple, Opts) {
6461 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6462 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006463 }
6464};
6465
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006466// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6467class SparcV9TargetInfo : public SparcTargetInfo {
6468public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006469 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6470 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006471 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006472 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006473 // This is an LP64 platform.
6474 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006475
6476 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006477 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006478 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006479 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006480 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006481 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006482
6483 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6484 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6485 LongDoubleWidth = 128;
6486 LongDoubleAlign = 128;
6487 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006488 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006489 }
6490
Craig Topper3164f332014-03-11 03:39:26 +00006491 void getTargetDefines(const LangOptions &Opts,
6492 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006493 SparcTargetInfo::getTargetDefines(Opts, Builder);
6494 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006495 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006496 // Solaris doesn't need these variants, but the BSDs do.
6497 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006498 Builder.defineMacro("__sparc64__");
6499 Builder.defineMacro("__sparc_v9__");
6500 Builder.defineMacro("__sparcv9__");
6501 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006502 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006503
Craig Topper3164f332014-03-11 03:39:26 +00006504 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006505 if (!SparcTargetInfo::setCPU(Name))
6506 return false;
6507 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006508 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006509};
6510
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006511class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006512 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006513 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006514 std::string CPU;
6515 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006516 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006517
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006518public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006519 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006520 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6521 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006522 IntMaxType = SignedLong;
6523 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006524 TLSSupported = true;
6525 IntWidth = IntAlign = 32;
6526 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6527 PointerWidth = PointerAlign = 64;
6528 LongDoubleWidth = 128;
6529 LongDoubleAlign = 64;
6530 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006531 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006532 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006533 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 +00006534 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6535 }
6536 void getTargetDefines(const LangOptions &Opts,
6537 MacroBuilder &Builder) const override {
6538 Builder.defineMacro("__s390__");
6539 Builder.defineMacro("__s390x__");
6540 Builder.defineMacro("__zarch__");
6541 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006542
6543 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6544 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6545 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6546 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6547
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006548 if (HasTransactionalExecution)
6549 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006550 if (Opts.ZVector)
6551 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006552 }
Craig Topper6c03a542015-10-19 04:51:35 +00006553 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6554 return llvm::makeArrayRef(BuiltinInfo,
6555 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006556 }
6557
Craig Topperf054e3a2015-10-19 03:52:27 +00006558 ArrayRef<const char *> getGCCRegNames() const override;
6559 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006560 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006561 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006562 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006563 bool validateAsmConstraint(const char *&Name,
6564 TargetInfo::ConstraintInfo &info) const override;
6565 const char *getClobbers() const override {
6566 // FIXME: Is this really right?
6567 return "";
6568 }
6569 BuiltinVaListKind getBuiltinVaListKind() const override {
6570 return TargetInfo::SystemZBuiltinVaList;
6571 }
6572 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006573 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006574 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6575 .Case("z10", true)
6576 .Case("z196", true)
6577 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006578 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006579 .Default(false);
6580
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006581 return CPUKnown;
6582 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006583 bool
6584 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6585 StringRef CPU,
6586 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006587 if (CPU == "zEC12")
6588 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006589 if (CPU == "z13") {
6590 Features["transactional-execution"] = true;
6591 Features["vector"] = true;
6592 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006593 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006594 }
6595
6596 bool handleTargetFeatures(std::vector<std::string> &Features,
6597 DiagnosticsEngine &Diags) override {
6598 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006599 for (const auto &Feature : Features) {
6600 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006601 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006602 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006603 HasVector = true;
6604 }
6605 // If we use the vector ABI, vector types are 64-bit aligned.
6606 if (HasVector) {
6607 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006608 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6609 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006610 }
6611 return true;
6612 }
6613
6614 bool hasFeature(StringRef Feature) const override {
6615 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006616 .Case("systemz", true)
6617 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006618 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006619 .Default(false);
6620 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006621
Bryan Chane3f1ed52016-04-28 13:56:43 +00006622 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6623 switch (CC) {
6624 case CC_C:
6625 case CC_Swift:
6626 return CCCR_OK;
6627 default:
6628 return CCCR_Warning;
6629 }
6630 }
6631
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006632 StringRef getABI() const override {
6633 if (HasVector)
6634 return "vector";
6635 return "";
6636 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006637
6638 bool useFloat128ManglingForLongDouble() const override {
6639 return true;
6640 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006641};
6642
6643const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6644#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006645 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006646#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6647 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006648#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006649};
6650
6651const char *const SystemZTargetInfo::GCCRegNames[] = {
6652 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6653 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6654 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6655 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6656};
6657
Craig Topperf054e3a2015-10-19 03:52:27 +00006658ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6659 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006660}
6661
6662bool SystemZTargetInfo::
6663validateAsmConstraint(const char *&Name,
6664 TargetInfo::ConstraintInfo &Info) const {
6665 switch (*Name) {
6666 default:
6667 return false;
6668
6669 case 'a': // Address register
6670 case 'd': // Data register (equivalent to 'r')
6671 case 'f': // Floating-point register
6672 Info.setAllowsRegister();
6673 return true;
6674
6675 case 'I': // Unsigned 8-bit constant
6676 case 'J': // Unsigned 12-bit constant
6677 case 'K': // Signed 16-bit constant
6678 case 'L': // Signed 20-bit displacement (on all targets we support)
6679 case 'M': // 0x7fffffff
6680 return true;
6681
6682 case 'Q': // Memory with base and unsigned 12-bit displacement
6683 case 'R': // Likewise, plus an index
6684 case 'S': // Memory with base and signed 20-bit displacement
6685 case 'T': // Likewise, plus an index
6686 Info.setAllowsMemory();
6687 return true;
6688 }
6689}
Ulrich Weigand47445072013-05-06 16:26:41 +00006690
Eric Christopherc48497a2015-09-18 21:26:24 +00006691class MSP430TargetInfo : public TargetInfo {
6692 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006693
Eric Christopherc48497a2015-09-18 21:26:24 +00006694public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006695 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6696 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006697 BigEndian = false;
6698 TLSSupported = false;
6699 IntWidth = 16;
6700 IntAlign = 16;
6701 LongWidth = 32;
6702 LongLongWidth = 64;
6703 LongAlign = LongLongAlign = 16;
6704 PointerWidth = 16;
6705 PointerAlign = 16;
6706 SuitableAlign = 16;
6707 SizeType = UnsignedInt;
6708 IntMaxType = SignedLongLong;
6709 IntPtrType = SignedInt;
6710 PtrDiffType = SignedInt;
6711 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006712 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006713 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006714 void getTargetDefines(const LangOptions &Opts,
6715 MacroBuilder &Builder) const override {
6716 Builder.defineMacro("MSP430");
6717 Builder.defineMacro("__MSP430__");
6718 // FIXME: defines for different 'flavours' of MCU
6719 }
Craig Topper6c03a542015-10-19 04:51:35 +00006720 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006721 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006722 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006723 }
6724 bool hasFeature(StringRef Feature) const override {
6725 return Feature == "msp430";
6726 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006727 ArrayRef<const char *> getGCCRegNames() const override;
6728 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006729 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006730 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006731 }
6732 bool validateAsmConstraint(const char *&Name,
6733 TargetInfo::ConstraintInfo &info) const override {
6734 // FIXME: implement
6735 switch (*Name) {
6736 case 'K': // the constant 1
6737 case 'L': // constant -1^20 .. 1^19
6738 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006739 return true;
6740 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006741 // No target constraints for now.
6742 return false;
6743 }
6744 const char *getClobbers() const override {
6745 // FIXME: Is this really right?
6746 return "";
6747 }
6748 BuiltinVaListKind getBuiltinVaListKind() const override {
6749 // FIXME: implement
6750 return TargetInfo::CharPtrBuiltinVaList;
6751 }
6752};
6753
6754const char *const MSP430TargetInfo::GCCRegNames[] = {
6755 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6756 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6757
Craig Topperf054e3a2015-10-19 03:52:27 +00006758ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6759 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006760}
6761
6762// LLVM and Clang cannot be used directly to output native binaries for
6763// target, but is used to compile C code to llvm bitcode with correct
6764// type and alignment information.
6765//
6766// TCE uses the llvm bitcode as input and uses it for generating customized
6767// target processor and program binary. TCE co-design environment is
6768// publicly available in http://tce.cs.tut.fi
6769
6770static const unsigned TCEOpenCLAddrSpaceMap[] = {
6771 3, // opencl_global
6772 4, // opencl_local
6773 5, // opencl_constant
6774 // FIXME: generic has to be added to the target
6775 0, // opencl_generic
6776 0, // cuda_device
6777 0, // cuda_constant
6778 0 // cuda_shared
6779};
6780
6781class TCETargetInfo : public TargetInfo {
6782public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006783 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6784 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006785 TLSSupported = false;
6786 IntWidth = 32;
6787 LongWidth = LongLongWidth = 32;
6788 PointerWidth = 32;
6789 IntAlign = 32;
6790 LongAlign = LongLongAlign = 32;
6791 PointerAlign = 32;
6792 SuitableAlign = 32;
6793 SizeType = UnsignedInt;
6794 IntMaxType = SignedLong;
6795 IntPtrType = SignedInt;
6796 PtrDiffType = SignedInt;
6797 FloatWidth = 32;
6798 FloatAlign = 32;
6799 DoubleWidth = 32;
6800 DoubleAlign = 32;
6801 LongDoubleWidth = 32;
6802 LongDoubleAlign = 32;
6803 FloatFormat = &llvm::APFloat::IEEEsingle;
6804 DoubleFormat = &llvm::APFloat::IEEEsingle;
6805 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006806 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6807 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006808 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6809 UseAddrSpaceMapMangling = true;
6810 }
6811
6812 void getTargetDefines(const LangOptions &Opts,
6813 MacroBuilder &Builder) const override {
6814 DefineStd(Builder, "tce", Opts);
6815 Builder.defineMacro("__TCE__");
6816 Builder.defineMacro("__TCE_V1__");
6817 }
6818 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6819
Craig Topper6c03a542015-10-19 04:51:35 +00006820 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006821 const char *getClobbers() const override { return ""; }
6822 BuiltinVaListKind getBuiltinVaListKind() const override {
6823 return TargetInfo::VoidPtrBuiltinVaList;
6824 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006825 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006826 bool validateAsmConstraint(const char *&Name,
6827 TargetInfo::ConstraintInfo &info) const override {
6828 return true;
6829 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006830 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6831 return None;
6832 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006833};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006834
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006835class BPFTargetInfo : public TargetInfo {
6836public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006837 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6838 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006839 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6840 SizeType = UnsignedLong;
6841 PtrDiffType = SignedLong;
6842 IntPtrType = SignedLong;
6843 IntMaxType = SignedLong;
6844 Int64Type = SignedLong;
6845 RegParmMax = 5;
6846 if (Triple.getArch() == llvm::Triple::bpfeb) {
6847 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006848 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006849 } else {
6850 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006851 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006852 }
6853 MaxAtomicPromoteWidth = 64;
6854 MaxAtomicInlineWidth = 64;
6855 TLSSupported = false;
6856 }
6857 void getTargetDefines(const LangOptions &Opts,
6858 MacroBuilder &Builder) const override {
6859 DefineStd(Builder, "bpf", Opts);
6860 Builder.defineMacro("__BPF__");
6861 }
6862 bool hasFeature(StringRef Feature) const override {
6863 return Feature == "bpf";
6864 }
6865
Craig Topper6c03a542015-10-19 04:51:35 +00006866 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006867 const char *getClobbers() const override {
6868 return "";
6869 }
6870 BuiltinVaListKind getBuiltinVaListKind() const override {
6871 return TargetInfo::VoidPtrBuiltinVaList;
6872 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006873 ArrayRef<const char *> getGCCRegNames() const override {
6874 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006875 }
6876 bool validateAsmConstraint(const char *&Name,
6877 TargetInfo::ConstraintInfo &info) const override {
6878 return true;
6879 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006880 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6881 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006882 }
6883};
6884
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006885class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006886 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006887
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006888 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006889 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006890 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006891 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006892 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006893 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006894 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006895 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006896 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006897 enum DspRevEnum {
6898 NoDSP, DSP1, DSP2
6899 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006900 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006901
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006902protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006903 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006904 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006905
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006906public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006907 MipsTargetInfoBase(const llvm::Triple &Triple, const TargetOptions &,
6908 const std::string &ABIStr, const std::string &CPUStr)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006909 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006910 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006911 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6912 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6913 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006914
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006915 bool isNaN2008Default() const {
6916 return CPU == "mips32r6" || CPU == "mips64r6";
6917 }
6918
6919 bool isFP64Default() const {
6920 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6921 }
6922
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006923 bool isNan2008() const override {
6924 return IsNan2008;
6925 }
6926
Alp Toker4925ba72014-06-07 23:30:42 +00006927 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006928 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006929 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6930 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006931 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006932 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006933 .Case("mips1", IsMips32)
6934 .Case("mips2", IsMips32)
6935 .Case("mips3", true)
6936 .Case("mips4", true)
6937 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006938 .Case("mips32", IsMips32)
6939 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006940 .Case("mips32r3", IsMips32)
6941 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006942 .Case("mips32r6", IsMips32)
6943 .Case("mips64", true)
6944 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006945 .Case("mips64r3", true)
6946 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006947 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006948 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006949 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006950 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006951 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006952 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006953 bool
6954 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6955 StringRef CPU,
6956 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006957 if (CPU.empty())
6958 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006959 if (CPU == "octeon")
6960 Features["mips64r2"] = Features["cnmips"] = true;
6961 else
6962 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006963 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006964 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006965
Craig Topper3164f332014-03-11 03:39:26 +00006966 void getTargetDefines(const LangOptions &Opts,
6967 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006968 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006969 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006970 if (Opts.GNUMode)
6971 Builder.defineMacro("mips");
6972
Simon Atanasyan683535b2012-08-29 19:14:58 +00006973 Builder.defineMacro("__REGISTER_PREFIX__", "");
6974
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006975 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006976 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006977 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006978 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006979 case SoftFloat:
6980 Builder.defineMacro("__mips_soft_float", Twine(1));
6981 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006982 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006983
Simon Atanasyan16071912013-04-14 14:07:30 +00006984 if (IsSingleFloat)
6985 Builder.defineMacro("__mips_single_float", Twine(1));
6986
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006987 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6988 Builder.defineMacro("_MIPS_FPSET",
6989 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6990
Simon Atanasyan72244b62012-07-05 16:06:06 +00006991 if (IsMips16)
6992 Builder.defineMacro("__mips16", Twine(1));
6993
Simon Atanasyan60777612013-04-14 14:07:51 +00006994 if (IsMicromips)
6995 Builder.defineMacro("__mips_micromips", Twine(1));
6996
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006997 if (IsNan2008)
6998 Builder.defineMacro("__mips_nan2008", Twine(1));
6999
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007000 switch (DspRev) {
7001 default:
7002 break;
7003 case DSP1:
7004 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7005 Builder.defineMacro("__mips_dsp", Twine(1));
7006 break;
7007 case DSP2:
7008 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7009 Builder.defineMacro("__mips_dspr2", Twine(1));
7010 Builder.defineMacro("__mips_dsp", Twine(1));
7011 break;
7012 }
7013
Jack Carter44ff1e52013-08-12 17:20:29 +00007014 if (HasMSA)
7015 Builder.defineMacro("__mips_msa", Twine(1));
7016
Simon Atanasyan26f19672012-04-05 19:28:31 +00007017 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7018 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7019 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007020
7021 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7022 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007023
7024 // These shouldn't be defined for MIPS-I but there's no need to check
7025 // for that since MIPS-I isn't supported.
7026 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7027 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7028 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007029 }
7030
Craig Topper6c03a542015-10-19 04:51:35 +00007031 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7032 return llvm::makeArrayRef(BuiltinInfo,
7033 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007034 }
Craig Topper3164f332014-03-11 03:39:26 +00007035 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007036 return llvm::StringSwitch<bool>(Feature)
7037 .Case("mips", true)
7038 .Case("fp64", HasFP64)
7039 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007040 }
Craig Topper3164f332014-03-11 03:39:26 +00007041 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007042 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007043 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007044 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007045 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007046 // CPU register names
7047 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007048 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7049 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7050 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007051 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7052 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007053 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7054 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7055 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7056 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007057 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007058 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007059 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7060 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007061 // MSA register names
7062 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7063 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7064 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7065 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7066 // MSA control register names
7067 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7068 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007069 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007070 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007071 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007072 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00007073 bool validateAsmConstraint(const char *&Name,
7074 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007075 switch (*Name) {
7076 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007077 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007078 case 'r': // CPU registers.
7079 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007080 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007081 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007082 case 'c': // $25 for indirect jumps
7083 case 'l': // lo register
7084 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007085 Info.setAllowsRegister();
7086 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007087 case 'I': // Signed 16-bit constant
7088 case 'J': // Integer 0
7089 case 'K': // Unsigned 16-bit constant
7090 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7091 case 'M': // Constants not loadable via lui, addiu, or ori
7092 case 'N': // Constant -1 to -65535
7093 case 'O': // A signed 15-bit constant
7094 case 'P': // A constant between 1 go 65535
7095 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007096 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007097 Info.setAllowsMemory();
7098 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007099 case 'Z':
7100 if (Name[1] == 'C') { // An address usable by ll, and sc.
7101 Info.setAllowsMemory();
7102 Name++; // Skip over 'Z'.
7103 return true;
7104 }
7105 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007106 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007107 }
7108
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007109 std::string convertConstraint(const char *&Constraint) const override {
7110 std::string R;
7111 switch (*Constraint) {
7112 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7113 if (Constraint[1] == 'C') {
7114 R = std::string("^") + std::string(Constraint, 2);
7115 Constraint++;
7116 return R;
7117 }
7118 break;
7119 }
7120 return TargetInfo::convertConstraint(Constraint);
7121 }
7122
Craig Topper3164f332014-03-11 03:39:26 +00007123 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007124 // In GCC, $1 is not widely used in generated code (it's used only in a few
7125 // specific situations), so there is no real need for users to add it to
7126 // the clobbers list if they want to use it in their inline assembly code.
7127 //
7128 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7129 // code generation, so using it in inline assembly without adding it to the
7130 // clobbers list can cause conflicts between the inline assembly code and
7131 // the surrounding generated code.
7132 //
7133 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7134 // operands, which will conflict with the ".set at" assembler option (which
7135 // we use only for inline assembly, in order to maintain compatibility with
7136 // GCC) and will also conflict with the user's usage of $1.
7137 //
7138 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7139 // register for generated code is to automatically clobber $1 for all inline
7140 // assembly code.
7141 //
7142 // FIXME: We should automatically clobber $1 only for inline assembly code
7143 // which actually uses it. This would allow LLVM to use $1 for inline
7144 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007145 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007146 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007147
Craig Topper3164f332014-03-11 03:39:26 +00007148 bool handleTargetFeatures(std::vector<std::string> &Features,
7149 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007150 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007151 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007152 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007153 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007154 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007155 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007156 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007157
Eric Christopher610fe112015-08-26 08:21:55 +00007158 for (const auto &Feature : Features) {
7159 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007160 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007161 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007162 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007163 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007164 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007165 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007166 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007167 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007168 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007169 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007170 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007171 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007172 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007173 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007174 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007175 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007176 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007177 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007178 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007179 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007180 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007181 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007182
James Y Knightb214cbc2016-03-04 19:00:41 +00007183 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007184
Rafael Espindolaeb265472013-08-21 21:59:03 +00007185 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007186 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007187
Craig Topper3164f332014-03-11 03:39:26 +00007188 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007189 if (RegNo == 0) return 4;
7190 if (RegNo == 1) return 5;
7191 return -1;
7192 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007193
7194 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007195};
7196
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007197const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007198#define BUILTIN(ID, TYPE, ATTRS) \
7199 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7200#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7201 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007202#include "clang/Basic/BuiltinsMips.def"
7203};
7204
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007205class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007206public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007207 Mips32TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7208 : MipsTargetInfoBase(Triple, Opts, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007209 SizeType = UnsignedInt;
7210 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007211 Int64Type = SignedLongLong;
7212 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007213 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007214 }
Craig Topper3164f332014-03-11 03:39:26 +00007215 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007216 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007217 ABI = Name;
7218 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007219 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007220 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007221 }
Craig Topper3164f332014-03-11 03:39:26 +00007222 void getTargetDefines(const LangOptions &Opts,
7223 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007224 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007225
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007226 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007227 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7228
7229 const std::string& CPUStr = getCPU();
7230 if (CPUStr == "mips32")
7231 Builder.defineMacro("__mips_isa_rev", "1");
7232 else if (CPUStr == "mips32r2")
7233 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007234 else if (CPUStr == "mips32r3")
7235 Builder.defineMacro("__mips_isa_rev", "3");
7236 else if (CPUStr == "mips32r5")
7237 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007238 else if (CPUStr == "mips32r6")
7239 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007240
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007241 if (ABI == "o32") {
7242 Builder.defineMacro("__mips_o32");
7243 Builder.defineMacro("_ABIO32", "1");
7244 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7245 }
7246 else if (ABI == "eabi")
7247 Builder.defineMacro("__mips_eabi");
7248 else
David Blaikie83d382b2011-09-23 05:06:16 +00007249 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007250 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007251 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007252 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7253 { { "at" }, "$1" },
7254 { { "v0" }, "$2" },
7255 { { "v1" }, "$3" },
7256 { { "a0" }, "$4" },
7257 { { "a1" }, "$5" },
7258 { { "a2" }, "$6" },
7259 { { "a3" }, "$7" },
7260 { { "t0" }, "$8" },
7261 { { "t1" }, "$9" },
7262 { { "t2" }, "$10" },
7263 { { "t3" }, "$11" },
7264 { { "t4" }, "$12" },
7265 { { "t5" }, "$13" },
7266 { { "t6" }, "$14" },
7267 { { "t7" }, "$15" },
7268 { { "s0" }, "$16" },
7269 { { "s1" }, "$17" },
7270 { { "s2" }, "$18" },
7271 { { "s3" }, "$19" },
7272 { { "s4" }, "$20" },
7273 { { "s5" }, "$21" },
7274 { { "s6" }, "$22" },
7275 { { "s7" }, "$23" },
7276 { { "t8" }, "$24" },
7277 { { "t9" }, "$25" },
7278 { { "k0" }, "$26" },
7279 { { "k1" }, "$27" },
7280 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007281 { { "sp","$sp" }, "$29" },
7282 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007283 { { "ra" }, "$31" }
7284 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007285 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007286 }
7287};
7288
7289class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007290 void setDataLayout() override {
7291 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007292 }
7293
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007294public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007295 Mips32EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7296 : Mips32TargetInfoBase(Triple, Opts) {
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00007297 }
Craig Topper3164f332014-03-11 03:39:26 +00007298 void getTargetDefines(const LangOptions &Opts,
7299 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007300 DefineStd(Builder, "MIPSEB", Opts);
7301 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007302 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007303 }
7304};
7305
7306class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007307 void setDataLayout() override {
7308 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007309 }
7310
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007312 Mips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7313 : Mips32TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007314 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007315 }
Craig Topper3164f332014-03-11 03:39:26 +00007316 void getTargetDefines(const LangOptions &Opts,
7317 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007318 DefineStd(Builder, "MIPSEL", Opts);
7319 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007320 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007321 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007322};
Akira Hatanakabef17452011-09-20 19:21:49 +00007323
7324class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007325public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007326 Mips64TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7327 : MipsTargetInfoBase(Triple, Opts, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007328 LongDoubleWidth = LongDoubleAlign = 128;
7329 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007330 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7331 LongDoubleWidth = LongDoubleAlign = 64;
7332 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7333 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007334 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007335 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007336 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007337 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007338
7339 void setN64ABITypes() {
7340 LongWidth = LongAlign = 64;
7341 PointerWidth = PointerAlign = 64;
7342 SizeType = UnsignedLong;
7343 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007344 Int64Type = SignedLong;
7345 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007346 }
7347
7348 void setN32ABITypes() {
7349 LongWidth = LongAlign = 32;
7350 PointerWidth = PointerAlign = 32;
7351 SizeType = UnsignedInt;
7352 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007353 Int64Type = SignedLongLong;
7354 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007355 }
7356
Craig Topper3164f332014-03-11 03:39:26 +00007357 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007358 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007359 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007360 ABI = Name;
7361 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007362 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007363 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007364 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007365 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007366 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007367 }
7368 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007369 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007370
Craig Topper3164f332014-03-11 03:39:26 +00007371 void getTargetDefines(const LangOptions &Opts,
7372 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007373 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007374
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007375 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007376 Builder.defineMacro("__mips64");
7377 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007378 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7379
7380 const std::string& CPUStr = getCPU();
7381 if (CPUStr == "mips64")
7382 Builder.defineMacro("__mips_isa_rev", "1");
7383 else if (CPUStr == "mips64r2")
7384 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007385 else if (CPUStr == "mips64r3")
7386 Builder.defineMacro("__mips_isa_rev", "3");
7387 else if (CPUStr == "mips64r5")
7388 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007389 else if (CPUStr == "mips64r6")
7390 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007391
Akira Hatanakabef17452011-09-20 19:21:49 +00007392 if (ABI == "n32") {
7393 Builder.defineMacro("__mips_n32");
7394 Builder.defineMacro("_ABIN32", "2");
7395 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7396 }
7397 else if (ABI == "n64") {
7398 Builder.defineMacro("__mips_n64");
7399 Builder.defineMacro("_ABI64", "3");
7400 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7401 }
7402 else
David Blaikie83d382b2011-09-23 05:06:16 +00007403 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007404
7405 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007406 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007407 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007408 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7409 { { "at" }, "$1" },
7410 { { "v0" }, "$2" },
7411 { { "v1" }, "$3" },
7412 { { "a0" }, "$4" },
7413 { { "a1" }, "$5" },
7414 { { "a2" }, "$6" },
7415 { { "a3" }, "$7" },
7416 { { "a4" }, "$8" },
7417 { { "a5" }, "$9" },
7418 { { "a6" }, "$10" },
7419 { { "a7" }, "$11" },
7420 { { "t0" }, "$12" },
7421 { { "t1" }, "$13" },
7422 { { "t2" }, "$14" },
7423 { { "t3" }, "$15" },
7424 { { "s0" }, "$16" },
7425 { { "s1" }, "$17" },
7426 { { "s2" }, "$18" },
7427 { { "s3" }, "$19" },
7428 { { "s4" }, "$20" },
7429 { { "s5" }, "$21" },
7430 { { "s6" }, "$22" },
7431 { { "s7" }, "$23" },
7432 { { "t8" }, "$24" },
7433 { { "t9" }, "$25" },
7434 { { "k0" }, "$26" },
7435 { { "k1" }, "$27" },
7436 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007437 { { "sp","$sp" }, "$29" },
7438 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007439 { { "ra" }, "$31" }
7440 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007441 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007442 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007443
7444 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007445};
7446
7447class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007448 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007449 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007450 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 +00007451 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007452 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007453 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007454
Akira Hatanakabef17452011-09-20 19:21:49 +00007455public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007456 Mips64EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7457 : Mips64TargetInfoBase(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00007458 void getTargetDefines(const LangOptions &Opts,
7459 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007460 DefineStd(Builder, "MIPSEB", Opts);
7461 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007462 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007463 }
7464};
7465
7466class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007467 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007468 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007469 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 +00007470 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007471 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007472 }
7473public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007474 Mips64ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7475 : Mips64TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007476 // Default ABI is n64.
7477 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007478 }
Craig Topper3164f332014-03-11 03:39:26 +00007479 void getTargetDefines(const LangOptions &Opts,
7480 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007481 DefineStd(Builder, "MIPSEL", Opts);
7482 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007483 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007484 }
7485};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007486
Ivan Krasindd7403e2011-08-24 20:22:22 +00007487class PNaClTargetInfo : public TargetInfo {
7488public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007489 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7490 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007491 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007492 this->LongAlign = 32;
7493 this->LongWidth = 32;
7494 this->PointerAlign = 32;
7495 this->PointerWidth = 32;
7496 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007497 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007498 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007499 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007500 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007501 this->SizeType = TargetInfo::UnsignedInt;
7502 this->PtrDiffType = TargetInfo::SignedInt;
7503 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007504 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007505 }
7506
Craig Toppere6f17d02014-03-11 04:07:52 +00007507 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007508 Builder.defineMacro("__le32__");
7509 Builder.defineMacro("__pnacl__");
7510 }
Craig Topper3164f332014-03-11 03:39:26 +00007511 void getTargetDefines(const LangOptions &Opts,
7512 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007513 getArchDefines(Opts, Builder);
7514 }
Craig Topper3164f332014-03-11 03:39:26 +00007515 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007516 return Feature == "pnacl";
7517 }
Craig Topper6c03a542015-10-19 04:51:35 +00007518 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007519 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007520 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007521 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007522 ArrayRef<const char *> getGCCRegNames() const override;
7523 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007524 bool validateAsmConstraint(const char *&Name,
7525 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007526 return false;
7527 }
7528
Craig Topper3164f332014-03-11 03:39:26 +00007529 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007530 return "";
7531 }
7532};
7533
Craig Topperf054e3a2015-10-19 03:52:27 +00007534ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7535 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007536}
7537
Craig Topperf054e3a2015-10-19 03:52:27 +00007538ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7539 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007540}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007541
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007542// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7543class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7544public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007545 NaClMips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7546 : Mips32ELTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007547
7548 BuiltinVaListKind getBuiltinVaListKind() const override {
7549 return TargetInfo::PNaClABIBuiltinVaList;
7550 }
7551};
7552
JF Bastien643817d2014-09-12 17:52:47 +00007553class Le64TargetInfo : public TargetInfo {
7554 static const Builtin::Info BuiltinInfo[];
7555
7556public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007557 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7558 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007559 BigEndian = false;
7560 NoAsmVariants = true;
7561 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7562 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007563 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007564 }
7565
7566 void getTargetDefines(const LangOptions &Opts,
7567 MacroBuilder &Builder) const override {
7568 DefineStd(Builder, "unix", Opts);
7569 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7570 Builder.defineMacro("__ELF__");
7571 }
Craig Topper6c03a542015-10-19 04:51:35 +00007572 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7573 return llvm::makeArrayRef(BuiltinInfo,
7574 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007575 }
7576 BuiltinVaListKind getBuiltinVaListKind() const override {
7577 return TargetInfo::PNaClABIBuiltinVaList;
7578 }
7579 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007580 ArrayRef<const char *> getGCCRegNames() const override {
7581 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007582 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007583 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7584 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007585 }
7586 bool validateAsmConstraint(const char *&Name,
7587 TargetInfo::ConstraintInfo &Info) const override {
7588 return false;
7589 }
7590
7591 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007592};
Dan Gohmanc2853072015-09-03 22:51:53 +00007593
7594class WebAssemblyTargetInfo : public TargetInfo {
7595 static const Builtin::Info BuiltinInfo[];
7596
7597 enum SIMDEnum {
7598 NoSIMD,
7599 SIMD128,
7600 } SIMDLevel;
7601
7602public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007603 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007604 : TargetInfo(T), SIMDLevel(NoSIMD) {
7605 BigEndian = false;
7606 NoAsmVariants = true;
7607 SuitableAlign = 128;
7608 LargeArrayMinWidth = 128;
7609 LargeArrayAlign = 128;
7610 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007611 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007612 LongDoubleWidth = LongDoubleAlign = 128;
7613 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007614 }
7615
7616protected:
7617 void getTargetDefines(const LangOptions &Opts,
7618 MacroBuilder &Builder) const override {
7619 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7620 if (SIMDLevel >= SIMD128)
7621 Builder.defineMacro("__wasm_simd128__");
7622 }
7623
7624private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007625 bool
7626 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7627 StringRef CPU,
7628 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007629 if (CPU == "bleeding-edge")
7630 Features["simd128"] = true;
7631 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7632 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007633 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007634 return llvm::StringSwitch<bool>(Feature)
7635 .Case("simd128", SIMDLevel >= SIMD128)
7636 .Default(false);
7637 }
7638 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007639 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007640 for (const auto &Feature : Features) {
7641 if (Feature == "+simd128") {
7642 SIMDLevel = std::max(SIMDLevel, SIMD128);
7643 continue;
7644 }
7645 if (Feature == "-simd128") {
7646 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7647 continue;
7648 }
7649
7650 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7651 << "-target-feature";
7652 return false;
7653 }
7654 return true;
7655 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007656 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007657 return llvm::StringSwitch<bool>(Name)
7658 .Case("mvp", true)
7659 .Case("bleeding-edge", true)
7660 .Case("generic", true)
7661 .Default(false);
7662 }
Craig Topper6c03a542015-10-19 04:51:35 +00007663 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7664 return llvm::makeArrayRef(BuiltinInfo,
7665 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007666 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007667 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007668 return VoidPtrBuiltinVaList;
7669 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007670 ArrayRef<const char *> getGCCRegNames() const final {
7671 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007672 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007673 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7674 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007675 }
7676 bool
7677 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007678 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007679 return false;
7680 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007681 const char *getClobbers() const final { return ""; }
7682 bool isCLZForZeroUndef() const final { return false; }
7683 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007684 IntType getIntTypeByWidth(unsigned BitWidth,
7685 bool IsSigned) const final {
7686 // WebAssembly prefers long long for explicitly 64-bit integers.
7687 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7688 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7689 }
7690 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7691 bool IsSigned) const final {
7692 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7693 return BitWidth == 64
7694 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7695 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7696 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007697};
7698
7699const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7700#define BUILTIN(ID, TYPE, ATTRS) \
7701 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7702#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7703 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7704#include "clang/Basic/BuiltinsWebAssembly.def"
7705};
7706
7707class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7708public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007709 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7710 const TargetOptions &Opts)
7711 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007712 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007713 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007714 }
7715
7716protected:
7717 void getTargetDefines(const LangOptions &Opts,
7718 MacroBuilder &Builder) const override {
7719 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7720 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7721 }
7722};
7723
7724class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7725public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007726 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7727 const TargetOptions &Opts)
7728 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007729 LongAlign = LongWidth = 64;
7730 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007731 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007732 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007733 }
7734
7735protected:
7736 void getTargetDefines(const LangOptions &Opts,
7737 MacroBuilder &Builder) const override {
7738 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7739 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7740 }
7741};
7742
JF Bastien643817d2014-09-12 17:52:47 +00007743const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7744#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007745 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007746#include "clang/Basic/BuiltinsLe64.def"
7747};
7748
Eric Christopherc48497a2015-09-18 21:26:24 +00007749static const unsigned SPIRAddrSpaceMap[] = {
7750 1, // opencl_global
7751 3, // opencl_local
7752 2, // opencl_constant
7753 4, // opencl_generic
7754 0, // cuda_device
7755 0, // cuda_constant
7756 0 // cuda_shared
7757};
7758class SPIRTargetInfo : public TargetInfo {
7759public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007760 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7761 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007762 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7763 "SPIR target must use unknown OS");
7764 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7765 "SPIR target must use unknown environment type");
7766 BigEndian = false;
7767 TLSSupported = false;
7768 LongWidth = LongAlign = 64;
7769 AddrSpaceMap = &SPIRAddrSpaceMap;
7770 UseAddrSpaceMapMangling = true;
7771 // Define available target features
7772 // These must be defined in sorted order!
7773 NoAsmVariants = true;
7774 }
7775 void getTargetDefines(const LangOptions &Opts,
7776 MacroBuilder &Builder) const override {
7777 DefineStd(Builder, "SPIR", Opts);
7778 }
7779 bool hasFeature(StringRef Feature) const override {
7780 return Feature == "spir";
7781 }
Craig Topper3164f332014-03-11 03:39:26 +00007782
Craig Topper6c03a542015-10-19 04:51:35 +00007783 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007784 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007785 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007786 bool validateAsmConstraint(const char *&Name,
7787 TargetInfo::ConstraintInfo &info) const override {
7788 return true;
7789 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007790 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7791 return None;
7792 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007793 BuiltinVaListKind getBuiltinVaListKind() const override {
7794 return TargetInfo::VoidPtrBuiltinVaList;
7795 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007796
Eric Christopherc48497a2015-09-18 21:26:24 +00007797 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7798 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7799 : CCCR_Warning;
7800 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007801
Eric Christopherc48497a2015-09-18 21:26:24 +00007802 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7803 return CC_SpirFunction;
7804 }
7805};
Guy Benyeib798fc92012-12-11 21:38:14 +00007806
Eric Christopherc48497a2015-09-18 21:26:24 +00007807class SPIR32TargetInfo : public SPIRTargetInfo {
7808public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007809 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7810 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007811 PointerWidth = PointerAlign = 32;
7812 SizeType = TargetInfo::UnsignedInt;
7813 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007814 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7815 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007816 }
7817 void getTargetDefines(const LangOptions &Opts,
7818 MacroBuilder &Builder) const override {
7819 DefineStd(Builder, "SPIR32", Opts);
7820 }
7821};
Guy Benyeib798fc92012-12-11 21:38:14 +00007822
Eric Christopherc48497a2015-09-18 21:26:24 +00007823class SPIR64TargetInfo : public SPIRTargetInfo {
7824public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007825 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7826 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007827 PointerWidth = PointerAlign = 64;
7828 SizeType = TargetInfo::UnsignedLong;
7829 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007830 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7831 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007832 }
7833 void getTargetDefines(const LangOptions &Opts,
7834 MacroBuilder &Builder) const override {
7835 DefineStd(Builder, "SPIR64", Opts);
7836 }
7837};
Guy Benyeib798fc92012-12-11 21:38:14 +00007838
Robert Lytton0e076492013-08-13 09:43:10 +00007839class XCoreTargetInfo : public TargetInfo {
7840 static const Builtin::Info BuiltinInfo[];
7841public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007842 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7843 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007844 BigEndian = false;
7845 NoAsmVariants = true;
7846 LongLongAlign = 32;
7847 SuitableAlign = 32;
7848 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007849 SizeType = UnsignedInt;
7850 PtrDiffType = SignedInt;
7851 IntPtrType = SignedInt;
7852 WCharType = UnsignedChar;
7853 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007854 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007855 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7856 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007857 }
Craig Topper3164f332014-03-11 03:39:26 +00007858 void getTargetDefines(const LangOptions &Opts,
7859 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007860 Builder.defineMacro("__XS1B__");
7861 }
Craig Topper6c03a542015-10-19 04:51:35 +00007862 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7863 return llvm::makeArrayRef(BuiltinInfo,
7864 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007865 }
Craig Topper3164f332014-03-11 03:39:26 +00007866 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007867 return TargetInfo::VoidPtrBuiltinVaList;
7868 }
Craig Topper3164f332014-03-11 03:39:26 +00007869 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007870 return "";
7871 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007872 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007873 static const char * const GCCRegNames[] = {
7874 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7875 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7876 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007877 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007878 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007879 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7880 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007881 }
Craig Topper3164f332014-03-11 03:39:26 +00007882 bool validateAsmConstraint(const char *&Name,
7883 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007884 return false;
7885 }
Craig Topper3164f332014-03-11 03:39:26 +00007886 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007887 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7888 return (RegNo < 2)? RegNo : -1;
7889 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007890 bool allowsLargerPreferedTypeAlignment() const override {
7891 return false;
7892 }
Robert Lytton0e076492013-08-13 09:43:10 +00007893};
7894
7895const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007896#define BUILTIN(ID, TYPE, ATTRS) \
7897 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7898#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7899 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007900#include "clang/Basic/BuiltinsXCore.def"
7901};
Robert Lytton0e076492013-08-13 09:43:10 +00007902
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007903// x86_32 Android target
7904class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7905public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007906 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7907 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007908 SuitableAlign = 32;
7909 LongDoubleWidth = 64;
7910 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7911 }
7912};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007913
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007914// x86_64 Android target
7915class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7916public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007917 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7918 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007919 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7920 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007921
7922 bool useFloat128ManglingForLongDouble() const override {
7923 return true;
7924 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007925};
7926} // end anonymous namespace
7927
Chris Lattner5ba61f02006-10-14 07:39:34 +00007928//===----------------------------------------------------------------------===//
7929// Driver code
7930//===----------------------------------------------------------------------===//
7931
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007932static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
7933 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007934 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007935
Daniel Dunbar52322032009-08-18 05:47:58 +00007936 switch (Triple.getArch()) {
7937 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007938 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007939
Tim Northover2a0783d2014-05-30 14:14:07 +00007940 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007941 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007942
7943 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007944 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007945
Jacques Pienaard964cc22016-03-28 21:02:54 +00007946 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007947 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00007948
Tim Northover2a0783d2014-05-30 14:14:07 +00007949 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007950 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007951 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007952
7953 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007954 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007955 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00007956 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007957 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007958 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007959 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00007960 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007961 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007962 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007963 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00007964 }
7965
Christian Pirker9b019ae2014-02-25 13:51:00 +00007966 case llvm::Triple::aarch64_be:
7967 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007968 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007969 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007970 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007971 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007972 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007973 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007974 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007975 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00007976 }
7977
Daniel Dunbar52322032009-08-18 05:47:58 +00007978 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007979 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007980 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007981 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007982
Daniel Dunbar52322032009-08-18 05:47:58 +00007983 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007984 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007985 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00007986 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007987 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007988 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007989 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007990 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007991 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00007992 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007993 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007994 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007995 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007996 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007997 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007998 case llvm::Triple::Win32:
7999 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008000 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008001 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008002 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008003 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008004 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008005 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008006 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008007 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008008 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008009 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008010 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008011 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008012 }
8013
8014 case llvm::Triple::armeb:
8015 case llvm::Triple::thumbeb:
8016 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008017 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008018
8019 switch (os) {
8020 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008021 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008022 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008023 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008024 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008025 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008026 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008027 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008028 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008029 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008030 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008031 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008032 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008033 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008034 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008035 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008036 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008037
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008038 case llvm::Triple::bpfeb:
8039 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008040 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008041
Daniel Dunbar52322032009-08-18 05:47:58 +00008042 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008043 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008044
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008045 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008046 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008047 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008048 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008049 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008050 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008051 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008052 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008053 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008054 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008055 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008056 return new Mips32EBTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008057 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008058
8059 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008060 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008061 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008062 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008063 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008064 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008065 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008066 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008067 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008068 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008069 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008070 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008071 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008072 return new Mips32ELTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008073 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008074
Akira Hatanakabef17452011-09-20 19:21:49 +00008075 case llvm::Triple::mips64:
8076 switch (os) {
8077 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008078 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008079 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008080 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008081 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008082 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008083 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008084 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008085 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008086 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008087 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008088 return new Mips64EBTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008089 }
8090
8091 case llvm::Triple::mips64el:
8092 switch (os) {
8093 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008094 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008095 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008096 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008097 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008098 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008099 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008100 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008101 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008102 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008103 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008104 return new Mips64ELTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008105 }
8106
Ivan Krasindd7403e2011-08-24 20:22:22 +00008107 case llvm::Triple::le32:
8108 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008109 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008110 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008111 default:
8112 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008113 }
8114
JF Bastien643817d2014-09-12 17:52:47 +00008115 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008116 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008117
Daniel Dunbar52322032009-08-18 05:47:58 +00008118 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008119 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008120 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008121 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008122 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008123 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008124 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008125 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008126 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008127 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008128 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008129 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008130 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008131 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008132 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008133 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008134 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008135
8136 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008137 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008138 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008139 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008140 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008141 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008142 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008143 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008144 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008145 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008146 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008147 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008148 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008149 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008150 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008151
Bill Schmidt778d3872013-07-26 01:36:11 +00008152 case llvm::Triple::ppc64le:
8153 switch (os) {
8154 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008155 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008156 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008157 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008158 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008159 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008160 }
8161
Peter Collingbournec947aae2012-05-20 23:28:41 +00008162 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008163 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008164 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008165 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008166
Tom Stellardd8e38a32015-01-06 20:34:47 +00008167 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008168 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008169 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008170
Daniel Dunbar52322032009-08-18 05:47:58 +00008171 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008172 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008173 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008174 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008175 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008176 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008177 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008178 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008179 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008180 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008181 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008182 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008183 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008184 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008185 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008186
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008187 // The 'sparcel' architecture copies all the above cases except for Solaris.
8188 case llvm::Triple::sparcel:
8189 switch (os) {
8190 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008191 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008192 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008193 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008194 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008195 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008196 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008197 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008198 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008199 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008200 }
8201
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008202 case llvm::Triple::sparcv9:
8203 switch (os) {
8204 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008205 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008206 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008207 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008208 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008209 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008210 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008211 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008212 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008213 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008214 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008215 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008216 }
8217
Ulrich Weigand47445072013-05-06 16:26:41 +00008218 case llvm::Triple::systemz:
8219 switch (os) {
8220 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008222 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008224 }
8225
Eli Friedmana9c3d712009-08-19 20:47:07 +00008226 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008228
Daniel Dunbar52322032009-08-18 05:47:58 +00008229 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008230 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008231 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008232
Daniel Dunbar52322032009-08-18 05:47:58 +00008233 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008234 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008236 case llvm::Triple::Linux: {
8237 switch (Triple.getEnvironment()) {
8238 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008240 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008242 }
8243 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008244 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008246 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008247 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008248 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008249 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008250 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008251 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008252 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008253 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008254 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008256 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008257 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008258 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008260 case llvm::Triple::Win32: {
8261 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008262 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008264 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008265 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008266 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008267 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008268 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008269 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008270 }
8271 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008272 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008274 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008275 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008276 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008277 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008278 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008279 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008280 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008281 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008282 }
8283
8284 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008285 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008286 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008287
Daniel Dunbar52322032009-08-18 05:47:58 +00008288 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008289 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008290 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008291 case llvm::Triple::Linux: {
8292 switch (Triple.getEnvironment()) {
8293 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008294 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008295 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008296 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008297 }
8298 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008299 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008300 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008301 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008302 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008303 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008304 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008305 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008306 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008307 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008308 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008309 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008310 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008311 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008312 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008313 case llvm::Triple::Win32: {
8314 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008315 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008316 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008317 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008318 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008319 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008320 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008321 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008322 }
8323 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008324 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008325 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008326 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008328 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008330 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008331
Douglas Katzman78d7c542015-05-12 21:18:10 +00008332 case llvm::Triple::spir: {
8333 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8334 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8335 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008336 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008337 }
8338 case llvm::Triple::spir64: {
8339 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8340 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8341 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008342 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008343 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008344 case llvm::Triple::wasm32:
8345 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8346 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008347 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008348 case llvm::Triple::wasm64:
8349 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8350 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008351 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008352 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008353}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008354
8355/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008356/// options.
Alp Toker80758082014-07-06 05:26:44 +00008357TargetInfo *
8358TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008359 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008360 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008361
8362 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008363 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008364 if (!Target) {
8365 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008366 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008367 }
Alp Toker80758082014-07-06 05:26:44 +00008368 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008369
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008370 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008371 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8372 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008373 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008374 }
8375
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008376 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008377 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8378 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008379 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008380 }
8381
Rafael Espindolaeb265472013-08-21 21:59:03 +00008382 // Set the fp math unit.
8383 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8384 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008385 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008386 }
8387
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008388 // Compute the default target features, we need the target to handle this
8389 // because features may have dependencies on one another.
8390 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008391 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8392 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008393 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008394
8395 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008396 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008397 for (const auto &F : Features)
8398 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8399
Eric Christopher3ff21b32013-10-16 21:26:26 +00008400 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008401 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008402
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008403 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008404}