blob: 0a87cdf061e8400d8fd09ba06748f4d87e57502c [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
Chris Lattner09d98f52008-10-05 21:50:58 +000068//===----------------------------------------------------------------------===//
69// Defines specific to certain operating systems.
70//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000071
Torok Edwinb2b37c62009-06-30 17:10:35 +000072namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000073template<typename TgtInfo>
74class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000075protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000076 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000077 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000078public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000079 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
80 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000081 void getTargetDefines(const LangOptions &Opts,
82 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000083 TgtInfo::getTargetDefines(Opts, Builder);
84 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000085 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000086
87};
Chris Lattner30ba6742009-08-10 19:03:04 +000088
Eric Christopher7d0c7252015-09-24 21:17:04 +000089// CloudABI Target
90template <typename Target>
91class CloudABITargetInfo : public OSTargetInfo<Target> {
92protected:
93 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
94 MacroBuilder &Builder) const override {
95 Builder.defineMacro("__CloudABI__");
96 Builder.defineMacro("__ELF__");
97
98 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
99 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
100 Builder.defineMacro("__STDC_UTF_16__");
101 Builder.defineMacro("__STDC_UTF_32__");
102 }
103
104public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000105 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
106 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000107};
108
Daniel Dunbard86666f2010-01-26 01:44:04 +0000109static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000110 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000111 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000112 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000113 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000116 // AddressSanitizer doesn't play well with source fortification, which is on
117 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000118 if (Opts.Sanitize.has(SanitizerKind::Address))
119 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000120
John McCall460ce582015-10-22 18:38:17 +0000121 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
122 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000123 // __weak is always defined, for use in blocks and with objc pointers.
124 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000125 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000126 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000127 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000128
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000129 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000130 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000131 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000132 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000133
134 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000136
Daniel Dunbarecf13562011-04-19 21:40:34 +0000137 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000138 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000139 if (Triple.isMacOSX()) {
140 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000141 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000143 Triple.getOSVersion(Maj, Min, Rev);
144 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000146
Sebastian Pop422377c2012-01-20 22:01:23 +0000147 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000148 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000149 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
150 if (PlatformName == "win32") {
151 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
152 return;
153 }
154
Evan Cheng31dd9a62014-01-26 23:12:43 +0000155 // Set the appropriate OS version define.
156 if (Triple.isiOS()) {
157 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
158 char Str[6];
159 Str[0] = '0' + Maj;
160 Str[1] = '0' + (Min / 10);
161 Str[2] = '0' + (Min % 10);
162 Str[3] = '0' + (Rev / 10);
163 Str[4] = '0' + (Rev % 10);
164 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000165 if (Triple.isTvOS())
166 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
167 else
168 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
169 Str);
170
171 } else if (Triple.isWatchOS()) {
172 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
173 char Str[6];
174 Str[0] = '0' + Maj;
175 Str[1] = '0' + (Min / 10);
176 Str[2] = '0' + (Min % 10);
177 Str[3] = '0' + (Rev / 10);
178 Str[4] = '0' + (Rev % 10);
179 Str[5] = '\0';
180 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000181 } else if (Triple.isMacOSX()) {
182 // Note that the Driver allows versions which aren't representable in the
183 // define (because we only get a single digit for the minor and micro
184 // revision numbers). So, we limit them to the maximum representable
185 // version.
186 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000187 char Str[7];
188 if (Maj < 10 || (Maj == 10 && Min < 10)) {
189 Str[0] = '0' + (Maj / 10);
190 Str[1] = '0' + (Maj % 10);
191 Str[2] = '0' + std::min(Min, 9U);
192 Str[3] = '0' + std::min(Rev, 9U);
193 Str[4] = '\0';
194 } else {
195 // Handle versions > 10.9.
196 Str[0] = '0' + (Maj / 10);
197 Str[1] = '0' + (Maj % 10);
198 Str[2] = '0' + (Min / 10);
199 Str[3] = '0' + (Min % 10);
200 Str[4] = '0' + (Rev / 10);
201 Str[5] = '0' + (Rev % 10);
202 Str[6] = '\0';
203 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000204 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000205 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000206
Tim Northover157d9112014-01-16 08:48:16 +0000207 // Tell users about the kernel if there is one.
208 if (Triple.isOSDarwin())
209 Builder.defineMacro("__MACH__");
210
Chris Bieneman46977b62016-04-29 17:53:00 +0000211 // The Watch ABI uses Dwarf EH.
212 if(Triple.isWatchABI())
213 Builder.defineMacro("__ARM_DWARF_EH__");
214
Daniel Dunbarecf13562011-04-19 21:40:34 +0000215 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000216}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000217
Torok Edwinb2b37c62009-06-30 17:10:35 +0000218template<typename Target>
219class DarwinTargetInfo : public OSTargetInfo<Target> {
220protected:
Craig Topper3164f332014-03-11 03:39:26 +0000221 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
222 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000223 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000224 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000225 }
Mike Stump11289f42009-09-09 15:08:12 +0000226
Torok Edwinb2b37c62009-06-30 17:10:35 +0000227public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000228 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
229 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000230 // By default, no TLS, and we whitelist permitted architecture/OS
231 // combinations.
232 this->TLSSupported = false;
233
234 if (Triple.isMacOSX())
235 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
236 else if (Triple.isiOS()) {
237 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
238 if (Triple.getArch() == llvm::Triple::x86_64 ||
239 Triple.getArch() == llvm::Triple::aarch64)
240 this->TLSSupported = !Triple.isOSVersionLT(8);
241 else if (Triple.getArch() == llvm::Triple::x86 ||
242 Triple.getArch() == llvm::Triple::arm ||
243 Triple.getArch() == llvm::Triple::thumb)
244 this->TLSSupported = !Triple.isOSVersionLT(9);
245 } else if (Triple.isWatchOS())
246 this->TLSSupported = !Triple.isOSVersionLT(2);
247
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000248 this->MCountName = "\01mcount";
249 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000250
Craig Topper3164f332014-03-11 03:39:26 +0000251 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000252 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000253 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000254 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000255 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000256 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000257 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000258 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000259
Craig Topper3164f332014-03-11 03:39:26 +0000260 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000261 // FIXME: We should return 0 when building kexts.
262 return "__TEXT,__StaticInit,regular,pure_instructions";
263 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000264
John McCalleed64c72012-01-29 01:20:30 +0000265 /// Darwin does not support protected visibility. Darwin's "default"
266 /// is very similar to ELF's "protected"; Darwin requires a "weak"
267 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000268 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000269 return false;
270 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000271
272 unsigned getExnObjectAlignment() const override {
273 // The alignment of an exception object is 8-bytes for darwin since
274 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
275 // and therefore doesn't guarantee 16-byte alignment.
276 return 64;
277 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000278};
279
Chris Lattner30ba6742009-08-10 19:03:04 +0000280
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281// DragonFlyBSD Target
282template<typename Target>
283class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
284protected:
Craig Topper3164f332014-03-11 03:39:26 +0000285 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
286 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000287 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000288 Builder.defineMacro("__DragonFly__");
289 Builder.defineMacro("__DragonFly_cc_version", "100001");
290 Builder.defineMacro("__ELF__");
291 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
292 Builder.defineMacro("__tune_i386__");
293 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294 }
295public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000296 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
297 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000298 switch (Triple.getArch()) {
299 default:
300 case llvm::Triple::x86:
301 case llvm::Triple::x86_64:
302 this->MCountName = ".mcount";
303 break;
304 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000305 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306};
307
308// FreeBSD Target
309template<typename Target>
310class FreeBSDTargetInfo : public OSTargetInfo<Target> {
311protected:
Craig Topper3164f332014-03-11 03:39:26 +0000312 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
313 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000314 // FreeBSD defines; list based off of gcc output
315
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000316 unsigned Release = Triple.getOSMajorVersion();
317 if (Release == 0U)
318 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000319
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000320 Builder.defineMacro("__FreeBSD__", Twine(Release));
321 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000322 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
323 DefineStd(Builder, "unix", Opts);
324 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000325
326 // On FreeBSD, wchar_t contains the number of the code point as
327 // used by the character set of the locale. These character sets are
328 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000329 //
330 // FIXME: This is wrong; the macro refers to the numerical values
331 // of wchar_t *literals*, which are not locale-dependent. However,
332 // FreeBSD systems apparently depend on us getting this wrong, and
333 // setting this to 1 is conforming even if all the basic source
334 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000335 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000336 }
337public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000338 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
339 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000340 switch (Triple.getArch()) {
341 default:
342 case llvm::Triple::x86:
343 case llvm::Triple::x86_64:
344 this->MCountName = ".mcount";
345 break;
346 case llvm::Triple::mips:
347 case llvm::Triple::mipsel:
348 case llvm::Triple::ppc:
349 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000350 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000351 this->MCountName = "_mcount";
352 break;
353 case llvm::Triple::arm:
354 this->MCountName = "__mcount";
355 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000356 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000357 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000358};
359
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000360// GNU/kFreeBSD Target
361template<typename Target>
362class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
363protected:
Craig Topper3164f332014-03-11 03:39:26 +0000364 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
365 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000366 // GNU/kFreeBSD defines; list based off of gcc output
367
368 DefineStd(Builder, "unix", Opts);
369 Builder.defineMacro("__FreeBSD_kernel__");
370 Builder.defineMacro("__GLIBC__");
371 Builder.defineMacro("__ELF__");
372 if (Opts.POSIXThreads)
373 Builder.defineMacro("_REENTRANT");
374 if (Opts.CPlusPlus)
375 Builder.defineMacro("_GNU_SOURCE");
376 }
377public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000378 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
379 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000380};
381
Chris Lattner3e2ee142010-07-07 16:01:42 +0000382// Minix Target
383template<typename Target>
384class MinixTargetInfo : public OSTargetInfo<Target> {
385protected:
Craig Topper3164f332014-03-11 03:39:26 +0000386 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
387 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000388 // Minix defines
389
390 Builder.defineMacro("__minix", "3");
391 Builder.defineMacro("_EM_WSIZE", "4");
392 Builder.defineMacro("_EM_PSIZE", "4");
393 Builder.defineMacro("_EM_SSIZE", "2");
394 Builder.defineMacro("_EM_LSIZE", "4");
395 Builder.defineMacro("_EM_FSIZE", "4");
396 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000397 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000398 DefineStd(Builder, "unix", Opts);
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000403};
404
Torok Edwinb2b37c62009-06-30 17:10:35 +0000405// Linux target
406template<typename Target>
407class LinuxTargetInfo : public OSTargetInfo<Target> {
408protected:
Craig Topper3164f332014-03-11 03:39:26 +0000409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000411 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000412 DefineStd(Builder, "unix", Opts);
413 DefineStd(Builder, "linux", Opts);
414 Builder.defineMacro("__gnu_linux__");
415 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000416 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000417 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000418 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000419 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000420 this->PlatformName = "android";
421 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
422 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000423 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000424 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000425 if (Opts.CPlusPlus)
426 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000427 }
428public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000429 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
430 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000431 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000432
433 switch (Triple.getArch()) {
434 default:
435 break;
436 case llvm::Triple::ppc:
437 case llvm::Triple::ppc64:
438 case llvm::Triple::ppc64le:
439 this->MCountName = "_mcount";
440 break;
441 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000442 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000443
Craig Topper3164f332014-03-11 03:39:26 +0000444 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000445 return ".text.startup";
446 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000447};
448
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000449// NetBSD Target
450template<typename Target>
451class NetBSDTargetInfo : public OSTargetInfo<Target> {
452protected:
Craig Topper3164f332014-03-11 03:39:26 +0000453 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
454 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000455 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000456 Builder.defineMacro("__NetBSD__");
457 Builder.defineMacro("__unix__");
458 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000459 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000460 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000461
462 switch (Triple.getArch()) {
463 default:
464 break;
465 case llvm::Triple::arm:
466 case llvm::Triple::armeb:
467 case llvm::Triple::thumb:
468 case llvm::Triple::thumbeb:
469 Builder.defineMacro("__ARM_DWARF_EH__");
470 break;
471 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000472 }
473public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000474 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
475 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000476 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000477 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000478};
479
Torok Edwinb2b37c62009-06-30 17:10:35 +0000480// OpenBSD Target
481template<typename Target>
482class OpenBSDTargetInfo : public OSTargetInfo<Target> {
483protected:
Craig Topper3164f332014-03-11 03:39:26 +0000484 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
485 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000486 // OpenBSD defines; list based off of gcc output
487
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000488 Builder.defineMacro("__OpenBSD__");
489 DefineStd(Builder, "unix", Opts);
490 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000491 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000492 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000493 }
494public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000495 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
496 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000497 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000498
Eli Friedman3715d1f2011-12-15 02:15:56 +0000499 switch (Triple.getArch()) {
500 default:
501 case llvm::Triple::x86:
502 case llvm::Triple::x86_64:
503 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000504 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000505 this->MCountName = "__mcount";
506 break;
507 case llvm::Triple::mips64:
508 case llvm::Triple::mips64el:
509 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000510 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000511 this->MCountName = "_mcount";
512 break;
513 }
514 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000515};
516
Eli Friedman9fa28852012-08-08 23:57:20 +0000517// Bitrig Target
518template<typename Target>
519class BitrigTargetInfo : public OSTargetInfo<Target> {
520protected:
Craig Topper3164f332014-03-11 03:39:26 +0000521 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
522 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000523 // Bitrig defines; list based off of gcc output
524
525 Builder.defineMacro("__Bitrig__");
526 DefineStd(Builder, "unix", Opts);
527 Builder.defineMacro("__ELF__");
528 if (Opts.POSIXThreads)
529 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000530
531 switch (Triple.getArch()) {
532 default:
533 break;
534 case llvm::Triple::arm:
535 case llvm::Triple::armeb:
536 case llvm::Triple::thumb:
537 case llvm::Triple::thumbeb:
538 Builder.defineMacro("__ARM_DWARF_EH__");
539 break;
540 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000541 }
542public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000543 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
544 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000545 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000546 }
547};
548
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000549// PSP Target
550template<typename Target>
551class PSPTargetInfo : public OSTargetInfo<Target> {
552protected:
Craig Topper3164f332014-03-11 03:39:26 +0000553 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
554 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000555 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000556 Builder.defineMacro("PSP");
557 Builder.defineMacro("_PSP");
558 Builder.defineMacro("__psp__");
559 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000560 }
561public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000562 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000563};
564
John Thompsone467e192009-11-19 17:18:50 +0000565// PS3 PPU Target
566template<typename Target>
567class PS3PPUTargetInfo : public OSTargetInfo<Target> {
568protected:
Craig Topper3164f332014-03-11 03:39:26 +0000569 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
570 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000571 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000572 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000573 Builder.defineMacro("__PPU__");
574 Builder.defineMacro("__CELLOS_LV2__");
575 Builder.defineMacro("__ELF__");
576 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000577 Builder.defineMacro("_ARCH_PPC64");
578 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000579 }
580public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000581 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
582 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000583 this->LongWidth = this->LongAlign = 32;
584 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000585 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000586 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000587 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000588 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000589 }
590};
591
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000592template <typename Target>
593class PS4OSTargetInfo : public OSTargetInfo<Target> {
594protected:
595 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
596 MacroBuilder &Builder) const override {
597 Builder.defineMacro("__FreeBSD__", "9");
598 Builder.defineMacro("__FreeBSD_cc_version", "900001");
599 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
600 DefineStd(Builder, "unix", Opts);
601 Builder.defineMacro("__ELF__");
602 Builder.defineMacro("__PS4__");
603 }
604public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000605 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
606 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000607 this->WCharType = this->UnsignedShort;
608
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000609 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
610 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000611
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000612 // On PS4, do not honor explicit bit field alignment,
613 // as in "__attribute__((aligned(2))) int b : 1;".
614 this->UseExplicitBitFieldAlignment = false;
615
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000616 switch (Triple.getArch()) {
617 default:
618 case llvm::Triple::x86_64:
619 this->MCountName = ".mcount";
620 break;
621 }
622 }
623};
624
Torok Edwinb2b37c62009-06-30 17:10:35 +0000625// Solaris target
626template<typename Target>
627class SolarisTargetInfo : public OSTargetInfo<Target> {
628protected:
Craig Topper3164f332014-03-11 03:39:26 +0000629 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
630 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000631 DefineStd(Builder, "sun", Opts);
632 DefineStd(Builder, "unix", Opts);
633 Builder.defineMacro("__ELF__");
634 Builder.defineMacro("__svr4__");
635 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000636 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
637 // newer, but to 500 for everything else. feature_test.h has a check to
638 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000639 // with a new version.
640 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000641 Builder.defineMacro("_XOPEN_SOURCE", "600");
642 else
643 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000644 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000645 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000646 Builder.defineMacro("_LARGEFILE_SOURCE");
647 Builder.defineMacro("_LARGEFILE64_SOURCE");
648 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000649 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000650 }
651public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000652 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
653 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000654 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000655 // FIXME: WIntType should be SignedLong
656 }
657};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000658
659// Windows target
660template<typename Target>
661class WindowsTargetInfo : public OSTargetInfo<Target> {
662protected:
Craig Topper3164f332014-03-11 03:39:26 +0000663 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
664 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000665 Builder.defineMacro("_WIN32");
666 }
667 void getVisualStudioDefines(const LangOptions &Opts,
668 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000669 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000670 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000671 Builder.defineMacro("_CPPRTTI");
672
Reid Kleckner16514352015-01-30 21:42:55 +0000673 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000674 Builder.defineMacro("_CPPUNWIND");
675 }
676
David Majnemer6a658902015-07-22 22:36:26 +0000677 if (Opts.Bool)
678 Builder.defineMacro("__BOOL_DEFINED");
679
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000680 if (!Opts.CharIsSigned)
681 Builder.defineMacro("_CHAR_UNSIGNED");
682
683 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
684 // but it works for now.
685 if (Opts.POSIXThreads)
686 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000687
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000688 if (Opts.MSCompatibilityVersion) {
689 Builder.defineMacro("_MSC_VER",
690 Twine(Opts.MSCompatibilityVersion / 100000));
691 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000692 // FIXME We cannot encode the revision information into 32-bits
693 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000694
David Majnemerb710a932015-05-11 03:57:49 +0000695 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000696 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000697 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000698
699 if (Opts.MicrosoftExt) {
700 Builder.defineMacro("_MSC_EXTENSIONS");
701
702 if (Opts.CPlusPlus11) {
703 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
704 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
705 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
706 }
707 }
708
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000709 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000710 }
711
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000712public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000713 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
714 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000715};
716
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000717template <typename Target>
718class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000719protected:
Craig Topper3164f332014-03-11 03:39:26 +0000720 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
721 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000722 if (Opts.POSIXThreads)
723 Builder.defineMacro("_REENTRANT");
724 if (Opts.CPlusPlus)
725 Builder.defineMacro("_GNU_SOURCE");
726
727 DefineStd(Builder, "unix", Opts);
728 Builder.defineMacro("__ELF__");
729 Builder.defineMacro("__native_client__");
730 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000731
732public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000733 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
734 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000735 this->LongAlign = 32;
736 this->LongWidth = 32;
737 this->PointerAlign = 32;
738 this->PointerWidth = 32;
739 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000740 this->Int64Type = TargetInfo::SignedLongLong;
741 this->DoubleAlign = 64;
742 this->LongDoubleWidth = 64;
743 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000744 this->LongLongWidth = 64;
745 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000746 this->SizeType = TargetInfo::UnsignedInt;
747 this->PtrDiffType = TargetInfo::SignedInt;
748 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000749 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000750 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000751 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000752 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000753 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000754 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000755 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000756 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000757 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000758 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000759 } else {
760 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000761 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000762 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000763 }
764};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000765
Dan Gohmanc2853072015-09-03 22:51:53 +0000766// WebAssembly target
767template <typename Target>
768class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
769 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000770 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000771 // A common platform macro.
772 if (Opts.POSIXThreads)
773 Builder.defineMacro("_REENTRANT");
774 // Follow g++ convention and predefine _GNU_SOURCE for C++.
775 if (Opts.CPlusPlus)
776 Builder.defineMacro("_GNU_SOURCE");
777 }
778
779 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000780 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000781 return ".text.__startup";
782 }
783
784public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000785 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
786 const TargetOptions &Opts)
787 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000788 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000789 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
790 }
791};
Dan Gohmanc2853072015-09-03 22:51:53 +0000792
Chris Lattner09d98f52008-10-05 21:50:58 +0000793//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000794// Specific target implementations.
795//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000796
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000797// PPC abstract base class
798class PPCTargetInfo : public TargetInfo {
799 static const Builtin::Info BuiltinInfo[];
800 static const char * const GCCRegNames[];
801 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000802 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000803
804 // Target cpu features.
805 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000806 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000807 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000808 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000809 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000810 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000811 bool HasBPERMD;
812 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000813
Ulrich Weigand8afad612014-07-28 13:17:52 +0000814protected:
815 std::string ABI;
816
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000817public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000818 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000819 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
820 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000821 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000822 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000823 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000824 LongDoubleWidth = LongDoubleAlign = 128;
825 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
826 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000827
Hal Finkel6b984f02012-07-03 16:51:04 +0000828 /// \brief Flags for architecture specific defines.
829 typedef enum {
830 ArchDefineNone = 0,
831 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
832 ArchDefinePpcgr = 1 << 1,
833 ArchDefinePpcsq = 1 << 2,
834 ArchDefine440 = 1 << 3,
835 ArchDefine603 = 1 << 4,
836 ArchDefine604 = 1 << 5,
837 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000838 ArchDefinePwr5 = 1 << 7,
839 ArchDefinePwr5x = 1 << 8,
840 ArchDefinePwr6 = 1 << 9,
841 ArchDefinePwr6x = 1 << 10,
842 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000843 ArchDefinePwr8 = 1 << 12,
844 ArchDefineA2 = 1 << 13,
845 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000846 } ArchDefineTypes;
847
Bill Schmidt38378a02013-02-01 20:23:10 +0000848 // Note: GCC recognizes the following additional cpus:
849 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
850 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
851 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000852 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000853 bool CPUKnown = llvm::StringSwitch<bool>(Name)
854 .Case("generic", true)
855 .Case("440", true)
856 .Case("450", true)
857 .Case("601", true)
858 .Case("602", true)
859 .Case("603", true)
860 .Case("603e", true)
861 .Case("603ev", true)
862 .Case("604", true)
863 .Case("604e", true)
864 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000865 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000866 .Case("g3", true)
867 .Case("7400", true)
868 .Case("g4", true)
869 .Case("7450", true)
870 .Case("g4+", true)
871 .Case("750", true)
872 .Case("970", true)
873 .Case("g5", true)
874 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000875 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000876 .Case("e500mc", true)
877 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000878 .Case("power3", true)
879 .Case("pwr3", true)
880 .Case("power4", true)
881 .Case("pwr4", true)
882 .Case("power5", true)
883 .Case("pwr5", true)
884 .Case("power5x", true)
885 .Case("pwr5x", true)
886 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000887 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000888 .Case("power6x", true)
889 .Case("pwr6x", true)
890 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000891 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000892 .Case("power8", true)
893 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000894 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000895 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000896 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000897 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000898 .Case("powerpc64le", true)
899 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000900 .Default(false);
901
902 if (CPUKnown)
903 CPU = Name;
904
905 return CPUKnown;
906 }
907
Ulrich Weigand8afad612014-07-28 13:17:52 +0000908
909 StringRef getABI() const override { return ABI; }
910
Craig Topper6c03a542015-10-19 04:51:35 +0000911 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
912 return llvm::makeArrayRef(BuiltinInfo,
913 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000914 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000915
Craig Topper3164f332014-03-11 03:39:26 +0000916 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000917
Craig Topper3164f332014-03-11 03:39:26 +0000918 void getTargetDefines(const LangOptions &Opts,
919 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000920
Eric Christopher8c47b422015-10-09 18:39:55 +0000921 bool
922 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
923 StringRef CPU,
924 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000925
Craig Topper3164f332014-03-11 03:39:26 +0000926 bool handleTargetFeatures(std::vector<std::string> &Features,
927 DiagnosticsEngine &Diags) override;
928 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000929 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
930 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000931
Craig Topperf054e3a2015-10-19 03:52:27 +0000932 ArrayRef<const char *> getGCCRegNames() const override;
933 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000934 bool validateAsmConstraint(const char *&Name,
935 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000936 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000937 default: return false;
938 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000939 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000940 case 'b': // Base register
941 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000942 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000943 break;
944 // FIXME: The following are added to allow parsing.
945 // I just took a guess at what the actions should be.
946 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000947 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000948 case 'v': // Altivec vector register
949 Info.setAllowsRegister();
950 break;
951 case 'w':
952 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000953 case 'd':// VSX vector register to hold vector double data
954 case 'f':// VSX vector register to hold vector float data
955 case 's':// VSX vector register to hold scalar float data
956 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000957 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000958 break;
959 default:
960 return false;
961 }
962 Info.setAllowsRegister();
963 Name++; // Skip over 'w'.
964 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000965 case 'h': // `MQ', `CTR', or `LINK' register
966 case 'q': // `MQ' register
967 case 'c': // `CTR' register
968 case 'l': // `LINK' register
969 case 'x': // `CR' register (condition register) number 0
970 case 'y': // `CR' register (condition register)
971 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000972 Info.setAllowsRegister();
973 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000974 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000975 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000976 // (use `L' instead for SImode constants)
977 case 'K': // Unsigned 16-bit constant
978 case 'L': // Signed 16-bit constant shifted left 16 bits
979 case 'M': // Constant larger than 31
980 case 'N': // Exact power of 2
981 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000982 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000983 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000984 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000985 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000986 break;
987 case 'm': // Memory operand. Note that on PowerPC targets, m can
988 // include addresses that update the base register. It
989 // is therefore only safe to use `m' in an asm statement
990 // if that asm statement accesses the operand exactly once.
991 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000992 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000993 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000994 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000995 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000996 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
997 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000998 // register to be updated.
999 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001000 if (Name[1] != 's')
1001 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001002 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001003 // include any automodification of the base register. Unlike
1004 // `m', this constraint can be used in asm statements that
1005 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001006 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001007 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001008 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001009 break;
1010 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001011 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001012 case 'Z': // Memory operand that is an indexed or indirect from a
1013 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001014 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001015 Info.setAllowsMemory();
1016 Info.setAllowsRegister();
1017 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001018 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001019 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001020 // register (`p' is preferable for asm statements)
1021 case 'S': // Constant suitable as a 64-bit mask operand
1022 case 'T': // Constant suitable as a 32-bit mask operand
1023 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001024 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001025 // instructions
1026 case 'W': // Vector constant that does not require memory
1027 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001028 break;
1029 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001030 }
John Thompson07a61a42010-06-24 22:44:13 +00001031 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001032 }
Craig Topper3164f332014-03-11 03:39:26 +00001033 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001034 std::string R;
1035 switch (*Constraint) {
1036 case 'e':
1037 case 'w':
1038 // Two-character constraint; add "^" hint for later parsing.
1039 R = std::string("^") + std::string(Constraint, 2);
1040 Constraint++;
1041 break;
1042 default:
1043 return TargetInfo::convertConstraint(Constraint);
1044 }
1045 return R;
1046 }
Craig Topper3164f332014-03-11 03:39:26 +00001047 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001048 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001049 }
Craig Topper3164f332014-03-11 03:39:26 +00001050 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001051 if (RegNo == 0) return 3;
1052 if (RegNo == 1) return 4;
1053 return -1;
1054 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001055
1056 bool hasSjLjLowering() const override {
1057 return true;
1058 }
David Majnemer2617ea62015-06-09 18:05:33 +00001059
1060 bool useFloat128ManglingForLongDouble() const override {
1061 return LongDoubleWidth == 128 &&
1062 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1063 getTriple().isOSBinFormatELF();
1064 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001065};
Anders Carlssonf511f642007-11-27 04:11:28 +00001066
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001067const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001068#define BUILTIN(ID, TYPE, ATTRS) \
1069 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1070#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1071 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001072#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001073};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001074
Eric Christopher917e9522014-11-18 22:36:15 +00001075/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001076/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001077bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001078 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001079 for (const auto &Feature : Features) {
1080 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001081 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001082 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001083 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001084 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001085 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001086 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001087 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001088 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001089 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001090 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001091 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001092 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001093 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001094 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001095 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001096 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001097 // TODO: Finish this list and add an assert that we've handled them
1098 // all.
1099 }
Eric Christopher02c33352015-08-25 00:59:11 +00001100
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001101 return true;
1102}
1103
Chris Lattnerecd49032009-03-02 22:27:17 +00001104/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1105/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001106void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001107 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001108 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001109 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001110 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001111 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001112 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001113 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001114 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001115 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001116 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001117 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001118 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001119 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001120
Chris Lattnerecd49032009-03-02 22:27:17 +00001121 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001122 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1123 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001124 } else {
1125 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1126 getTriple().getOS() != llvm::Triple::OpenBSD)
1127 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001128 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001129
Ulrich Weigand8afad612014-07-28 13:17:52 +00001130 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001131 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001132 Builder.defineMacro("_CALL_ELF", "1");
1133 if (ABI == "elfv2")
1134 Builder.defineMacro("_CALL_ELF", "2");
1135
Chris Lattnerecd49032009-03-02 22:27:17 +00001136 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001137 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1138 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001139
Chris Lattnerecd49032009-03-02 22:27:17 +00001140 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001141 if (LongDoubleWidth == 128)
1142 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001143
John Thompsone467e192009-11-19 17:18:50 +00001144 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001145 Builder.defineMacro("__VEC__", "10206");
1146 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001147 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001148
1149 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001150 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1151 .Case("440", ArchDefineName)
1152 .Case("450", ArchDefineName | ArchDefine440)
1153 .Case("601", ArchDefineName)
1154 .Case("602", ArchDefineName | ArchDefinePpcgr)
1155 .Case("603", ArchDefineName | ArchDefinePpcgr)
1156 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1157 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1158 .Case("604", ArchDefineName | ArchDefinePpcgr)
1159 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1160 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001161 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001162 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1163 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1164 .Case("750", ArchDefineName | ArchDefinePpcgr)
1165 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1166 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001167 .Case("a2", ArchDefineA2)
1168 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001169 .Case("pwr3", ArchDefinePpcgr)
1170 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1171 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1172 | ArchDefinePpcsq)
1173 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1174 | ArchDefinePpcgr | ArchDefinePpcsq)
1175 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1176 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1177 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1178 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1179 | ArchDefinePpcsq)
1180 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1181 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001182 | ArchDefinePpcgr | ArchDefinePpcsq)
1183 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1184 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1185 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001186 .Case("power3", ArchDefinePpcgr)
1187 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1188 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1189 | ArchDefinePpcsq)
1190 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1191 | ArchDefinePpcgr | ArchDefinePpcsq)
1192 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1193 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1194 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1195 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1196 | ArchDefinePpcsq)
1197 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1198 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001199 | ArchDefinePpcgr | ArchDefinePpcsq)
1200 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1201 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1202 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001203 .Default(ArchDefineNone);
1204
1205 if (defs & ArchDefineName)
1206 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1207 if (defs & ArchDefinePpcgr)
1208 Builder.defineMacro("_ARCH_PPCGR");
1209 if (defs & ArchDefinePpcsq)
1210 Builder.defineMacro("_ARCH_PPCSQ");
1211 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001212 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001213 if (defs & ArchDefine603)
1214 Builder.defineMacro("_ARCH_603");
1215 if (defs & ArchDefine604)
1216 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001217 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001218 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001219 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001220 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001221 if (defs & ArchDefinePwr5x)
1222 Builder.defineMacro("_ARCH_PWR5X");
1223 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001224 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001225 if (defs & ArchDefinePwr6x)
1226 Builder.defineMacro("_ARCH_PWR6X");
1227 if (defs & ArchDefinePwr7)
1228 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001229 if (defs & ArchDefinePwr8)
1230 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001231 if (defs & ArchDefineA2)
1232 Builder.defineMacro("_ARCH_A2");
1233 if (defs & ArchDefineA2q) {
1234 Builder.defineMacro("_ARCH_A2Q");
1235 Builder.defineMacro("_ARCH_QP");
1236 }
1237
1238 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1239 Builder.defineMacro("__bg__");
1240 Builder.defineMacro("__THW_BLUEGENE__");
1241 Builder.defineMacro("__bgq__");
1242 Builder.defineMacro("__TOS_BGQ__");
1243 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001244
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001245 if (HasVSX)
1246 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001247 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001248 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001249 if (HasP8Crypto)
1250 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001251 if (HasHTM)
1252 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001253
1254 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1255 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1256 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1257 if (PointerWidth == 64)
1258 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001259
Bill Schmidt38378a02013-02-01 20:23:10 +00001260 // FIXME: The following are not yet generated here by Clang, but are
1261 // generated by GCC:
1262 //
1263 // _SOFT_FLOAT_
1264 // __RECIP_PRECISION__
1265 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001266 // __RECIP__
1267 // __RECIPF__
1268 // __RSQRTE__
1269 // __RSQRTEF__
1270 // _SOFT_DOUBLE_
1271 // __NO_LWSYNC__
1272 // __HAVE_BSWAP__
1273 // __LONGDOUBLE128
1274 // __CMODEL_MEDIUM__
1275 // __CMODEL_LARGE__
1276 // _CALL_SYSV
1277 // _CALL_DARWIN
1278 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001279}
1280
Eric Christophera8a14c32015-08-31 18:39:16 +00001281// Handle explicit options being passed to the compiler here: if we've
1282// explicitly turned off vsx and turned on power8-vector or direct-move then
1283// go ahead and error since the customer has expressed a somewhat incompatible
1284// set of options.
1285static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001286 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001287
1288 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1289 FeaturesVec.end()) {
1290 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1291 FeaturesVec.end()) {
1292 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1293 << "-mno-vsx";
1294 return false;
1295 }
1296
1297 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1298 FeaturesVec.end()) {
1299 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1300 << "-mno-vsx";
1301 return false;
1302 }
1303 }
1304
1305 return true;
1306}
1307
Eric Christopher8c47b422015-10-09 18:39:55 +00001308bool PPCTargetInfo::initFeatureMap(
1309 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1310 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001311 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1312 .Case("7400", true)
1313 .Case("g4", true)
1314 .Case("7450", true)
1315 .Case("g4+", true)
1316 .Case("970", true)
1317 .Case("g5", true)
1318 .Case("pwr6", true)
1319 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001320 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001321 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001322 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001323 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001324
1325 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001326 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1327 .Case("ppc64le", true)
1328 .Case("pwr8", true)
1329 .Default(false);
1330 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1331 .Case("ppc64le", true)
1332 .Case("pwr8", true)
1333 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001334 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1335 .Case("ppc64le", true)
1336 .Case("pwr8", true)
1337 .Case("pwr7", true)
1338 .Default(false);
1339 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1340 .Case("ppc64le", true)
1341 .Case("pwr8", true)
1342 .Case("pwr7", true)
1343 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001344 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1345 .Case("ppc64le", true)
1346 .Case("pwr8", true)
1347 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001348 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1349 .Case("ppc64le", true)
1350 .Case("pwr8", true)
1351 .Case("pwr7", true)
1352 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001353
Eric Christophera8a14c32015-08-31 18:39:16 +00001354 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1355 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001356
Eric Christopher007b0a02015-08-28 22:32:01 +00001357 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001358}
1359
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001360bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001361 return llvm::StringSwitch<bool>(Feature)
1362 .Case("powerpc", true)
1363 .Case("vsx", HasVSX)
1364 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001365 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001366 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001367 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001368 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001369 .Case("bpermd", HasBPERMD)
1370 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001371 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001372}
Chris Lattner17df24e2008-04-21 18:56:49 +00001373
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001374void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1375 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001376 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1377 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1378 // incompatible options.
1379 if (Enabled) {
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +00001380 if (Name == "vsx") {
1381 Features[Name] = true;
1382 } else if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001383 Features[Name] = Features["vsx"] = true;
1384 } else if (Name == "power8-vector") {
1385 Features[Name] = Features["vsx"] = true;
1386 } else {
1387 Features[Name] = true;
1388 }
1389 } else {
1390 if (Name == "vsx") {
1391 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +00001392 false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001393 } else {
1394 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001395 }
1396 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001397}
1398
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001399const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001400 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1401 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1402 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1403 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1404 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1405 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1406 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1407 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001408 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001409 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001410 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001411 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1412 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1413 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1414 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001415 "vrsave", "vscr",
1416 "spe_acc", "spefscr",
1417 "sfp"
1418};
Chris Lattner10a5b382007-01-29 05:24:35 +00001419
Craig Topperf054e3a2015-10-19 03:52:27 +00001420ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1421 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001422}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001423
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001424const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1425 // While some of these aliases do map to different registers
1426 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001427 { { "0" }, "r0" },
1428 { { "1"}, "r1" },
1429 { { "2" }, "r2" },
1430 { { "3" }, "r3" },
1431 { { "4" }, "r4" },
1432 { { "5" }, "r5" },
1433 { { "6" }, "r6" },
1434 { { "7" }, "r7" },
1435 { { "8" }, "r8" },
1436 { { "9" }, "r9" },
1437 { { "10" }, "r10" },
1438 { { "11" }, "r11" },
1439 { { "12" }, "r12" },
1440 { { "13" }, "r13" },
1441 { { "14" }, "r14" },
1442 { { "15" }, "r15" },
1443 { { "16" }, "r16" },
1444 { { "17" }, "r17" },
1445 { { "18" }, "r18" },
1446 { { "19" }, "r19" },
1447 { { "20" }, "r20" },
1448 { { "21" }, "r21" },
1449 { { "22" }, "r22" },
1450 { { "23" }, "r23" },
1451 { { "24" }, "r24" },
1452 { { "25" }, "r25" },
1453 { { "26" }, "r26" },
1454 { { "27" }, "r27" },
1455 { { "28" }, "r28" },
1456 { { "29" }, "r29" },
1457 { { "30" }, "r30" },
1458 { { "31" }, "r31" },
1459 { { "fr0" }, "f0" },
1460 { { "fr1" }, "f1" },
1461 { { "fr2" }, "f2" },
1462 { { "fr3" }, "f3" },
1463 { { "fr4" }, "f4" },
1464 { { "fr5" }, "f5" },
1465 { { "fr6" }, "f6" },
1466 { { "fr7" }, "f7" },
1467 { { "fr8" }, "f8" },
1468 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001469 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001470 { { "fr11" }, "f11" },
1471 { { "fr12" }, "f12" },
1472 { { "fr13" }, "f13" },
1473 { { "fr14" }, "f14" },
1474 { { "fr15" }, "f15" },
1475 { { "fr16" }, "f16" },
1476 { { "fr17" }, "f17" },
1477 { { "fr18" }, "f18" },
1478 { { "fr19" }, "f19" },
1479 { { "fr20" }, "f20" },
1480 { { "fr21" }, "f21" },
1481 { { "fr22" }, "f22" },
1482 { { "fr23" }, "f23" },
1483 { { "fr24" }, "f24" },
1484 { { "fr25" }, "f25" },
1485 { { "fr26" }, "f26" },
1486 { { "fr27" }, "f27" },
1487 { { "fr28" }, "f28" },
1488 { { "fr29" }, "f29" },
1489 { { "fr30" }, "f30" },
1490 { { "fr31" }, "f31" },
1491 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001492};
1493
Craig Topperf054e3a2015-10-19 03:52:27 +00001494ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1495 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001496}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001497
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001498class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001499public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001500 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1501 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001502 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001503
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001504 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001505 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001506 case llvm::Triple::FreeBSD:
1507 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001508 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001509 PtrDiffType = SignedInt;
1510 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001511 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001512 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001513 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001514 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001515
Roman Divacky3ffe7462012-03-13 19:20:17 +00001516 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1517 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001518 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001519 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001520
1521 // PPC32 supports atomics up to 4 bytes.
1522 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001523 }
1524
Craig Topper3164f332014-03-11 03:39:26 +00001525 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001526 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001527 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001528 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001529};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001530
Bill Schmidt778d3872013-07-26 01:36:11 +00001531// Note: ABI differences may eventually require us to have a separate
1532// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001533class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001534public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001535 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1536 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001537 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001538 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001539 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001540
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001541 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001542 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001543 ABI = "elfv2";
1544 } else {
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 = "elfv1";
1547 }
1548
1549 switch (getTriple().getOS()) {
1550 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001551 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001552 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001553 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001554 case llvm::Triple::NetBSD:
1555 IntMaxType = SignedLongLong;
1556 Int64Type = SignedLongLong;
1557 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001558 default:
1559 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001560 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001561
1562 // PPC64 supports atomics up to 8 bytes.
1563 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001564 }
Craig Topper3164f332014-03-11 03:39:26 +00001565 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001566 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001567 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001568 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001569 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001570 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001571 ABI = Name;
1572 return true;
1573 }
1574 return false;
1575 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001576};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001577
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001578class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001579public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001580 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1581 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001582 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001583 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001584 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001585 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001586 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001587 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001588 }
Craig Topper3164f332014-03-11 03:39:26 +00001589 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001590 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001591 }
1592};
1593
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001594class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001596 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1597 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001598 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001599 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001600 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001601 }
1602};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001603
Eric Christopherc48497a2015-09-18 21:26:24 +00001604static const unsigned NVPTXAddrSpaceMap[] = {
1605 1, // opencl_global
1606 3, // opencl_local
1607 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001608 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001609 0, // opencl_generic
1610 1, // cuda_device
1611 4, // cuda_constant
1612 3, // cuda_shared
1613};
1614
1615class NVPTXTargetInfo : public TargetInfo {
1616 static const char *const GCCRegNames[];
1617 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001618
1619 // The GPU profiles supported by the NVPTX backend
1620 enum GPUKind {
1621 GK_NONE,
1622 GK_SM20,
1623 GK_SM21,
1624 GK_SM30,
1625 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001626 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001627 } GPU;
1628
Eric Christopherc48497a2015-09-18 21:26:24 +00001629public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001630 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
1631 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001632 BigEndian = false;
1633 TLSSupported = false;
1634 LongWidth = LongAlign = 64;
1635 AddrSpaceMap = &NVPTXAddrSpaceMap;
1636 UseAddrSpaceMapMangling = true;
1637 // Define available target features
1638 // These must be defined in sorted order!
1639 NoAsmVariants = true;
1640 // Set the default GPU to sm20
1641 GPU = GK_SM20;
1642 }
1643 void getTargetDefines(const LangOptions &Opts,
1644 MacroBuilder &Builder) const override {
1645 Builder.defineMacro("__PTX__");
1646 Builder.defineMacro("__NVPTX__");
1647 if (Opts.CUDAIsDevice) {
1648 // Set __CUDA_ARCH__ for the GPU specified.
1649 std::string CUDAArchCode;
1650 switch (GPU) {
1651 case GK_SM20:
1652 CUDAArchCode = "200";
1653 break;
1654 case GK_SM21:
1655 CUDAArchCode = "210";
1656 break;
1657 case GK_SM30:
1658 CUDAArchCode = "300";
1659 break;
1660 case GK_SM35:
1661 CUDAArchCode = "350";
1662 break;
1663 case GK_SM37:
1664 CUDAArchCode = "370";
1665 break;
1666 default:
1667 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001668 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001669 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001670 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001671 }
Craig Topper6c03a542015-10-19 04:51:35 +00001672 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1673 return llvm::makeArrayRef(BuiltinInfo,
1674 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001675 }
1676 bool hasFeature(StringRef Feature) const override {
1677 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001678 }
1679
Craig Topperf054e3a2015-10-19 03:52:27 +00001680 ArrayRef<const char *> getGCCRegNames() const override;
1681 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001682 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001683 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001684 }
1685 bool validateAsmConstraint(const char *&Name,
1686 TargetInfo::ConstraintInfo &Info) const override {
1687 switch (*Name) {
1688 default:
1689 return false;
1690 case 'c':
1691 case 'h':
1692 case 'r':
1693 case 'l':
1694 case 'f':
1695 case 'd':
1696 Info.setAllowsRegister();
1697 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001698 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001699 }
1700 const char *getClobbers() const override {
1701 // FIXME: Is this really right?
1702 return "";
1703 }
1704 BuiltinVaListKind getBuiltinVaListKind() const override {
1705 // FIXME: implement
1706 return TargetInfo::CharPtrBuiltinVaList;
1707 }
1708 bool setCPU(const std::string &Name) override {
1709 GPU = llvm::StringSwitch<GPUKind>(Name)
1710 .Case("sm_20", GK_SM20)
1711 .Case("sm_21", GK_SM21)
1712 .Case("sm_30", GK_SM30)
1713 .Case("sm_35", GK_SM35)
1714 .Case("sm_37", GK_SM37)
1715 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001716
Eric Christopherc48497a2015-09-18 21:26:24 +00001717 return GPU != GK_NONE;
1718 }
1719};
1720
1721const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1722#define BUILTIN(ID, TYPE, ATTRS) \
1723 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1724#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1725 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1726#include "clang/Basic/BuiltinsNVPTX.def"
1727};
1728
1729const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1730
Craig Topperf054e3a2015-10-19 03:52:27 +00001731ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1732 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001733}
1734
1735class NVPTX32TargetInfo : public NVPTXTargetInfo {
1736public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001737 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1738 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001739 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001740 PointerWidth = PointerAlign = 32;
1741 SizeType = TargetInfo::UnsignedInt;
1742 PtrDiffType = TargetInfo::SignedInt;
1743 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001744 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001745 }
1746};
1747
1748class NVPTX64TargetInfo : public NVPTXTargetInfo {
1749public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001750 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1751 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001752 PointerWidth = PointerAlign = 64;
1753 SizeType = TargetInfo::UnsignedLong;
1754 PtrDiffType = TargetInfo::SignedLong;
1755 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001756 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001757 }
1758};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001759
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001760static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001761 1, // opencl_global
1762 3, // opencl_local
1763 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001764 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001765 1, // cuda_device
1766 2, // cuda_constant
1767 3 // cuda_shared
1768};
1769
Tom Stellarda96344b2014-08-21 13:58:40 +00001770// If you edit the description strings, make sure you update
1771// getPointerWidthV().
1772
Craig Topper273dbc62015-10-18 05:29:26 +00001773static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001774 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1775 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001776
Craig Topper273dbc62015-10-18 05:29:26 +00001777static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001778 "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 +00001779 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1780 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001781
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001782class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001783 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001784 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001785
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001786 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001787 enum GPUKind {
1788 GK_NONE,
1789 GK_R600,
1790 GK_R600_DOUBLE_OPS,
1791 GK_R700,
1792 GK_R700_DOUBLE_OPS,
1793 GK_EVERGREEN,
1794 GK_EVERGREEN_DOUBLE_OPS,
1795 GK_NORTHERN_ISLANDS,
1796 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001797 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001798 GK_SEA_ISLANDS,
1799 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001800 } GPU;
1801
Jan Veselyeebeaea2015-05-04 19:53:36 +00001802 bool hasFP64:1;
1803 bool hasFMAF:1;
1804 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001805
Eli Friedmand13b41e2012-10-12 23:32:00 +00001806public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001807 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
1808 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001809 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001810 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001811 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001812 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001813 hasFMAF = true;
1814 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001815 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001816 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001817 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001818 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001819 hasFMAF = false;
1820 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001821 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001822 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001823 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001824 }
1825
Tom Stellarda96344b2014-08-21 13:58:40 +00001826 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1827 if (GPU <= GK_CAYMAN)
1828 return 32;
1829
1830 switch(AddrSpace) {
1831 default:
1832 return 64;
1833 case 0:
1834 case 3:
1835 case 5:
1836 return 32;
1837 }
1838 }
1839
Craig Topper3164f332014-03-11 03:39:26 +00001840 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001841 return "";
1842 }
1843
Craig Topperf054e3a2015-10-19 03:52:27 +00001844 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001845
Craig Topperf054e3a2015-10-19 03:52:27 +00001846 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1847 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001848 }
1849
Craig Topper3164f332014-03-11 03:39:26 +00001850 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001851 TargetInfo::ConstraintInfo &Info) const override {
1852 switch (*Name) {
1853 default: break;
1854 case 'v': // vgpr
1855 case 's': // sgpr
1856 Info.setAllowsRegister();
1857 return true;
1858 }
1859 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001860 }
1861
Craig Topper6c03a542015-10-19 04:51:35 +00001862 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1863 return llvm::makeArrayRef(BuiltinInfo,
1864 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001865 }
1866
Craig Topper3164f332014-03-11 03:39:26 +00001867 void getTargetDefines(const LangOptions &Opts,
1868 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001869 if (getTriple().getArch() == llvm::Triple::amdgcn)
1870 Builder.defineMacro("__AMDGCN__");
1871 else
1872 Builder.defineMacro("__R600__");
1873
Jan Veselyeebeaea2015-05-04 19:53:36 +00001874 if (hasFMAF)
1875 Builder.defineMacro("__HAS_FMAF__");
1876 if (hasLDEXPF)
1877 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001878 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001879 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001880 if (Opts.OpenCL) {
1881 if (GPU >= GK_NORTHERN_ISLANDS) {
1882 Builder.defineMacro("cl_khr_byte_addressable_store");
1883 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1884 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1885 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1886 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1887 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001888 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001889 }
1890
Craig Topper3164f332014-03-11 03:39:26 +00001891 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001892 return TargetInfo::CharPtrBuiltinVaList;
1893 }
1894
Craig Topper3164f332014-03-11 03:39:26 +00001895 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001896 GPU = llvm::StringSwitch<GPUKind>(Name)
1897 .Case("r600" , GK_R600)
1898 .Case("rv610", GK_R600)
1899 .Case("rv620", GK_R600)
1900 .Case("rv630", GK_R600)
1901 .Case("rv635", GK_R600)
1902 .Case("rs780", GK_R600)
1903 .Case("rs880", GK_R600)
1904 .Case("rv670", GK_R600_DOUBLE_OPS)
1905 .Case("rv710", GK_R700)
1906 .Case("rv730", GK_R700)
1907 .Case("rv740", GK_R700_DOUBLE_OPS)
1908 .Case("rv770", GK_R700_DOUBLE_OPS)
1909 .Case("palm", GK_EVERGREEN)
1910 .Case("cedar", GK_EVERGREEN)
1911 .Case("sumo", GK_EVERGREEN)
1912 .Case("sumo2", GK_EVERGREEN)
1913 .Case("redwood", GK_EVERGREEN)
1914 .Case("juniper", GK_EVERGREEN)
1915 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1916 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1917 .Case("barts", GK_NORTHERN_ISLANDS)
1918 .Case("turks", GK_NORTHERN_ISLANDS)
1919 .Case("caicos", GK_NORTHERN_ISLANDS)
1920 .Case("cayman", GK_CAYMAN)
1921 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001922 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001923 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1924 .Case("verde", GK_SOUTHERN_ISLANDS)
1925 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001926 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001927 .Case("bonaire", GK_SEA_ISLANDS)
1928 .Case("kabini", GK_SEA_ISLANDS)
1929 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001930 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001931 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001932 .Case("tonga", GK_VOLCANIC_ISLANDS)
1933 .Case("iceland", GK_VOLCANIC_ISLANDS)
1934 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00001935 .Case("fiji", GK_VOLCANIC_ISLANDS)
1936 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001937 .Default(GK_NONE);
1938
1939 if (GPU == GK_NONE) {
1940 return false;
1941 }
1942
1943 // Set the correct data layout
1944 switch (GPU) {
1945 case GK_NONE:
1946 case GK_R600:
1947 case GK_R700:
1948 case GK_EVERGREEN:
1949 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001950 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001951 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001952 hasFMAF = false;
1953 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001954 break;
1955 case GK_R600_DOUBLE_OPS:
1956 case GK_R700_DOUBLE_OPS:
1957 case GK_EVERGREEN_DOUBLE_OPS:
1958 case GK_CAYMAN:
Matt Arsenaultedc7c6b2016-03-30 21:32:37 +00001959 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001960 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001961 hasFMAF = true;
1962 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001963 break;
1964 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001965 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001966 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001967 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001968 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001969 hasFMAF = true;
1970 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001971 break;
1972 }
1973
1974 return true;
1975 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001976};
1977
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001978const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001979#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001980 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001981#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001982};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001983const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001984 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1985 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1986 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1987 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1988 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1989 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1990 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1991 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1992 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1993 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1994 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1995 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1996 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1997 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1998 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1999 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2000 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2001 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2002 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2003 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2004 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2005 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2006 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2007 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2008 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2009 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2010 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2011 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2012 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2013 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2014 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2015 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2016 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2017 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2018 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2019 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2020 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2021 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2022 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2023 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2024 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2025 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2026 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2027 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2028 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2029 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2030 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002031 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002032 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2033 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002034};
2035
Craig Topperf054e3a2015-10-19 03:52:27 +00002036ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2037 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002038}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002039
Eli Friedman3fd920a2008-08-20 02:34:37 +00002040// Namespace for x86 abstract base class
2041const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002042#define BUILTIN(ID, TYPE, ATTRS) \
2043 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002044#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002045 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002046#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002047 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002048#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002049};
Eli Friedmanb5366062008-05-20 14:21:01 +00002050
Nuno Lopescfca1f02009-12-23 17:49:57 +00002051static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002052 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2053 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002054 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002055 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2056 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2057 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002058 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002059 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2060 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002061 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2062 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2063 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2064 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2065 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2066 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2067 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2068 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002069};
2070
Eric Christophercdd36352011-06-21 00:05:20 +00002071const TargetInfo::AddlRegName AddlRegNames[] = {
2072 { { "al", "ah", "eax", "rax" }, 0 },
2073 { { "bl", "bh", "ebx", "rbx" }, 3 },
2074 { { "cl", "ch", "ecx", "rcx" }, 2 },
2075 { { "dl", "dh", "edx", "rdx" }, 1 },
2076 { { "esi", "rsi" }, 4 },
2077 { { "edi", "rdi" }, 5 },
2078 { { "esp", "rsp" }, 7 },
2079 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002080 { { "r8d", "r8w", "r8b" }, 38 },
2081 { { "r9d", "r9w", "r9b" }, 39 },
2082 { { "r10d", "r10w", "r10b" }, 40 },
2083 { { "r11d", "r11w", "r11b" }, 41 },
2084 { { "r12d", "r12w", "r12b" }, 42 },
2085 { { "r13d", "r13w", "r13b" }, 43 },
2086 { { "r14d", "r14w", "r14b" }, 44 },
2087 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002088};
2089
2090// X86 target abstract base class; x86-32 and x86-64 are very close, so
2091// most of the implementation can be shared.
2092class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002093 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002094 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002095 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002096 enum MMX3DNowEnum {
2097 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002098 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002099 enum XOPEnum {
2100 NoXOP,
2101 SSE4A,
2102 FMA4,
2103 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002104 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002105
Craig Topper543f3bd2015-10-14 23:47:57 +00002106 bool HasAES = false;
2107 bool HasPCLMUL = false;
2108 bool HasLZCNT = false;
2109 bool HasRDRND = false;
2110 bool HasFSGSBASE = false;
2111 bool HasBMI = false;
2112 bool HasBMI2 = false;
2113 bool HasPOPCNT = false;
2114 bool HasRTM = false;
2115 bool HasPRFCHW = false;
2116 bool HasRDSEED = false;
2117 bool HasADX = false;
2118 bool HasTBM = false;
2119 bool HasFMA = false;
2120 bool HasF16C = false;
2121 bool HasAVX512CD = false;
2122 bool HasAVX512ER = false;
2123 bool HasAVX512PF = false;
2124 bool HasAVX512DQ = false;
2125 bool HasAVX512BW = false;
2126 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002127 bool HasAVX512VBMI = false;
2128 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002129 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002130 bool HasMPX = false;
2131 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002132 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002133 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002134 bool HasXSAVE = false;
2135 bool HasXSAVEOPT = false;
2136 bool HasXSAVEC = false;
2137 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002138 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002139 bool HasCLFLUSHOPT = false;
2140 bool HasPCOMMIT = false;
2141 bool HasCLWB = false;
2142 bool HasUMIP = false;
2143 bool HasMOVBE = false;
2144 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002145
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002146 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2147 ///
2148 /// Each enumeration represents a particular CPU supported by Clang. These
2149 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2150 enum CPUKind {
2151 CK_Generic,
2152
2153 /// \name i386
2154 /// i386-generation processors.
2155 //@{
2156 CK_i386,
2157 //@}
2158
2159 /// \name i486
2160 /// i486-generation processors.
2161 //@{
2162 CK_i486,
2163 CK_WinChipC6,
2164 CK_WinChip2,
2165 CK_C3,
2166 //@}
2167
2168 /// \name i586
2169 /// i586-generation processors, P5 microarchitecture based.
2170 //@{
2171 CK_i586,
2172 CK_Pentium,
2173 CK_PentiumMMX,
2174 //@}
2175
2176 /// \name i686
2177 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2178 //@{
2179 CK_i686,
2180 CK_PentiumPro,
2181 CK_Pentium2,
2182 CK_Pentium3,
2183 CK_Pentium3M,
2184 CK_PentiumM,
2185 CK_C3_2,
2186
2187 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2188 /// Clang however has some logic to suport this.
2189 // FIXME: Warn, deprecate, and potentially remove this.
2190 CK_Yonah,
2191 //@}
2192
2193 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002194 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002195 //@{
2196 CK_Pentium4,
2197 CK_Pentium4M,
2198 CK_Prescott,
2199 CK_Nocona,
2200 //@}
2201
2202 /// \name Core
2203 /// Core microarchitecture based processors.
2204 //@{
2205 CK_Core2,
2206
2207 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2208 /// codename which GCC no longer accepts as an option to -march, but Clang
2209 /// has some logic for recognizing it.
2210 // FIXME: Warn, deprecate, and potentially remove this.
2211 CK_Penryn,
2212 //@}
2213
2214 /// \name Atom
2215 /// Atom processors
2216 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002217 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002218 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002219 //@}
2220
2221 /// \name Nehalem
2222 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002223 CK_Nehalem,
2224
2225 /// \name Westmere
2226 /// Westmere microarchitecture based processors.
2227 CK_Westmere,
2228
2229 /// \name Sandy Bridge
2230 /// Sandy Bridge microarchitecture based processors.
2231 CK_SandyBridge,
2232
2233 /// \name Ivy Bridge
2234 /// Ivy Bridge microarchitecture based processors.
2235 CK_IvyBridge,
2236
2237 /// \name Haswell
2238 /// Haswell microarchitecture based processors.
2239 CK_Haswell,
2240
2241 /// \name Broadwell
2242 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002243 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002244
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002245 /// \name Skylake Client
2246 /// Skylake client microarchitecture based processors.
2247 CK_SkylakeClient,
2248
2249 /// \name Skylake Server
2250 /// Skylake server microarchitecture based processors.
2251 CK_SkylakeServer,
2252
2253 /// \name Cannonlake Client
2254 /// Cannonlake client microarchitecture based processors.
2255 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002256
Craig Topper449314e2013-08-20 07:09:39 +00002257 /// \name Knights Landing
2258 /// Knights Landing processor.
2259 CK_KNL,
2260
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002261 /// \name Lakemont
2262 /// Lakemont microarchitecture based processors.
2263 CK_Lakemont,
2264
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002265 /// \name K6
2266 /// K6 architecture processors.
2267 //@{
2268 CK_K6,
2269 CK_K6_2,
2270 CK_K6_3,
2271 //@}
2272
2273 /// \name K7
2274 /// K7 architecture processors.
2275 //@{
2276 CK_Athlon,
2277 CK_AthlonThunderbird,
2278 CK_Athlon4,
2279 CK_AthlonXP,
2280 CK_AthlonMP,
2281 //@}
2282
2283 /// \name K8
2284 /// K8 architecture processors.
2285 //@{
2286 CK_Athlon64,
2287 CK_Athlon64SSE3,
2288 CK_AthlonFX,
2289 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002290 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002291 CK_Opteron,
2292 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002293 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002294 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002295
Benjamin Kramer569f2152012-01-10 11:50:18 +00002296 /// \name Bobcat
2297 /// Bobcat architecture processors.
2298 //@{
2299 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002300 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002301 //@}
2302
2303 /// \name Bulldozer
2304 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002305 //@{
2306 CK_BDVER1,
2307 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002308 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002309 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002310 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002311
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002312 /// This specification is deprecated and will be removed in the future.
2313 /// Users should prefer \see CK_K8.
2314 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002315 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002316 CK_x86_64,
2317 //@}
2318
2319 /// \name Geode
2320 /// Geode processors.
2321 //@{
2322 CK_Geode
2323 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002324 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002325
Eric Christopherc50738f2015-08-27 00:05:50 +00002326 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002327 return llvm::StringSwitch<CPUKind>(CPU)
2328 .Case("i386", CK_i386)
2329 .Case("i486", CK_i486)
2330 .Case("winchip-c6", CK_WinChipC6)
2331 .Case("winchip2", CK_WinChip2)
2332 .Case("c3", CK_C3)
2333 .Case("i586", CK_i586)
2334 .Case("pentium", CK_Pentium)
2335 .Case("pentium-mmx", CK_PentiumMMX)
2336 .Case("i686", CK_i686)
2337 .Case("pentiumpro", CK_PentiumPro)
2338 .Case("pentium2", CK_Pentium2)
2339 .Case("pentium3", CK_Pentium3)
2340 .Case("pentium3m", CK_Pentium3M)
2341 .Case("pentium-m", CK_PentiumM)
2342 .Case("c3-2", CK_C3_2)
2343 .Case("yonah", CK_Yonah)
2344 .Case("pentium4", CK_Pentium4)
2345 .Case("pentium4m", CK_Pentium4M)
2346 .Case("prescott", CK_Prescott)
2347 .Case("nocona", CK_Nocona)
2348 .Case("core2", CK_Core2)
2349 .Case("penryn", CK_Penryn)
2350 .Case("bonnell", CK_Bonnell)
2351 .Case("atom", CK_Bonnell) // Legacy name.
2352 .Case("silvermont", CK_Silvermont)
2353 .Case("slm", CK_Silvermont) // Legacy name.
2354 .Case("nehalem", CK_Nehalem)
2355 .Case("corei7", CK_Nehalem) // Legacy name.
2356 .Case("westmere", CK_Westmere)
2357 .Case("sandybridge", CK_SandyBridge)
2358 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2359 .Case("ivybridge", CK_IvyBridge)
2360 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2361 .Case("haswell", CK_Haswell)
2362 .Case("core-avx2", CK_Haswell) // Legacy name.
2363 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002364 .Case("skylake", CK_SkylakeClient)
2365 .Case("skylake-avx512", CK_SkylakeServer)
2366 .Case("skx", CK_SkylakeServer) // Legacy name.
2367 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002368 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002369 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002370 .Case("k6", CK_K6)
2371 .Case("k6-2", CK_K6_2)
2372 .Case("k6-3", CK_K6_3)
2373 .Case("athlon", CK_Athlon)
2374 .Case("athlon-tbird", CK_AthlonThunderbird)
2375 .Case("athlon-4", CK_Athlon4)
2376 .Case("athlon-xp", CK_AthlonXP)
2377 .Case("athlon-mp", CK_AthlonMP)
2378 .Case("athlon64", CK_Athlon64)
2379 .Case("athlon64-sse3", CK_Athlon64SSE3)
2380 .Case("athlon-fx", CK_AthlonFX)
2381 .Case("k8", CK_K8)
2382 .Case("k8-sse3", CK_K8SSE3)
2383 .Case("opteron", CK_Opteron)
2384 .Case("opteron-sse3", CK_OpteronSSE3)
2385 .Case("barcelona", CK_AMDFAM10)
2386 .Case("amdfam10", CK_AMDFAM10)
2387 .Case("btver1", CK_BTVER1)
2388 .Case("btver2", CK_BTVER2)
2389 .Case("bdver1", CK_BDVER1)
2390 .Case("bdver2", CK_BDVER2)
2391 .Case("bdver3", CK_BDVER3)
2392 .Case("bdver4", CK_BDVER4)
2393 .Case("x86-64", CK_x86_64)
2394 .Case("geode", CK_Geode)
2395 .Default(CK_Generic);
2396 }
2397
Rafael Espindolaeb265472013-08-21 21:59:03 +00002398 enum FPMathKind {
2399 FP_Default,
2400 FP_SSE,
2401 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002402 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002403
Eli Friedman3fd920a2008-08-20 02:34:37 +00002404public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002405 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2406 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002407 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002408 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002409 }
Craig Topper3164f332014-03-11 03:39:26 +00002410 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002411 // X87 evaluates with 80 bits "long double" precision.
2412 return SSELevel == NoSSE ? 2 : 0;
2413 }
Craig Topper6c03a542015-10-19 04:51:35 +00002414 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2415 return llvm::makeArrayRef(BuiltinInfo,
2416 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002417 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002418 ArrayRef<const char *> getGCCRegNames() const override {
2419 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002420 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002421 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2422 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002423 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002424 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2425 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002426 }
Eric Christopherd9832702015-06-29 21:00:05 +00002427 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002428 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002429 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002430
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002431 bool validateGlobalRegisterVariable(StringRef RegName,
2432 unsigned RegSize,
2433 bool &HasSizeMismatch) const override {
2434 // esp and ebp are the only 32-bit registers the x86 backend can currently
2435 // handle.
2436 if (RegName.equals("esp") || RegName.equals("ebp")) {
2437 // Check that the register size is 32-bit.
2438 HasSizeMismatch = RegSize != 32;
2439 return true;
2440 }
2441
2442 return false;
2443 }
2444
Akira Hatanaka974131e2014-09-18 18:17:18 +00002445 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2446
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002447 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2448
Akira Hatanaka974131e2014-09-18 18:17:18 +00002449 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2450
Craig Topper3164f332014-03-11 03:39:26 +00002451 std::string convertConstraint(const char *&Constraint) const override;
2452 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002453 return "~{dirflag},~{fpsr},~{flags}";
2454 }
Craig Topper3164f332014-03-11 03:39:26 +00002455 void getTargetDefines(const LangOptions &Opts,
2456 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002457 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2458 bool Enabled);
2459 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2460 bool Enabled);
2461 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2462 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002463 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2464 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002465 setFeatureEnabledImpl(Features, Name, Enabled);
2466 }
2467 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002468 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002469 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2470 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002471 bool
2472 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2473 StringRef CPU,
2474 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002475 bool hasFeature(StringRef Feature) const override;
2476 bool handleTargetFeatures(std::vector<std::string> &Features,
2477 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002478 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002479 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2480 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002481 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002482 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002483 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002484 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002485 return "no-mmx";
2486 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002487 }
Craig Topper3164f332014-03-11 03:39:26 +00002488 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002489 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002490
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002491 // Perform any per-CPU checks necessary to determine if this CPU is
2492 // acceptable.
2493 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2494 // invalid without explaining *why*.
2495 switch (CPU) {
2496 case CK_Generic:
2497 // No processor selected!
2498 return false;
2499
2500 case CK_i386:
2501 case CK_i486:
2502 case CK_WinChipC6:
2503 case CK_WinChip2:
2504 case CK_C3:
2505 case CK_i586:
2506 case CK_Pentium:
2507 case CK_PentiumMMX:
2508 case CK_i686:
2509 case CK_PentiumPro:
2510 case CK_Pentium2:
2511 case CK_Pentium3:
2512 case CK_Pentium3M:
2513 case CK_PentiumM:
2514 case CK_Yonah:
2515 case CK_C3_2:
2516 case CK_Pentium4:
2517 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002518 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002519 case CK_Prescott:
2520 case CK_K6:
2521 case CK_K6_2:
2522 case CK_K6_3:
2523 case CK_Athlon:
2524 case CK_AthlonThunderbird:
2525 case CK_Athlon4:
2526 case CK_AthlonXP:
2527 case CK_AthlonMP:
2528 case CK_Geode:
2529 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002530 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002531 return false;
2532
2533 // Fallthrough
2534 case CK_Nocona:
2535 case CK_Core2:
2536 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002537 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002538 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002539 case CK_Nehalem:
2540 case CK_Westmere:
2541 case CK_SandyBridge:
2542 case CK_IvyBridge:
2543 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002544 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002545 case CK_SkylakeClient:
2546 case CK_SkylakeServer:
2547 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002548 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002549 case CK_Athlon64:
2550 case CK_Athlon64SSE3:
2551 case CK_AthlonFX:
2552 case CK_K8:
2553 case CK_K8SSE3:
2554 case CK_Opteron:
2555 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002556 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002557 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002558 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002559 case CK_BDVER1:
2560 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002561 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002562 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002563 case CK_x86_64:
2564 return true;
2565 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002566 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002567 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002568
Craig Topper3164f332014-03-11 03:39:26 +00002569 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002570
Craig Topper3164f332014-03-11 03:39:26 +00002571 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002572 // Most of the non-ARM calling conventions are i386 conventions.
2573 switch (CC) {
2574 case CC_X86ThisCall:
2575 case CC_X86FastCall:
2576 case CC_X86StdCall:
2577 case CC_X86VectorCall:
2578 case CC_C:
2579 case CC_Swift:
2580 case CC_X86Pascal:
2581 case CC_IntelOclBicc:
2582 return CCCR_OK;
2583 default:
2584 return CCCR_Warning;
2585 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002586 }
2587
Craig Topper3164f332014-03-11 03:39:26 +00002588 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002589 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002590 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002591
2592 bool hasSjLjLowering() const override {
2593 return true;
2594 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002595};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002596
Rafael Espindolaeb265472013-08-21 21:59:03 +00002597bool X86TargetInfo::setFPMath(StringRef Name) {
2598 if (Name == "387") {
2599 FPMath = FP_387;
2600 return true;
2601 }
2602 if (Name == "sse") {
2603 FPMath = FP_SSE;
2604 return true;
2605 }
2606 return false;
2607}
2608
Eric Christopher007b0a02015-08-28 22:32:01 +00002609bool X86TargetInfo::initFeatureMap(
2610 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002611 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002612 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002613 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002614 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002615 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002616
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002617 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002618
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002619 // Enable X87 for all X86 processors but Lakemont.
2620 if (Kind != CK_Lakemont)
2621 setFeatureEnabledImpl(Features, "x87", true);
2622
2623 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002624 case CK_Generic:
2625 case CK_i386:
2626 case CK_i486:
2627 case CK_i586:
2628 case CK_Pentium:
2629 case CK_i686:
2630 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002631 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002632 break;
2633 case CK_PentiumMMX:
2634 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002635 case CK_K6:
2636 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002637 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002638 break;
2639 case CK_Pentium3:
2640 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002641 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002642 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002643 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002644 break;
2645 case CK_PentiumM:
2646 case CK_Pentium4:
2647 case CK_Pentium4M:
2648 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002649 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002650 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002651 break;
2652 case CK_Yonah:
2653 case CK_Prescott:
2654 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002655 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002656 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002657 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002658 break;
2659 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002660 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002661 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002662 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002663 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002664 break;
2665 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002666 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002667 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002668 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002669 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002670 case CK_Cannonlake:
2671 setFeatureEnabledImpl(Features, "avx512ifma", true);
2672 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2673 setFeatureEnabledImpl(Features, "sha", true);
2674 setFeatureEnabledImpl(Features, "umip", true);
2675 // FALLTHROUGH
2676 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002677 setFeatureEnabledImpl(Features, "avx512f", true);
2678 setFeatureEnabledImpl(Features, "avx512cd", true);
2679 setFeatureEnabledImpl(Features, "avx512dq", true);
2680 setFeatureEnabledImpl(Features, "avx512bw", true);
2681 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002682 setFeatureEnabledImpl(Features, "pku", true);
2683 setFeatureEnabledImpl(Features, "pcommit", true);
2684 setFeatureEnabledImpl(Features, "clwb", true);
2685 // FALLTHROUGH
2686 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002687 setFeatureEnabledImpl(Features, "xsavec", true);
2688 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002689 setFeatureEnabledImpl(Features, "mpx", true);
2690 setFeatureEnabledImpl(Features, "sgx", true);
2691 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002692 // FALLTHROUGH
2693 case CK_Broadwell:
2694 setFeatureEnabledImpl(Features, "rdseed", true);
2695 setFeatureEnabledImpl(Features, "adx", true);
2696 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002697 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002698 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002699 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002700 setFeatureEnabledImpl(Features, "bmi", true);
2701 setFeatureEnabledImpl(Features, "bmi2", true);
2702 setFeatureEnabledImpl(Features, "rtm", true);
2703 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002704 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002705 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002706 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002707 setFeatureEnabledImpl(Features, "rdrnd", true);
2708 setFeatureEnabledImpl(Features, "f16c", true);
2709 setFeatureEnabledImpl(Features, "fsgsbase", true);
2710 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002711 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002712 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002713 setFeatureEnabledImpl(Features, "xsave", true);
2714 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002715 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002716 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002717 case CK_Silvermont:
2718 setFeatureEnabledImpl(Features, "aes", true);
2719 setFeatureEnabledImpl(Features, "pclmul", true);
2720 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002721 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002722 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002723 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002724 setFeatureEnabledImpl(Features, "cx16", true);
2725 break;
2726 case CK_KNL:
2727 setFeatureEnabledImpl(Features, "avx512f", true);
2728 setFeatureEnabledImpl(Features, "avx512cd", true);
2729 setFeatureEnabledImpl(Features, "avx512er", true);
2730 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002731 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002732 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002733 setFeatureEnabledImpl(Features, "rdseed", true);
2734 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002735 setFeatureEnabledImpl(Features, "lzcnt", true);
2736 setFeatureEnabledImpl(Features, "bmi", true);
2737 setFeatureEnabledImpl(Features, "bmi2", true);
2738 setFeatureEnabledImpl(Features, "rtm", true);
2739 setFeatureEnabledImpl(Features, "fma", true);
2740 setFeatureEnabledImpl(Features, "rdrnd", true);
2741 setFeatureEnabledImpl(Features, "f16c", true);
2742 setFeatureEnabledImpl(Features, "fsgsbase", true);
2743 setFeatureEnabledImpl(Features, "aes", true);
2744 setFeatureEnabledImpl(Features, "pclmul", true);
2745 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002746 setFeatureEnabledImpl(Features, "xsaveopt", true);
2747 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002748 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002749 break;
2750 case CK_K6_2:
2751 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002752 case CK_WinChip2:
2753 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002754 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002755 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002756 case CK_Athlon:
2757 case CK_AthlonThunderbird:
2758 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002759 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002760 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002761 case CK_Athlon4:
2762 case CK_AthlonXP:
2763 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002764 setFeatureEnabledImpl(Features, "sse", true);
2765 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002766 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002767 break;
2768 case CK_K8:
2769 case CK_Opteron:
2770 case CK_Athlon64:
2771 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002772 setFeatureEnabledImpl(Features, "sse2", true);
2773 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002774 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002775 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002776 case CK_AMDFAM10:
2777 setFeatureEnabledImpl(Features, "sse4a", true);
2778 setFeatureEnabledImpl(Features, "lzcnt", true);
2779 setFeatureEnabledImpl(Features, "popcnt", true);
2780 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002781 case CK_K8SSE3:
2782 case CK_OpteronSSE3:
2783 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002784 setFeatureEnabledImpl(Features, "sse3", true);
2785 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002786 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002787 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002788 case CK_BTVER2:
2789 setFeatureEnabledImpl(Features, "avx", true);
2790 setFeatureEnabledImpl(Features, "aes", true);
2791 setFeatureEnabledImpl(Features, "pclmul", true);
2792 setFeatureEnabledImpl(Features, "bmi", true);
2793 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002794 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002795 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002796 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002797 setFeatureEnabledImpl(Features, "ssse3", true);
2798 setFeatureEnabledImpl(Features, "sse4a", true);
2799 setFeatureEnabledImpl(Features, "lzcnt", true);
2800 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002801 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002802 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002803 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002804 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002805 case CK_BDVER4:
2806 setFeatureEnabledImpl(Features, "avx2", true);
2807 setFeatureEnabledImpl(Features, "bmi2", true);
2808 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002809 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002810 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002811 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002812 // FALLTHROUGH
2813 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002814 setFeatureEnabledImpl(Features, "bmi", true);
2815 setFeatureEnabledImpl(Features, "fma", true);
2816 setFeatureEnabledImpl(Features, "f16c", true);
2817 setFeatureEnabledImpl(Features, "tbm", true);
2818 // FALLTHROUGH
2819 case CK_BDVER1:
2820 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002821 setFeatureEnabledImpl(Features, "xop", true);
2822 setFeatureEnabledImpl(Features, "lzcnt", true);
2823 setFeatureEnabledImpl(Features, "aes", true);
2824 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002825 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002826 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002827 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002828 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002829 break;
Eli Friedman33465822011-07-08 23:31:17 +00002830 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002831 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2832 return false;
2833
2834 // Can't do this earlier because we need to be able to explicitly enable
2835 // or disable these features and the things that they depend upon.
2836
2837 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2838 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002839 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002840 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2841 FeaturesVec.end())
2842 Features["popcnt"] = true;
2843
2844 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2845 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002846 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002847 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2848 FeaturesVec.end())
2849 Features["prfchw"] = true;
2850
Eric Christophera7260af2015-10-08 20:10:18 +00002851 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2852 // then enable MMX.
2853 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002854 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002855 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2856 FeaturesVec.end())
2857 Features["mmx"] = true;
2858
Eric Christopherbbd746d2015-10-08 20:10:14 +00002859 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002860}
2861
Rafael Espindolae62e2792013-08-20 13:44:29 +00002862void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002863 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 if (Enabled) {
2865 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002866 case AVX512F:
2867 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002868 case AVX2:
2869 Features["avx2"] = true;
2870 case AVX:
2871 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002872 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002873 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002874 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002875 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002876 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002877 case SSSE3:
2878 Features["ssse3"] = true;
2879 case SSE3:
2880 Features["sse3"] = true;
2881 case SSE2:
2882 Features["sse2"] = true;
2883 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002884 Features["sse"] = true;
2885 case NoSSE:
2886 break;
2887 }
2888 return;
2889 }
2890
2891 switch (Level) {
2892 case NoSSE:
2893 case SSE1:
2894 Features["sse"] = false;
2895 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002896 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2897 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002898 case SSE3:
2899 Features["sse3"] = false;
2900 setXOPLevel(Features, NoXOP, false);
2901 case SSSE3:
2902 Features["ssse3"] = false;
2903 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002904 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002905 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002906 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002907 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002908 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2909 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002910 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002911 case AVX2:
2912 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002913 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002914 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002915 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00002916 Features["avx512vl"] = Features["avx512vbmi"] =
2917 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002918 }
2919}
2920
2921void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002922 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002923 if (Enabled) {
2924 switch (Level) {
2925 case AMD3DNowAthlon:
2926 Features["3dnowa"] = true;
2927 case AMD3DNow:
2928 Features["3dnow"] = true;
2929 case MMX:
2930 Features["mmx"] = true;
2931 case NoMMX3DNow:
2932 break;
2933 }
2934 return;
2935 }
2936
2937 switch (Level) {
2938 case NoMMX3DNow:
2939 case MMX:
2940 Features["mmx"] = false;
2941 case AMD3DNow:
2942 Features["3dnow"] = false;
2943 case AMD3DNowAthlon:
2944 Features["3dnowa"] = false;
2945 }
2946}
2947
2948void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002949 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002950 if (Enabled) {
2951 switch (Level) {
2952 case XOP:
2953 Features["xop"] = true;
2954 case FMA4:
2955 Features["fma4"] = true;
2956 setSSELevel(Features, AVX, true);
2957 case SSE4A:
2958 Features["sse4a"] = true;
2959 setSSELevel(Features, SSE3, true);
2960 case NoXOP:
2961 break;
2962 }
2963 return;
2964 }
2965
2966 switch (Level) {
2967 case NoXOP:
2968 case SSE4A:
2969 Features["sse4a"] = false;
2970 case FMA4:
2971 Features["fma4"] = false;
2972 case XOP:
2973 Features["xop"] = false;
2974 }
2975}
2976
Craig Topper86d79ef2013-09-17 04:51:29 +00002977void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2978 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002979 // This is a bit of a hack to deal with the sse4 target feature when used
2980 // as part of the target attribute. We handle sse4 correctly everywhere
2981 // else. See below for more information on how we handle the sse4 options.
2982 if (Name != "sse4")
2983 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002984
Craig Topper29561122013-09-19 01:13:07 +00002985 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002986 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002987 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002988 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002989 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002990 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002991 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002992 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002993 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002994 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002995 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002996 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002997 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002998 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002999 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003000 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003001 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003002 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003003 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003004 if (Enabled)
3005 setSSELevel(Features, SSE2, Enabled);
3006 } else if (Name == "pclmul") {
3007 if (Enabled)
3008 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003009 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003010 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003011 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003012 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003013 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003014 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003015 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3016 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3017 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003018 if (Enabled)
3019 setSSELevel(Features, AVX512F, Enabled);
3020 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003021 if (Enabled)
3022 setSSELevel(Features, AVX, Enabled);
3023 } else if (Name == "fma4") {
3024 setXOPLevel(Features, FMA4, Enabled);
3025 } else if (Name == "xop") {
3026 setXOPLevel(Features, XOP, Enabled);
3027 } else if (Name == "sse4a") {
3028 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003029 } else if (Name == "f16c") {
3030 if (Enabled)
3031 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003032 } else if (Name == "sha") {
3033 if (Enabled)
3034 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003035 } else if (Name == "sse4") {
3036 // We can get here via the __target__ attribute since that's not controlled
3037 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3038 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3039 // disabled.
3040 if (Enabled)
3041 setSSELevel(Features, SSE42, Enabled);
3042 else
3043 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003044 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003045 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003046 Features["xsaveopt"] = false;
3047 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003048 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003049 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003050 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003051}
3052
Eric Christopher3ff21b32013-10-16 21:26:26 +00003053/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003054/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003055bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003056 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003057 for (const auto &Feature : Features) {
3058 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003059 continue;
3060
Eric Christopher610fe112015-08-26 08:21:55 +00003061 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003062 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003063 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003064 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003065 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003066 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003067 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003068 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003069 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003070 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003071 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003072 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003073 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003074 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003075 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003076 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003077 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003078 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003079 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003080 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003081 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003082 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003083 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003084 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003085 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003086 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003087 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003088 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003089 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003090 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003091 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003092 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003093 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003094 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003095 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003096 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003097 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003098 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003099 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003100 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003101 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003102 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003103 } else if (Feature == "+avx512vbmi") {
3104 HasAVX512VBMI = true;
3105 } else if (Feature == "+avx512ifma") {
3106 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003107 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003108 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003109 } else if (Feature == "+mpx") {
3110 HasMPX = true;
3111 } else if (Feature == "+movbe") {
3112 HasMOVBE = true;
3113 } else if (Feature == "+sgx") {
3114 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003115 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003116 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003117 } else if (Feature == "+fxsr") {
3118 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003119 } else if (Feature == "+xsave") {
3120 HasXSAVE = true;
3121 } else if (Feature == "+xsaveopt") {
3122 HasXSAVEOPT = true;
3123 } else if (Feature == "+xsavec") {
3124 HasXSAVEC = true;
3125 } else if (Feature == "+xsaves") {
3126 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003127 } else if (Feature == "+pku") {
3128 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003129 } else if (Feature == "+clflushopt") {
3130 HasCLFLUSHOPT = true;
3131 } else if (Feature == "+pcommit") {
3132 HasPCOMMIT = true;
3133 } else if (Feature == "+clwb") {
3134 HasCLWB = true;
3135 } else if (Feature == "+umip") {
3136 HasUMIP = true;
3137 } else if (Feature == "+prefetchwt1") {
3138 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003139 }
3140
Benjamin Kramer27402c62012-03-05 15:10:44 +00003141 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003142 .Case("+avx512f", AVX512F)
3143 .Case("+avx2", AVX2)
3144 .Case("+avx", AVX)
3145 .Case("+sse4.2", SSE42)
3146 .Case("+sse4.1", SSE41)
3147 .Case("+ssse3", SSSE3)
3148 .Case("+sse3", SSE3)
3149 .Case("+sse2", SSE2)
3150 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003151 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003152 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003153
Eli Friedman33465822011-07-08 23:31:17 +00003154 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003155 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003156 .Case("+3dnowa", AMD3DNowAthlon)
3157 .Case("+3dnow", AMD3DNow)
3158 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003159 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003160 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003161
3162 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003163 .Case("+xop", XOP)
3164 .Case("+fma4", FMA4)
3165 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003166 .Default(NoXOP);
3167 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003168 }
Eli Friedman33465822011-07-08 23:31:17 +00003169
Rafael Espindolaeb265472013-08-21 21:59:03 +00003170 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3171 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003172 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3173 (FPMath == FP_387 && SSELevel >= SSE1)) {
3174 Diags.Report(diag::err_target_unsupported_fpmath) <<
3175 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003176 return false;
3177 }
3178
Alexey Bataev00396512015-07-02 03:40:19 +00003179 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003180 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003181 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003182}
Chris Lattnerecd49032009-03-02 22:27:17 +00003183
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003184/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3185/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003186void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003187 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003188 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003189 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003190 Builder.defineMacro("__amd64__");
3191 Builder.defineMacro("__amd64");
3192 Builder.defineMacro("__x86_64");
3193 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003194 if (getTriple().getArchName() == "x86_64h") {
3195 Builder.defineMacro("__x86_64h");
3196 Builder.defineMacro("__x86_64h__");
3197 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003198 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003199 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003200 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003201
Chris Lattnerecd49032009-03-02 22:27:17 +00003202 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003203 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3204 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003205 switch (CPU) {
3206 case CK_Generic:
3207 break;
3208 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003209 // The rest are coming from the i386 define above.
3210 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003211 break;
3212 case CK_i486:
3213 case CK_WinChipC6:
3214 case CK_WinChip2:
3215 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003216 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003217 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003218 case CK_PentiumMMX:
3219 Builder.defineMacro("__pentium_mmx__");
3220 Builder.defineMacro("__tune_pentium_mmx__");
3221 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003222 case CK_i586:
3223 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003224 defineCPUMacros(Builder, "i586");
3225 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003226 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003227 case CK_Pentium3:
3228 case CK_Pentium3M:
3229 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003230 Builder.defineMacro("__tune_pentium3__");
3231 // Fallthrough
3232 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003233 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003234 Builder.defineMacro("__tune_pentium2__");
3235 // Fallthrough
3236 case CK_PentiumPro:
3237 Builder.defineMacro("__tune_i686__");
3238 Builder.defineMacro("__tune_pentiumpro__");
3239 // Fallthrough
3240 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003241 Builder.defineMacro("__i686");
3242 Builder.defineMacro("__i686__");
3243 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3244 Builder.defineMacro("__pentiumpro");
3245 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003246 break;
3247 case CK_Pentium4:
3248 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003249 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003250 break;
3251 case CK_Yonah:
3252 case CK_Prescott:
3253 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003254 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003255 break;
3256 case CK_Core2:
3257 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003258 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003259 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003260 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003261 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003262 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003263 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003264 defineCPUMacros(Builder, "slm");
3265 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003266 case CK_Nehalem:
3267 case CK_Westmere:
3268 case CK_SandyBridge:
3269 case CK_IvyBridge:
3270 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003271 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003272 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003273 // FIXME: Historically, we defined this legacy name, it would be nice to
3274 // remove it at some point. We've never exposed fine-grained names for
3275 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003276 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003277 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003278 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003279 defineCPUMacros(Builder, "skx");
3280 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003281 case CK_Cannonlake:
3282 break;
Craig Topper449314e2013-08-20 07:09:39 +00003283 case CK_KNL:
3284 defineCPUMacros(Builder, "knl");
3285 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003286 case CK_Lakemont:
3287 Builder.defineMacro("__tune_lakemont__");
3288 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003289 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003290 Builder.defineMacro("__k6_2__");
3291 Builder.defineMacro("__tune_k6_2__");
3292 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003293 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003294 if (CPU != CK_K6_2) { // In case of fallthrough
3295 // FIXME: GCC may be enabling these in cases where some other k6
3296 // architecture is specified but -m3dnow is explicitly provided. The
3297 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003298 Builder.defineMacro("__k6_3__");
3299 Builder.defineMacro("__tune_k6_3__");
3300 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003301 // Fallthrough
3302 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003303 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003304 break;
3305 case CK_Athlon:
3306 case CK_AthlonThunderbird:
3307 case CK_Athlon4:
3308 case CK_AthlonXP:
3309 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003310 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003311 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003312 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003313 Builder.defineMacro("__tune_athlon_sse__");
3314 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003315 break;
3316 case CK_K8:
3317 case CK_K8SSE3:
3318 case CK_x86_64:
3319 case CK_Opteron:
3320 case CK_OpteronSSE3:
3321 case CK_Athlon64:
3322 case CK_Athlon64SSE3:
3323 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003324 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003325 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003326 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003327 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003328 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003329 case CK_BTVER1:
3330 defineCPUMacros(Builder, "btver1");
3331 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003332 case CK_BTVER2:
3333 defineCPUMacros(Builder, "btver2");
3334 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003335 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003336 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003337 break;
3338 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003339 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003340 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003341 case CK_BDVER3:
3342 defineCPUMacros(Builder, "bdver3");
3343 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003344 case CK_BDVER4:
3345 defineCPUMacros(Builder, "bdver4");
3346 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003347 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003348 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003349 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003350 }
Chris Lattner96e43572009-03-02 22:40:39 +00003351
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003352 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003353 Builder.defineMacro("__REGISTER_PREFIX__", "");
3354
Chris Lattner6df41af2009-04-19 17:32:33 +00003355 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3356 // functions in glibc header files that use FP Stack inline asm which the
3357 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003358 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003359
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003360 if (HasAES)
3361 Builder.defineMacro("__AES__");
3362
Craig Topper3f122a72012-05-31 05:18:48 +00003363 if (HasPCLMUL)
3364 Builder.defineMacro("__PCLMUL__");
3365
Craig Topper22967d42011-12-25 05:06:45 +00003366 if (HasLZCNT)
3367 Builder.defineMacro("__LZCNT__");
3368
Benjamin Kramer1e250392012-07-07 09:39:18 +00003369 if (HasRDRND)
3370 Builder.defineMacro("__RDRND__");
3371
Craig Topper8c7f2512014-11-03 06:51:41 +00003372 if (HasFSGSBASE)
3373 Builder.defineMacro("__FSGSBASE__");
3374
Craig Topper22967d42011-12-25 05:06:45 +00003375 if (HasBMI)
3376 Builder.defineMacro("__BMI__");
3377
3378 if (HasBMI2)
3379 Builder.defineMacro("__BMI2__");
3380
Craig Topper1de83482011-12-29 16:10:46 +00003381 if (HasPOPCNT)
3382 Builder.defineMacro("__POPCNT__");
3383
Michael Liao625a8752012-11-10 05:17:46 +00003384 if (HasRTM)
3385 Builder.defineMacro("__RTM__");
3386
Michael Liao74f4eaf2013-03-26 17:52:08 +00003387 if (HasPRFCHW)
3388 Builder.defineMacro("__PRFCHW__");
3389
Michael Liaoffaae352013-03-29 05:17:55 +00003390 if (HasRDSEED)
3391 Builder.defineMacro("__RDSEED__");
3392
Robert Khasanov50e6f582014-09-19 09:53:48 +00003393 if (HasADX)
3394 Builder.defineMacro("__ADX__");
3395
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003396 if (HasTBM)
3397 Builder.defineMacro("__TBM__");
3398
Rafael Espindolae62e2792013-08-20 13:44:29 +00003399 switch (XOPLevel) {
3400 case XOP:
3401 Builder.defineMacro("__XOP__");
3402 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003403 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003404 case SSE4A:
3405 Builder.defineMacro("__SSE4A__");
3406 case NoXOP:
3407 break;
3408 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003409
Craig Topperbba778b2012-06-03 21:46:30 +00003410 if (HasFMA)
3411 Builder.defineMacro("__FMA__");
3412
Manman Rena45358c2012-10-11 00:59:55 +00003413 if (HasF16C)
3414 Builder.defineMacro("__F16C__");
3415
Craig Topper679b53a2013-08-21 05:29:10 +00003416 if (HasAVX512CD)
3417 Builder.defineMacro("__AVX512CD__");
3418 if (HasAVX512ER)
3419 Builder.defineMacro("__AVX512ER__");
3420 if (HasAVX512PF)
3421 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003422 if (HasAVX512DQ)
3423 Builder.defineMacro("__AVX512DQ__");
3424 if (HasAVX512BW)
3425 Builder.defineMacro("__AVX512BW__");
3426 if (HasAVX512VL)
3427 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003428 if (HasAVX512VBMI)
3429 Builder.defineMacro("__AVX512VBMI__");
3430 if (HasAVX512IFMA)
3431 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003432
Ben Langmuir58078d02013-09-19 13:22:04 +00003433 if (HasSHA)
3434 Builder.defineMacro("__SHA__");
3435
Craig Toppere33f51f2015-10-16 06:22:36 +00003436 if (HasFXSR)
3437 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003438 if (HasXSAVE)
3439 Builder.defineMacro("__XSAVE__");
3440 if (HasXSAVEOPT)
3441 Builder.defineMacro("__XSAVEOPT__");
3442 if (HasXSAVEC)
3443 Builder.defineMacro("__XSAVEC__");
3444 if (HasXSAVES)
3445 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003446 if (HasPKU)
3447 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003448 if (HasCX16)
3449 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3450
Chris Lattner96e43572009-03-02 22:40:39 +00003451 // Each case falls through to the previous one here.
3452 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003453 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003454 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003455 case AVX2:
3456 Builder.defineMacro("__AVX2__");
3457 case AVX:
3458 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003459 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003460 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003461 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003462 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003463 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003464 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003465 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003466 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003467 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003468 Builder.defineMacro("__SSE2__");
3469 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003470 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003471 Builder.defineMacro("__SSE__");
3472 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003473 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003474 break;
3475 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003476
Derek Schuffc7dd7222012-10-11 15:52:22 +00003477 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003478 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003479 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003480 case AVX2:
3481 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003482 case SSE42:
3483 case SSE41:
3484 case SSSE3:
3485 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003486 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003487 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003488 break;
3489 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003490 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003491 break;
3492 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003493 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003494 }
3495 }
3496
Anders Carlssone437c682010-01-27 03:47:49 +00003497 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003498 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003499 case AMD3DNowAthlon:
3500 Builder.defineMacro("__3dNOW_A__");
3501 case AMD3DNow:
3502 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003503 case MMX:
3504 Builder.defineMacro("__MMX__");
3505 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003506 break;
3507 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003508
3509 if (CPU >= CK_i486) {
3510 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3511 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3512 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3513 }
3514 if (CPU >= CK_i586)
3515 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003516}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003517
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003518bool X86TargetInfo::hasFeature(StringRef Feature) const {
3519 return llvm::StringSwitch<bool>(Feature)
3520 .Case("aes", HasAES)
3521 .Case("avx", SSELevel >= AVX)
3522 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003523 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003524 .Case("avx512cd", HasAVX512CD)
3525 .Case("avx512er", HasAVX512ER)
3526 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003527 .Case("avx512dq", HasAVX512DQ)
3528 .Case("avx512bw", HasAVX512BW)
3529 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003530 .Case("avx512vbmi", HasAVX512VBMI)
3531 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003532 .Case("bmi", HasBMI)
3533 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003534 .Case("clflushopt", HasCLFLUSHOPT)
3535 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003536 .Case("cx16", HasCX16)
3537 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003538 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003539 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003540 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003541 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003542 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003543 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3544 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3545 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003546 .Case("movbe", HasMOVBE)
3547 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003548 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003549 .Case("pcommit", HasPCOMMIT)
3550 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003551 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003552 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003553 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003554 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003555 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003556 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003557 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003558 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003559 .Case("sse", SSELevel >= SSE1)
3560 .Case("sse2", SSELevel >= SSE2)
3561 .Case("sse3", SSELevel >= SSE3)
3562 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003563 .Case("sse4.1", SSELevel >= SSE41)
3564 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003565 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003566 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003567 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003568 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003569 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3570 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003571 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003572 .Case("xsave", HasXSAVE)
3573 .Case("xsavec", HasXSAVEC)
3574 .Case("xsaves", HasXSAVES)
3575 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003576 .Default(false);
3577}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003578
Eric Christopherd9832702015-06-29 21:00:05 +00003579// We can't use a generic validation scheme for the features accepted here
3580// versus subtarget features accepted in the target attribute because the
3581// bitfield structure that's initialized in the runtime only supports the
3582// below currently rather than the full range of subtarget features. (See
3583// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3584bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3585 return llvm::StringSwitch<bool>(FeatureStr)
3586 .Case("cmov", true)
3587 .Case("mmx", true)
3588 .Case("popcnt", true)
3589 .Case("sse", true)
3590 .Case("sse2", true)
3591 .Case("sse3", true)
3592 .Case("sse4.1", true)
3593 .Case("sse4.2", true)
3594 .Case("avx", true)
3595 .Case("avx2", true)
3596 .Case("sse4a", true)
3597 .Case("fma4", true)
3598 .Case("xop", true)
3599 .Case("fma", true)
3600 .Case("avx512f", true)
3601 .Case("bmi", true)
3602 .Case("bmi2", true)
3603 .Default(false);
3604}
3605
Eli Friedman3fd920a2008-08-20 02:34:37 +00003606bool
Anders Carlsson58436352009-02-28 17:11:49 +00003607X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003608 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003609 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003610 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003611 // Constant constraints.
3612 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3613 // instructions.
3614 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3615 // x86_64 instructions.
3616 case 's':
3617 Info.setRequiresImmediate();
3618 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003619 case 'I':
3620 Info.setRequiresImmediate(0, 31);
3621 return true;
3622 case 'J':
3623 Info.setRequiresImmediate(0, 63);
3624 return true;
3625 case 'K':
3626 Info.setRequiresImmediate(-128, 127);
3627 return true;
3628 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003629 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003630 return true;
3631 case 'M':
3632 Info.setRequiresImmediate(0, 3);
3633 return true;
3634 case 'N':
3635 Info.setRequiresImmediate(0, 255);
3636 return true;
3637 case 'O':
3638 Info.setRequiresImmediate(0, 127);
3639 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003640 // Register constraints.
3641 case 'Y': // 'Y' is the first character for several 2-character constraints.
3642 // Shift the pointer to the second character of the constraint.
3643 Name++;
3644 switch (*Name) {
3645 default:
3646 return false;
3647 case '0': // First SSE register.
3648 case 't': // Any SSE register, when SSE2 is enabled.
3649 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3650 case 'm': // Any MMX register, when inter-unit moves enabled.
3651 Info.setAllowsRegister();
3652 return true;
3653 }
3654 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003655 // Constraint 'f' cannot be used for output operands.
3656 if (Info.ConstraintStr[0] == '=')
3657 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003658 Info.setAllowsRegister();
3659 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003660 case 'a': // eax.
3661 case 'b': // ebx.
3662 case 'c': // ecx.
3663 case 'd': // edx.
3664 case 'S': // esi.
3665 case 'D': // edi.
3666 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003667 case 't': // Top of floating point stack.
3668 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003669 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003670 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003671 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003672 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003673 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3674 case 'l': // "Index" registers: any general register that can be used as an
3675 // index in a base+index memory access.
3676 Info.setAllowsRegister();
3677 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003678 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003679 case 'C': // SSE floating point constant.
3680 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003681 return true;
3682 }
3683}
3684
Akira Hatanaka974131e2014-09-18 18:17:18 +00003685bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3686 unsigned Size) const {
3687 // Strip off constraint modifiers.
3688 while (Constraint[0] == '=' ||
3689 Constraint[0] == '+' ||
3690 Constraint[0] == '&')
3691 Constraint = Constraint.substr(1);
3692
3693 return validateOperandSize(Constraint, Size);
3694}
3695
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003696bool X86TargetInfo::validateInputSize(StringRef Constraint,
3697 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003698 return validateOperandSize(Constraint, Size);
3699}
3700
3701bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3702 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003703 switch (Constraint[0]) {
3704 default: break;
3705 case 'y':
3706 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003707 case 'f':
3708 case 't':
3709 case 'u':
3710 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003711 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003712 if (SSELevel >= AVX512F)
3713 // 512-bit zmm registers can be used if target supports AVX512F.
3714 return Size <= 512U;
3715 else if (SSELevel >= AVX)
3716 // 256-bit ymm registers can be used if target supports AVX.
3717 return Size <= 256U;
3718 return Size <= 128U;
3719 case 'Y':
3720 // 'Y' is the first character for several 2-character constraints.
3721 switch (Constraint[1]) {
3722 default: break;
3723 case 'm':
3724 // 'Ym' is synonymous with 'y'.
3725 return Size <= 64;
3726 case 'i':
3727 case 't':
3728 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3729 if (SSELevel >= AVX512F)
3730 return Size <= 512U;
3731 else if (SSELevel >= AVX)
3732 return Size <= 256U;
3733 return SSELevel >= SSE2 && Size <= 128U;
3734 }
3735
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003736 }
3737
3738 return true;
3739}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003740
Eli Friedman3fd920a2008-08-20 02:34:37 +00003741std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003742X86TargetInfo::convertConstraint(const char *&Constraint) const {
3743 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003744 case 'a': return std::string("{ax}");
3745 case 'b': return std::string("{bx}");
3746 case 'c': return std::string("{cx}");
3747 case 'd': return std::string("{dx}");
3748 case 'S': return std::string("{si}");
3749 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003750 case 'p': // address
3751 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003752 case 't': // top of floating point stack.
3753 return std::string("{st}");
3754 case 'u': // second from top of floating point stack.
3755 return std::string("{st(1)}"); // second from top of floating point stack.
3756 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003757 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003758 }
3759}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003760
Eli Friedman3fd920a2008-08-20 02:34:37 +00003761// X86-32 generic target
3762class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003763public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003764 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3765 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003766 DoubleAlign = LongLongAlign = 32;
3767 LongDoubleWidth = 96;
3768 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003769 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003770 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003771 SizeType = UnsignedInt;
3772 PtrDiffType = SignedInt;
3773 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003774 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003775
3776 // Use fpret for all types.
3777 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3778 (1 << TargetInfo::Double) |
3779 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003780
3781 // x86-32 has atomics up to 8 bytes
3782 // FIXME: Check that we actually have cmpxchg8b before setting
3783 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3784 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003785 }
Craig Topper3164f332014-03-11 03:39:26 +00003786 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003787 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003788 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003789
Craig Topper3164f332014-03-11 03:39:26 +00003790 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003791 if (RegNo == 0) return 0;
3792 if (RegNo == 1) return 2;
3793 return -1;
3794 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003795 bool validateOperandSize(StringRef Constraint,
3796 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003797 switch (Constraint[0]) {
3798 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003799 case 'R':
3800 case 'q':
3801 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003802 case 'a':
3803 case 'b':
3804 case 'c':
3805 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003806 case 'S':
3807 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003808 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003809 case 'A':
3810 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003811 }
3812
Akira Hatanaka974131e2014-09-18 18:17:18 +00003813 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003814 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003815};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003816
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003817class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3818public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003819 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3820 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003821
Craig Topper3164f332014-03-11 03:39:26 +00003822 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003823 unsigned Major, Minor, Micro;
3824 getTriple().getOSVersion(Major, Minor, Micro);
3825 // New NetBSD uses the default rounding mode.
3826 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3827 return X86_32TargetInfo::getFloatEvalMethod();
3828 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003829 return 1;
3830 }
3831};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003832
Eli Friedmane3aa4542009-07-05 18:47:56 +00003833class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3834public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003835 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3836 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003837 SizeType = UnsignedLong;
3838 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003839 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003840 }
3841};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003842
Eli Friedman9fa28852012-08-08 23:57:20 +00003843class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003845 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3846 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003847 SizeType = UnsignedLong;
3848 IntPtrType = SignedLong;
3849 PtrDiffType = SignedLong;
3850 }
3851};
Eli Friedman9fa28852012-08-08 23:57:20 +00003852
Torok Edwinb2b37c62009-06-30 17:10:35 +00003853class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003854public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003855 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3856 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003857 LongDoubleWidth = 128;
3858 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003859 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003860 MaxVectorAlign = 256;
3861 // The watchOS simulator uses the builtin bool type for Objective-C.
3862 llvm::Triple T = llvm::Triple(Triple);
3863 if (T.isWatchOS())
3864 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003865 SizeType = UnsignedLong;
3866 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00003867 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00003868 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003869 }
3870
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003871 bool handleTargetFeatures(std::vector<std::string> &Features,
3872 DiagnosticsEngine &Diags) override {
3873 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3874 Diags))
3875 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003876 // We now know the features we have: we can decide how to align vectors.
3877 MaxVectorAlign =
3878 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003879 return true;
3880 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003881};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003882
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003883// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003884class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003885public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003886 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3887 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003888 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003889 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003890 bool IsWinCOFF =
3891 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00003892 resetDataLayout(IsWinCOFF
3893 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3894 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003895 }
Craig Topper3164f332014-03-11 03:39:26 +00003896 void getTargetDefines(const LangOptions &Opts,
3897 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003898 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3899 }
3900};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003901
3902// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003903class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003904public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003905 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
3906 const TargetOptions &Opts)
3907 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00003908 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003909 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3910 }
Craig Topper3164f332014-03-11 03:39:26 +00003911 void getTargetDefines(const LangOptions &Opts,
3912 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003913 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3914 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3915 // The value of the following reflects processor type.
3916 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3917 // We lost the original triple, so we use the default.
3918 Builder.defineMacro("_M_IX86", "600");
3919 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003920};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003921
David Majnemerae1ed0e2015-05-28 04:36:18 +00003922static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003923 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3924 // supports __declspec natively under -fms-extensions, but we define a no-op
3925 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003926 if (Opts.MicrosoftExt)
3927 Builder.defineMacro("__declspec", "__declspec");
3928 else
3929 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3930
3931 if (!Opts.MicrosoftExt) {
3932 // Provide macros for all the calling convention keywords. Provide both
3933 // single and double underscore prefixed variants. These are available on
3934 // x64 as well as x86, even though they have no effect.
3935 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3936 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003937 std::string GCCSpelling = "__attribute__((__";
3938 GCCSpelling += CC;
3939 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003940 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3941 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3942 }
3943 }
3944}
3945
David Majnemerae1ed0e2015-05-28 04:36:18 +00003946static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3947 Builder.defineMacro("__MSVCRT__");
3948 Builder.defineMacro("__MINGW32__");
3949 addCygMingDefines(Opts, Builder);
3950}
3951
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003952// x86-32 MinGW target
3953class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3954public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003955 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3956 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00003957 void getTargetDefines(const LangOptions &Opts,
3958 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003959 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003960 DefineStd(Builder, "WIN32", Opts);
3961 DefineStd(Builder, "WINNT", Opts);
3962 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003963 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003964 }
3965};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003966
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003967// x86-32 Cygwin target
3968class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3969public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003970 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3971 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003972 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003973 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00003974 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 +00003975 }
Craig Topper3164f332014-03-11 03:39:26 +00003976 void getTargetDefines(const LangOptions &Opts,
3977 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003978 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003979 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003980 Builder.defineMacro("__CYGWIN__");
3981 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003982 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003983 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003984 if (Opts.CPlusPlus)
3985 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003986 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003987};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003988
Chris Lattnerb986aba2010-04-11 19:29:39 +00003989// x86-32 Haiku target
3990class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3991public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003992 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3993 : X86_32TargetInfo(Triple, Opts) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003994 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003995 IntPtrType = SignedLong;
3996 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003997 ProcessIDType = SignedLong;
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003998 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003999 }
Craig Topper3164f332014-03-11 03:39:26 +00004000 void getTargetDefines(const LangOptions &Opts,
4001 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004002 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4003 Builder.defineMacro("__INTEL__");
4004 Builder.defineMacro("__HAIKU__");
4005 }
4006};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004007
Alexey Bataevc99b0492015-11-25 09:24:26 +00004008// X86-32 MCU target
4009class MCUX86_32TargetInfo : public X86_32TargetInfo {
4010public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004011 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4012 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004013 LongDoubleWidth = 64;
4014 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004015 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 +00004016 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004017 }
4018
4019 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4020 // On MCU we support only C calling convention.
4021 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4022 }
4023
4024 void getTargetDefines(const LangOptions &Opts,
4025 MacroBuilder &Builder) const override {
4026 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4027 Builder.defineMacro("__iamcu");
4028 Builder.defineMacro("__iamcu__");
4029 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004030
4031 bool allowsLargerPreferedTypeAlignment() const override {
4032 return false;
4033 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004034};
4035
Douglas Gregor9fabd852011-07-01 22:41:14 +00004036// RTEMS Target
4037template<typename Target>
4038class RTEMSTargetInfo : public OSTargetInfo<Target> {
4039protected:
Craig Topper3164f332014-03-11 03:39:26 +00004040 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4041 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004042 // RTEMS defines; list based off of gcc output
4043
Douglas Gregor9fabd852011-07-01 22:41:14 +00004044 Builder.defineMacro("__rtems__");
4045 Builder.defineMacro("__ELF__");
4046 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004047
Douglas Gregor9fabd852011-07-01 22:41:14 +00004048public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004049 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4050 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004051 switch (Triple.getArch()) {
4052 default:
4053 case llvm::Triple::x86:
4054 // this->MCountName = ".mcount";
4055 break;
4056 case llvm::Triple::mips:
4057 case llvm::Triple::mipsel:
4058 case llvm::Triple::ppc:
4059 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004060 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004061 // this->MCountName = "_mcount";
4062 break;
4063 case llvm::Triple::arm:
4064 // this->MCountName = "__mcount";
4065 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004066 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004067 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004068};
4069
Douglas Gregor9fabd852011-07-01 22:41:14 +00004070// x86-32 RTEMS target
4071class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4072public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004073 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4074 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004075 SizeType = UnsignedLong;
4076 IntPtrType = SignedLong;
4077 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004078 }
Craig Topper3164f332014-03-11 03:39:26 +00004079 void getTargetDefines(const LangOptions &Opts,
4080 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004081 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4082 Builder.defineMacro("__INTEL__");
4083 Builder.defineMacro("__rtems__");
4084 }
4085};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004086
Eli Friedman3fd920a2008-08-20 02:34:37 +00004087// x86-64 generic target
4088class X86_64TargetInfo : public X86TargetInfo {
4089public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004090 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4091 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004092 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004093 bool IsWinCOFF =
4094 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004095 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004096 LongDoubleWidth = 128;
4097 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004098 LargeArrayMinWidth = 128;
4099 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004100 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004101 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4102 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4103 IntPtrType = IsX32 ? SignedInt : SignedLong;
4104 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004105 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004106 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004107
Eric Christopher917e9522014-11-18 22:36:15 +00004108 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004109 resetDataLayout(IsX32
4110 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4111 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4112 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004113
4114 // Use fpret only for long double.
4115 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004116
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004117 // Use fp2ret for _Complex long double.
4118 ComplexLongDoubleUsesFP2Ret = true;
4119
Charles Davisc7d5c942015-09-17 20:55:33 +00004120 // Make __builtin_ms_va_list available.
4121 HasBuiltinMSVaList = true;
4122
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004123 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004124 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004125 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004126 }
Craig Topper3164f332014-03-11 03:39:26 +00004127 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004128 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004129 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004130
Craig Topper3164f332014-03-11 03:39:26 +00004131 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004132 if (RegNo == 0) return 0;
4133 if (RegNo == 1) return 1;
4134 return -1;
4135 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004136
Craig Topper3164f332014-03-11 03:39:26 +00004137 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004138 switch (CC) {
4139 case CC_C:
4140 case CC_Swift:
4141 case CC_X86VectorCall:
4142 case CC_IntelOclBicc:
4143 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004144 case CC_PreserveMost:
4145 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004146 return CCCR_OK;
4147 default:
4148 return CCCR_Warning;
4149 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004150 }
4151
Craig Topper3164f332014-03-11 03:39:26 +00004152 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004153 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004154 }
4155
Pavel Chupinfd223e12014-08-04 12:39:43 +00004156 // for x32 we need it here explicitly
4157 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004158 unsigned getUnwindWordWidth() const override { return 64; }
4159 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004160
4161 bool validateGlobalRegisterVariable(StringRef RegName,
4162 unsigned RegSize,
4163 bool &HasSizeMismatch) const override {
4164 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4165 // handle.
4166 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4167 // Check that the register size is 64-bit.
4168 HasSizeMismatch = RegSize != 64;
4169 return true;
4170 }
4171
4172 // Check if the register is a 32-bit register the backend can handle.
4173 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4174 HasSizeMismatch);
4175 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004176};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004177
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004178// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004179class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004180public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004181 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4182 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004183 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004184 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004185 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004186 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004187 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004188 SizeType = UnsignedLongLong;
4189 PtrDiffType = SignedLongLong;
4190 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004191 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004192
Craig Topper3164f332014-03-11 03:39:26 +00004193 void getTargetDefines(const LangOptions &Opts,
4194 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004195 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004196 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004197 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004198
Craig Topper3164f332014-03-11 03:39:26 +00004199 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004200 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004201 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004202
Craig Topper3164f332014-03-11 03:39:26 +00004203 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004204 switch (CC) {
4205 case CC_X86StdCall:
4206 case CC_X86ThisCall:
4207 case CC_X86FastCall:
4208 return CCCR_Ignore;
4209 case CC_C:
4210 case CC_X86VectorCall:
4211 case CC_IntelOclBicc:
4212 case CC_X86_64SysV:
4213 return CCCR_OK;
4214 default:
4215 return CCCR_Warning;
4216 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004217 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004218};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004219
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004220// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004221class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004222public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004223 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4224 const TargetOptions &Opts)
4225 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004226 LongDoubleWidth = LongDoubleAlign = 64;
4227 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004228 }
Craig Topper3164f332014-03-11 03:39:26 +00004229 void getTargetDefines(const LangOptions &Opts,
4230 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004231 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4232 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004233 Builder.defineMacro("_M_X64", "100");
4234 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004235 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004236};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004237
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004238// x86-64 MinGW target
4239class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4240public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004241 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4242 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004243 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4244 // with x86 FP ops. Weird.
4245 LongDoubleWidth = LongDoubleAlign = 128;
4246 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4247 }
4248
Craig Topper3164f332014-03-11 03:39:26 +00004249 void getTargetDefines(const LangOptions &Opts,
4250 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004251 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004252 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004253 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004254 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004255
4256 // GCC defines this macro when it is using __gxx_personality_seh0.
4257 if (!Opts.SjLjExceptions)
4258 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004259 }
4260};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004261
Yaron Kerend030d112015-07-22 17:38:19 +00004262// x86-64 Cygwin target
4263class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4264public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004265 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4266 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004267 TLSSupported = false;
4268 WCharType = UnsignedShort;
4269 }
4270 void getTargetDefines(const LangOptions &Opts,
4271 MacroBuilder &Builder) const override {
4272 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4273 Builder.defineMacro("__x86_64__");
4274 Builder.defineMacro("__CYGWIN__");
4275 Builder.defineMacro("__CYGWIN64__");
4276 addCygMingDefines(Opts, Builder);
4277 DefineStd(Builder, "unix", Opts);
4278 if (Opts.CPlusPlus)
4279 Builder.defineMacro("_GNU_SOURCE");
4280
4281 // GCC defines this macro when it is using __gxx_personality_seh0.
4282 if (!Opts.SjLjExceptions)
4283 Builder.defineMacro("__SEH__");
4284 }
4285};
4286
Eli Friedman2857ccb2009-07-01 03:36:11 +00004287class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4288public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004289 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4290 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004291 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004292 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4293 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004294 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004295 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004296 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004297 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004298
4299 bool handleTargetFeatures(std::vector<std::string> &Features,
4300 DiagnosticsEngine &Diags) override {
4301 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4302 Diags))
4303 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004304 // We now know the features we have: we can decide how to align vectors.
4305 MaxVectorAlign =
4306 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004307 return true;
4308 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004309};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004310
Eli Friedman245f2292009-07-05 22:31:18 +00004311class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4312public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004313 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4314 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004315 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004316 Int64Type = SignedLongLong;
4317 }
4318};
Eli Friedman245f2292009-07-05 22:31:18 +00004319
Eli Friedman9fa28852012-08-08 23:57:20 +00004320class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4321public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004322 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4323 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004324 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004325 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004326 }
4327};
Tim Northover9bb857a2013-01-31 12:13:10 +00004328
Eli Friedmanf05b7722008-08-20 07:44:10 +00004329class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004330 // Possible FPU choices.
4331 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004332 VFP2FPU = (1 << 0),
4333 VFP3FPU = (1 << 1),
4334 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004335 NeonFPU = (1 << 3),
4336 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004337 };
4338
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004339 // Possible HWDiv features.
4340 enum HWDivMode {
4341 HWDivThumb = (1 << 0),
4342 HWDivARM = (1 << 1)
4343 };
4344
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004345 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004346 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004347 }
4348
4349 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4350 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004351
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004352 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004353
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004354 StringRef CPUProfile;
4355 StringRef CPUAttr;
4356
Rafael Espindolaeb265472013-08-21 21:59:03 +00004357 enum {
4358 FP_Default,
4359 FP_VFP,
4360 FP_Neon
4361 } FPMath;
4362
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004363 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004364 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004365 unsigned ArchProfile;
4366 unsigned ArchVersion;
4367
Bernard Ogdenda13af32013-10-24 18:32:51 +00004368 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004369
Logan Chien57086ce2012-10-10 06:56:20 +00004370 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004371 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004372
4373 // Initialized via features.
4374 unsigned SoftFloat : 1;
4375 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004376
Bernard Ogden18b57012013-10-29 09:47:51 +00004377 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004378 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004379 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004380 unsigned Unaligned : 1;
4381
4382 enum {
4383 LDREX_B = (1 << 0), /// byte (8-bit)
4384 LDREX_H = (1 << 1), /// half (16-bit)
4385 LDREX_W = (1 << 2), /// word (32-bit)
4386 LDREX_D = (1 << 3), /// double (64-bit)
4387 };
4388
4389 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004390
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004391 // ACLE 6.5.1 Hardware floating point
4392 enum {
4393 HW_FP_HP = (1 << 1), /// half (16-bit)
4394 HW_FP_SP = (1 << 2), /// single (32-bit)
4395 HW_FP_DP = (1 << 3), /// double (64-bit)
4396 };
4397 uint32_t HW_FP;
4398
Chris Lattner5cc15e02010-03-03 19:03:45 +00004399 static const Builtin::Info BuiltinInfo[];
4400
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004401 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004402 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004403
4404 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004405 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004406
Renato Golin9ba39232015-02-27 16:35:48 +00004407 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4408 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4409 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004410 SizeType = UnsignedLong;
4411 else
4412 SizeType = UnsignedInt;
4413
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004414 switch (T.getOS()) {
4415 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004416 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004417 break;
4418 case llvm::Triple::Win32:
4419 WCharType = UnsignedShort;
4420 break;
4421 case llvm::Triple::Linux:
4422 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004423 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4424 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004425 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004426 }
4427
4428 UseBitFieldTypeAlignment = true;
4429
4430 ZeroLengthBitfieldBoundary = 0;
4431
Tim Northover147cd2f2014-10-14 22:12:21 +00004432 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4433 // so set preferred for small types to 32.
4434 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004435 resetDataLayout(BigEndian
4436 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4437 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004438 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004439 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004440 resetDataLayout("e"
4441 "-m:w"
4442 "-p:32:32"
4443 "-i64:64"
4444 "-v128:64:128"
4445 "-a:0:32"
4446 "-n32"
4447 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004448 } else if (T.isOSNaCl()) {
4449 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004450 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004451 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004452 resetDataLayout(BigEndian
4453 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4454 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004455 }
4456
4457 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004458 }
4459
Tim Northover5627d392015-10-30 16:30:45 +00004460 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004461 const llvm::Triple &T = getTriple();
4462
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004463 IsAAPCS = false;
4464
Tim Northover5627d392015-10-30 16:30:45 +00004465 if (IsAAPCS16)
4466 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4467 else
4468 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004469
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004470 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004471 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004472 SizeType = UnsignedInt;
4473 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004474 SizeType = UnsignedLong;
4475
4476 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4477 WCharType = SignedInt;
4478
4479 // Do not respect the alignment of bit-field types when laying out
4480 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4481 UseBitFieldTypeAlignment = false;
4482
4483 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4484 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4485 /// gcc.
4486 ZeroLengthBitfieldBoundary = 32;
4487
Tim Northover5627d392015-10-30 16:30:45 +00004488 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4489 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004490 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004491 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004492 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004493 BigEndian
4494 ? "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 +00004495 : "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 +00004496 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004497 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004498 BigEndian
4499 ? "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 +00004500 : "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 +00004501
4502 // FIXME: Override "preferred align" for double and long long.
4503 }
4504
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004505 void setArchInfo() {
4506 StringRef ArchName = getTriple().getArchName();
4507
Renato Goline84b0002015-10-08 16:43:26 +00004508 ArchISA = llvm::ARM::parseArchISA(ArchName);
4509 CPU = llvm::ARM::getDefaultCPU(ArchName);
4510 unsigned AK = llvm::ARM::parseArch(ArchName);
4511 if (AK != llvm::ARM::AK_INVALID)
4512 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004513 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004514 }
4515
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004516 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004517 StringRef SubArch;
4518
4519 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004520 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004521 SubArch = llvm::ARM::getSubArch(ArchKind);
4522 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4523 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004524
4525 // cache CPU related strings
4526 CPUAttr = getCPUAttr();
4527 CPUProfile = getCPUProfile();
4528 }
4529
4530 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004531 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004532 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004533 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004534 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4535 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004536 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004537 if (ArchProfile == llvm::ARM::PK_M) {
4538 MaxAtomicPromoteWidth = 32;
4539 if (ShouldUseInlineAtomic)
4540 MaxAtomicInlineWidth = 32;
4541 }
4542 else {
4543 MaxAtomicPromoteWidth = 64;
4544 if (ShouldUseInlineAtomic)
4545 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004546 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004547 }
4548
4549 bool isThumb() const {
4550 return (ArchISA == llvm::ARM::IK_THUMB);
4551 }
4552
4553 bool supportsThumb() const {
4554 return CPUAttr.count('T') || ArchVersion >= 6;
4555 }
4556
4557 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004558 return CPUAttr.equals("6T2") ||
4559 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004560 }
4561
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004562 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004563 // For most sub-arches, the build attribute CPU name is enough.
4564 // For Cortex variants, it's slightly different.
4565 switch(ArchKind) {
4566 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004567 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004568 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004569 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004570 case llvm::ARM::AK_ARMV7S:
4571 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004572 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004573 return "7A";
4574 case llvm::ARM::AK_ARMV7R:
4575 return "7R";
4576 case llvm::ARM::AK_ARMV7M:
4577 return "7M";
4578 case llvm::ARM::AK_ARMV7EM:
4579 return "7EM";
4580 case llvm::ARM::AK_ARMV8A:
4581 return "8A";
4582 case llvm::ARM::AK_ARMV8_1A:
4583 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004584 case llvm::ARM::AK_ARMV8_2A:
4585 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004586 case llvm::ARM::AK_ARMV8MBaseline:
4587 return "8M_BASE";
4588 case llvm::ARM::AK_ARMV8MMainline:
4589 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004590 }
4591 }
4592
4593 StringRef getCPUProfile() const {
4594 switch(ArchProfile) {
4595 case llvm::ARM::PK_A:
4596 return "A";
4597 case llvm::ARM::PK_R:
4598 return "R";
4599 case llvm::ARM::PK_M:
4600 return "M";
4601 default:
4602 return "";
4603 }
4604 }
4605
Chris Lattner17df24e2008-04-21 18:56:49 +00004606public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004607 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4608 bool IsBigEndian)
4609 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4610 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004611 BigEndian = IsBigEndian;
4612
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004613 switch (getTriple().getOS()) {
4614 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004615 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004616 break;
4617 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004618 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004619 break;
4620 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004621
Renato Goline84b0002015-10-08 16:43:26 +00004622 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004623 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004624
Chris Lattner1a8f3942010-04-23 16:29:58 +00004625 // {} in inline assembly are neon specifiers, not assembly variant
4626 // specifiers.
4627 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004628
Eric Christopher0e261882014-12-05 01:06:59 +00004629 // FIXME: This duplicates code from the driver that sets the -target-abi
4630 // option - this code is used if -target-abi isn't passed and should
4631 // be unified in some way.
4632 if (Triple.isOSBinFormatMachO()) {
4633 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4634 // the frontend matches that.
4635 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4636 Triple.getOS() == llvm::Triple::UnknownOS ||
4637 StringRef(CPU).startswith("cortex-m")) {
4638 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004639 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004640 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004641 } else {
4642 setABI("apcs-gnu");
4643 }
4644 } else if (Triple.isOSWindows()) {
4645 // FIXME: this is invalid for WindowsCE
4646 setABI("aapcs");
4647 } else {
4648 // Select the default based on the platform.
4649 switch (Triple.getEnvironment()) {
4650 case llvm::Triple::Android:
4651 case llvm::Triple::GNUEABI:
4652 case llvm::Triple::GNUEABIHF:
4653 setABI("aapcs-linux");
4654 break;
4655 case llvm::Triple::EABIHF:
4656 case llvm::Triple::EABI:
4657 setABI("aapcs");
4658 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004659 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004660 setABI("apcs-gnu");
4661 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004662 default:
4663 if (Triple.getOS() == llvm::Triple::NetBSD)
4664 setABI("apcs-gnu");
4665 else
4666 setABI("aapcs");
4667 break;
4668 }
4669 }
John McCall86353412010-08-21 22:46:04 +00004670
4671 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004672 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004673
Renato Golin15b86152015-07-03 16:41:13 +00004674 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004675 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004676
James Molloya7139222012-03-12 09:14:10 +00004677 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004678 // the alignment of the zero-length bitfield is greater than the member
4679 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004680 // zero length bitfield.
4681 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004682
4683 if (Triple.getOS() == llvm::Triple::Linux ||
4684 Triple.getOS() == llvm::Triple::UnknownOS)
4685 this->MCountName =
4686 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004687 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004688
Alp Toker4925ba72014-06-07 23:30:42 +00004689 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004690
Craig Topper3164f332014-03-11 03:39:26 +00004691 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004692 ABI = Name;
4693
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004694 // The defaults (above) are for AAPCS, check if we need to change them.
4695 //
4696 // FIXME: We need support for -meabi... we could just mangle it into the
4697 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004698 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004699 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004700 return true;
4701 }
4702 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4703 setABIAAPCS();
4704 return true;
4705 }
4706 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004707 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004708
Renato Golinf5c4dec2015-05-27 13:33:00 +00004709 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004710 bool
4711 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4712 StringRef CPU,
4713 const std::vector<std::string> &FeaturesVec) const override {
4714
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004715 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004716 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004717
4718 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004719 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004720 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4721
4722 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004723 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004724 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4725
4726 for (const char *Feature : TargetFeatures)
4727 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004728 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004729
Eric Christopher007b0a02015-08-28 22:32:01 +00004730 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004731 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004732
Craig Topper3164f332014-03-11 03:39:26 +00004733 bool handleTargetFeatures(std::vector<std::string> &Features,
4734 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004735 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004736 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004737 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004738 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004739 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004740 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004741 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004742
Ranjeet Singhac08e532015-06-24 23:39:25 +00004743 // This does not diagnose illegal cases like having both
4744 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4745 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004746 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004747 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004748 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004749 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004750 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004751 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004752 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004753 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004754 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004755 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004756 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004757 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004758 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004759 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004760 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004761 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004762 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004763 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004764 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004765 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004766 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004767 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004768 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004769 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004770 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004771 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004772 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004773 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004774 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004775 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004776 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004777 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004778 } else if (Feature == "+strict-align") {
4779 Unaligned = 0;
4780 } else if (Feature == "+fp16") {
4781 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004782 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004783 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004784 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004785
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004786 switch (ArchVersion) {
4787 case 6:
4788 if (ArchProfile == llvm::ARM::PK_M)
4789 LDREX = 0;
4790 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4791 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4792 else
4793 LDREX = LDREX_W;
4794 break;
4795 case 7:
4796 if (ArchProfile == llvm::ARM::PK_M)
4797 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4798 else
4799 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4800 break;
4801 case 8:
4802 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4803 }
4804
Rafael Espindolaeb265472013-08-21 21:59:03 +00004805 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4806 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4807 return false;
4808 }
4809
4810 if (FPMath == FP_Neon)
4811 Features.push_back("+neonfp");
4812 else if (FPMath == FP_VFP)
4813 Features.push_back("-neonfp");
4814
Daniel Dunbar893d4752009-12-19 04:15:38 +00004815 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004816 auto Feature =
4817 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4818 if (Feature != Features.end())
4819 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004820
Rafael Espindolaeb265472013-08-21 21:59:03 +00004821 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004822 }
4823
Craig Topper3164f332014-03-11 03:39:26 +00004824 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004825 return llvm::StringSwitch<bool>(Feature)
4826 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004827 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004828 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004829 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004830 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004831 .Case("hwdiv", HWDiv & HWDivThumb)
4832 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004833 .Default(false);
4834 }
Renato Golin15b86152015-07-03 16:41:13 +00004835
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004836 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004837 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004838 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004839
Renato Golin15b86152015-07-03 16:41:13 +00004840 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004841 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004842 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004843 CPU = Name;
4844 return true;
4845 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004846
Craig Topper3164f332014-03-11 03:39:26 +00004847 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004848
Craig Topper3164f332014-03-11 03:39:26 +00004849 void getTargetDefines(const LangOptions &Opts,
4850 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004851 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004852 Builder.defineMacro("__arm");
4853 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00004854 // For bare-metal none-eabi.
4855 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
4856 getTriple().getEnvironment() == llvm::Triple::EABI)
4857 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004858
Chris Lattnerecd49032009-03-02 22:27:17 +00004859 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004860 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004861
4862 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4863 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004864 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004865 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4866
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004867 if (!CPUAttr.empty())
4868 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004869
4870 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004871 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004872 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004873
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004874 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004875 // ACLE 6.5.7 Crypto Extension
4876 if (Crypto)
4877 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4878 // ACLE 6.5.8 CRC32 Extension
4879 if (CRC)
4880 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4881 // ACLE 6.5.10 Numeric Maximum and Minimum
4882 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4883 // ACLE 6.5.9 Directed Rounding
4884 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004885 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004886
4887 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4888 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00004889 // NOTE that the default profile is assumed to be 'A'
4890 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004891 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4892
Bradley Smithf4affc12016-03-03 13:52:22 +00004893 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
4894 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
4895 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
4896 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004897 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004898 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004899 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004900 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4901
4902 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4903 // instruction set such as ARM or Thumb.
4904 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4905
4906 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4907
4908 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004909 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004910 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004911
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004912 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004913 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004914 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004915
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004916 // ACLE 6.4.4 LDREX/STREX
4917 if (LDREX)
4918 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4919
4920 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004921 if (ArchVersion == 5 ||
4922 (ArchVersion == 6 && CPUProfile != "M") ||
4923 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004924 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4925
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004926 // ACLE 6.5.1 Hardware Floating Point
4927 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004928 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004929
Yi Konga44c4d72014-06-27 21:25:42 +00004930 // ACLE predefines.
4931 Builder.defineMacro("__ARM_ACLE", "200");
4932
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004933 // FP16 support (we currently only support IEEE format).
4934 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4935 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4936
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004937 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00004938 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004939 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4940
Mike Stump9d54bd72009-04-08 02:07:04 +00004941 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004942
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004943 // FIXME: It's more complicated than this and we don't really support
4944 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004945 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004946 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004947 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004948
David Tweed8f676532012-10-25 13:33:01 +00004949 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004950 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004951 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4952 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004953 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004954 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004955 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004956
Tim Northover28fc0e12016-04-28 13:59:55 +00004957 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
4958 ABI == "aapcs16")
4959 Builder.defineMacro("__ARM_PCS_VFP", "1");
4960
Daniel Dunbar893d4752009-12-19 04:15:38 +00004961 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004962 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004963
4964 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004965 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004966
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004967 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004968 Builder.defineMacro("__THUMBEL__");
4969 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004970 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004971 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004972 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004973
4974 // ACLE 6.4.9 32-bit SIMD instructions
4975 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4976 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4977
4978 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004979 if (((HWDiv & HWDivThumb) && isThumb()) ||
4980 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004981 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004982 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004983 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004984
4985 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004986 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004987
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004988 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004989 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004990 if (FPU & VFP2FPU)
4991 Builder.defineMacro("__ARM_VFPV2__");
4992 if (FPU & VFP3FPU)
4993 Builder.defineMacro("__ARM_VFPV3__");
4994 if (FPU & VFP4FPU)
4995 Builder.defineMacro("__ARM_VFPV4__");
4996 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004997
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004998 // This only gets set when Neon instructions are actually available, unlike
4999 // the VFP define, hence the soft float and arch check. This is subtly
5000 // different from gcc, we follow the intent which was that it should be set
5001 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005002 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005003 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005004 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005005 // current AArch32 NEON implementations do not support double-precision
5006 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005007 Builder.defineMacro("__ARM_NEON_FP",
5008 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005009 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005010
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005011 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5012 Opts.ShortWChar ? "2" : "4");
5013
5014 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5015 Opts.ShortEnums ? "1" : "4");
5016
Bradley Smithf4affc12016-03-03 13:52:22 +00005017 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005018 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5019 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5020 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5021 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5022 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005023
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005024 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005025 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005026 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005027 }
5028
5029 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005030 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005031 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5032 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005033 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005034 }
5035
5036 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005037 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005038 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005039
5040 if (Opts.UnsafeFPMath)
5041 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005042
5043 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5044 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005045 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005046
Craig Topper6c03a542015-10-19 04:51:35 +00005047 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5048 return llvm::makeArrayRef(BuiltinInfo,
5049 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005050 }
Craig Topper3164f332014-03-11 03:39:26 +00005051 bool isCLZForZeroUndef() const override { return false; }
5052 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005053 return IsAAPCS
5054 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005055 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5056 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005057 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005058 ArrayRef<const char *> getGCCRegNames() const override;
5059 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005060 bool validateAsmConstraint(const char *&Name,
5061 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005062 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005063 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005064 case 'l': // r0-r7
5065 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005066 case 't': // VFP Floating point register single precision
5067 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005068 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005069 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005070 case 'I':
5071 case 'J':
5072 case 'K':
5073 case 'L':
5074 case 'M':
5075 // FIXME
5076 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005077 case 'Q': // A memory address that is a single base register.
5078 Info.setAllowsMemory();
5079 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005080 case 'U': // a memory reference...
5081 switch (Name[1]) {
5082 case 'q': // ...ARMV4 ldrsb
5083 case 'v': // ...VFP load/store (reg+constant offset)
5084 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005085 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005086 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005087 case 'n': // valid address for Neon doubleword vector load/store
5088 case 'm': // valid address for Neon element and structure load/store
5089 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005090 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005091 Info.setAllowsMemory();
5092 Name++;
5093 return true;
5094 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005095 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005096 return false;
5097 }
Craig Topper3164f332014-03-11 03:39:26 +00005098 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005099 std::string R;
5100 switch (*Constraint) {
5101 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005102 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005103 Constraint++;
5104 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005105 case 'p': // 'p' should be translated to 'r' by default.
5106 R = std::string("r");
5107 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005108 default:
5109 return std::string(1, *Constraint);
5110 }
5111 return R;
5112 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005113 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005114 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005115 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005116 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005117 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005118
Bill Wendling9d1ee112012-10-25 23:28:48 +00005119 // Strip off constraint modifiers.
5120 while (Constraint[0] == '=' ||
5121 Constraint[0] == '+' ||
5122 Constraint[0] == '&')
5123 Constraint = Constraint.substr(1);
5124
5125 switch (Constraint[0]) {
5126 default: break;
5127 case 'r': {
5128 switch (Modifier) {
5129 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005130 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005131 case 'q':
5132 // A register of size 32 cannot fit a vector type.
5133 return false;
5134 }
5135 }
5136 }
5137
5138 return true;
5139 }
Craig Topper3164f332014-03-11 03:39:26 +00005140 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005141 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005142 return "";
5143 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005144
Craig Topper3164f332014-03-11 03:39:26 +00005145 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005146 switch (CC) {
5147 case CC_AAPCS:
5148 case CC_AAPCS_VFP:
5149 case CC_Swift:
5150 return CCCR_OK;
5151 default:
5152 return CCCR_Warning;
5153 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005154 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005155
Craig Topper3164f332014-03-11 03:39:26 +00005156 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005157 if (RegNo == 0) return 0;
5158 if (RegNo == 1) return 1;
5159 return -1;
5160 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005161
5162 bool hasSjLjLowering() const override {
5163 return true;
5164 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005165};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005166
Rafael Espindolaeb265472013-08-21 21:59:03 +00005167bool ARMTargetInfo::setFPMath(StringRef Name) {
5168 if (Name == "neon") {
5169 FPMath = FP_Neon;
5170 return true;
5171 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5172 Name == "vfp4") {
5173 FPMath = FP_VFP;
5174 return true;
5175 }
5176 return false;
5177}
5178
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005179const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005180 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005181 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005182 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5183
5184 // Float registers
5185 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5186 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5187 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005188 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005189
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005190 // Double registers
5191 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5192 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005193 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5194 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005195
5196 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005197 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5198 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005199};
5200
Craig Topperf054e3a2015-10-19 03:52:27 +00005201ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5202 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005203}
5204
5205const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005206 { { "a1" }, "r0" },
5207 { { "a2" }, "r1" },
5208 { { "a3" }, "r2" },
5209 { { "a4" }, "r3" },
5210 { { "v1" }, "r4" },
5211 { { "v2" }, "r5" },
5212 { { "v3" }, "r6" },
5213 { { "v4" }, "r7" },
5214 { { "v5" }, "r8" },
5215 { { "v6", "rfp" }, "r9" },
5216 { { "sl" }, "r10" },
5217 { { "fp" }, "r11" },
5218 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005219 { { "r13" }, "sp" },
5220 { { "r14" }, "lr" },
5221 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005222 // The S, D and Q registers overlap, but aren't really aliases; we
5223 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005224};
5225
Craig Topperf054e3a2015-10-19 03:52:27 +00005226ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5227 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005228}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005229
5230const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005231#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005232 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005233#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5234 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005235#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005236
Craig Topper07d3b622015-08-07 05:14:44 +00005237#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005238 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005239#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005240 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005241#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5242 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005243#include "clang/Basic/BuiltinsARM.def"
5244};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005245
5246class ARMleTargetInfo : public ARMTargetInfo {
5247public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005248 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5249 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005250 void getTargetDefines(const LangOptions &Opts,
5251 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005252 Builder.defineMacro("__ARMEL__");
5253 ARMTargetInfo::getTargetDefines(Opts, Builder);
5254 }
5255};
5256
5257class ARMbeTargetInfo : public ARMTargetInfo {
5258public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005259 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5260 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005261 void getTargetDefines(const LangOptions &Opts,
5262 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005263 Builder.defineMacro("__ARMEB__");
5264 Builder.defineMacro("__ARM_BIG_ENDIAN");
5265 ARMTargetInfo::getTargetDefines(Opts, Builder);
5266 }
5267};
Chris Lattner17df24e2008-04-21 18:56:49 +00005268
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005269class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5270 const llvm::Triple Triple;
5271public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005272 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5273 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005274 WCharType = UnsignedShort;
5275 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005276 }
5277 void getVisualStudioDefines(const LangOptions &Opts,
5278 MacroBuilder &Builder) const {
5279 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5280
5281 // FIXME: this is invalid for WindowsCE
5282 Builder.defineMacro("_M_ARM_NT", "1");
5283 Builder.defineMacro("_M_ARMT", "_M_ARM");
5284 Builder.defineMacro("_M_THUMB", "_M_ARM");
5285
5286 assert((Triple.getArch() == llvm::Triple::arm ||
5287 Triple.getArch() == llvm::Triple::thumb) &&
5288 "invalid architecture for Windows ARM target info");
5289 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5290 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5291
5292 // TODO map the complete set of values
5293 // 31: VFPv3 40: VFPv4
5294 Builder.defineMacro("_M_ARM_FP", "31");
5295 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005296 BuiltinVaListKind getBuiltinVaListKind() const override {
5297 return TargetInfo::CharPtrBuiltinVaList;
5298 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005299 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5300 switch (CC) {
5301 case CC_X86StdCall:
5302 case CC_X86ThisCall:
5303 case CC_X86FastCall:
5304 case CC_X86VectorCall:
5305 return CCCR_Ignore;
5306 case CC_C:
5307 return CCCR_OK;
5308 default:
5309 return CCCR_Warning;
5310 }
5311 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005312};
5313
5314// Windows ARM + Itanium C++ ABI Target
5315class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5316public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005317 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5318 const TargetOptions &Opts)
5319 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005320 TheCXXABI.set(TargetCXXABI::GenericARM);
5321 }
5322
5323 void getTargetDefines(const LangOptions &Opts,
5324 MacroBuilder &Builder) const override {
5325 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5326
5327 if (Opts.MSVCCompat)
5328 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5329 }
5330};
5331
5332// Windows ARM, MS (C++) ABI
5333class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5334public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005335 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5336 const TargetOptions &Opts)
5337 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005338 TheCXXABI.set(TargetCXXABI::Microsoft);
5339 }
5340
5341 void getTargetDefines(const LangOptions &Opts,
5342 MacroBuilder &Builder) const override {
5343 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5344 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5345 }
5346};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005347
Yaron Keren321249c2015-07-15 13:32:23 +00005348// ARM MinGW target
5349class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5350public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005351 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5352 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005353 TheCXXABI.set(TargetCXXABI::GenericARM);
5354 }
5355
5356 void getTargetDefines(const LangOptions &Opts,
5357 MacroBuilder &Builder) const override {
5358 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5359 DefineStd(Builder, "WIN32", Opts);
5360 DefineStd(Builder, "WINNT", Opts);
5361 Builder.defineMacro("_ARM_");
5362 addMinGWDefines(Opts, Builder);
5363 }
5364};
5365
5366// ARM Cygwin target
5367class CygwinARMTargetInfo : public ARMleTargetInfo {
5368public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005369 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5370 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005371 TLSSupported = false;
5372 WCharType = UnsignedShort;
5373 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005374 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005375 }
5376 void getTargetDefines(const LangOptions &Opts,
5377 MacroBuilder &Builder) const override {
5378 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5379 Builder.defineMacro("_ARM_");
5380 Builder.defineMacro("__CYGWIN__");
5381 Builder.defineMacro("__CYGWIN32__");
5382 DefineStd(Builder, "unix", Opts);
5383 if (Opts.CPlusPlus)
5384 Builder.defineMacro("_GNU_SOURCE");
5385 }
5386};
5387
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005388class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005389protected:
Craig Topper3164f332014-03-11 03:39:26 +00005390 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5391 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005392 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005393 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005394
Torok Edwinb2b37c62009-06-30 17:10:35 +00005395public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005396 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5397 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005398 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005399 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005400 // FIXME: This should be based off of the target features in
5401 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005402 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005403
Tim Northoverd88ecb32016-01-27 19:32:40 +00005404 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005405 // Darwin on iOS uses a variant of the ARM C++ ABI.
5406 TheCXXABI.set(TargetCXXABI::WatchOS);
5407
5408 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5409 // size_t is long, it's a bit weird for it to be int.
5410 PtrDiffType = SignedLong;
5411
5412 // BOOL should be a real boolean on the new ABI
5413 UseSignedCharForObjCBool = false;
5414 } else
5415 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005416 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005417};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005418
Tim Northover573cbee2014-05-24 12:52:07 +00005419class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005420 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005421 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5422 static const char *const GCCRegNames[];
5423
James Molloy75f5f9e2014-04-16 15:33:48 +00005424 enum FPUModeEnum {
5425 FPUMode,
5426 NeonMode
5427 };
5428
5429 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005430 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005431 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005432 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005433 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005434
Tim Northovera2ee4332014-03-29 15:09:45 +00005435 static const Builtin::Info BuiltinInfo[];
5436
5437 std::string ABI;
5438
5439public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005440 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005441 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005442 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5443 WCharType = SignedInt;
5444
5445 // NetBSD apparently prefers consistency across ARM targets to consistency
5446 // across 64-bit targets.
5447 Int64Type = SignedLongLong;
5448 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005449 } else {
5450 WCharType = UnsignedInt;
5451 Int64Type = SignedLong;
5452 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005453 }
5454
Tim Northovera2ee4332014-03-29 15:09:45 +00005455 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005456 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005457 MaxAtomicInlineWidth = 128;
5458 MaxAtomicPromoteWidth = 128;
5459
Tim Northovera6a19f12015-02-06 01:25:07 +00005460 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005461 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5462
Tim Northovera2ee4332014-03-29 15:09:45 +00005463 // {} in inline assembly are neon specifiers, not assembly variant
5464 // specifiers.
5465 NoAsmVariants = true;
5466
Tim Northover7ad87af2015-01-16 18:44:04 +00005467 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5468 // contributes to the alignment of the containing aggregate in the same way
5469 // a plain (non bit-field) member of that type would, without exception for
5470 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005471 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005472 UseZeroLengthBitfieldAlignment = true;
5473
Tim Northover573cbee2014-05-24 12:52:07 +00005474 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005475 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005476
5477 if (Triple.getOS() == llvm::Triple::Linux ||
5478 Triple.getOS() == llvm::Triple::UnknownOS)
5479 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005480 }
5481
Alp Toker4925ba72014-06-07 23:30:42 +00005482 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005483 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005484 if (Name != "aapcs" && Name != "darwinpcs")
5485 return false;
5486
5487 ABI = Name;
5488 return true;
5489 }
5490
David Blaikie1cbb9712014-11-14 19:09:44 +00005491 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005492 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005493 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005494 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5495 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005496 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005497 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005498 .Default(false);
5499 return CPUKnown;
5500 }
5501
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005502 void getTargetDefines(const LangOptions &Opts,
5503 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005504 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005505 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005506
5507 // Target properties.
5508 Builder.defineMacro("_LP64");
5509 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005510
5511 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5512 Builder.defineMacro("__ARM_ACLE", "200");
5513 Builder.defineMacro("__ARM_ARCH", "8");
5514 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5515
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005516 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005517 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005518 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005519
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005520 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5521 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5522 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5523 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005524 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005525 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5526 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005527
5528 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5529
5530 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005531 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005532
5533 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5534 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005535 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5536 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005537
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005538 if (Opts.UnsafeFPMath)
5539 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005540
5541 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5542
5543 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5544 Opts.ShortEnums ? "1" : "4");
5545
James Molloy75f5f9e2014-04-16 15:33:48 +00005546 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005547 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005548 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005549 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005550 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005551
Bradley Smith418c5932014-05-02 15:17:51 +00005552 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005553 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005554
James Molloy75f5f9e2014-04-16 15:33:48 +00005555 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005556 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5557
5558 if (Unaligned)
5559 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005560
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005561 if (V8_1A)
5562 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5563
Reid Klecknerd167d422015-05-06 15:31:46 +00005564 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5565 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5566 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5567 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5568 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005569 }
5570
Craig Topper6c03a542015-10-19 04:51:35 +00005571 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5572 return llvm::makeArrayRef(BuiltinInfo,
5573 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005574 }
5575
David Blaikie1cbb9712014-11-14 19:09:44 +00005576 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005577 return Feature == "aarch64" ||
5578 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005579 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005580 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005581 }
5582
James Molloy5e73df52014-04-16 15:06:20 +00005583 bool handleTargetFeatures(std::vector<std::string> &Features,
5584 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005585 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005586 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005587 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005588 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005589 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005590
Eric Christopher610fe112015-08-26 08:21:55 +00005591 for (const auto &Feature : Features) {
5592 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005593 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005594 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005595 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005596 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005597 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005598 if (Feature == "+strict-align")
5599 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005600 if (Feature == "+v8.1a")
5601 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005602 }
5603
James Y Knightb214cbc2016-03-04 19:00:41 +00005604 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005605
5606 return true;
5607 }
5608
John McCall477f2bb2016-03-03 06:39:32 +00005609 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5610 switch (CC) {
5611 case CC_C:
5612 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005613 case CC_PreserveMost:
5614 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005615 return CCCR_OK;
5616 default:
5617 return CCCR_Warning;
5618 }
5619 }
5620
David Blaikie1cbb9712014-11-14 19:09:44 +00005621 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005622
David Blaikie1cbb9712014-11-14 19:09:44 +00005623 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005624 return TargetInfo::AArch64ABIBuiltinVaList;
5625 }
5626
Craig Topperf054e3a2015-10-19 03:52:27 +00005627 ArrayRef<const char *> getGCCRegNames() const override;
5628 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005629
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005630 bool validateAsmConstraint(const char *&Name,
5631 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005632 switch (*Name) {
5633 default:
5634 return false;
5635 case 'w': // Floating point and SIMD registers (V0-V31)
5636 Info.setAllowsRegister();
5637 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005638 case 'I': // Constant that can be used with an ADD instruction
5639 case 'J': // Constant that can be used with a SUB instruction
5640 case 'K': // Constant that can be used with a 32-bit logical instruction
5641 case 'L': // Constant that can be used with a 64-bit logical instruction
5642 case 'M': // Constant that can be used as a 32-bit MOV immediate
5643 case 'N': // Constant that can be used as a 64-bit MOV immediate
5644 case 'Y': // Floating point constant zero
5645 case 'Z': // Integer constant zero
5646 return true;
5647 case 'Q': // A memory reference with base register and no offset
5648 Info.setAllowsMemory();
5649 return true;
5650 case 'S': // A symbolic address
5651 Info.setAllowsRegister();
5652 return true;
5653 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005654 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5655 // Utf: A memory address suitable for ldp/stp in TF mode.
5656 // Usa: An absolute symbolic address.
5657 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5658 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005659 case 'z': // Zero register, wzr or xzr
5660 Info.setAllowsRegister();
5661 return true;
5662 case 'x': // Floating point and SIMD registers (V0-V15)
5663 Info.setAllowsRegister();
5664 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005665 }
5666 return false;
5667 }
5668
Akira Hatanaka987f1862014-08-22 06:05:21 +00005669 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005670 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005671 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005672 // Strip off constraint modifiers.
5673 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5674 Constraint = Constraint.substr(1);
5675
5676 switch (Constraint[0]) {
5677 default:
5678 return true;
5679 case 'z':
5680 case 'r': {
5681 switch (Modifier) {
5682 case 'x':
5683 case 'w':
5684 // For now assume that the person knows what they're
5685 // doing with the modifier.
5686 return true;
5687 default:
5688 // By default an 'r' constraint will be in the 'x'
5689 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005690 if (Size == 64)
5691 return true;
5692
5693 SuggestedModifier = "w";
5694 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005695 }
5696 }
5697 }
5698 }
5699
David Blaikie1cbb9712014-11-14 19:09:44 +00005700 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005701
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005702 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005703 if (RegNo == 0)
5704 return 0;
5705 if (RegNo == 1)
5706 return 1;
5707 return -1;
5708 }
5709};
5710
Tim Northover573cbee2014-05-24 12:52:07 +00005711const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005712 // 32-bit Integer registers
5713 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5714 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5715 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5716
5717 // 64-bit Integer registers
5718 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5719 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5720 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5721
5722 // 32-bit floating point regsisters
5723 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5724 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5725 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5726
5727 // 64-bit floating point regsisters
5728 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5729 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5730 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5731
5732 // Vector registers
5733 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5734 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5735 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5736};
5737
Craig Topperf054e3a2015-10-19 03:52:27 +00005738ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5739 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005740}
5741
Tim Northover573cbee2014-05-24 12:52:07 +00005742const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005743 { { "w31" }, "wsp" },
5744 { { "x29" }, "fp" },
5745 { { "x30" }, "lr" },
5746 { { "x31" }, "sp" },
5747 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5748 // don't want to substitute one of these for a different-sized one.
5749};
5750
Craig Topperf054e3a2015-10-19 03:52:27 +00005751ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5752 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005753}
5754
Tim Northover573cbee2014-05-24 12:52:07 +00005755const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005756#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005757 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005758#include "clang/Basic/BuiltinsNEON.def"
5759
5760#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005761 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005762#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005763};
James Molloy5e73df52014-04-16 15:06:20 +00005764
Tim Northover573cbee2014-05-24 12:52:07 +00005765class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005766 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005767 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005768 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005769 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005770 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005771 }
5772
5773public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005774 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5775 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00005776 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005777 }
James Molloy5e73df52014-04-16 15:06:20 +00005778 void getTargetDefines(const LangOptions &Opts,
5779 MacroBuilder &Builder) const override {
5780 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005781 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005782 }
5783};
5784
Tim Northover573cbee2014-05-24 12:52:07 +00005785class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005786 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005787 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005788 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005789 }
5790
5791public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005792 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5793 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00005794 void getTargetDefines(const LangOptions &Opts,
5795 MacroBuilder &Builder) const override {
5796 Builder.defineMacro("__AARCH64EB__");
5797 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5798 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005799 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005800 }
5801};
Tim Northovera2ee4332014-03-29 15:09:45 +00005802
Tim Northover573cbee2014-05-24 12:52:07 +00005803class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005804protected:
5805 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5806 MacroBuilder &Builder) const override {
5807 Builder.defineMacro("__AARCH64_SIMD__");
5808 Builder.defineMacro("__ARM64_ARCH_8__");
5809 Builder.defineMacro("__ARM_NEON__");
5810 Builder.defineMacro("__LITTLE_ENDIAN__");
5811 Builder.defineMacro("__REGISTER_PREFIX__", "");
5812 Builder.defineMacro("__arm64", "1");
5813 Builder.defineMacro("__arm64__", "1");
5814
5815 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5816 }
5817
Tim Northovera2ee4332014-03-29 15:09:45 +00005818public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005819 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5820 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005821 Int64Type = SignedLongLong;
5822 WCharType = SignedInt;
5823 UseSignedCharForObjCBool = false;
5824
Tim Northovera6a19f12015-02-06 01:25:07 +00005825 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005826 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5827
5828 TheCXXABI.set(TargetCXXABI::iOS64);
5829 }
5830
David Blaikie1cbb9712014-11-14 19:09:44 +00005831 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005832 return TargetInfo::CharPtrBuiltinVaList;
5833 }
5834};
Tim Northovera2ee4332014-03-29 15:09:45 +00005835
Tony Linthicum76329bf2011-12-12 21:14:55 +00005836// Hexagon abstract base class
5837class HexagonTargetInfo : public TargetInfo {
5838 static const Builtin::Info BuiltinInfo[];
5839 static const char * const GCCRegNames[];
5840 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5841 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005842 bool HasHVX, HasHVXDouble;
5843
Tony Linthicum76329bf2011-12-12 21:14:55 +00005844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005845 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
5846 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005847 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005848 // Specify the vector alignment explicitly. For v512x1, the calculated
5849 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5850 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005851 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005852 "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 +00005853 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005854 SizeType = UnsignedInt;
5855 PtrDiffType = SignedInt;
5856 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005857
5858 // {} in inline assembly are packet specifiers, not assembly variant
5859 // specifiers.
5860 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005861
5862 LargeArrayMinWidth = 64;
5863 LargeArrayAlign = 64;
5864 UseBitFieldTypeAlignment = true;
5865 ZeroLengthBitfieldBoundary = 32;
5866 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005867 }
5868
Craig Topper6c03a542015-10-19 04:51:35 +00005869 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5870 return llvm::makeArrayRef(BuiltinInfo,
5871 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005872 }
5873
Craig Topper3164f332014-03-11 03:39:26 +00005874 bool validateAsmConstraint(const char *&Name,
5875 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005876 return true;
5877 }
5878
Craig Topper3164f332014-03-11 03:39:26 +00005879 void getTargetDefines(const LangOptions &Opts,
5880 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005881
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005882 bool isCLZForZeroUndef() const override { return false; }
5883
Craig Topper3164f332014-03-11 03:39:26 +00005884 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005885 return llvm::StringSwitch<bool>(Feature)
5886 .Case("hexagon", true)
5887 .Case("hvx", HasHVX)
5888 .Case("hvx-double", HasHVXDouble)
5889 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005890 }
Craig Topper3164f332014-03-11 03:39:26 +00005891
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005892 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5893 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5894 const override;
5895
5896 bool handleTargetFeatures(std::vector<std::string> &Features,
5897 DiagnosticsEngine &Diags) override;
5898
Craig Topper3164f332014-03-11 03:39:26 +00005899 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005900 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005901 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005902 ArrayRef<const char *> getGCCRegNames() const override;
5903 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005904 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005905 return "";
5906 }
Sebastian Pop86500282012-01-13 20:37:10 +00005907
5908 static const char *getHexagonCPUSuffix(StringRef Name) {
5909 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005910 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005911 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005912 .Case("hexagonv55", "55")
5913 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005914 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005915 }
5916
Craig Topper3164f332014-03-11 03:39:26 +00005917 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005918 if (!getHexagonCPUSuffix(Name))
5919 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005920 CPU = Name;
5921 return true;
5922 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005923
5924 int getEHDataRegisterNumber(unsigned RegNo) const override {
5925 return RegNo < 2 ? RegNo : -1;
5926 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005927};
5928
5929void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005930 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005931 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005932 Builder.defineMacro("__hexagon__", "1");
5933
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005934 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005935 Builder.defineMacro("__HEXAGON_V4__");
5936 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005937 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005938 Builder.defineMacro("__QDSP6_V4__");
5939 Builder.defineMacro("__QDSP6_ARCH__", "4");
5940 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005941 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005942 Builder.defineMacro("__HEXAGON_V5__");
5943 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5944 if(Opts.HexagonQdsp6Compat) {
5945 Builder.defineMacro("__QDSP6_V5__");
5946 Builder.defineMacro("__QDSP6_ARCH__", "5");
5947 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00005948 } else if (CPU == "hexagonv55") {
5949 Builder.defineMacro("__HEXAGON_V55__");
5950 Builder.defineMacro("__HEXAGON_ARCH__", "55");
5951 Builder.defineMacro("__QDSP6_V55__");
5952 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005953 } else if (CPU == "hexagonv60") {
5954 Builder.defineMacro("__HEXAGON_V60__");
5955 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5956 Builder.defineMacro("__QDSP6_V60__");
5957 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005958 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00005959
5960 if (hasFeature("hvx")) {
5961 Builder.defineMacro("__HVX__");
5962 if (hasFeature("hvx-double"))
5963 Builder.defineMacro("__HVXDBL__");
5964 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005965}
5966
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005967bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5968 DiagnosticsEngine &Diags) {
5969 for (auto &F : Features) {
5970 if (F == "+hvx")
5971 HasHVX = true;
5972 else if (F == "-hvx")
5973 HasHVX = HasHVXDouble = false;
5974 else if (F == "+hvx-double")
5975 HasHVX = HasHVXDouble = true;
5976 else if (F == "-hvx-double")
5977 HasHVXDouble = false;
5978 }
5979 return true;
5980}
5981
5982bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5983 DiagnosticsEngine &Diags, StringRef CPU,
5984 const std::vector<std::string> &FeaturesVec) const {
5985 // Default for v60: -hvx, -hvx-double.
5986 Features["hvx"] = false;
5987 Features["hvx-double"] = false;
5988
5989 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5990}
5991
5992
5993const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005994 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5995 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5996 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5997 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5998 "p0", "p1", "p2", "p3",
5999 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6000};
6001
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006002ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006003 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006004}
6005
Tony Linthicum76329bf2011-12-12 21:14:55 +00006006const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6007 { { "sp" }, "r29" },
6008 { { "fp" }, "r30" },
6009 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006010};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006011
Craig Topperf054e3a2015-10-19 03:52:27 +00006012ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6013 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006014}
6015
6016
6017const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006018#define BUILTIN(ID, TYPE, ATTRS) \
6019 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6020#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6021 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006022#include "clang/Basic/BuiltinsHexagon.def"
6023};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006024
Jacques Pienaard964cc22016-03-28 21:02:54 +00006025class LanaiTargetInfo : public TargetInfo {
6026 // Class for Lanai (32-bit).
6027 // The CPU profiles supported by the Lanai backend
6028 enum CPUKind {
6029 CK_NONE,
6030 CK_V11,
6031 } CPU;
6032
6033 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6034 static const char *const GCCRegNames[];
6035
6036public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006037 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6038 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006039 // Description string has to be kept in sync with backend.
6040 resetDataLayout("E" // Big endian
6041 "-m:e" // ELF name manging
6042 "-p:32:32" // 32 bit pointers, 32 bit aligned
6043 "-i64:64" // 64 bit integers, 64 bit aligned
6044 "-a:0:32" // 32 bit alignment of objects of aggregate type
6045 "-n32" // 32 bit native integer width
6046 "-S64" // 64 bit natural stack alignment
6047 );
6048
6049 // Setting RegParmMax equal to what mregparm was set to in the old
6050 // toolchain
6051 RegParmMax = 4;
6052
6053 // Set the default CPU to V11
6054 CPU = CK_V11;
6055
6056 // Temporary approach to make everything at least word-aligned and allow for
6057 // safely casting between pointers with different alignment requirements.
6058 // TODO: Remove this when there are no more cast align warnings on the
6059 // firmware.
6060 MinGlobalAlign = 32;
6061 }
6062
6063 void getTargetDefines(const LangOptions &Opts,
6064 MacroBuilder &Builder) const override {
6065 // Define __lanai__ when building for target lanai.
6066 Builder.defineMacro("__lanai__");
6067
6068 // Set define for the CPU specified.
6069 switch (CPU) {
6070 case CK_V11:
6071 Builder.defineMacro("__LANAI_V11__");
6072 break;
6073 case CK_NONE:
6074 llvm_unreachable("Unhandled target CPU");
6075 }
6076 }
6077
6078 bool setCPU(const std::string &Name) override {
6079 CPU = llvm::StringSwitch<CPUKind>(Name)
6080 .Case("v11", CK_V11)
6081 .Default(CK_NONE);
6082
6083 return CPU != CK_NONE;
6084 }
6085
6086 bool hasFeature(StringRef Feature) const override {
6087 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6088 }
6089
6090 ArrayRef<const char *> getGCCRegNames() const override;
6091
6092 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6093
6094 BuiltinVaListKind getBuiltinVaListKind() const override {
6095 return TargetInfo::VoidPtrBuiltinVaList;
6096 }
6097
6098 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6099
6100 bool validateAsmConstraint(const char *&Name,
6101 TargetInfo::ConstraintInfo &info) const override {
6102 return false;
6103 }
6104
6105 const char *getClobbers() const override { return ""; }
6106};
6107
6108const char *const LanaiTargetInfo::GCCRegNames[] = {
6109 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6110 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6111 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6112
6113ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6114 return llvm::makeArrayRef(GCCRegNames);
6115}
6116
6117const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6118 {{"pc"}, "r2"},
6119 {{"sp"}, "r4"},
6120 {{"fp"}, "r5"},
6121 {{"rv"}, "r8"},
6122 {{"rr1"}, "r10"},
6123 {{"rr2"}, "r11"},
6124 {{"rca"}, "r15"},
6125};
6126
6127ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6128 return llvm::makeArrayRef(GCCRegAliases);
6129}
6130
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006131// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6132class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006133 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6134 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006135 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006136public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006137 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006138 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006139
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006140 int getEHDataRegisterNumber(unsigned RegNo) const override {
6141 if (RegNo == 0) return 24;
6142 if (RegNo == 1) return 25;
6143 return -1;
6144 }
6145
Craig Topper3164f332014-03-11 03:39:26 +00006146 bool handleTargetFeatures(std::vector<std::string> &Features,
6147 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006148 // The backend doesn't actually handle soft float yet, but in case someone
6149 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006150 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6151 if (Feature != Features.end()) {
6152 SoftFloat = true;
6153 Features.erase(Feature);
6154 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006155 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006156 }
Craig Topper3164f332014-03-11 03:39:26 +00006157 void getTargetDefines(const LangOptions &Opts,
6158 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006159 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006160 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006161
6162 if (SoftFloat)
6163 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006164 }
Craig Topper3164f332014-03-11 03:39:26 +00006165
6166 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006167 return llvm::StringSwitch<bool>(Feature)
6168 .Case("softfloat", SoftFloat)
6169 .Case("sparc", true)
6170 .Default(false);
6171 }
Craig Topper3164f332014-03-11 03:39:26 +00006172
Craig Topper6c03a542015-10-19 04:51:35 +00006173 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006174 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006175 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006176 }
Craig Topper3164f332014-03-11 03:39:26 +00006177 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006178 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006179 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006180 ArrayRef<const char *> getGCCRegNames() const override;
6181 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006182 bool validateAsmConstraint(const char *&Name,
6183 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006184 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006185 switch (*Name) {
6186 case 'I': // Signed 13-bit constant
6187 case 'J': // Zero
6188 case 'K': // 32-bit constant with the low 12 bits clear
6189 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6190 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6191 case 'N': // Same as 'K' but zext (required for SIMode)
6192 case 'O': // The constant 4096
6193 return true;
6194 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006195 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006196 }
Craig Topper3164f332014-03-11 03:39:26 +00006197 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006198 // FIXME: Implement!
6199 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006200 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006201
6202 // No Sparc V7 for now, the backend doesn't support it anyway.
6203 enum CPUKind {
6204 CK_GENERIC,
6205 CK_V8,
6206 CK_SUPERSPARC,
6207 CK_SPARCLITE,
6208 CK_F934,
6209 CK_HYPERSPARC,
6210 CK_SPARCLITE86X,
6211 CK_SPARCLET,
6212 CK_TSC701,
6213 CK_V9,
6214 CK_ULTRASPARC,
6215 CK_ULTRASPARC3,
6216 CK_NIAGARA,
6217 CK_NIAGARA2,
6218 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006219 CK_NIAGARA4,
6220 CK_MYRIAD2_1,
6221 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006222 } CPU = CK_GENERIC;
6223
6224 enum CPUGeneration {
6225 CG_V8,
6226 CG_V9,
6227 };
6228
6229 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6230 switch (Kind) {
6231 case CK_GENERIC:
6232 case CK_V8:
6233 case CK_SUPERSPARC:
6234 case CK_SPARCLITE:
6235 case CK_F934:
6236 case CK_HYPERSPARC:
6237 case CK_SPARCLITE86X:
6238 case CK_SPARCLET:
6239 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006240 case CK_MYRIAD2_1:
6241 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006242 return CG_V8;
6243 case CK_V9:
6244 case CK_ULTRASPARC:
6245 case CK_ULTRASPARC3:
6246 case CK_NIAGARA:
6247 case CK_NIAGARA2:
6248 case CK_NIAGARA3:
6249 case CK_NIAGARA4:
6250 return CG_V9;
6251 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006252 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006253 }
6254
6255 CPUKind getCPUKind(StringRef Name) const {
6256 return llvm::StringSwitch<CPUKind>(Name)
6257 .Case("v8", CK_V8)
6258 .Case("supersparc", CK_SUPERSPARC)
6259 .Case("sparclite", CK_SPARCLITE)
6260 .Case("f934", CK_F934)
6261 .Case("hypersparc", CK_HYPERSPARC)
6262 .Case("sparclite86x", CK_SPARCLITE86X)
6263 .Case("sparclet", CK_SPARCLET)
6264 .Case("tsc701", CK_TSC701)
6265 .Case("v9", CK_V9)
6266 .Case("ultrasparc", CK_ULTRASPARC)
6267 .Case("ultrasparc3", CK_ULTRASPARC3)
6268 .Case("niagara", CK_NIAGARA)
6269 .Case("niagara2", CK_NIAGARA2)
6270 .Case("niagara3", CK_NIAGARA3)
6271 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006272 .Case("myriad2", CK_MYRIAD2_1)
6273 .Case("myriad2.1", CK_MYRIAD2_1)
6274 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006275 .Default(CK_GENERIC);
6276 }
6277
6278 bool setCPU(const std::string &Name) override {
6279 CPU = getCPUKind(Name);
6280 return CPU != CK_GENERIC;
6281 }
Gabor Greif49991682008-02-21 16:29:08 +00006282};
6283
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006284const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006285 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6286 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6287 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6288 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6289};
6290
Craig Topperf054e3a2015-10-19 03:52:27 +00006291ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6292 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006293}
6294
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006295const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006296 { { "g0" }, "r0" },
6297 { { "g1" }, "r1" },
6298 { { "g2" }, "r2" },
6299 { { "g3" }, "r3" },
6300 { { "g4" }, "r4" },
6301 { { "g5" }, "r5" },
6302 { { "g6" }, "r6" },
6303 { { "g7" }, "r7" },
6304 { { "o0" }, "r8" },
6305 { { "o1" }, "r9" },
6306 { { "o2" }, "r10" },
6307 { { "o3" }, "r11" },
6308 { { "o4" }, "r12" },
6309 { { "o5" }, "r13" },
6310 { { "o6", "sp" }, "r14" },
6311 { { "o7" }, "r15" },
6312 { { "l0" }, "r16" },
6313 { { "l1" }, "r17" },
6314 { { "l2" }, "r18" },
6315 { { "l3" }, "r19" },
6316 { { "l4" }, "r20" },
6317 { { "l5" }, "r21" },
6318 { { "l6" }, "r22" },
6319 { { "l7" }, "r23" },
6320 { { "i0" }, "r24" },
6321 { { "i1" }, "r25" },
6322 { { "i2" }, "r26" },
6323 { { "i3" }, "r27" },
6324 { { "i4" }, "r28" },
6325 { { "i5" }, "r29" },
6326 { { "i6", "fp" }, "r30" },
6327 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006328};
6329
Craig Topperf054e3a2015-10-19 03:52:27 +00006330ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6331 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006332}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006333
6334// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6335class SparcV8TargetInfo : public SparcTargetInfo {
6336public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006337 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6338 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006339 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006340 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6341 switch (getTriple().getOS()) {
6342 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006343 SizeType = UnsignedInt;
6344 IntPtrType = SignedInt;
6345 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006346 break;
6347 case llvm::Triple::NetBSD:
6348 case llvm::Triple::OpenBSD:
6349 SizeType = UnsignedLong;
6350 IntPtrType = SignedLong;
6351 PtrDiffType = SignedLong;
6352 break;
Brad Smith56495d52015-08-13 22:00:53 +00006353 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006354 }
6355
Craig Topper3164f332014-03-11 03:39:26 +00006356 void getTargetDefines(const LangOptions &Opts,
6357 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006358 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006359 switch (getCPUGeneration(CPU)) {
6360 case CG_V8:
6361 Builder.defineMacro("__sparcv8");
6362 if (getTriple().getOS() != llvm::Triple::Solaris)
6363 Builder.defineMacro("__sparcv8__");
6364 break;
6365 case CG_V9:
6366 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006367 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006368 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006369 Builder.defineMacro("__sparc_v9__");
6370 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006371 break;
6372 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006373 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6374 switch (CPU) {
6375 case CK_MYRIAD2_1:
6376 Builder.defineMacro("__myriad2", "1");
6377 Builder.defineMacro("__myriad2__", "1");
6378 break;
6379 case CK_MYRIAD2_2:
6380 Builder.defineMacro("__myriad2", "2");
6381 Builder.defineMacro("__myriad2__", "2");
6382 break;
6383 default:
6384 break;
6385 }
6386 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006387 }
6388};
6389
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006390// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6391class SparcV8elTargetInfo : public SparcV8TargetInfo {
6392 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006393 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6394 : SparcV8TargetInfo(Triple, Opts) {
6395 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6396 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006397 }
6398};
6399
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006400// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6401class SparcV9TargetInfo : public SparcTargetInfo {
6402public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006403 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6404 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006405 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006406 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006407 // This is an LP64 platform.
6408 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006409
6410 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006411 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006412 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006413 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006414 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006415 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006416
6417 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6418 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6419 LongDoubleWidth = 128;
6420 LongDoubleAlign = 128;
6421 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006422 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006423 }
6424
Craig Topper3164f332014-03-11 03:39:26 +00006425 void getTargetDefines(const LangOptions &Opts,
6426 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006427 SparcTargetInfo::getTargetDefines(Opts, Builder);
6428 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006429 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006430 // Solaris doesn't need these variants, but the BSDs do.
6431 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006432 Builder.defineMacro("__sparc64__");
6433 Builder.defineMacro("__sparc_v9__");
6434 Builder.defineMacro("__sparcv9__");
6435 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006436 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006437
Craig Topper3164f332014-03-11 03:39:26 +00006438 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006439 if (!SparcTargetInfo::setCPU(Name))
6440 return false;
6441 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006442 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006443};
6444
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006445class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006446 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006447 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006448 std::string CPU;
6449 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006450 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006451
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006452public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006453 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006454 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6455 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006456 IntMaxType = SignedLong;
6457 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006458 TLSSupported = true;
6459 IntWidth = IntAlign = 32;
6460 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6461 PointerWidth = PointerAlign = 64;
6462 LongDoubleWidth = 128;
6463 LongDoubleAlign = 64;
6464 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006465 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006466 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006467 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 +00006468 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6469 }
6470 void getTargetDefines(const LangOptions &Opts,
6471 MacroBuilder &Builder) const override {
6472 Builder.defineMacro("__s390__");
6473 Builder.defineMacro("__s390x__");
6474 Builder.defineMacro("__zarch__");
6475 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006476
6477 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6478 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6479 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6480 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6481
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006482 if (HasTransactionalExecution)
6483 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006484 if (Opts.ZVector)
6485 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006486 }
Craig Topper6c03a542015-10-19 04:51:35 +00006487 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6488 return llvm::makeArrayRef(BuiltinInfo,
6489 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006490 }
6491
Craig Topperf054e3a2015-10-19 03:52:27 +00006492 ArrayRef<const char *> getGCCRegNames() const override;
6493 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006494 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006495 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006496 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006497 bool validateAsmConstraint(const char *&Name,
6498 TargetInfo::ConstraintInfo &info) const override;
6499 const char *getClobbers() const override {
6500 // FIXME: Is this really right?
6501 return "";
6502 }
6503 BuiltinVaListKind getBuiltinVaListKind() const override {
6504 return TargetInfo::SystemZBuiltinVaList;
6505 }
6506 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006507 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006508 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6509 .Case("z10", true)
6510 .Case("z196", true)
6511 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006512 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006513 .Default(false);
6514
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006515 return CPUKnown;
6516 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006517 bool
6518 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6519 StringRef CPU,
6520 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006521 if (CPU == "zEC12")
6522 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006523 if (CPU == "z13") {
6524 Features["transactional-execution"] = true;
6525 Features["vector"] = true;
6526 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006527 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006528 }
6529
6530 bool handleTargetFeatures(std::vector<std::string> &Features,
6531 DiagnosticsEngine &Diags) override {
6532 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006533 for (const auto &Feature : Features) {
6534 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006535 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006536 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006537 HasVector = true;
6538 }
6539 // If we use the vector ABI, vector types are 64-bit aligned.
6540 if (HasVector) {
6541 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006542 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6543 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006544 }
6545 return true;
6546 }
6547
6548 bool hasFeature(StringRef Feature) const override {
6549 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006550 .Case("systemz", true)
6551 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006552 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006553 .Default(false);
6554 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006555
Bryan Chane3f1ed52016-04-28 13:56:43 +00006556 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6557 switch (CC) {
6558 case CC_C:
6559 case CC_Swift:
6560 return CCCR_OK;
6561 default:
6562 return CCCR_Warning;
6563 }
6564 }
6565
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006566 StringRef getABI() const override {
6567 if (HasVector)
6568 return "vector";
6569 return "";
6570 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006571
6572 bool useFloat128ManglingForLongDouble() const override {
6573 return true;
6574 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006575};
6576
6577const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6578#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006579 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006580#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6581 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006582#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006583};
6584
6585const char *const SystemZTargetInfo::GCCRegNames[] = {
6586 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6587 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6588 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6589 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6590};
6591
Craig Topperf054e3a2015-10-19 03:52:27 +00006592ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6593 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006594}
6595
6596bool SystemZTargetInfo::
6597validateAsmConstraint(const char *&Name,
6598 TargetInfo::ConstraintInfo &Info) const {
6599 switch (*Name) {
6600 default:
6601 return false;
6602
6603 case 'a': // Address register
6604 case 'd': // Data register (equivalent to 'r')
6605 case 'f': // Floating-point register
6606 Info.setAllowsRegister();
6607 return true;
6608
6609 case 'I': // Unsigned 8-bit constant
6610 case 'J': // Unsigned 12-bit constant
6611 case 'K': // Signed 16-bit constant
6612 case 'L': // Signed 20-bit displacement (on all targets we support)
6613 case 'M': // 0x7fffffff
6614 return true;
6615
6616 case 'Q': // Memory with base and unsigned 12-bit displacement
6617 case 'R': // Likewise, plus an index
6618 case 'S': // Memory with base and signed 20-bit displacement
6619 case 'T': // Likewise, plus an index
6620 Info.setAllowsMemory();
6621 return true;
6622 }
6623}
Ulrich Weigand47445072013-05-06 16:26:41 +00006624
Eric Christopherc48497a2015-09-18 21:26:24 +00006625class MSP430TargetInfo : public TargetInfo {
6626 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006627
Eric Christopherc48497a2015-09-18 21:26:24 +00006628public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006629 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6630 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006631 BigEndian = false;
6632 TLSSupported = false;
6633 IntWidth = 16;
6634 IntAlign = 16;
6635 LongWidth = 32;
6636 LongLongWidth = 64;
6637 LongAlign = LongLongAlign = 16;
6638 PointerWidth = 16;
6639 PointerAlign = 16;
6640 SuitableAlign = 16;
6641 SizeType = UnsignedInt;
6642 IntMaxType = SignedLongLong;
6643 IntPtrType = SignedInt;
6644 PtrDiffType = SignedInt;
6645 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006646 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006647 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006648 void getTargetDefines(const LangOptions &Opts,
6649 MacroBuilder &Builder) const override {
6650 Builder.defineMacro("MSP430");
6651 Builder.defineMacro("__MSP430__");
6652 // FIXME: defines for different 'flavours' of MCU
6653 }
Craig Topper6c03a542015-10-19 04:51:35 +00006654 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006655 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006656 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006657 }
6658 bool hasFeature(StringRef Feature) const override {
6659 return Feature == "msp430";
6660 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006661 ArrayRef<const char *> getGCCRegNames() const override;
6662 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006663 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006664 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006665 }
6666 bool validateAsmConstraint(const char *&Name,
6667 TargetInfo::ConstraintInfo &info) const override {
6668 // FIXME: implement
6669 switch (*Name) {
6670 case 'K': // the constant 1
6671 case 'L': // constant -1^20 .. 1^19
6672 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006673 return true;
6674 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006675 // No target constraints for now.
6676 return false;
6677 }
6678 const char *getClobbers() const override {
6679 // FIXME: Is this really right?
6680 return "";
6681 }
6682 BuiltinVaListKind getBuiltinVaListKind() const override {
6683 // FIXME: implement
6684 return TargetInfo::CharPtrBuiltinVaList;
6685 }
6686};
6687
6688const char *const MSP430TargetInfo::GCCRegNames[] = {
6689 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6690 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6691
Craig Topperf054e3a2015-10-19 03:52:27 +00006692ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6693 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006694}
6695
6696// LLVM and Clang cannot be used directly to output native binaries for
6697// target, but is used to compile C code to llvm bitcode with correct
6698// type and alignment information.
6699//
6700// TCE uses the llvm bitcode as input and uses it for generating customized
6701// target processor and program binary. TCE co-design environment is
6702// publicly available in http://tce.cs.tut.fi
6703
6704static const unsigned TCEOpenCLAddrSpaceMap[] = {
6705 3, // opencl_global
6706 4, // opencl_local
6707 5, // opencl_constant
6708 // FIXME: generic has to be added to the target
6709 0, // opencl_generic
6710 0, // cuda_device
6711 0, // cuda_constant
6712 0 // cuda_shared
6713};
6714
6715class TCETargetInfo : public TargetInfo {
6716public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006717 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6718 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006719 TLSSupported = false;
6720 IntWidth = 32;
6721 LongWidth = LongLongWidth = 32;
6722 PointerWidth = 32;
6723 IntAlign = 32;
6724 LongAlign = LongLongAlign = 32;
6725 PointerAlign = 32;
6726 SuitableAlign = 32;
6727 SizeType = UnsignedInt;
6728 IntMaxType = SignedLong;
6729 IntPtrType = SignedInt;
6730 PtrDiffType = SignedInt;
6731 FloatWidth = 32;
6732 FloatAlign = 32;
6733 DoubleWidth = 32;
6734 DoubleAlign = 32;
6735 LongDoubleWidth = 32;
6736 LongDoubleAlign = 32;
6737 FloatFormat = &llvm::APFloat::IEEEsingle;
6738 DoubleFormat = &llvm::APFloat::IEEEsingle;
6739 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006740 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6741 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006742 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6743 UseAddrSpaceMapMangling = true;
6744 }
6745
6746 void getTargetDefines(const LangOptions &Opts,
6747 MacroBuilder &Builder) const override {
6748 DefineStd(Builder, "tce", Opts);
6749 Builder.defineMacro("__TCE__");
6750 Builder.defineMacro("__TCE_V1__");
6751 }
6752 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6753
Craig Topper6c03a542015-10-19 04:51:35 +00006754 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006755 const char *getClobbers() const override { return ""; }
6756 BuiltinVaListKind getBuiltinVaListKind() const override {
6757 return TargetInfo::VoidPtrBuiltinVaList;
6758 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006759 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006760 bool validateAsmConstraint(const char *&Name,
6761 TargetInfo::ConstraintInfo &info) const override {
6762 return true;
6763 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006764 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6765 return None;
6766 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006767};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006768
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006769class BPFTargetInfo : public TargetInfo {
6770public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006771 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6772 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006773 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6774 SizeType = UnsignedLong;
6775 PtrDiffType = SignedLong;
6776 IntPtrType = SignedLong;
6777 IntMaxType = SignedLong;
6778 Int64Type = SignedLong;
6779 RegParmMax = 5;
6780 if (Triple.getArch() == llvm::Triple::bpfeb) {
6781 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006782 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006783 } else {
6784 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006785 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006786 }
6787 MaxAtomicPromoteWidth = 64;
6788 MaxAtomicInlineWidth = 64;
6789 TLSSupported = false;
6790 }
6791 void getTargetDefines(const LangOptions &Opts,
6792 MacroBuilder &Builder) const override {
6793 DefineStd(Builder, "bpf", Opts);
6794 Builder.defineMacro("__BPF__");
6795 }
6796 bool hasFeature(StringRef Feature) const override {
6797 return Feature == "bpf";
6798 }
6799
Craig Topper6c03a542015-10-19 04:51:35 +00006800 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006801 const char *getClobbers() const override {
6802 return "";
6803 }
6804 BuiltinVaListKind getBuiltinVaListKind() const override {
6805 return TargetInfo::VoidPtrBuiltinVaList;
6806 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006807 ArrayRef<const char *> getGCCRegNames() const override {
6808 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006809 }
6810 bool validateAsmConstraint(const char *&Name,
6811 TargetInfo::ConstraintInfo &info) const override {
6812 return true;
6813 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006814 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6815 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006816 }
6817};
6818
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006819class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006820 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006821
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006822 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006823 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006824 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006825 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006826 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006827 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006828 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006829 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006830 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006831 enum DspRevEnum {
6832 NoDSP, DSP1, DSP2
6833 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006834 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006835
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006836protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006837 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006838 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006839
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006840public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006841 MipsTargetInfoBase(const llvm::Triple &Triple, const TargetOptions &,
6842 const std::string &ABIStr, const std::string &CPUStr)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006843 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006844 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006845 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6846 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6847 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006848
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006849 bool isNaN2008Default() const {
6850 return CPU == "mips32r6" || CPU == "mips64r6";
6851 }
6852
6853 bool isFP64Default() const {
6854 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6855 }
6856
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006857 bool isNan2008() const override {
6858 return IsNan2008;
6859 }
6860
Alp Toker4925ba72014-06-07 23:30:42 +00006861 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006862 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006863 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6864 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006865 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006866 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006867 .Case("mips1", IsMips32)
6868 .Case("mips2", IsMips32)
6869 .Case("mips3", true)
6870 .Case("mips4", true)
6871 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006872 .Case("mips32", IsMips32)
6873 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006874 .Case("mips32r3", IsMips32)
6875 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006876 .Case("mips32r6", IsMips32)
6877 .Case("mips64", true)
6878 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006879 .Case("mips64r3", true)
6880 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006881 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006882 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006883 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006884 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006885 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006886 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006887 bool
6888 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6889 StringRef CPU,
6890 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006891 if (CPU.empty())
6892 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006893 if (CPU == "octeon")
6894 Features["mips64r2"] = Features["cnmips"] = true;
6895 else
6896 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006897 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006898 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006899
Craig Topper3164f332014-03-11 03:39:26 +00006900 void getTargetDefines(const LangOptions &Opts,
6901 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006902 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006903 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006904 if (Opts.GNUMode)
6905 Builder.defineMacro("mips");
6906
Simon Atanasyan683535b2012-08-29 19:14:58 +00006907 Builder.defineMacro("__REGISTER_PREFIX__", "");
6908
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006909 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006910 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006911 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006912 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006913 case SoftFloat:
6914 Builder.defineMacro("__mips_soft_float", Twine(1));
6915 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006916 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006917
Simon Atanasyan16071912013-04-14 14:07:30 +00006918 if (IsSingleFloat)
6919 Builder.defineMacro("__mips_single_float", Twine(1));
6920
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006921 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6922 Builder.defineMacro("_MIPS_FPSET",
6923 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6924
Simon Atanasyan72244b62012-07-05 16:06:06 +00006925 if (IsMips16)
6926 Builder.defineMacro("__mips16", Twine(1));
6927
Simon Atanasyan60777612013-04-14 14:07:51 +00006928 if (IsMicromips)
6929 Builder.defineMacro("__mips_micromips", Twine(1));
6930
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006931 if (IsNan2008)
6932 Builder.defineMacro("__mips_nan2008", Twine(1));
6933
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006934 switch (DspRev) {
6935 default:
6936 break;
6937 case DSP1:
6938 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6939 Builder.defineMacro("__mips_dsp", Twine(1));
6940 break;
6941 case DSP2:
6942 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6943 Builder.defineMacro("__mips_dspr2", Twine(1));
6944 Builder.defineMacro("__mips_dsp", Twine(1));
6945 break;
6946 }
6947
Jack Carter44ff1e52013-08-12 17:20:29 +00006948 if (HasMSA)
6949 Builder.defineMacro("__mips_msa", Twine(1));
6950
Simon Atanasyan26f19672012-04-05 19:28:31 +00006951 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6952 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6953 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006954
6955 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6956 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006957
6958 // These shouldn't be defined for MIPS-I but there's no need to check
6959 // for that since MIPS-I isn't supported.
6960 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6961 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6962 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006963 }
6964
Craig Topper6c03a542015-10-19 04:51:35 +00006965 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6966 return llvm::makeArrayRef(BuiltinInfo,
6967 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006968 }
Craig Topper3164f332014-03-11 03:39:26 +00006969 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006970 return llvm::StringSwitch<bool>(Feature)
6971 .Case("mips", true)
6972 .Case("fp64", HasFP64)
6973 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006974 }
Craig Topper3164f332014-03-11 03:39:26 +00006975 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006976 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006977 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006978 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006979 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006980 // CPU register names
6981 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006982 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6983 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6984 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006985 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6986 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006987 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6988 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6989 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6990 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006991 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006992 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00006993 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
6994 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006995 // MSA register names
6996 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6997 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6998 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6999 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7000 // MSA control register names
7001 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7002 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007003 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007004 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007005 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007006 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00007007 bool validateAsmConstraint(const char *&Name,
7008 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007009 switch (*Name) {
7010 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007011 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007012 case 'r': // CPU registers.
7013 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007014 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007015 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007016 case 'c': // $25 for indirect jumps
7017 case 'l': // lo register
7018 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007019 Info.setAllowsRegister();
7020 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007021 case 'I': // Signed 16-bit constant
7022 case 'J': // Integer 0
7023 case 'K': // Unsigned 16-bit constant
7024 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7025 case 'M': // Constants not loadable via lui, addiu, or ori
7026 case 'N': // Constant -1 to -65535
7027 case 'O': // A signed 15-bit constant
7028 case 'P': // A constant between 1 go 65535
7029 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007030 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007031 Info.setAllowsMemory();
7032 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007033 case 'Z':
7034 if (Name[1] == 'C') { // An address usable by ll, and sc.
7035 Info.setAllowsMemory();
7036 Name++; // Skip over 'Z'.
7037 return true;
7038 }
7039 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007040 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007041 }
7042
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007043 std::string convertConstraint(const char *&Constraint) const override {
7044 std::string R;
7045 switch (*Constraint) {
7046 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7047 if (Constraint[1] == 'C') {
7048 R = std::string("^") + std::string(Constraint, 2);
7049 Constraint++;
7050 return R;
7051 }
7052 break;
7053 }
7054 return TargetInfo::convertConstraint(Constraint);
7055 }
7056
Craig Topper3164f332014-03-11 03:39:26 +00007057 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007058 // In GCC, $1 is not widely used in generated code (it's used only in a few
7059 // specific situations), so there is no real need for users to add it to
7060 // the clobbers list if they want to use it in their inline assembly code.
7061 //
7062 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7063 // code generation, so using it in inline assembly without adding it to the
7064 // clobbers list can cause conflicts between the inline assembly code and
7065 // the surrounding generated code.
7066 //
7067 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7068 // operands, which will conflict with the ".set at" assembler option (which
7069 // we use only for inline assembly, in order to maintain compatibility with
7070 // GCC) and will also conflict with the user's usage of $1.
7071 //
7072 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7073 // register for generated code is to automatically clobber $1 for all inline
7074 // assembly code.
7075 //
7076 // FIXME: We should automatically clobber $1 only for inline assembly code
7077 // which actually uses it. This would allow LLVM to use $1 for inline
7078 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007079 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007080 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007081
Craig Topper3164f332014-03-11 03:39:26 +00007082 bool handleTargetFeatures(std::vector<std::string> &Features,
7083 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007084 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007085 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007086 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007087 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007088 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007089 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007090 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007091
Eric Christopher610fe112015-08-26 08:21:55 +00007092 for (const auto &Feature : Features) {
7093 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007094 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007095 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007096 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007097 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007098 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007099 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007100 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007101 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007102 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007103 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007104 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007105 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007106 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007107 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007108 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007109 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007110 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007111 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007112 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007113 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007114 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007115 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007116
James Y Knightb214cbc2016-03-04 19:00:41 +00007117 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007118
Rafael Espindolaeb265472013-08-21 21:59:03 +00007119 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007120 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007121
Craig Topper3164f332014-03-11 03:39:26 +00007122 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007123 if (RegNo == 0) return 4;
7124 if (RegNo == 1) return 5;
7125 return -1;
7126 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007127
7128 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007129};
7130
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007131const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007132#define BUILTIN(ID, TYPE, ATTRS) \
7133 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7134#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7135 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007136#include "clang/Basic/BuiltinsMips.def"
7137};
7138
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007139class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007140public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007141 Mips32TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7142 : MipsTargetInfoBase(Triple, Opts, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007143 SizeType = UnsignedInt;
7144 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007145 Int64Type = SignedLongLong;
7146 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007147 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007148 }
Craig Topper3164f332014-03-11 03:39:26 +00007149 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007150 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007151 ABI = Name;
7152 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007153 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007154 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007155 }
Craig Topper3164f332014-03-11 03:39:26 +00007156 void getTargetDefines(const LangOptions &Opts,
7157 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007158 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007159
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007160 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007161 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7162
7163 const std::string& CPUStr = getCPU();
7164 if (CPUStr == "mips32")
7165 Builder.defineMacro("__mips_isa_rev", "1");
7166 else if (CPUStr == "mips32r2")
7167 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007168 else if (CPUStr == "mips32r3")
7169 Builder.defineMacro("__mips_isa_rev", "3");
7170 else if (CPUStr == "mips32r5")
7171 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007172 else if (CPUStr == "mips32r6")
7173 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007174
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007175 if (ABI == "o32") {
7176 Builder.defineMacro("__mips_o32");
7177 Builder.defineMacro("_ABIO32", "1");
7178 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7179 }
7180 else if (ABI == "eabi")
7181 Builder.defineMacro("__mips_eabi");
7182 else
David Blaikie83d382b2011-09-23 05:06:16 +00007183 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007184 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007185 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007186 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7187 { { "at" }, "$1" },
7188 { { "v0" }, "$2" },
7189 { { "v1" }, "$3" },
7190 { { "a0" }, "$4" },
7191 { { "a1" }, "$5" },
7192 { { "a2" }, "$6" },
7193 { { "a3" }, "$7" },
7194 { { "t0" }, "$8" },
7195 { { "t1" }, "$9" },
7196 { { "t2" }, "$10" },
7197 { { "t3" }, "$11" },
7198 { { "t4" }, "$12" },
7199 { { "t5" }, "$13" },
7200 { { "t6" }, "$14" },
7201 { { "t7" }, "$15" },
7202 { { "s0" }, "$16" },
7203 { { "s1" }, "$17" },
7204 { { "s2" }, "$18" },
7205 { { "s3" }, "$19" },
7206 { { "s4" }, "$20" },
7207 { { "s5" }, "$21" },
7208 { { "s6" }, "$22" },
7209 { { "s7" }, "$23" },
7210 { { "t8" }, "$24" },
7211 { { "t9" }, "$25" },
7212 { { "k0" }, "$26" },
7213 { { "k1" }, "$27" },
7214 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007215 { { "sp","$sp" }, "$29" },
7216 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007217 { { "ra" }, "$31" }
7218 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007219 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007220 }
7221};
7222
7223class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007224 void setDataLayout() override {
7225 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007226 }
7227
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007228public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007229 Mips32EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7230 : Mips32TargetInfoBase(Triple, Opts) {
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00007231 }
Craig Topper3164f332014-03-11 03:39:26 +00007232 void getTargetDefines(const LangOptions &Opts,
7233 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007234 DefineStd(Builder, "MIPSEB", Opts);
7235 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007236 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007237 }
7238};
7239
7240class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007241 void setDataLayout() override {
7242 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007243 }
7244
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007245public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007246 Mips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7247 : Mips32TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007248 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007249 }
Craig Topper3164f332014-03-11 03:39:26 +00007250 void getTargetDefines(const LangOptions &Opts,
7251 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007252 DefineStd(Builder, "MIPSEL", Opts);
7253 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007254 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007255 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007256};
Akira Hatanakabef17452011-09-20 19:21:49 +00007257
7258class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007259public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007260 Mips64TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7261 : MipsTargetInfoBase(Triple, Opts, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007262 LongDoubleWidth = LongDoubleAlign = 128;
7263 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007264 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7265 LongDoubleWidth = LongDoubleAlign = 64;
7266 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7267 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007268 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007269 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007270 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007271 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007272
7273 void setN64ABITypes() {
7274 LongWidth = LongAlign = 64;
7275 PointerWidth = PointerAlign = 64;
7276 SizeType = UnsignedLong;
7277 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007278 Int64Type = SignedLong;
7279 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007280 }
7281
7282 void setN32ABITypes() {
7283 LongWidth = LongAlign = 32;
7284 PointerWidth = PointerAlign = 32;
7285 SizeType = UnsignedInt;
7286 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007287 Int64Type = SignedLongLong;
7288 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007289 }
7290
Craig Topper3164f332014-03-11 03:39:26 +00007291 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007292 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007293 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007294 ABI = Name;
7295 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007296 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007297 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007298 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007299 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007300 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007301 }
7302 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007303 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007304
Craig Topper3164f332014-03-11 03:39:26 +00007305 void getTargetDefines(const LangOptions &Opts,
7306 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007307 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007308
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007309 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007310 Builder.defineMacro("__mips64");
7311 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007312 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7313
7314 const std::string& CPUStr = getCPU();
7315 if (CPUStr == "mips64")
7316 Builder.defineMacro("__mips_isa_rev", "1");
7317 else if (CPUStr == "mips64r2")
7318 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007319 else if (CPUStr == "mips64r3")
7320 Builder.defineMacro("__mips_isa_rev", "3");
7321 else if (CPUStr == "mips64r5")
7322 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007323 else if (CPUStr == "mips64r6")
7324 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007325
Akira Hatanakabef17452011-09-20 19:21:49 +00007326 if (ABI == "n32") {
7327 Builder.defineMacro("__mips_n32");
7328 Builder.defineMacro("_ABIN32", "2");
7329 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7330 }
7331 else if (ABI == "n64") {
7332 Builder.defineMacro("__mips_n64");
7333 Builder.defineMacro("_ABI64", "3");
7334 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7335 }
7336 else
David Blaikie83d382b2011-09-23 05:06:16 +00007337 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007338
7339 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007340 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007341 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007342 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7343 { { "at" }, "$1" },
7344 { { "v0" }, "$2" },
7345 { { "v1" }, "$3" },
7346 { { "a0" }, "$4" },
7347 { { "a1" }, "$5" },
7348 { { "a2" }, "$6" },
7349 { { "a3" }, "$7" },
7350 { { "a4" }, "$8" },
7351 { { "a5" }, "$9" },
7352 { { "a6" }, "$10" },
7353 { { "a7" }, "$11" },
7354 { { "t0" }, "$12" },
7355 { { "t1" }, "$13" },
7356 { { "t2" }, "$14" },
7357 { { "t3" }, "$15" },
7358 { { "s0" }, "$16" },
7359 { { "s1" }, "$17" },
7360 { { "s2" }, "$18" },
7361 { { "s3" }, "$19" },
7362 { { "s4" }, "$20" },
7363 { { "s5" }, "$21" },
7364 { { "s6" }, "$22" },
7365 { { "s7" }, "$23" },
7366 { { "t8" }, "$24" },
7367 { { "t9" }, "$25" },
7368 { { "k0" }, "$26" },
7369 { { "k1" }, "$27" },
7370 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007371 { { "sp","$sp" }, "$29" },
7372 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007373 { { "ra" }, "$31" }
7374 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007375 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007376 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007377
7378 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007379};
7380
7381class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007382 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007383 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007384 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 +00007385 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007386 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007387 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007388
Akira Hatanakabef17452011-09-20 19:21:49 +00007389public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007390 Mips64EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7391 : Mips64TargetInfoBase(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00007392 void getTargetDefines(const LangOptions &Opts,
7393 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007394 DefineStd(Builder, "MIPSEB", Opts);
7395 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007396 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007397 }
7398};
7399
7400class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007401 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007402 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007403 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 +00007404 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007405 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007406 }
7407public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007408 Mips64ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7409 : Mips64TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007410 // Default ABI is n64.
7411 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007412 }
Craig Topper3164f332014-03-11 03:39:26 +00007413 void getTargetDefines(const LangOptions &Opts,
7414 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007415 DefineStd(Builder, "MIPSEL", Opts);
7416 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007417 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007418 }
7419};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007420
Ivan Krasindd7403e2011-08-24 20:22:22 +00007421class PNaClTargetInfo : public TargetInfo {
7422public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007423 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7424 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007425 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007426 this->LongAlign = 32;
7427 this->LongWidth = 32;
7428 this->PointerAlign = 32;
7429 this->PointerWidth = 32;
7430 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007431 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007432 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007433 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007434 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007435 this->SizeType = TargetInfo::UnsignedInt;
7436 this->PtrDiffType = TargetInfo::SignedInt;
7437 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007438 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007439 }
7440
Craig Toppere6f17d02014-03-11 04:07:52 +00007441 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007442 Builder.defineMacro("__le32__");
7443 Builder.defineMacro("__pnacl__");
7444 }
Craig Topper3164f332014-03-11 03:39:26 +00007445 void getTargetDefines(const LangOptions &Opts,
7446 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007447 getArchDefines(Opts, Builder);
7448 }
Craig Topper3164f332014-03-11 03:39:26 +00007449 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007450 return Feature == "pnacl";
7451 }
Craig Topper6c03a542015-10-19 04:51:35 +00007452 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007453 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007454 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007455 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007456 ArrayRef<const char *> getGCCRegNames() const override;
7457 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007458 bool validateAsmConstraint(const char *&Name,
7459 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007460 return false;
7461 }
7462
Craig Topper3164f332014-03-11 03:39:26 +00007463 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007464 return "";
7465 }
7466};
7467
Craig Topperf054e3a2015-10-19 03:52:27 +00007468ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7469 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007470}
7471
Craig Topperf054e3a2015-10-19 03:52:27 +00007472ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7473 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007474}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007475
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007476// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7477class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7478public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007479 NaClMips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7480 : Mips32ELTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007481
7482 BuiltinVaListKind getBuiltinVaListKind() const override {
7483 return TargetInfo::PNaClABIBuiltinVaList;
7484 }
7485};
7486
JF Bastien643817d2014-09-12 17:52:47 +00007487class Le64TargetInfo : public TargetInfo {
7488 static const Builtin::Info BuiltinInfo[];
7489
7490public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007491 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7492 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007493 BigEndian = false;
7494 NoAsmVariants = true;
7495 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7496 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007497 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007498 }
7499
7500 void getTargetDefines(const LangOptions &Opts,
7501 MacroBuilder &Builder) const override {
7502 DefineStd(Builder, "unix", Opts);
7503 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7504 Builder.defineMacro("__ELF__");
7505 }
Craig Topper6c03a542015-10-19 04:51:35 +00007506 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7507 return llvm::makeArrayRef(BuiltinInfo,
7508 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007509 }
7510 BuiltinVaListKind getBuiltinVaListKind() const override {
7511 return TargetInfo::PNaClABIBuiltinVaList;
7512 }
7513 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007514 ArrayRef<const char *> getGCCRegNames() const override {
7515 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007516 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007517 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7518 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007519 }
7520 bool validateAsmConstraint(const char *&Name,
7521 TargetInfo::ConstraintInfo &Info) const override {
7522 return false;
7523 }
7524
7525 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007526};
Dan Gohmanc2853072015-09-03 22:51:53 +00007527
7528class WebAssemblyTargetInfo : public TargetInfo {
7529 static const Builtin::Info BuiltinInfo[];
7530
7531 enum SIMDEnum {
7532 NoSIMD,
7533 SIMD128,
7534 } SIMDLevel;
7535
7536public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007537 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007538 : TargetInfo(T), SIMDLevel(NoSIMD) {
7539 BigEndian = false;
7540 NoAsmVariants = true;
7541 SuitableAlign = 128;
7542 LargeArrayMinWidth = 128;
7543 LargeArrayAlign = 128;
7544 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007545 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007546 LongDoubleWidth = LongDoubleAlign = 128;
7547 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007548 }
7549
7550protected:
7551 void getTargetDefines(const LangOptions &Opts,
7552 MacroBuilder &Builder) const override {
7553 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7554 if (SIMDLevel >= SIMD128)
7555 Builder.defineMacro("__wasm_simd128__");
7556 }
7557
7558private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007559 bool
7560 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7561 StringRef CPU,
7562 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007563 if (CPU == "bleeding-edge")
7564 Features["simd128"] = true;
7565 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7566 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007567 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007568 return llvm::StringSwitch<bool>(Feature)
7569 .Case("simd128", SIMDLevel >= SIMD128)
7570 .Default(false);
7571 }
7572 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007573 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007574 for (const auto &Feature : Features) {
7575 if (Feature == "+simd128") {
7576 SIMDLevel = std::max(SIMDLevel, SIMD128);
7577 continue;
7578 }
7579 if (Feature == "-simd128") {
7580 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7581 continue;
7582 }
7583
7584 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7585 << "-target-feature";
7586 return false;
7587 }
7588 return true;
7589 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007590 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007591 return llvm::StringSwitch<bool>(Name)
7592 .Case("mvp", true)
7593 .Case("bleeding-edge", true)
7594 .Case("generic", true)
7595 .Default(false);
7596 }
Craig Topper6c03a542015-10-19 04:51:35 +00007597 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7598 return llvm::makeArrayRef(BuiltinInfo,
7599 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007600 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007601 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007602 return VoidPtrBuiltinVaList;
7603 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007604 ArrayRef<const char *> getGCCRegNames() const final {
7605 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007606 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007607 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7608 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007609 }
7610 bool
7611 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007612 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007613 return false;
7614 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007615 const char *getClobbers() const final { return ""; }
7616 bool isCLZForZeroUndef() const final { return false; }
7617 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007618 IntType getIntTypeByWidth(unsigned BitWidth,
7619 bool IsSigned) const final {
7620 // WebAssembly prefers long long for explicitly 64-bit integers.
7621 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7622 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7623 }
7624 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7625 bool IsSigned) const final {
7626 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7627 return BitWidth == 64
7628 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7629 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7630 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007631};
7632
7633const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7634#define BUILTIN(ID, TYPE, ATTRS) \
7635 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7636#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7637 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7638#include "clang/Basic/BuiltinsWebAssembly.def"
7639};
7640
7641class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7642public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007643 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7644 const TargetOptions &Opts)
7645 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007646 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007647 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007648 }
7649
7650protected:
7651 void getTargetDefines(const LangOptions &Opts,
7652 MacroBuilder &Builder) const override {
7653 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7654 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7655 }
7656};
7657
7658class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7659public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007660 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7661 const TargetOptions &Opts)
7662 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007663 LongAlign = LongWidth = 64;
7664 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007665 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007666 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007667 }
7668
7669protected:
7670 void getTargetDefines(const LangOptions &Opts,
7671 MacroBuilder &Builder) const override {
7672 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7673 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7674 }
7675};
7676
JF Bastien643817d2014-09-12 17:52:47 +00007677const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7678#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007679 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007680#include "clang/Basic/BuiltinsLe64.def"
7681};
7682
Eric Christopherc48497a2015-09-18 21:26:24 +00007683static const unsigned SPIRAddrSpaceMap[] = {
7684 1, // opencl_global
7685 3, // opencl_local
7686 2, // opencl_constant
7687 4, // opencl_generic
7688 0, // cuda_device
7689 0, // cuda_constant
7690 0 // cuda_shared
7691};
7692class SPIRTargetInfo : public TargetInfo {
7693public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007694 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7695 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007696 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7697 "SPIR target must use unknown OS");
7698 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7699 "SPIR target must use unknown environment type");
7700 BigEndian = false;
7701 TLSSupported = false;
7702 LongWidth = LongAlign = 64;
7703 AddrSpaceMap = &SPIRAddrSpaceMap;
7704 UseAddrSpaceMapMangling = true;
7705 // Define available target features
7706 // These must be defined in sorted order!
7707 NoAsmVariants = true;
7708 }
7709 void getTargetDefines(const LangOptions &Opts,
7710 MacroBuilder &Builder) const override {
7711 DefineStd(Builder, "SPIR", Opts);
7712 }
7713 bool hasFeature(StringRef Feature) const override {
7714 return Feature == "spir";
7715 }
Craig Topper3164f332014-03-11 03:39:26 +00007716
Craig Topper6c03a542015-10-19 04:51:35 +00007717 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007718 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007719 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007720 bool validateAsmConstraint(const char *&Name,
7721 TargetInfo::ConstraintInfo &info) const override {
7722 return true;
7723 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007724 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7725 return None;
7726 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007727 BuiltinVaListKind getBuiltinVaListKind() const override {
7728 return TargetInfo::VoidPtrBuiltinVaList;
7729 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007730
Eric Christopherc48497a2015-09-18 21:26:24 +00007731 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7732 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7733 : CCCR_Warning;
7734 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007735
Eric Christopherc48497a2015-09-18 21:26:24 +00007736 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7737 return CC_SpirFunction;
7738 }
7739};
Guy Benyeib798fc92012-12-11 21:38:14 +00007740
Eric Christopherc48497a2015-09-18 21:26:24 +00007741class SPIR32TargetInfo : public SPIRTargetInfo {
7742public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007743 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7744 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007745 PointerWidth = PointerAlign = 32;
7746 SizeType = TargetInfo::UnsignedInt;
7747 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007748 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7749 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007750 }
7751 void getTargetDefines(const LangOptions &Opts,
7752 MacroBuilder &Builder) const override {
7753 DefineStd(Builder, "SPIR32", Opts);
7754 }
7755};
Guy Benyeib798fc92012-12-11 21:38:14 +00007756
Eric Christopherc48497a2015-09-18 21:26:24 +00007757class SPIR64TargetInfo : public SPIRTargetInfo {
7758public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007759 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7760 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007761 PointerWidth = PointerAlign = 64;
7762 SizeType = TargetInfo::UnsignedLong;
7763 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007764 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7765 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007766 }
7767 void getTargetDefines(const LangOptions &Opts,
7768 MacroBuilder &Builder) const override {
7769 DefineStd(Builder, "SPIR64", Opts);
7770 }
7771};
Guy Benyeib798fc92012-12-11 21:38:14 +00007772
Robert Lytton0e076492013-08-13 09:43:10 +00007773class XCoreTargetInfo : public TargetInfo {
7774 static const Builtin::Info BuiltinInfo[];
7775public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007776 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7777 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007778 BigEndian = false;
7779 NoAsmVariants = true;
7780 LongLongAlign = 32;
7781 SuitableAlign = 32;
7782 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007783 SizeType = UnsignedInt;
7784 PtrDiffType = SignedInt;
7785 IntPtrType = SignedInt;
7786 WCharType = UnsignedChar;
7787 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007788 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007789 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7790 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007791 }
Craig Topper3164f332014-03-11 03:39:26 +00007792 void getTargetDefines(const LangOptions &Opts,
7793 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007794 Builder.defineMacro("__XS1B__");
7795 }
Craig Topper6c03a542015-10-19 04:51:35 +00007796 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7797 return llvm::makeArrayRef(BuiltinInfo,
7798 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007799 }
Craig Topper3164f332014-03-11 03:39:26 +00007800 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007801 return TargetInfo::VoidPtrBuiltinVaList;
7802 }
Craig Topper3164f332014-03-11 03:39:26 +00007803 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007804 return "";
7805 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007806 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007807 static const char * const GCCRegNames[] = {
7808 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7809 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7810 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007811 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007812 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007813 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7814 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007815 }
Craig Topper3164f332014-03-11 03:39:26 +00007816 bool validateAsmConstraint(const char *&Name,
7817 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007818 return false;
7819 }
Craig Topper3164f332014-03-11 03:39:26 +00007820 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007821 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7822 return (RegNo < 2)? RegNo : -1;
7823 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007824 bool allowsLargerPreferedTypeAlignment() const override {
7825 return false;
7826 }
Robert Lytton0e076492013-08-13 09:43:10 +00007827};
7828
7829const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007830#define BUILTIN(ID, TYPE, ATTRS) \
7831 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7832#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7833 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007834#include "clang/Basic/BuiltinsXCore.def"
7835};
Robert Lytton0e076492013-08-13 09:43:10 +00007836
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007837// x86_32 Android target
7838class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7839public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007840 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7841 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007842 SuitableAlign = 32;
7843 LongDoubleWidth = 64;
7844 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7845 }
7846};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007847
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007848// x86_64 Android target
7849class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7850public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007851 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7852 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007853 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7854 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007855
7856 bool useFloat128ManglingForLongDouble() const override {
7857 return true;
7858 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007859};
7860} // end anonymous namespace
7861
Chris Lattner5ba61f02006-10-14 07:39:34 +00007862//===----------------------------------------------------------------------===//
7863// Driver code
7864//===----------------------------------------------------------------------===//
7865
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007866static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
7867 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007868 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007869
Daniel Dunbar52322032009-08-18 05:47:58 +00007870 switch (Triple.getArch()) {
7871 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007872 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007873
Tim Northover2a0783d2014-05-30 14:14:07 +00007874 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007875 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007876
7877 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007878 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007879
Jacques Pienaard964cc22016-03-28 21:02:54 +00007880 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007881 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00007882
Tim Northover2a0783d2014-05-30 14:14:07 +00007883 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007884 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007885 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007886
7887 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007888 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007889 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00007890 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007891 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007892 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007893 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00007894 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007895 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007896 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007897 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00007898 }
7899
Christian Pirker9b019ae2014-02-25 13:51:00 +00007900 case llvm::Triple::aarch64_be:
7901 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007902 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007903 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007904 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007905 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007906 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007907 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007908 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007909 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00007910 }
7911
Daniel Dunbar52322032009-08-18 05:47:58 +00007912 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007913 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007914 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007915 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007916
Daniel Dunbar52322032009-08-18 05:47:58 +00007917 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007918 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007919 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00007920 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007921 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007922 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007923 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007924 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007925 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00007926 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007927 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007928 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007929 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007930 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007931 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007932 case llvm::Triple::Win32:
7933 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007934 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007935 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00007936 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007937 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007938 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007939 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007940 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007941 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007942 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007943 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007944 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007945 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007946 }
7947
7948 case llvm::Triple::armeb:
7949 case llvm::Triple::thumbeb:
7950 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007951 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007952
7953 switch (os) {
7954 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007955 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007956 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007957 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007958 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007959 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007960 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007961 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007962 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007963 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007964 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007965 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007966 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007967 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007968 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007969 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00007970 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007971
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007972 case llvm::Triple::bpfeb:
7973 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007974 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007975
Daniel Dunbar52322032009-08-18 05:47:58 +00007976 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007977 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00007978
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007979 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007980 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007981 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007982 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007983 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007984 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007985 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007986 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007987 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007988 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007989 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007990 return new Mips32EBTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007991 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007992
7993 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007994 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007995 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007996 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007997 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007998 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007999 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008000 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008001 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008002 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008003 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008004 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008005 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008006 return new Mips32ELTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008007 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008008
Akira Hatanakabef17452011-09-20 19:21:49 +00008009 case llvm::Triple::mips64:
8010 switch (os) {
8011 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008012 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008013 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008014 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008015 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008016 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008017 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008018 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008019 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008020 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008021 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008022 return new Mips64EBTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008023 }
8024
8025 case llvm::Triple::mips64el:
8026 switch (os) {
8027 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008028 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008029 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008030 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008031 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008032 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008033 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008034 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008035 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008036 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008037 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008038 return new Mips64ELTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008039 }
8040
Ivan Krasindd7403e2011-08-24 20:22:22 +00008041 case llvm::Triple::le32:
8042 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008043 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008044 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008045 default:
8046 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008047 }
8048
JF Bastien643817d2014-09-12 17:52:47 +00008049 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008050 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008051
Daniel Dunbar52322032009-08-18 05:47:58 +00008052 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008053 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008054 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008055 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008056 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008057 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008058 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008059 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008060 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008061 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008062 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008063 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008064 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008065 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008066 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008067 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008068 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008069
8070 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008071 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008072 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008073 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008074 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008075 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008076 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008077 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008078 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008079 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008080 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008081 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008082 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008083 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008084 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008085
Bill Schmidt778d3872013-07-26 01:36:11 +00008086 case llvm::Triple::ppc64le:
8087 switch (os) {
8088 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008089 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008090 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008091 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008092 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008093 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008094 }
8095
Peter Collingbournec947aae2012-05-20 23:28:41 +00008096 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008097 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008098 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008099 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008100
Tom Stellardd8e38a32015-01-06 20:34:47 +00008101 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008102 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008103 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008104
Daniel Dunbar52322032009-08-18 05:47:58 +00008105 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008106 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008107 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008108 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008109 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008110 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008111 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008112 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008113 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008114 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008115 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008116 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008117 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008118 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008119 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008120
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008121 // The 'sparcel' architecture copies all the above cases except for Solaris.
8122 case llvm::Triple::sparcel:
8123 switch (os) {
8124 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008125 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008126 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008127 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008128 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008129 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008130 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008131 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008132 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008133 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008134 }
8135
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008136 case llvm::Triple::sparcv9:
8137 switch (os) {
8138 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008139 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008140 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008141 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008142 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008143 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008144 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008145 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008146 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008147 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008148 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008149 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008150 }
8151
Ulrich Weigand47445072013-05-06 16:26:41 +00008152 case llvm::Triple::systemz:
8153 switch (os) {
8154 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008155 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008156 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008157 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008158 }
8159
Eli Friedmana9c3d712009-08-19 20:47:07 +00008160 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008161 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008162
Daniel Dunbar52322032009-08-18 05:47:58 +00008163 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008164 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008165 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008166
Daniel Dunbar52322032009-08-18 05:47:58 +00008167 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008168 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008169 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008170 case llvm::Triple::Linux: {
8171 switch (Triple.getEnvironment()) {
8172 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008173 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008174 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008175 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008176 }
8177 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008178 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008179 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008180 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008181 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008182 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008183 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008184 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008185 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008186 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008187 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008188 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008189 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008190 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008191 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008192 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008193 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008194 case llvm::Triple::Win32: {
8195 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008196 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008197 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008198 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008199 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008200 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008201 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008202 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008203 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008204 }
8205 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008206 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008207 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008208 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008209 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008210 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008211 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008212 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008213 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008214 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008215 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008216 }
8217
8218 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008219 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008220 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008221
Daniel Dunbar52322032009-08-18 05:47:58 +00008222 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008223 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008224 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008225 case llvm::Triple::Linux: {
8226 switch (Triple.getEnvironment()) {
8227 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008228 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008229 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008230 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008231 }
8232 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008233 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008234 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008235 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008236 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008237 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008238 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008239 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008240 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008241 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008242 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008243 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008244 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008245 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008246 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008247 case llvm::Triple::Win32: {
8248 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008249 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008250 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008251 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008252 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008253 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008254 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008256 }
8257 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008258 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008260 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008262 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008264 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008265
Douglas Katzman78d7c542015-05-12 21:18:10 +00008266 case llvm::Triple::spir: {
8267 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8268 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8269 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008270 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008271 }
8272 case llvm::Triple::spir64: {
8273 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8274 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8275 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008276 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008277 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008278 case llvm::Triple::wasm32:
8279 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8280 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008281 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008282 case llvm::Triple::wasm64:
8283 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8284 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008285 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008286 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008287}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008288
8289/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008290/// options.
Alp Toker80758082014-07-06 05:26:44 +00008291TargetInfo *
8292TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008293 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008294 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008295
8296 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008297 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008298 if (!Target) {
8299 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008300 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008301 }
Alp Toker80758082014-07-06 05:26:44 +00008302 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008303
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008304 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008305 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8306 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008307 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008308 }
8309
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008310 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008311 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8312 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008313 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008314 }
8315
Rafael Espindolaeb265472013-08-21 21:59:03 +00008316 // Set the fp math unit.
8317 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8318 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008319 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008320 }
8321
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008322 // Compute the default target features, we need the target to handle this
8323 // because features may have dependencies on one another.
8324 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008325 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8326 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008327 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008328
8329 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008330 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008331 for (const auto &F : Features)
8332 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8333
Eric Christopher3ff21b32013-10-16 21:26:26 +00008334 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008335 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008336
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008337 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008338}