blob: 98827b89a1543bd2724680a4cc820936e31bcaf0 [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
Daniel Dunbarecf13562011-04-19 21:40:34 +0000211 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000212}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000213
Torok Edwinb2b37c62009-06-30 17:10:35 +0000214template<typename Target>
215class DarwinTargetInfo : public OSTargetInfo<Target> {
216protected:
Craig Topper3164f332014-03-11 03:39:26 +0000217 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
218 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000219 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000220 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221 }
Mike Stump11289f42009-09-09 15:08:12 +0000222
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000224 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
225 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000226 // By default, no TLS, and we whitelist permitted architecture/OS
227 // combinations.
228 this->TLSSupported = false;
229
230 if (Triple.isMacOSX())
231 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
232 else if (Triple.isiOS()) {
233 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
234 if (Triple.getArch() == llvm::Triple::x86_64 ||
235 Triple.getArch() == llvm::Triple::aarch64)
236 this->TLSSupported = !Triple.isOSVersionLT(8);
237 else if (Triple.getArch() == llvm::Triple::x86 ||
238 Triple.getArch() == llvm::Triple::arm ||
239 Triple.getArch() == llvm::Triple::thumb)
240 this->TLSSupported = !Triple.isOSVersionLT(9);
241 } else if (Triple.isWatchOS())
242 this->TLSSupported = !Triple.isOSVersionLT(2);
243
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000244 this->MCountName = "\01mcount";
245 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000246
Craig Topper3164f332014-03-11 03:39:26 +0000247 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000248 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000249 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000250 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000251 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000252 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000253 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000254 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000255
Craig Topper3164f332014-03-11 03:39:26 +0000256 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000257 // FIXME: We should return 0 when building kexts.
258 return "__TEXT,__StaticInit,regular,pure_instructions";
259 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000260
John McCalleed64c72012-01-29 01:20:30 +0000261 /// Darwin does not support protected visibility. Darwin's "default"
262 /// is very similar to ELF's "protected"; Darwin requires a "weak"
263 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000264 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000265 return false;
266 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000267
268 unsigned getExnObjectAlignment() const override {
269 // The alignment of an exception object is 8-bytes for darwin since
270 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
271 // and therefore doesn't guarantee 16-byte alignment.
272 return 64;
273 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274};
275
Chris Lattner30ba6742009-08-10 19:03:04 +0000276
Torok Edwinb2b37c62009-06-30 17:10:35 +0000277// DragonFlyBSD Target
278template<typename Target>
279class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
280protected:
Craig Topper3164f332014-03-11 03:39:26 +0000281 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
282 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000283 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000284 Builder.defineMacro("__DragonFly__");
285 Builder.defineMacro("__DragonFly_cc_version", "100001");
286 Builder.defineMacro("__ELF__");
287 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
288 Builder.defineMacro("__tune_i386__");
289 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290 }
291public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000292 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
293 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000294 switch (Triple.getArch()) {
295 default:
296 case llvm::Triple::x86:
297 case llvm::Triple::x86_64:
298 this->MCountName = ".mcount";
299 break;
300 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000301 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000302};
303
304// FreeBSD Target
305template<typename Target>
306class FreeBSDTargetInfo : public OSTargetInfo<Target> {
307protected:
Craig Topper3164f332014-03-11 03:39:26 +0000308 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
309 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 // FreeBSD defines; list based off of gcc output
311
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000312 unsigned Release = Triple.getOSMajorVersion();
313 if (Release == 0U)
314 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000315
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000316 Builder.defineMacro("__FreeBSD__", Twine(Release));
317 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000318 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
319 DefineStd(Builder, "unix", Opts);
320 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000321
322 // On FreeBSD, wchar_t contains the number of the code point as
323 // used by the character set of the locale. These character sets are
324 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000325 //
326 // FIXME: This is wrong; the macro refers to the numerical values
327 // of wchar_t *literals*, which are not locale-dependent. However,
328 // FreeBSD systems apparently depend on us getting this wrong, and
329 // setting this to 1 is conforming even if all the basic source
330 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000331 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000332 }
333public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000334 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
335 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000336 switch (Triple.getArch()) {
337 default:
338 case llvm::Triple::x86:
339 case llvm::Triple::x86_64:
340 this->MCountName = ".mcount";
341 break;
342 case llvm::Triple::mips:
343 case llvm::Triple::mipsel:
344 case llvm::Triple::ppc:
345 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000346 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000347 this->MCountName = "_mcount";
348 break;
349 case llvm::Triple::arm:
350 this->MCountName = "__mcount";
351 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000352 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000353 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000354};
355
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000356// GNU/kFreeBSD Target
357template<typename Target>
358class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
359protected:
Craig Topper3164f332014-03-11 03:39:26 +0000360 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
361 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000362 // GNU/kFreeBSD defines; list based off of gcc output
363
364 DefineStd(Builder, "unix", Opts);
365 Builder.defineMacro("__FreeBSD_kernel__");
366 Builder.defineMacro("__GLIBC__");
367 Builder.defineMacro("__ELF__");
368 if (Opts.POSIXThreads)
369 Builder.defineMacro("_REENTRANT");
370 if (Opts.CPlusPlus)
371 Builder.defineMacro("_GNU_SOURCE");
372 }
373public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000374 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
375 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000376};
377
Chris Lattner3e2ee142010-07-07 16:01:42 +0000378// Minix Target
379template<typename Target>
380class MinixTargetInfo : public OSTargetInfo<Target> {
381protected:
Craig Topper3164f332014-03-11 03:39:26 +0000382 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
383 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000384 // Minix defines
385
386 Builder.defineMacro("__minix", "3");
387 Builder.defineMacro("_EM_WSIZE", "4");
388 Builder.defineMacro("_EM_PSIZE", "4");
389 Builder.defineMacro("_EM_SSIZE", "2");
390 Builder.defineMacro("_EM_LSIZE", "4");
391 Builder.defineMacro("_EM_FSIZE", "4");
392 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000393 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000394 DefineStd(Builder, "unix", Opts);
395 }
396public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000397 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
398 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000399};
400
Torok Edwinb2b37c62009-06-30 17:10:35 +0000401// Linux target
402template<typename Target>
403class LinuxTargetInfo : public OSTargetInfo<Target> {
404protected:
Craig Topper3164f332014-03-11 03:39:26 +0000405 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
406 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000407 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000408 DefineStd(Builder, "unix", Opts);
409 DefineStd(Builder, "linux", Opts);
410 Builder.defineMacro("__gnu_linux__");
411 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000412 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000413 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000414 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000415 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000416 this->PlatformName = "android";
417 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
418 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000419 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000420 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000421 if (Opts.CPlusPlus)
422 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000423 }
424public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000425 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
426 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000427 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000428
429 switch (Triple.getArch()) {
430 default:
431 break;
432 case llvm::Triple::ppc:
433 case llvm::Triple::ppc64:
434 case llvm::Triple::ppc64le:
435 this->MCountName = "_mcount";
436 break;
437 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000439
Craig Topper3164f332014-03-11 03:39:26 +0000440 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000441 return ".text.startup";
442 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000443};
444
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000445// NetBSD Target
446template<typename Target>
447class NetBSDTargetInfo : public OSTargetInfo<Target> {
448protected:
Craig Topper3164f332014-03-11 03:39:26 +0000449 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
450 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000451 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000452 Builder.defineMacro("__NetBSD__");
453 Builder.defineMacro("__unix__");
454 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000455 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000456 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000457
458 switch (Triple.getArch()) {
459 default:
460 break;
461 case llvm::Triple::arm:
462 case llvm::Triple::armeb:
463 case llvm::Triple::thumb:
464 case llvm::Triple::thumbeb:
465 Builder.defineMacro("__ARM_DWARF_EH__");
466 break;
467 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000468 }
469public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000470 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
471 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000472 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000473 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000474};
475
Torok Edwinb2b37c62009-06-30 17:10:35 +0000476// OpenBSD Target
477template<typename Target>
478class OpenBSDTargetInfo : public OSTargetInfo<Target> {
479protected:
Craig Topper3164f332014-03-11 03:39:26 +0000480 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
481 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000482 // OpenBSD defines; list based off of gcc output
483
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000484 Builder.defineMacro("__OpenBSD__");
485 DefineStd(Builder, "unix", Opts);
486 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000487 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000488 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000489 }
490public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000491 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
492 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000493 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000494
Eli Friedman3715d1f2011-12-15 02:15:56 +0000495 switch (Triple.getArch()) {
496 default:
497 case llvm::Triple::x86:
498 case llvm::Triple::x86_64:
499 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000500 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000501 this->MCountName = "__mcount";
502 break;
503 case llvm::Triple::mips64:
504 case llvm::Triple::mips64el:
505 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000506 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000507 this->MCountName = "_mcount";
508 break;
509 }
510 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000511};
512
Eli Friedman9fa28852012-08-08 23:57:20 +0000513// Bitrig Target
514template<typename Target>
515class BitrigTargetInfo : public OSTargetInfo<Target> {
516protected:
Craig Topper3164f332014-03-11 03:39:26 +0000517 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
518 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000519 // Bitrig defines; list based off of gcc output
520
521 Builder.defineMacro("__Bitrig__");
522 DefineStd(Builder, "unix", Opts);
523 Builder.defineMacro("__ELF__");
524 if (Opts.POSIXThreads)
525 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000526
527 switch (Triple.getArch()) {
528 default:
529 break;
530 case llvm::Triple::arm:
531 case llvm::Triple::armeb:
532 case llvm::Triple::thumb:
533 case llvm::Triple::thumbeb:
534 Builder.defineMacro("__ARM_DWARF_EH__");
535 break;
536 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000537 }
538public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000539 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
540 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000541 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000542 }
543};
544
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000545// PSP Target
546template<typename Target>
547class PSPTargetInfo : public OSTargetInfo<Target> {
548protected:
Craig Topper3164f332014-03-11 03:39:26 +0000549 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
550 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000551 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000552 Builder.defineMacro("PSP");
553 Builder.defineMacro("_PSP");
554 Builder.defineMacro("__psp__");
555 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000556 }
557public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000558 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000559};
560
John Thompsone467e192009-11-19 17:18:50 +0000561// PS3 PPU Target
562template<typename Target>
563class PS3PPUTargetInfo : public OSTargetInfo<Target> {
564protected:
Craig Topper3164f332014-03-11 03:39:26 +0000565 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
566 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000567 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000568 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000569 Builder.defineMacro("__PPU__");
570 Builder.defineMacro("__CELLOS_LV2__");
571 Builder.defineMacro("__ELF__");
572 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000573 Builder.defineMacro("_ARCH_PPC64");
574 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000575 }
576public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000577 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
578 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000579 this->LongWidth = this->LongAlign = 32;
580 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000581 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000582 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000583 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000584 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000585 }
586};
587
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000588template <typename Target>
589class PS4OSTargetInfo : public OSTargetInfo<Target> {
590protected:
591 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
592 MacroBuilder &Builder) const override {
593 Builder.defineMacro("__FreeBSD__", "9");
594 Builder.defineMacro("__FreeBSD_cc_version", "900001");
595 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
596 DefineStd(Builder, "unix", Opts);
597 Builder.defineMacro("__ELF__");
598 Builder.defineMacro("__PS4__");
599 }
600public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000601 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
602 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000603 this->WCharType = this->UnsignedShort;
604
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000605 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
606 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000607
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000608 // On PS4, do not honor explicit bit field alignment,
609 // as in "__attribute__((aligned(2))) int b : 1;".
610 this->UseExplicitBitFieldAlignment = false;
611
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000612 switch (Triple.getArch()) {
613 default:
614 case llvm::Triple::x86_64:
615 this->MCountName = ".mcount";
616 break;
617 }
618 }
619};
620
Torok Edwinb2b37c62009-06-30 17:10:35 +0000621// Solaris target
622template<typename Target>
623class SolarisTargetInfo : public OSTargetInfo<Target> {
624protected:
Craig Topper3164f332014-03-11 03:39:26 +0000625 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
626 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000627 DefineStd(Builder, "sun", Opts);
628 DefineStd(Builder, "unix", Opts);
629 Builder.defineMacro("__ELF__");
630 Builder.defineMacro("__svr4__");
631 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000632 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
633 // newer, but to 500 for everything else. feature_test.h has a check to
634 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000635 // with a new version.
636 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000637 Builder.defineMacro("_XOPEN_SOURCE", "600");
638 else
639 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000640 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000641 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000642 Builder.defineMacro("_LARGEFILE_SOURCE");
643 Builder.defineMacro("_LARGEFILE64_SOURCE");
644 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000645 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000646 }
647public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000648 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
649 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000650 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000651 // FIXME: WIntType should be SignedLong
652 }
653};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000654
655// Windows target
656template<typename Target>
657class WindowsTargetInfo : public OSTargetInfo<Target> {
658protected:
Craig Topper3164f332014-03-11 03:39:26 +0000659 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
660 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000661 Builder.defineMacro("_WIN32");
662 }
663 void getVisualStudioDefines(const LangOptions &Opts,
664 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000665 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000666 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000667 Builder.defineMacro("_CPPRTTI");
668
Reid Kleckner16514352015-01-30 21:42:55 +0000669 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000670 Builder.defineMacro("_CPPUNWIND");
671 }
672
David Majnemer6a658902015-07-22 22:36:26 +0000673 if (Opts.Bool)
674 Builder.defineMacro("__BOOL_DEFINED");
675
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000676 if (!Opts.CharIsSigned)
677 Builder.defineMacro("_CHAR_UNSIGNED");
678
679 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
680 // but it works for now.
681 if (Opts.POSIXThreads)
682 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000683
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000684 if (Opts.MSCompatibilityVersion) {
685 Builder.defineMacro("_MSC_VER",
686 Twine(Opts.MSCompatibilityVersion / 100000));
687 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000688 // FIXME We cannot encode the revision information into 32-bits
689 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000690
David Majnemerb710a932015-05-11 03:57:49 +0000691 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000692 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000693 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000694
695 if (Opts.MicrosoftExt) {
696 Builder.defineMacro("_MSC_EXTENSIONS");
697
698 if (Opts.CPlusPlus11) {
699 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
700 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
701 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
702 }
703 }
704
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000705 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000706 }
707
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000708public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000709 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
710 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711};
712
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000713template <typename Target>
714class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000718 if (Opts.POSIXThreads)
719 Builder.defineMacro("_REENTRANT");
720 if (Opts.CPlusPlus)
721 Builder.defineMacro("_GNU_SOURCE");
722
723 DefineStd(Builder, "unix", Opts);
724 Builder.defineMacro("__ELF__");
725 Builder.defineMacro("__native_client__");
726 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000727
728public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000729 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
730 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000731 this->LongAlign = 32;
732 this->LongWidth = 32;
733 this->PointerAlign = 32;
734 this->PointerWidth = 32;
735 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000736 this->Int64Type = TargetInfo::SignedLongLong;
737 this->DoubleAlign = 64;
738 this->LongDoubleWidth = 64;
739 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000740 this->LongLongWidth = 64;
741 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000742 this->SizeType = TargetInfo::UnsignedInt;
743 this->PtrDiffType = TargetInfo::SignedInt;
744 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000745 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000746 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000747 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000748 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000749 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000750 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000751 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000752 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000753 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000754 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000755 } else {
756 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000757 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000758 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000759 }
760};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000761
Dan Gohmanc2853072015-09-03 22:51:53 +0000762// WebAssembly target
763template <typename Target>
764class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
765 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000766 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000767 // A common platform macro.
768 if (Opts.POSIXThreads)
769 Builder.defineMacro("_REENTRANT");
770 // Follow g++ convention and predefine _GNU_SOURCE for C++.
771 if (Opts.CPlusPlus)
772 Builder.defineMacro("_GNU_SOURCE");
773 }
774
775 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000776 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000777 return ".text.__startup";
778 }
779
780public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000781 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
782 const TargetOptions &Opts)
783 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000784 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000785 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
786 }
787};
Dan Gohmanc2853072015-09-03 22:51:53 +0000788
Chris Lattner09d98f52008-10-05 21:50:58 +0000789//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000790// Specific target implementations.
791//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000792
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000793// PPC abstract base class
794class PPCTargetInfo : public TargetInfo {
795 static const Builtin::Info BuiltinInfo[];
796 static const char * const GCCRegNames[];
797 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000798 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000799
800 // Target cpu features.
801 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000802 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000803 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000804 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000805 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000806 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000807 bool HasBPERMD;
808 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000809
Ulrich Weigand8afad612014-07-28 13:17:52 +0000810protected:
811 std::string ABI;
812
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000813public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000814 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000815 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
816 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000817 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000818 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000819 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000820 LongDoubleWidth = LongDoubleAlign = 128;
821 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
822 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000823
Hal Finkel6b984f02012-07-03 16:51:04 +0000824 /// \brief Flags for architecture specific defines.
825 typedef enum {
826 ArchDefineNone = 0,
827 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
828 ArchDefinePpcgr = 1 << 1,
829 ArchDefinePpcsq = 1 << 2,
830 ArchDefine440 = 1 << 3,
831 ArchDefine603 = 1 << 4,
832 ArchDefine604 = 1 << 5,
833 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000834 ArchDefinePwr5 = 1 << 7,
835 ArchDefinePwr5x = 1 << 8,
836 ArchDefinePwr6 = 1 << 9,
837 ArchDefinePwr6x = 1 << 10,
838 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000839 ArchDefinePwr8 = 1 << 12,
840 ArchDefineA2 = 1 << 13,
841 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000842 } ArchDefineTypes;
843
Bill Schmidt38378a02013-02-01 20:23:10 +0000844 // Note: GCC recognizes the following additional cpus:
845 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
846 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
847 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000848 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000849 bool CPUKnown = llvm::StringSwitch<bool>(Name)
850 .Case("generic", true)
851 .Case("440", true)
852 .Case("450", true)
853 .Case("601", true)
854 .Case("602", true)
855 .Case("603", true)
856 .Case("603e", true)
857 .Case("603ev", true)
858 .Case("604", true)
859 .Case("604e", true)
860 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000861 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000862 .Case("g3", true)
863 .Case("7400", true)
864 .Case("g4", true)
865 .Case("7450", true)
866 .Case("g4+", true)
867 .Case("750", true)
868 .Case("970", true)
869 .Case("g5", true)
870 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000871 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000872 .Case("e500mc", true)
873 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000874 .Case("power3", true)
875 .Case("pwr3", true)
876 .Case("power4", true)
877 .Case("pwr4", true)
878 .Case("power5", true)
879 .Case("pwr5", true)
880 .Case("power5x", true)
881 .Case("pwr5x", true)
882 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000883 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000884 .Case("power6x", true)
885 .Case("pwr6x", true)
886 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000887 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000888 .Case("power8", true)
889 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000890 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000891 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000892 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000893 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000894 .Case("powerpc64le", true)
895 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000896 .Default(false);
897
898 if (CPUKnown)
899 CPU = Name;
900
901 return CPUKnown;
902 }
903
Ulrich Weigand8afad612014-07-28 13:17:52 +0000904
905 StringRef getABI() const override { return ABI; }
906
Craig Topper6c03a542015-10-19 04:51:35 +0000907 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
908 return llvm::makeArrayRef(BuiltinInfo,
909 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000910 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000911
Craig Topper3164f332014-03-11 03:39:26 +0000912 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000913
Craig Topper3164f332014-03-11 03:39:26 +0000914 void getTargetDefines(const LangOptions &Opts,
915 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000916
Eric Christopher8c47b422015-10-09 18:39:55 +0000917 bool
918 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
919 StringRef CPU,
920 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000921
Craig Topper3164f332014-03-11 03:39:26 +0000922 bool handleTargetFeatures(std::vector<std::string> &Features,
923 DiagnosticsEngine &Diags) override;
924 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000925 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
926 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000927
Craig Topperf054e3a2015-10-19 03:52:27 +0000928 ArrayRef<const char *> getGCCRegNames() const override;
929 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000930 bool validateAsmConstraint(const char *&Name,
931 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000932 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000933 default: return false;
934 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000935 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000936 case 'b': // Base register
937 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000938 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000939 break;
940 // FIXME: The following are added to allow parsing.
941 // I just took a guess at what the actions should be.
942 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000943 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000944 case 'v': // Altivec vector register
945 Info.setAllowsRegister();
946 break;
947 case 'w':
948 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000949 case 'd':// VSX vector register to hold vector double data
950 case 'f':// VSX vector register to hold vector float data
951 case 's':// VSX vector register to hold scalar float data
952 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000953 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000954 break;
955 default:
956 return false;
957 }
958 Info.setAllowsRegister();
959 Name++; // Skip over 'w'.
960 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000961 case 'h': // `MQ', `CTR', or `LINK' register
962 case 'q': // `MQ' register
963 case 'c': // `CTR' register
964 case 'l': // `LINK' register
965 case 'x': // `CR' register (condition register) number 0
966 case 'y': // `CR' register (condition register)
967 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000968 Info.setAllowsRegister();
969 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000970 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000971 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000972 // (use `L' instead for SImode constants)
973 case 'K': // Unsigned 16-bit constant
974 case 'L': // Signed 16-bit constant shifted left 16 bits
975 case 'M': // Constant larger than 31
976 case 'N': // Exact power of 2
977 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000978 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000979 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000980 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000981 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000982 break;
983 case 'm': // Memory operand. Note that on PowerPC targets, m can
984 // include addresses that update the base register. It
985 // is therefore only safe to use `m' in an asm statement
986 // if that asm statement accesses the operand exactly once.
987 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000988 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000989 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000990 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000991 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000992 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
993 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000994 // register to be updated.
995 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000996 if (Name[1] != 's')
997 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000998 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000999 // include any automodification of the base register. Unlike
1000 // `m', this constraint can be used in asm statements that
1001 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001002 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001003 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001004 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001005 break;
1006 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001007 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001008 case 'Z': // Memory operand that is an indexed or indirect from a
1009 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001011 Info.setAllowsMemory();
1012 Info.setAllowsRegister();
1013 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001014 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001015 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001016 // register (`p' is preferable for asm statements)
1017 case 'S': // Constant suitable as a 64-bit mask operand
1018 case 'T': // Constant suitable as a 32-bit mask operand
1019 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001020 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001021 // instructions
1022 case 'W': // Vector constant that does not require memory
1023 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001024 break;
1025 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001026 }
John Thompson07a61a42010-06-24 22:44:13 +00001027 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001028 }
Craig Topper3164f332014-03-11 03:39:26 +00001029 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001030 std::string R;
1031 switch (*Constraint) {
1032 case 'e':
1033 case 'w':
1034 // Two-character constraint; add "^" hint for later parsing.
1035 R = std::string("^") + std::string(Constraint, 2);
1036 Constraint++;
1037 break;
1038 default:
1039 return TargetInfo::convertConstraint(Constraint);
1040 }
1041 return R;
1042 }
Craig Topper3164f332014-03-11 03:39:26 +00001043 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001044 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001045 }
Craig Topper3164f332014-03-11 03:39:26 +00001046 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001047 if (RegNo == 0) return 3;
1048 if (RegNo == 1) return 4;
1049 return -1;
1050 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001051
1052 bool hasSjLjLowering() const override {
1053 return true;
1054 }
David Majnemer2617ea62015-06-09 18:05:33 +00001055
1056 bool useFloat128ManglingForLongDouble() const override {
1057 return LongDoubleWidth == 128 &&
1058 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1059 getTriple().isOSBinFormatELF();
1060 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001061};
Anders Carlssonf511f642007-11-27 04:11:28 +00001062
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001063const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001064#define BUILTIN(ID, TYPE, ATTRS) \
1065 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1066#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1067 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001068#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001069};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001070
Eric Christopher917e9522014-11-18 22:36:15 +00001071/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001072/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001073bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001074 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001075 for (const auto &Feature : Features) {
1076 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001077 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001078 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001079 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001080 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001081 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001082 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001083 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001084 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001085 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001086 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001087 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001088 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001089 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001090 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001091 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001092 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001093 // TODO: Finish this list and add an assert that we've handled them
1094 // all.
1095 }
Eric Christopher02c33352015-08-25 00:59:11 +00001096
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001097 return true;
1098}
1099
Chris Lattnerecd49032009-03-02 22:27:17 +00001100/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1101/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001102void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001103 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001104 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001105 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001106 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001107 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001108 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001109 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001110 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001111 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001112 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001113 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001114 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001115 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001116
Chris Lattnerecd49032009-03-02 22:27:17 +00001117 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001118 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1119 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001120 } else {
1121 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1122 getTriple().getOS() != llvm::Triple::OpenBSD)
1123 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001124 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001125
Ulrich Weigand8afad612014-07-28 13:17:52 +00001126 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001127 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001128 Builder.defineMacro("_CALL_ELF", "1");
1129 if (ABI == "elfv2")
1130 Builder.defineMacro("_CALL_ELF", "2");
1131
Chris Lattnerecd49032009-03-02 22:27:17 +00001132 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001133 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1134 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001135
Chris Lattnerecd49032009-03-02 22:27:17 +00001136 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001137 if (LongDoubleWidth == 128)
1138 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001139
John Thompsone467e192009-11-19 17:18:50 +00001140 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001141 Builder.defineMacro("__VEC__", "10206");
1142 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001143 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001144
1145 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001146 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1147 .Case("440", ArchDefineName)
1148 .Case("450", ArchDefineName | ArchDefine440)
1149 .Case("601", ArchDefineName)
1150 .Case("602", ArchDefineName | ArchDefinePpcgr)
1151 .Case("603", ArchDefineName | ArchDefinePpcgr)
1152 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1153 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1154 .Case("604", ArchDefineName | ArchDefinePpcgr)
1155 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1156 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001157 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001158 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1159 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1160 .Case("750", ArchDefineName | ArchDefinePpcgr)
1161 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1162 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001163 .Case("a2", ArchDefineA2)
1164 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001165 .Case("pwr3", ArchDefinePpcgr)
1166 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1167 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1168 | ArchDefinePpcsq)
1169 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1170 | ArchDefinePpcgr | ArchDefinePpcsq)
1171 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1172 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1173 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1174 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1175 | ArchDefinePpcsq)
1176 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1177 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001178 | ArchDefinePpcgr | ArchDefinePpcsq)
1179 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1180 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1181 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001182 .Case("power3", ArchDefinePpcgr)
1183 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1184 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1185 | ArchDefinePpcsq)
1186 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1187 | ArchDefinePpcgr | ArchDefinePpcsq)
1188 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1189 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1190 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1191 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1192 | ArchDefinePpcsq)
1193 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1194 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001195 | ArchDefinePpcgr | ArchDefinePpcsq)
1196 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1197 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1198 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001199 .Default(ArchDefineNone);
1200
1201 if (defs & ArchDefineName)
1202 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1203 if (defs & ArchDefinePpcgr)
1204 Builder.defineMacro("_ARCH_PPCGR");
1205 if (defs & ArchDefinePpcsq)
1206 Builder.defineMacro("_ARCH_PPCSQ");
1207 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001208 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001209 if (defs & ArchDefine603)
1210 Builder.defineMacro("_ARCH_603");
1211 if (defs & ArchDefine604)
1212 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001213 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001214 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001215 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001216 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001217 if (defs & ArchDefinePwr5x)
1218 Builder.defineMacro("_ARCH_PWR5X");
1219 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001220 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001221 if (defs & ArchDefinePwr6x)
1222 Builder.defineMacro("_ARCH_PWR6X");
1223 if (defs & ArchDefinePwr7)
1224 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001225 if (defs & ArchDefinePwr8)
1226 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001227 if (defs & ArchDefineA2)
1228 Builder.defineMacro("_ARCH_A2");
1229 if (defs & ArchDefineA2q) {
1230 Builder.defineMacro("_ARCH_A2Q");
1231 Builder.defineMacro("_ARCH_QP");
1232 }
1233
1234 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1235 Builder.defineMacro("__bg__");
1236 Builder.defineMacro("__THW_BLUEGENE__");
1237 Builder.defineMacro("__bgq__");
1238 Builder.defineMacro("__TOS_BGQ__");
1239 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001240
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001241 if (HasVSX)
1242 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001243 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001244 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001245 if (HasP8Crypto)
1246 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001247 if (HasHTM)
1248 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001249
1250 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1251 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1252 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1253 if (PointerWidth == 64)
1254 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001255
Bill Schmidt38378a02013-02-01 20:23:10 +00001256 // FIXME: The following are not yet generated here by Clang, but are
1257 // generated by GCC:
1258 //
1259 // _SOFT_FLOAT_
1260 // __RECIP_PRECISION__
1261 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001262 // __RECIP__
1263 // __RECIPF__
1264 // __RSQRTE__
1265 // __RSQRTEF__
1266 // _SOFT_DOUBLE_
1267 // __NO_LWSYNC__
1268 // __HAVE_BSWAP__
1269 // __LONGDOUBLE128
1270 // __CMODEL_MEDIUM__
1271 // __CMODEL_LARGE__
1272 // _CALL_SYSV
1273 // _CALL_DARWIN
1274 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001275}
1276
Eric Christophera8a14c32015-08-31 18:39:16 +00001277// Handle explicit options being passed to the compiler here: if we've
1278// explicitly turned off vsx and turned on power8-vector or direct-move then
1279// go ahead and error since the customer has expressed a somewhat incompatible
1280// set of options.
1281static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001282 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001283
1284 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1285 FeaturesVec.end()) {
1286 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1287 FeaturesVec.end()) {
1288 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1289 << "-mno-vsx";
1290 return false;
1291 }
1292
1293 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1294 FeaturesVec.end()) {
1295 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1296 << "-mno-vsx";
1297 return false;
1298 }
1299 }
1300
1301 return true;
1302}
1303
Eric Christopher8c47b422015-10-09 18:39:55 +00001304bool PPCTargetInfo::initFeatureMap(
1305 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1306 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001307 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1308 .Case("7400", true)
1309 .Case("g4", true)
1310 .Case("7450", true)
1311 .Case("g4+", true)
1312 .Case("970", true)
1313 .Case("g5", true)
1314 .Case("pwr6", true)
1315 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001316 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001317 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001318 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001319 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001320
1321 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001322 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1323 .Case("ppc64le", true)
1324 .Case("pwr8", true)
1325 .Default(false);
1326 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1327 .Case("ppc64le", true)
1328 .Case("pwr8", true)
1329 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001330 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1331 .Case("ppc64le", true)
1332 .Case("pwr8", true)
1333 .Case("pwr7", true)
1334 .Default(false);
1335 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1336 .Case("ppc64le", true)
1337 .Case("pwr8", true)
1338 .Case("pwr7", true)
1339 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001340 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1341 .Case("ppc64le", true)
1342 .Case("pwr8", true)
1343 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001344 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1345 .Case("ppc64le", true)
1346 .Case("pwr8", true)
1347 .Case("pwr7", true)
1348 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001349
Eric Christophera8a14c32015-08-31 18:39:16 +00001350 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1351 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001352
Eric Christopher007b0a02015-08-28 22:32:01 +00001353 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001354}
1355
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001356bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001357 return llvm::StringSwitch<bool>(Feature)
1358 .Case("powerpc", true)
1359 .Case("vsx", HasVSX)
1360 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001361 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001362 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001363 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001364 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001365 .Case("bpermd", HasBPERMD)
1366 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001367 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001368}
Chris Lattner17df24e2008-04-21 18:56:49 +00001369
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001370void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1371 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001372 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1373 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1374 // incompatible options.
1375 if (Enabled) {
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +00001376 if (Name == "vsx") {
1377 Features[Name] = true;
1378 } else if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001379 Features[Name] = Features["vsx"] = true;
1380 } else if (Name == "power8-vector") {
1381 Features[Name] = Features["vsx"] = true;
1382 } else {
1383 Features[Name] = true;
1384 }
1385 } else {
1386 if (Name == "vsx") {
1387 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +00001388 false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001389 } else {
1390 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001391 }
1392 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001393}
1394
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001395const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001396 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1397 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1398 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1399 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1400 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1401 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1402 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1403 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001404 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001405 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001406 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001407 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1408 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1409 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1410 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001411 "vrsave", "vscr",
1412 "spe_acc", "spefscr",
1413 "sfp"
1414};
Chris Lattner10a5b382007-01-29 05:24:35 +00001415
Craig Topperf054e3a2015-10-19 03:52:27 +00001416ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1417 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001418}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001419
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001420const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1421 // While some of these aliases do map to different registers
1422 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001423 { { "0" }, "r0" },
1424 { { "1"}, "r1" },
1425 { { "2" }, "r2" },
1426 { { "3" }, "r3" },
1427 { { "4" }, "r4" },
1428 { { "5" }, "r5" },
1429 { { "6" }, "r6" },
1430 { { "7" }, "r7" },
1431 { { "8" }, "r8" },
1432 { { "9" }, "r9" },
1433 { { "10" }, "r10" },
1434 { { "11" }, "r11" },
1435 { { "12" }, "r12" },
1436 { { "13" }, "r13" },
1437 { { "14" }, "r14" },
1438 { { "15" }, "r15" },
1439 { { "16" }, "r16" },
1440 { { "17" }, "r17" },
1441 { { "18" }, "r18" },
1442 { { "19" }, "r19" },
1443 { { "20" }, "r20" },
1444 { { "21" }, "r21" },
1445 { { "22" }, "r22" },
1446 { { "23" }, "r23" },
1447 { { "24" }, "r24" },
1448 { { "25" }, "r25" },
1449 { { "26" }, "r26" },
1450 { { "27" }, "r27" },
1451 { { "28" }, "r28" },
1452 { { "29" }, "r29" },
1453 { { "30" }, "r30" },
1454 { { "31" }, "r31" },
1455 { { "fr0" }, "f0" },
1456 { { "fr1" }, "f1" },
1457 { { "fr2" }, "f2" },
1458 { { "fr3" }, "f3" },
1459 { { "fr4" }, "f4" },
1460 { { "fr5" }, "f5" },
1461 { { "fr6" }, "f6" },
1462 { { "fr7" }, "f7" },
1463 { { "fr8" }, "f8" },
1464 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001465 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001466 { { "fr11" }, "f11" },
1467 { { "fr12" }, "f12" },
1468 { { "fr13" }, "f13" },
1469 { { "fr14" }, "f14" },
1470 { { "fr15" }, "f15" },
1471 { { "fr16" }, "f16" },
1472 { { "fr17" }, "f17" },
1473 { { "fr18" }, "f18" },
1474 { { "fr19" }, "f19" },
1475 { { "fr20" }, "f20" },
1476 { { "fr21" }, "f21" },
1477 { { "fr22" }, "f22" },
1478 { { "fr23" }, "f23" },
1479 { { "fr24" }, "f24" },
1480 { { "fr25" }, "f25" },
1481 { { "fr26" }, "f26" },
1482 { { "fr27" }, "f27" },
1483 { { "fr28" }, "f28" },
1484 { { "fr29" }, "f29" },
1485 { { "fr30" }, "f30" },
1486 { { "fr31" }, "f31" },
1487 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001488};
1489
Craig Topperf054e3a2015-10-19 03:52:27 +00001490ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1491 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001492}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001493
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001494class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001495public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001496 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1497 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001498 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001499
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001500 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001501 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001502 case llvm::Triple::FreeBSD:
1503 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001504 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001505 PtrDiffType = SignedInt;
1506 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001507 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001508 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001509 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001510 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001511
Roman Divacky3ffe7462012-03-13 19:20:17 +00001512 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1513 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001514 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001515 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001516
1517 // PPC32 supports atomics up to 4 bytes.
1518 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001519 }
1520
Craig Topper3164f332014-03-11 03:39:26 +00001521 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001522 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001523 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001524 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001525};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001526
Bill Schmidt778d3872013-07-26 01:36:11 +00001527// Note: ABI differences may eventually require us to have a separate
1528// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001529class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001530public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001531 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1532 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001533 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001534 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001535 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001536
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001537 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001538 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001539 ABI = "elfv2";
1540 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001541 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001542 ABI = "elfv1";
1543 }
1544
1545 switch (getTriple().getOS()) {
1546 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001547 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001548 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001549 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001550 case llvm::Triple::NetBSD:
1551 IntMaxType = SignedLongLong;
1552 Int64Type = SignedLongLong;
1553 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001554 default:
1555 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001556 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001557
1558 // PPC64 supports atomics up to 8 bytes.
1559 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001560 }
Craig Topper3164f332014-03-11 03:39:26 +00001561 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001562 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001563 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001564 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001565 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001566 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001567 ABI = Name;
1568 return true;
1569 }
1570 return false;
1571 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001572};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001573
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001574class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001575public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001576 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1577 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001578 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001579 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001580 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001581 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001582 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001583 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001584 }
Craig Topper3164f332014-03-11 03:39:26 +00001585 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001586 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001587 }
1588};
1589
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001590class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001591public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001592 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1593 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001594 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001595 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001596 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001597 }
1598};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001599
Eric Christopherc48497a2015-09-18 21:26:24 +00001600static const unsigned NVPTXAddrSpaceMap[] = {
1601 1, // opencl_global
1602 3, // opencl_local
1603 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001604 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001605 0, // opencl_generic
1606 1, // cuda_device
1607 4, // cuda_constant
1608 3, // cuda_shared
1609};
1610
1611class NVPTXTargetInfo : public TargetInfo {
1612 static const char *const GCCRegNames[];
1613 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001614
1615 // The GPU profiles supported by the NVPTX backend
1616 enum GPUKind {
1617 GK_NONE,
1618 GK_SM20,
1619 GK_SM21,
1620 GK_SM30,
1621 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001622 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001623 } GPU;
1624
Eric Christopherc48497a2015-09-18 21:26:24 +00001625public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001626 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
1627 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001628 BigEndian = false;
1629 TLSSupported = false;
1630 LongWidth = LongAlign = 64;
1631 AddrSpaceMap = &NVPTXAddrSpaceMap;
1632 UseAddrSpaceMapMangling = true;
1633 // Define available target features
1634 // These must be defined in sorted order!
1635 NoAsmVariants = true;
1636 // Set the default GPU to sm20
1637 GPU = GK_SM20;
1638 }
1639 void getTargetDefines(const LangOptions &Opts,
1640 MacroBuilder &Builder) const override {
1641 Builder.defineMacro("__PTX__");
1642 Builder.defineMacro("__NVPTX__");
1643 if (Opts.CUDAIsDevice) {
1644 // Set __CUDA_ARCH__ for the GPU specified.
1645 std::string CUDAArchCode;
1646 switch (GPU) {
1647 case GK_SM20:
1648 CUDAArchCode = "200";
1649 break;
1650 case GK_SM21:
1651 CUDAArchCode = "210";
1652 break;
1653 case GK_SM30:
1654 CUDAArchCode = "300";
1655 break;
1656 case GK_SM35:
1657 CUDAArchCode = "350";
1658 break;
1659 case GK_SM37:
1660 CUDAArchCode = "370";
1661 break;
1662 default:
1663 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001664 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001665 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001666 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001667 }
Craig Topper6c03a542015-10-19 04:51:35 +00001668 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1669 return llvm::makeArrayRef(BuiltinInfo,
1670 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001671 }
1672 bool hasFeature(StringRef Feature) const override {
1673 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001674 }
1675
Craig Topperf054e3a2015-10-19 03:52:27 +00001676 ArrayRef<const char *> getGCCRegNames() const override;
1677 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001678 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001679 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001680 }
1681 bool validateAsmConstraint(const char *&Name,
1682 TargetInfo::ConstraintInfo &Info) const override {
1683 switch (*Name) {
1684 default:
1685 return false;
1686 case 'c':
1687 case 'h':
1688 case 'r':
1689 case 'l':
1690 case 'f':
1691 case 'd':
1692 Info.setAllowsRegister();
1693 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001694 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001695 }
1696 const char *getClobbers() const override {
1697 // FIXME: Is this really right?
1698 return "";
1699 }
1700 BuiltinVaListKind getBuiltinVaListKind() const override {
1701 // FIXME: implement
1702 return TargetInfo::CharPtrBuiltinVaList;
1703 }
1704 bool setCPU(const std::string &Name) override {
1705 GPU = llvm::StringSwitch<GPUKind>(Name)
1706 .Case("sm_20", GK_SM20)
1707 .Case("sm_21", GK_SM21)
1708 .Case("sm_30", GK_SM30)
1709 .Case("sm_35", GK_SM35)
1710 .Case("sm_37", GK_SM37)
1711 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001712
Eric Christopherc48497a2015-09-18 21:26:24 +00001713 return GPU != GK_NONE;
1714 }
1715};
1716
1717const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1718#define BUILTIN(ID, TYPE, ATTRS) \
1719 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1720#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1721 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1722#include "clang/Basic/BuiltinsNVPTX.def"
1723};
1724
1725const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1726
Craig Topperf054e3a2015-10-19 03:52:27 +00001727ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1728 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001729}
1730
1731class NVPTX32TargetInfo : public NVPTXTargetInfo {
1732public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001733 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1734 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001735 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001736 PointerWidth = PointerAlign = 32;
1737 SizeType = TargetInfo::UnsignedInt;
1738 PtrDiffType = TargetInfo::SignedInt;
1739 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001740 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001741 }
1742};
1743
1744class NVPTX64TargetInfo : public NVPTXTargetInfo {
1745public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001746 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1747 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001748 PointerWidth = PointerAlign = 64;
1749 SizeType = TargetInfo::UnsignedLong;
1750 PtrDiffType = TargetInfo::SignedLong;
1751 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001752 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001753 }
1754};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001755
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001756static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001757 1, // opencl_global
1758 3, // opencl_local
1759 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001760 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001761 1, // cuda_device
1762 2, // cuda_constant
1763 3 // cuda_shared
1764};
1765
Tom Stellarda96344b2014-08-21 13:58:40 +00001766// If you edit the description strings, make sure you update
1767// getPointerWidthV().
1768
Craig Topper273dbc62015-10-18 05:29:26 +00001769static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001770 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1771 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001772
Craig Topper273dbc62015-10-18 05:29:26 +00001773static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001774 "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 +00001775 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1776 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001777
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001778class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001779 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001780 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001781
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001782 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001783 enum GPUKind {
1784 GK_NONE,
1785 GK_R600,
1786 GK_R600_DOUBLE_OPS,
1787 GK_R700,
1788 GK_R700_DOUBLE_OPS,
1789 GK_EVERGREEN,
1790 GK_EVERGREEN_DOUBLE_OPS,
1791 GK_NORTHERN_ISLANDS,
1792 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001793 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001794 GK_SEA_ISLANDS,
1795 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001796 } GPU;
1797
Jan Veselyeebeaea2015-05-04 19:53:36 +00001798 bool hasFP64:1;
1799 bool hasFMAF:1;
1800 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001801
Eli Friedmand13b41e2012-10-12 23:32:00 +00001802public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001803 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
1804 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001805 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001806 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001807 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001808 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001809 hasFMAF = true;
1810 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001811 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001812 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001813 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001814 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001815 hasFMAF = false;
1816 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001817 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001818 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001819 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001820 }
1821
Tom Stellarda96344b2014-08-21 13:58:40 +00001822 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1823 if (GPU <= GK_CAYMAN)
1824 return 32;
1825
1826 switch(AddrSpace) {
1827 default:
1828 return 64;
1829 case 0:
1830 case 3:
1831 case 5:
1832 return 32;
1833 }
1834 }
1835
Craig Topper3164f332014-03-11 03:39:26 +00001836 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001837 return "";
1838 }
1839
Craig Topperf054e3a2015-10-19 03:52:27 +00001840 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001841
Craig Topperf054e3a2015-10-19 03:52:27 +00001842 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1843 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001844 }
1845
Craig Topper3164f332014-03-11 03:39:26 +00001846 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001847 TargetInfo::ConstraintInfo &Info) const override {
1848 switch (*Name) {
1849 default: break;
1850 case 'v': // vgpr
1851 case 's': // sgpr
1852 Info.setAllowsRegister();
1853 return true;
1854 }
1855 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001856 }
1857
Craig Topper6c03a542015-10-19 04:51:35 +00001858 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1859 return llvm::makeArrayRef(BuiltinInfo,
1860 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001861 }
1862
Craig Topper3164f332014-03-11 03:39:26 +00001863 void getTargetDefines(const LangOptions &Opts,
1864 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001865 if (getTriple().getArch() == llvm::Triple::amdgcn)
1866 Builder.defineMacro("__AMDGCN__");
1867 else
1868 Builder.defineMacro("__R600__");
1869
Jan Veselyeebeaea2015-05-04 19:53:36 +00001870 if (hasFMAF)
1871 Builder.defineMacro("__HAS_FMAF__");
1872 if (hasLDEXPF)
1873 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001874 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001875 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001876 if (Opts.OpenCL) {
1877 if (GPU >= GK_NORTHERN_ISLANDS) {
1878 Builder.defineMacro("cl_khr_byte_addressable_store");
1879 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1880 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1881 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1882 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1883 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001884 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001885 }
1886
Craig Topper3164f332014-03-11 03:39:26 +00001887 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001888 return TargetInfo::CharPtrBuiltinVaList;
1889 }
1890
Craig Topper3164f332014-03-11 03:39:26 +00001891 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001892 GPU = llvm::StringSwitch<GPUKind>(Name)
1893 .Case("r600" , GK_R600)
1894 .Case("rv610", GK_R600)
1895 .Case("rv620", GK_R600)
1896 .Case("rv630", GK_R600)
1897 .Case("rv635", GK_R600)
1898 .Case("rs780", GK_R600)
1899 .Case("rs880", GK_R600)
1900 .Case("rv670", GK_R600_DOUBLE_OPS)
1901 .Case("rv710", GK_R700)
1902 .Case("rv730", GK_R700)
1903 .Case("rv740", GK_R700_DOUBLE_OPS)
1904 .Case("rv770", GK_R700_DOUBLE_OPS)
1905 .Case("palm", GK_EVERGREEN)
1906 .Case("cedar", GK_EVERGREEN)
1907 .Case("sumo", GK_EVERGREEN)
1908 .Case("sumo2", GK_EVERGREEN)
1909 .Case("redwood", GK_EVERGREEN)
1910 .Case("juniper", GK_EVERGREEN)
1911 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1912 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1913 .Case("barts", GK_NORTHERN_ISLANDS)
1914 .Case("turks", GK_NORTHERN_ISLANDS)
1915 .Case("caicos", GK_NORTHERN_ISLANDS)
1916 .Case("cayman", GK_CAYMAN)
1917 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001918 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001919 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1920 .Case("verde", GK_SOUTHERN_ISLANDS)
1921 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001922 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001923 .Case("bonaire", GK_SEA_ISLANDS)
1924 .Case("kabini", GK_SEA_ISLANDS)
1925 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001926 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001927 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001928 .Case("tonga", GK_VOLCANIC_ISLANDS)
1929 .Case("iceland", GK_VOLCANIC_ISLANDS)
1930 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00001931 .Case("fiji", GK_VOLCANIC_ISLANDS)
1932 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001933 .Default(GK_NONE);
1934
1935 if (GPU == GK_NONE) {
1936 return false;
1937 }
1938
1939 // Set the correct data layout
1940 switch (GPU) {
1941 case GK_NONE:
1942 case GK_R600:
1943 case GK_R700:
1944 case GK_EVERGREEN:
1945 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001946 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001947 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001948 hasFMAF = false;
1949 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001950 break;
1951 case GK_R600_DOUBLE_OPS:
1952 case GK_R700_DOUBLE_OPS:
1953 case GK_EVERGREEN_DOUBLE_OPS:
1954 case GK_CAYMAN:
Matt Arsenaultedc7c6b2016-03-30 21:32:37 +00001955 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001956 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001957 hasFMAF = true;
1958 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001959 break;
1960 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001961 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001962 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001963 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001964 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001965 hasFMAF = true;
1966 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001967 break;
1968 }
1969
1970 return true;
1971 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001972};
1973
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001974const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001975#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001976 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001977#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001978};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001979const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001980 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1981 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1982 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1983 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1984 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1985 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1986 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1987 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1988 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1989 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1990 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1991 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1992 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1993 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1994 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1995 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1996 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1997 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1998 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1999 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2000 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2001 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2002 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2003 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2004 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2005 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2006 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2007 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2008 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2009 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2010 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2011 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2012 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2013 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2014 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2015 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2016 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2017 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2018 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2019 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2020 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2021 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2022 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2023 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2024 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2025 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2026 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002027 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002028 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2029 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002030};
2031
Craig Topperf054e3a2015-10-19 03:52:27 +00002032ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2033 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002034}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002035
Eli Friedman3fd920a2008-08-20 02:34:37 +00002036// Namespace for x86 abstract base class
2037const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002038#define BUILTIN(ID, TYPE, ATTRS) \
2039 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002040#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002041 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002042#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002043 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002044#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002045};
Eli Friedmanb5366062008-05-20 14:21:01 +00002046
Nuno Lopescfca1f02009-12-23 17:49:57 +00002047static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002048 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2049 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002050 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002051 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2052 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2053 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002054 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002055 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2056 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002057 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2058 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2059 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2060 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2061 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2062 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2063 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2064 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002065};
2066
Eric Christophercdd36352011-06-21 00:05:20 +00002067const TargetInfo::AddlRegName AddlRegNames[] = {
2068 { { "al", "ah", "eax", "rax" }, 0 },
2069 { { "bl", "bh", "ebx", "rbx" }, 3 },
2070 { { "cl", "ch", "ecx", "rcx" }, 2 },
2071 { { "dl", "dh", "edx", "rdx" }, 1 },
2072 { { "esi", "rsi" }, 4 },
2073 { { "edi", "rdi" }, 5 },
2074 { { "esp", "rsp" }, 7 },
2075 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002076 { { "r8d", "r8w", "r8b" }, 38 },
2077 { { "r9d", "r9w", "r9b" }, 39 },
2078 { { "r10d", "r10w", "r10b" }, 40 },
2079 { { "r11d", "r11w", "r11b" }, 41 },
2080 { { "r12d", "r12w", "r12b" }, 42 },
2081 { { "r13d", "r13w", "r13b" }, 43 },
2082 { { "r14d", "r14w", "r14b" }, 44 },
2083 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002084};
2085
2086// X86 target abstract base class; x86-32 and x86-64 are very close, so
2087// most of the implementation can be shared.
2088class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002089 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002090 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002091 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002092 enum MMX3DNowEnum {
2093 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002094 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002095 enum XOPEnum {
2096 NoXOP,
2097 SSE4A,
2098 FMA4,
2099 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002100 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002101
Craig Topper543f3bd2015-10-14 23:47:57 +00002102 bool HasAES = false;
2103 bool HasPCLMUL = false;
2104 bool HasLZCNT = false;
2105 bool HasRDRND = false;
2106 bool HasFSGSBASE = false;
2107 bool HasBMI = false;
2108 bool HasBMI2 = false;
2109 bool HasPOPCNT = false;
2110 bool HasRTM = false;
2111 bool HasPRFCHW = false;
2112 bool HasRDSEED = false;
2113 bool HasADX = false;
2114 bool HasTBM = false;
2115 bool HasFMA = false;
2116 bool HasF16C = false;
2117 bool HasAVX512CD = false;
2118 bool HasAVX512ER = false;
2119 bool HasAVX512PF = false;
2120 bool HasAVX512DQ = false;
2121 bool HasAVX512BW = false;
2122 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002123 bool HasAVX512VBMI = false;
2124 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002125 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002126 bool HasMPX = false;
2127 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002128 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002129 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002130 bool HasXSAVE = false;
2131 bool HasXSAVEOPT = false;
2132 bool HasXSAVEC = false;
2133 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002134 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002135 bool HasCLFLUSHOPT = false;
2136 bool HasPCOMMIT = false;
2137 bool HasCLWB = false;
2138 bool HasUMIP = false;
2139 bool HasMOVBE = false;
2140 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002141
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002142 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2143 ///
2144 /// Each enumeration represents a particular CPU supported by Clang. These
2145 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2146 enum CPUKind {
2147 CK_Generic,
2148
2149 /// \name i386
2150 /// i386-generation processors.
2151 //@{
2152 CK_i386,
2153 //@}
2154
2155 /// \name i486
2156 /// i486-generation processors.
2157 //@{
2158 CK_i486,
2159 CK_WinChipC6,
2160 CK_WinChip2,
2161 CK_C3,
2162 //@}
2163
2164 /// \name i586
2165 /// i586-generation processors, P5 microarchitecture based.
2166 //@{
2167 CK_i586,
2168 CK_Pentium,
2169 CK_PentiumMMX,
2170 //@}
2171
2172 /// \name i686
2173 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2174 //@{
2175 CK_i686,
2176 CK_PentiumPro,
2177 CK_Pentium2,
2178 CK_Pentium3,
2179 CK_Pentium3M,
2180 CK_PentiumM,
2181 CK_C3_2,
2182
2183 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2184 /// Clang however has some logic to suport this.
2185 // FIXME: Warn, deprecate, and potentially remove this.
2186 CK_Yonah,
2187 //@}
2188
2189 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002190 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002191 //@{
2192 CK_Pentium4,
2193 CK_Pentium4M,
2194 CK_Prescott,
2195 CK_Nocona,
2196 //@}
2197
2198 /// \name Core
2199 /// Core microarchitecture based processors.
2200 //@{
2201 CK_Core2,
2202
2203 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2204 /// codename which GCC no longer accepts as an option to -march, but Clang
2205 /// has some logic for recognizing it.
2206 // FIXME: Warn, deprecate, and potentially remove this.
2207 CK_Penryn,
2208 //@}
2209
2210 /// \name Atom
2211 /// Atom processors
2212 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002213 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002214 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002215 //@}
2216
2217 /// \name Nehalem
2218 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002219 CK_Nehalem,
2220
2221 /// \name Westmere
2222 /// Westmere microarchitecture based processors.
2223 CK_Westmere,
2224
2225 /// \name Sandy Bridge
2226 /// Sandy Bridge microarchitecture based processors.
2227 CK_SandyBridge,
2228
2229 /// \name Ivy Bridge
2230 /// Ivy Bridge microarchitecture based processors.
2231 CK_IvyBridge,
2232
2233 /// \name Haswell
2234 /// Haswell microarchitecture based processors.
2235 CK_Haswell,
2236
2237 /// \name Broadwell
2238 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002239 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002240
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002241 /// \name Skylake Client
2242 /// Skylake client microarchitecture based processors.
2243 CK_SkylakeClient,
2244
2245 /// \name Skylake Server
2246 /// Skylake server microarchitecture based processors.
2247 CK_SkylakeServer,
2248
2249 /// \name Cannonlake Client
2250 /// Cannonlake client microarchitecture based processors.
2251 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002252
Craig Topper449314e2013-08-20 07:09:39 +00002253 /// \name Knights Landing
2254 /// Knights Landing processor.
2255 CK_KNL,
2256
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002257 /// \name Lakemont
2258 /// Lakemont microarchitecture based processors.
2259 CK_Lakemont,
2260
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002261 /// \name K6
2262 /// K6 architecture processors.
2263 //@{
2264 CK_K6,
2265 CK_K6_2,
2266 CK_K6_3,
2267 //@}
2268
2269 /// \name K7
2270 /// K7 architecture processors.
2271 //@{
2272 CK_Athlon,
2273 CK_AthlonThunderbird,
2274 CK_Athlon4,
2275 CK_AthlonXP,
2276 CK_AthlonMP,
2277 //@}
2278
2279 /// \name K8
2280 /// K8 architecture processors.
2281 //@{
2282 CK_Athlon64,
2283 CK_Athlon64SSE3,
2284 CK_AthlonFX,
2285 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002286 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002287 CK_Opteron,
2288 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002289 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002290 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002291
Benjamin Kramer569f2152012-01-10 11:50:18 +00002292 /// \name Bobcat
2293 /// Bobcat architecture processors.
2294 //@{
2295 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002296 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002297 //@}
2298
2299 /// \name Bulldozer
2300 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002301 //@{
2302 CK_BDVER1,
2303 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002304 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002305 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002306 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002307
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002308 /// This specification is deprecated and will be removed in the future.
2309 /// Users should prefer \see CK_K8.
2310 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002311 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002312 CK_x86_64,
2313 //@}
2314
2315 /// \name Geode
2316 /// Geode processors.
2317 //@{
2318 CK_Geode
2319 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002320 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002321
Eric Christopherc50738f2015-08-27 00:05:50 +00002322 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002323 return llvm::StringSwitch<CPUKind>(CPU)
2324 .Case("i386", CK_i386)
2325 .Case("i486", CK_i486)
2326 .Case("winchip-c6", CK_WinChipC6)
2327 .Case("winchip2", CK_WinChip2)
2328 .Case("c3", CK_C3)
2329 .Case("i586", CK_i586)
2330 .Case("pentium", CK_Pentium)
2331 .Case("pentium-mmx", CK_PentiumMMX)
2332 .Case("i686", CK_i686)
2333 .Case("pentiumpro", CK_PentiumPro)
2334 .Case("pentium2", CK_Pentium2)
2335 .Case("pentium3", CK_Pentium3)
2336 .Case("pentium3m", CK_Pentium3M)
2337 .Case("pentium-m", CK_PentiumM)
2338 .Case("c3-2", CK_C3_2)
2339 .Case("yonah", CK_Yonah)
2340 .Case("pentium4", CK_Pentium4)
2341 .Case("pentium4m", CK_Pentium4M)
2342 .Case("prescott", CK_Prescott)
2343 .Case("nocona", CK_Nocona)
2344 .Case("core2", CK_Core2)
2345 .Case("penryn", CK_Penryn)
2346 .Case("bonnell", CK_Bonnell)
2347 .Case("atom", CK_Bonnell) // Legacy name.
2348 .Case("silvermont", CK_Silvermont)
2349 .Case("slm", CK_Silvermont) // Legacy name.
2350 .Case("nehalem", CK_Nehalem)
2351 .Case("corei7", CK_Nehalem) // Legacy name.
2352 .Case("westmere", CK_Westmere)
2353 .Case("sandybridge", CK_SandyBridge)
2354 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2355 .Case("ivybridge", CK_IvyBridge)
2356 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2357 .Case("haswell", CK_Haswell)
2358 .Case("core-avx2", CK_Haswell) // Legacy name.
2359 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002360 .Case("skylake", CK_SkylakeClient)
2361 .Case("skylake-avx512", CK_SkylakeServer)
2362 .Case("skx", CK_SkylakeServer) // Legacy name.
2363 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002364 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002365 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002366 .Case("k6", CK_K6)
2367 .Case("k6-2", CK_K6_2)
2368 .Case("k6-3", CK_K6_3)
2369 .Case("athlon", CK_Athlon)
2370 .Case("athlon-tbird", CK_AthlonThunderbird)
2371 .Case("athlon-4", CK_Athlon4)
2372 .Case("athlon-xp", CK_AthlonXP)
2373 .Case("athlon-mp", CK_AthlonMP)
2374 .Case("athlon64", CK_Athlon64)
2375 .Case("athlon64-sse3", CK_Athlon64SSE3)
2376 .Case("athlon-fx", CK_AthlonFX)
2377 .Case("k8", CK_K8)
2378 .Case("k8-sse3", CK_K8SSE3)
2379 .Case("opteron", CK_Opteron)
2380 .Case("opteron-sse3", CK_OpteronSSE3)
2381 .Case("barcelona", CK_AMDFAM10)
2382 .Case("amdfam10", CK_AMDFAM10)
2383 .Case("btver1", CK_BTVER1)
2384 .Case("btver2", CK_BTVER2)
2385 .Case("bdver1", CK_BDVER1)
2386 .Case("bdver2", CK_BDVER2)
2387 .Case("bdver3", CK_BDVER3)
2388 .Case("bdver4", CK_BDVER4)
2389 .Case("x86-64", CK_x86_64)
2390 .Case("geode", CK_Geode)
2391 .Default(CK_Generic);
2392 }
2393
Rafael Espindolaeb265472013-08-21 21:59:03 +00002394 enum FPMathKind {
2395 FP_Default,
2396 FP_SSE,
2397 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002398 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002399
Eli Friedman3fd920a2008-08-20 02:34:37 +00002400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002401 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2402 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002403 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002404 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002405 }
Craig Topper3164f332014-03-11 03:39:26 +00002406 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002407 // X87 evaluates with 80 bits "long double" precision.
2408 return SSELevel == NoSSE ? 2 : 0;
2409 }
Craig Topper6c03a542015-10-19 04:51:35 +00002410 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2411 return llvm::makeArrayRef(BuiltinInfo,
2412 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002413 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002414 ArrayRef<const char *> getGCCRegNames() const override {
2415 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002416 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002417 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2418 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002419 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002420 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2421 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002422 }
Eric Christopherd9832702015-06-29 21:00:05 +00002423 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002424 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002425 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002426
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002427 bool validateGlobalRegisterVariable(StringRef RegName,
2428 unsigned RegSize,
2429 bool &HasSizeMismatch) const override {
2430 // esp and ebp are the only 32-bit registers the x86 backend can currently
2431 // handle.
2432 if (RegName.equals("esp") || RegName.equals("ebp")) {
2433 // Check that the register size is 32-bit.
2434 HasSizeMismatch = RegSize != 32;
2435 return true;
2436 }
2437
2438 return false;
2439 }
2440
Akira Hatanaka974131e2014-09-18 18:17:18 +00002441 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2442
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002443 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2444
Akira Hatanaka974131e2014-09-18 18:17:18 +00002445 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2446
Craig Topper3164f332014-03-11 03:39:26 +00002447 std::string convertConstraint(const char *&Constraint) const override;
2448 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002449 return "~{dirflag},~{fpsr},~{flags}";
2450 }
Craig Topper3164f332014-03-11 03:39:26 +00002451 void getTargetDefines(const LangOptions &Opts,
2452 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002453 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2454 bool Enabled);
2455 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2456 bool Enabled);
2457 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2458 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002459 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2460 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002461 setFeatureEnabledImpl(Features, Name, Enabled);
2462 }
2463 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002464 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002465 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2466 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002467 bool
2468 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2469 StringRef CPU,
2470 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002471 bool hasFeature(StringRef Feature) const override;
2472 bool handleTargetFeatures(std::vector<std::string> &Features,
2473 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002474 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002475 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2476 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002477 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002478 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002479 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002480 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002481 return "no-mmx";
2482 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002483 }
Craig Topper3164f332014-03-11 03:39:26 +00002484 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002485 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002486
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002487 // Perform any per-CPU checks necessary to determine if this CPU is
2488 // acceptable.
2489 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2490 // invalid without explaining *why*.
2491 switch (CPU) {
2492 case CK_Generic:
2493 // No processor selected!
2494 return false;
2495
2496 case CK_i386:
2497 case CK_i486:
2498 case CK_WinChipC6:
2499 case CK_WinChip2:
2500 case CK_C3:
2501 case CK_i586:
2502 case CK_Pentium:
2503 case CK_PentiumMMX:
2504 case CK_i686:
2505 case CK_PentiumPro:
2506 case CK_Pentium2:
2507 case CK_Pentium3:
2508 case CK_Pentium3M:
2509 case CK_PentiumM:
2510 case CK_Yonah:
2511 case CK_C3_2:
2512 case CK_Pentium4:
2513 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002514 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002515 case CK_Prescott:
2516 case CK_K6:
2517 case CK_K6_2:
2518 case CK_K6_3:
2519 case CK_Athlon:
2520 case CK_AthlonThunderbird:
2521 case CK_Athlon4:
2522 case CK_AthlonXP:
2523 case CK_AthlonMP:
2524 case CK_Geode:
2525 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002526 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002527 return false;
2528
2529 // Fallthrough
2530 case CK_Nocona:
2531 case CK_Core2:
2532 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002533 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002534 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002535 case CK_Nehalem:
2536 case CK_Westmere:
2537 case CK_SandyBridge:
2538 case CK_IvyBridge:
2539 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002540 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002541 case CK_SkylakeClient:
2542 case CK_SkylakeServer:
2543 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002544 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002545 case CK_Athlon64:
2546 case CK_Athlon64SSE3:
2547 case CK_AthlonFX:
2548 case CK_K8:
2549 case CK_K8SSE3:
2550 case CK_Opteron:
2551 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002552 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002553 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002554 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002555 case CK_BDVER1:
2556 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002557 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002558 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002559 case CK_x86_64:
2560 return true;
2561 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002562 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002563 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002564
Craig Topper3164f332014-03-11 03:39:26 +00002565 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002566
Craig Topper3164f332014-03-11 03:39:26 +00002567 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002568 // Most of the non-ARM calling conventions are i386 conventions.
2569 switch (CC) {
2570 case CC_X86ThisCall:
2571 case CC_X86FastCall:
2572 case CC_X86StdCall:
2573 case CC_X86VectorCall:
2574 case CC_C:
2575 case CC_Swift:
2576 case CC_X86Pascal:
2577 case CC_IntelOclBicc:
2578 return CCCR_OK;
2579 default:
2580 return CCCR_Warning;
2581 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002582 }
2583
Craig Topper3164f332014-03-11 03:39:26 +00002584 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002585 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002586 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002587
2588 bool hasSjLjLowering() const override {
2589 return true;
2590 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002591};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002592
Rafael Espindolaeb265472013-08-21 21:59:03 +00002593bool X86TargetInfo::setFPMath(StringRef Name) {
2594 if (Name == "387") {
2595 FPMath = FP_387;
2596 return true;
2597 }
2598 if (Name == "sse") {
2599 FPMath = FP_SSE;
2600 return true;
2601 }
2602 return false;
2603}
2604
Eric Christopher007b0a02015-08-28 22:32:01 +00002605bool X86TargetInfo::initFeatureMap(
2606 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002607 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002608 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002609 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002610 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002611 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002612
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002613 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002614
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002615 // Enable X87 for all X86 processors but Lakemont.
2616 if (Kind != CK_Lakemont)
2617 setFeatureEnabledImpl(Features, "x87", true);
2618
2619 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002620 case CK_Generic:
2621 case CK_i386:
2622 case CK_i486:
2623 case CK_i586:
2624 case CK_Pentium:
2625 case CK_i686:
2626 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002627 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002628 break;
2629 case CK_PentiumMMX:
2630 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002631 case CK_K6:
2632 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002633 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002634 break;
2635 case CK_Pentium3:
2636 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002637 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002638 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002639 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002640 break;
2641 case CK_PentiumM:
2642 case CK_Pentium4:
2643 case CK_Pentium4M:
2644 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002645 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002646 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002647 break;
2648 case CK_Yonah:
2649 case CK_Prescott:
2650 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002651 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002652 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002653 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002654 break;
2655 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002656 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002657 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002658 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002659 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002660 break;
2661 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002662 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002663 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002664 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002665 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002666 case CK_Cannonlake:
2667 setFeatureEnabledImpl(Features, "avx512ifma", true);
2668 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2669 setFeatureEnabledImpl(Features, "sha", true);
2670 setFeatureEnabledImpl(Features, "umip", true);
2671 // FALLTHROUGH
2672 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002673 setFeatureEnabledImpl(Features, "avx512f", true);
2674 setFeatureEnabledImpl(Features, "avx512cd", true);
2675 setFeatureEnabledImpl(Features, "avx512dq", true);
2676 setFeatureEnabledImpl(Features, "avx512bw", true);
2677 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002678 setFeatureEnabledImpl(Features, "pku", true);
2679 setFeatureEnabledImpl(Features, "pcommit", true);
2680 setFeatureEnabledImpl(Features, "clwb", true);
2681 // FALLTHROUGH
2682 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002683 setFeatureEnabledImpl(Features, "xsavec", true);
2684 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002685 setFeatureEnabledImpl(Features, "mpx", true);
2686 setFeatureEnabledImpl(Features, "sgx", true);
2687 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002688 // FALLTHROUGH
2689 case CK_Broadwell:
2690 setFeatureEnabledImpl(Features, "rdseed", true);
2691 setFeatureEnabledImpl(Features, "adx", true);
2692 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002693 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002694 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002695 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002696 setFeatureEnabledImpl(Features, "bmi", true);
2697 setFeatureEnabledImpl(Features, "bmi2", true);
2698 setFeatureEnabledImpl(Features, "rtm", true);
2699 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002700 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002701 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002702 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002703 setFeatureEnabledImpl(Features, "rdrnd", true);
2704 setFeatureEnabledImpl(Features, "f16c", true);
2705 setFeatureEnabledImpl(Features, "fsgsbase", true);
2706 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002707 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002708 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002709 setFeatureEnabledImpl(Features, "xsave", true);
2710 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002711 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002712 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002713 case CK_Silvermont:
2714 setFeatureEnabledImpl(Features, "aes", true);
2715 setFeatureEnabledImpl(Features, "pclmul", true);
2716 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002717 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002718 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002719 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002720 setFeatureEnabledImpl(Features, "cx16", true);
2721 break;
2722 case CK_KNL:
2723 setFeatureEnabledImpl(Features, "avx512f", true);
2724 setFeatureEnabledImpl(Features, "avx512cd", true);
2725 setFeatureEnabledImpl(Features, "avx512er", true);
2726 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002727 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002728 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002729 setFeatureEnabledImpl(Features, "rdseed", true);
2730 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002731 setFeatureEnabledImpl(Features, "lzcnt", true);
2732 setFeatureEnabledImpl(Features, "bmi", true);
2733 setFeatureEnabledImpl(Features, "bmi2", true);
2734 setFeatureEnabledImpl(Features, "rtm", true);
2735 setFeatureEnabledImpl(Features, "fma", true);
2736 setFeatureEnabledImpl(Features, "rdrnd", true);
2737 setFeatureEnabledImpl(Features, "f16c", true);
2738 setFeatureEnabledImpl(Features, "fsgsbase", true);
2739 setFeatureEnabledImpl(Features, "aes", true);
2740 setFeatureEnabledImpl(Features, "pclmul", true);
2741 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002742 setFeatureEnabledImpl(Features, "xsaveopt", true);
2743 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002744 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002745 break;
2746 case CK_K6_2:
2747 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002748 case CK_WinChip2:
2749 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002750 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002751 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002752 case CK_Athlon:
2753 case CK_AthlonThunderbird:
2754 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002755 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002756 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002757 case CK_Athlon4:
2758 case CK_AthlonXP:
2759 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002760 setFeatureEnabledImpl(Features, "sse", true);
2761 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002762 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002763 break;
2764 case CK_K8:
2765 case CK_Opteron:
2766 case CK_Athlon64:
2767 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002768 setFeatureEnabledImpl(Features, "sse2", true);
2769 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002770 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002771 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002772 case CK_AMDFAM10:
2773 setFeatureEnabledImpl(Features, "sse4a", true);
2774 setFeatureEnabledImpl(Features, "lzcnt", true);
2775 setFeatureEnabledImpl(Features, "popcnt", true);
2776 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002777 case CK_K8SSE3:
2778 case CK_OpteronSSE3:
2779 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002780 setFeatureEnabledImpl(Features, "sse3", true);
2781 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002782 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002783 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002784 case CK_BTVER2:
2785 setFeatureEnabledImpl(Features, "avx", true);
2786 setFeatureEnabledImpl(Features, "aes", true);
2787 setFeatureEnabledImpl(Features, "pclmul", true);
2788 setFeatureEnabledImpl(Features, "bmi", true);
2789 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002790 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002791 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002792 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002793 setFeatureEnabledImpl(Features, "ssse3", true);
2794 setFeatureEnabledImpl(Features, "sse4a", true);
2795 setFeatureEnabledImpl(Features, "lzcnt", true);
2796 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002797 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002798 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002799 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002800 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002801 case CK_BDVER4:
2802 setFeatureEnabledImpl(Features, "avx2", true);
2803 setFeatureEnabledImpl(Features, "bmi2", true);
2804 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002805 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002806 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002807 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002808 // FALLTHROUGH
2809 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002810 setFeatureEnabledImpl(Features, "bmi", true);
2811 setFeatureEnabledImpl(Features, "fma", true);
2812 setFeatureEnabledImpl(Features, "f16c", true);
2813 setFeatureEnabledImpl(Features, "tbm", true);
2814 // FALLTHROUGH
2815 case CK_BDVER1:
2816 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002817 setFeatureEnabledImpl(Features, "xop", true);
2818 setFeatureEnabledImpl(Features, "lzcnt", true);
2819 setFeatureEnabledImpl(Features, "aes", true);
2820 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002821 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002822 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002823 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002824 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002825 break;
Eli Friedman33465822011-07-08 23:31:17 +00002826 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002827 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2828 return false;
2829
2830 // Can't do this earlier because we need to be able to explicitly enable
2831 // or disable these features and the things that they depend upon.
2832
2833 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2834 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002835 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002836 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2837 FeaturesVec.end())
2838 Features["popcnt"] = true;
2839
2840 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2841 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002842 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002843 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2844 FeaturesVec.end())
2845 Features["prfchw"] = true;
2846
Eric Christophera7260af2015-10-08 20:10:18 +00002847 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2848 // then enable MMX.
2849 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002850 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002851 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2852 FeaturesVec.end())
2853 Features["mmx"] = true;
2854
Eric Christopherbbd746d2015-10-08 20:10:14 +00002855 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002856}
2857
Rafael Espindolae62e2792013-08-20 13:44:29 +00002858void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002859 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002860 if (Enabled) {
2861 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002862 case AVX512F:
2863 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 case AVX2:
2865 Features["avx2"] = true;
2866 case AVX:
2867 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002868 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002869 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002870 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002871 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002872 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002873 case SSSE3:
2874 Features["ssse3"] = true;
2875 case SSE3:
2876 Features["sse3"] = true;
2877 case SSE2:
2878 Features["sse2"] = true;
2879 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002880 Features["sse"] = true;
2881 case NoSSE:
2882 break;
2883 }
2884 return;
2885 }
2886
2887 switch (Level) {
2888 case NoSSE:
2889 case SSE1:
2890 Features["sse"] = false;
2891 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002892 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2893 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002894 case SSE3:
2895 Features["sse3"] = false;
2896 setXOPLevel(Features, NoXOP, false);
2897 case SSSE3:
2898 Features["ssse3"] = false;
2899 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002900 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002901 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002902 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002903 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002904 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2905 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002906 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002907 case AVX2:
2908 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002909 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002910 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002911 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00002912 Features["avx512vl"] = Features["avx512vbmi"] =
2913 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002914 }
2915}
2916
2917void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002918 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002919 if (Enabled) {
2920 switch (Level) {
2921 case AMD3DNowAthlon:
2922 Features["3dnowa"] = true;
2923 case AMD3DNow:
2924 Features["3dnow"] = true;
2925 case MMX:
2926 Features["mmx"] = true;
2927 case NoMMX3DNow:
2928 break;
2929 }
2930 return;
2931 }
2932
2933 switch (Level) {
2934 case NoMMX3DNow:
2935 case MMX:
2936 Features["mmx"] = false;
2937 case AMD3DNow:
2938 Features["3dnow"] = false;
2939 case AMD3DNowAthlon:
2940 Features["3dnowa"] = false;
2941 }
2942}
2943
2944void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002945 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002946 if (Enabled) {
2947 switch (Level) {
2948 case XOP:
2949 Features["xop"] = true;
2950 case FMA4:
2951 Features["fma4"] = true;
2952 setSSELevel(Features, AVX, true);
2953 case SSE4A:
2954 Features["sse4a"] = true;
2955 setSSELevel(Features, SSE3, true);
2956 case NoXOP:
2957 break;
2958 }
2959 return;
2960 }
2961
2962 switch (Level) {
2963 case NoXOP:
2964 case SSE4A:
2965 Features["sse4a"] = false;
2966 case FMA4:
2967 Features["fma4"] = false;
2968 case XOP:
2969 Features["xop"] = false;
2970 }
2971}
2972
Craig Topper86d79ef2013-09-17 04:51:29 +00002973void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2974 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002975 // This is a bit of a hack to deal with the sse4 target feature when used
2976 // as part of the target attribute. We handle sse4 correctly everywhere
2977 // else. See below for more information on how we handle the sse4 options.
2978 if (Name != "sse4")
2979 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002980
Craig Topper29561122013-09-19 01:13:07 +00002981 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002982 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002983 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002984 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002985 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002986 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002987 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002988 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002989 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002990 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002991 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002992 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002993 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002994 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002995 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002996 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002997 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002998 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002999 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003000 if (Enabled)
3001 setSSELevel(Features, SSE2, Enabled);
3002 } else if (Name == "pclmul") {
3003 if (Enabled)
3004 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003005 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003006 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003007 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003008 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003009 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003010 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003011 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3012 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3013 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003014 if (Enabled)
3015 setSSELevel(Features, AVX512F, Enabled);
3016 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003017 if (Enabled)
3018 setSSELevel(Features, AVX, Enabled);
3019 } else if (Name == "fma4") {
3020 setXOPLevel(Features, FMA4, Enabled);
3021 } else if (Name == "xop") {
3022 setXOPLevel(Features, XOP, Enabled);
3023 } else if (Name == "sse4a") {
3024 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003025 } else if (Name == "f16c") {
3026 if (Enabled)
3027 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003028 } else if (Name == "sha") {
3029 if (Enabled)
3030 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003031 } else if (Name == "sse4") {
3032 // We can get here via the __target__ attribute since that's not controlled
3033 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3034 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3035 // disabled.
3036 if (Enabled)
3037 setSSELevel(Features, SSE42, Enabled);
3038 else
3039 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003040 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003041 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003042 Features["xsaveopt"] = false;
3043 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003044 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003045 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003046 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003047}
3048
Eric Christopher3ff21b32013-10-16 21:26:26 +00003049/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003050/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003051bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003052 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003053 for (const auto &Feature : Features) {
3054 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003055 continue;
3056
Eric Christopher610fe112015-08-26 08:21:55 +00003057 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003058 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003059 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003060 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003061 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003062 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003063 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003064 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003065 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003066 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003067 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003068 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003069 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003070 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003071 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003072 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003073 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003074 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003075 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003076 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003077 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003078 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003079 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003080 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003081 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003082 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003083 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003084 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003085 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003086 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003087 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003088 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003089 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003090 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003091 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003092 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003093 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003094 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003095 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003096 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003097 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003098 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003099 } else if (Feature == "+avx512vbmi") {
3100 HasAVX512VBMI = true;
3101 } else if (Feature == "+avx512ifma") {
3102 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003103 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003104 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003105 } else if (Feature == "+mpx") {
3106 HasMPX = true;
3107 } else if (Feature == "+movbe") {
3108 HasMOVBE = true;
3109 } else if (Feature == "+sgx") {
3110 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003111 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003112 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003113 } else if (Feature == "+fxsr") {
3114 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003115 } else if (Feature == "+xsave") {
3116 HasXSAVE = true;
3117 } else if (Feature == "+xsaveopt") {
3118 HasXSAVEOPT = true;
3119 } else if (Feature == "+xsavec") {
3120 HasXSAVEC = true;
3121 } else if (Feature == "+xsaves") {
3122 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003123 } else if (Feature == "+pku") {
3124 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003125 } else if (Feature == "+clflushopt") {
3126 HasCLFLUSHOPT = true;
3127 } else if (Feature == "+pcommit") {
3128 HasPCOMMIT = true;
3129 } else if (Feature == "+clwb") {
3130 HasCLWB = true;
3131 } else if (Feature == "+umip") {
3132 HasUMIP = true;
3133 } else if (Feature == "+prefetchwt1") {
3134 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003135 }
3136
Benjamin Kramer27402c62012-03-05 15:10:44 +00003137 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003138 .Case("+avx512f", AVX512F)
3139 .Case("+avx2", AVX2)
3140 .Case("+avx", AVX)
3141 .Case("+sse4.2", SSE42)
3142 .Case("+sse4.1", SSE41)
3143 .Case("+ssse3", SSSE3)
3144 .Case("+sse3", SSE3)
3145 .Case("+sse2", SSE2)
3146 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003147 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003148 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003149
Eli Friedman33465822011-07-08 23:31:17 +00003150 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003151 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003152 .Case("+3dnowa", AMD3DNowAthlon)
3153 .Case("+3dnow", AMD3DNow)
3154 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003155 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003156 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003157
3158 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003159 .Case("+xop", XOP)
3160 .Case("+fma4", FMA4)
3161 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003162 .Default(NoXOP);
3163 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003164 }
Eli Friedman33465822011-07-08 23:31:17 +00003165
Rafael Espindolaeb265472013-08-21 21:59:03 +00003166 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3167 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003168 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3169 (FPMath == FP_387 && SSELevel >= SSE1)) {
3170 Diags.Report(diag::err_target_unsupported_fpmath) <<
3171 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003172 return false;
3173 }
3174
Alexey Bataev00396512015-07-02 03:40:19 +00003175 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003176 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003177 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003178}
Chris Lattnerecd49032009-03-02 22:27:17 +00003179
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003180/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3181/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003182void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003183 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003184 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003185 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003186 Builder.defineMacro("__amd64__");
3187 Builder.defineMacro("__amd64");
3188 Builder.defineMacro("__x86_64");
3189 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003190 if (getTriple().getArchName() == "x86_64h") {
3191 Builder.defineMacro("__x86_64h");
3192 Builder.defineMacro("__x86_64h__");
3193 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003194 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003195 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003196 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003197
Chris Lattnerecd49032009-03-02 22:27:17 +00003198 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003199 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3200 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003201 switch (CPU) {
3202 case CK_Generic:
3203 break;
3204 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003205 // The rest are coming from the i386 define above.
3206 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003207 break;
3208 case CK_i486:
3209 case CK_WinChipC6:
3210 case CK_WinChip2:
3211 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003212 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003213 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003214 case CK_PentiumMMX:
3215 Builder.defineMacro("__pentium_mmx__");
3216 Builder.defineMacro("__tune_pentium_mmx__");
3217 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003218 case CK_i586:
3219 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003220 defineCPUMacros(Builder, "i586");
3221 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003222 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003223 case CK_Pentium3:
3224 case CK_Pentium3M:
3225 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003226 Builder.defineMacro("__tune_pentium3__");
3227 // Fallthrough
3228 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003229 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003230 Builder.defineMacro("__tune_pentium2__");
3231 // Fallthrough
3232 case CK_PentiumPro:
3233 Builder.defineMacro("__tune_i686__");
3234 Builder.defineMacro("__tune_pentiumpro__");
3235 // Fallthrough
3236 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003237 Builder.defineMacro("__i686");
3238 Builder.defineMacro("__i686__");
3239 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3240 Builder.defineMacro("__pentiumpro");
3241 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003242 break;
3243 case CK_Pentium4:
3244 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003245 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003246 break;
3247 case CK_Yonah:
3248 case CK_Prescott:
3249 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003250 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003251 break;
3252 case CK_Core2:
3253 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003254 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003255 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003256 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003257 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003258 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003259 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003260 defineCPUMacros(Builder, "slm");
3261 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003262 case CK_Nehalem:
3263 case CK_Westmere:
3264 case CK_SandyBridge:
3265 case CK_IvyBridge:
3266 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003267 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003268 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003269 // FIXME: Historically, we defined this legacy name, it would be nice to
3270 // remove it at some point. We've never exposed fine-grained names for
3271 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003272 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003273 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003274 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003275 defineCPUMacros(Builder, "skx");
3276 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003277 case CK_Cannonlake:
3278 break;
Craig Topper449314e2013-08-20 07:09:39 +00003279 case CK_KNL:
3280 defineCPUMacros(Builder, "knl");
3281 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003282 case CK_Lakemont:
3283 Builder.defineMacro("__tune_lakemont__");
3284 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003285 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003286 Builder.defineMacro("__k6_2__");
3287 Builder.defineMacro("__tune_k6_2__");
3288 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003289 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003290 if (CPU != CK_K6_2) { // In case of fallthrough
3291 // FIXME: GCC may be enabling these in cases where some other k6
3292 // architecture is specified but -m3dnow is explicitly provided. The
3293 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003294 Builder.defineMacro("__k6_3__");
3295 Builder.defineMacro("__tune_k6_3__");
3296 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003297 // Fallthrough
3298 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003299 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003300 break;
3301 case CK_Athlon:
3302 case CK_AthlonThunderbird:
3303 case CK_Athlon4:
3304 case CK_AthlonXP:
3305 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003306 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003307 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003308 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003309 Builder.defineMacro("__tune_athlon_sse__");
3310 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003311 break;
3312 case CK_K8:
3313 case CK_K8SSE3:
3314 case CK_x86_64:
3315 case CK_Opteron:
3316 case CK_OpteronSSE3:
3317 case CK_Athlon64:
3318 case CK_Athlon64SSE3:
3319 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003320 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003321 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003322 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003323 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003324 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003325 case CK_BTVER1:
3326 defineCPUMacros(Builder, "btver1");
3327 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003328 case CK_BTVER2:
3329 defineCPUMacros(Builder, "btver2");
3330 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003331 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003332 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003333 break;
3334 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003335 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003336 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003337 case CK_BDVER3:
3338 defineCPUMacros(Builder, "bdver3");
3339 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003340 case CK_BDVER4:
3341 defineCPUMacros(Builder, "bdver4");
3342 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003343 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003344 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003345 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003346 }
Chris Lattner96e43572009-03-02 22:40:39 +00003347
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003348 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003349 Builder.defineMacro("__REGISTER_PREFIX__", "");
3350
Chris Lattner6df41af2009-04-19 17:32:33 +00003351 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3352 // functions in glibc header files that use FP Stack inline asm which the
3353 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003354 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003355
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003356 if (HasAES)
3357 Builder.defineMacro("__AES__");
3358
Craig Topper3f122a72012-05-31 05:18:48 +00003359 if (HasPCLMUL)
3360 Builder.defineMacro("__PCLMUL__");
3361
Craig Topper22967d42011-12-25 05:06:45 +00003362 if (HasLZCNT)
3363 Builder.defineMacro("__LZCNT__");
3364
Benjamin Kramer1e250392012-07-07 09:39:18 +00003365 if (HasRDRND)
3366 Builder.defineMacro("__RDRND__");
3367
Craig Topper8c7f2512014-11-03 06:51:41 +00003368 if (HasFSGSBASE)
3369 Builder.defineMacro("__FSGSBASE__");
3370
Craig Topper22967d42011-12-25 05:06:45 +00003371 if (HasBMI)
3372 Builder.defineMacro("__BMI__");
3373
3374 if (HasBMI2)
3375 Builder.defineMacro("__BMI2__");
3376
Craig Topper1de83482011-12-29 16:10:46 +00003377 if (HasPOPCNT)
3378 Builder.defineMacro("__POPCNT__");
3379
Michael Liao625a8752012-11-10 05:17:46 +00003380 if (HasRTM)
3381 Builder.defineMacro("__RTM__");
3382
Michael Liao74f4eaf2013-03-26 17:52:08 +00003383 if (HasPRFCHW)
3384 Builder.defineMacro("__PRFCHW__");
3385
Michael Liaoffaae352013-03-29 05:17:55 +00003386 if (HasRDSEED)
3387 Builder.defineMacro("__RDSEED__");
3388
Robert Khasanov50e6f582014-09-19 09:53:48 +00003389 if (HasADX)
3390 Builder.defineMacro("__ADX__");
3391
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003392 if (HasTBM)
3393 Builder.defineMacro("__TBM__");
3394
Rafael Espindolae62e2792013-08-20 13:44:29 +00003395 switch (XOPLevel) {
3396 case XOP:
3397 Builder.defineMacro("__XOP__");
3398 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003399 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003400 case SSE4A:
3401 Builder.defineMacro("__SSE4A__");
3402 case NoXOP:
3403 break;
3404 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003405
Craig Topperbba778b2012-06-03 21:46:30 +00003406 if (HasFMA)
3407 Builder.defineMacro("__FMA__");
3408
Manman Rena45358c2012-10-11 00:59:55 +00003409 if (HasF16C)
3410 Builder.defineMacro("__F16C__");
3411
Craig Topper679b53a2013-08-21 05:29:10 +00003412 if (HasAVX512CD)
3413 Builder.defineMacro("__AVX512CD__");
3414 if (HasAVX512ER)
3415 Builder.defineMacro("__AVX512ER__");
3416 if (HasAVX512PF)
3417 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003418 if (HasAVX512DQ)
3419 Builder.defineMacro("__AVX512DQ__");
3420 if (HasAVX512BW)
3421 Builder.defineMacro("__AVX512BW__");
3422 if (HasAVX512VL)
3423 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003424 if (HasAVX512VBMI)
3425 Builder.defineMacro("__AVX512VBMI__");
3426 if (HasAVX512IFMA)
3427 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003428
Ben Langmuir58078d02013-09-19 13:22:04 +00003429 if (HasSHA)
3430 Builder.defineMacro("__SHA__");
3431
Craig Toppere33f51f2015-10-16 06:22:36 +00003432 if (HasFXSR)
3433 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003434 if (HasXSAVE)
3435 Builder.defineMacro("__XSAVE__");
3436 if (HasXSAVEOPT)
3437 Builder.defineMacro("__XSAVEOPT__");
3438 if (HasXSAVEC)
3439 Builder.defineMacro("__XSAVEC__");
3440 if (HasXSAVES)
3441 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003442 if (HasPKU)
3443 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003444 if (HasCX16)
3445 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3446
Chris Lattner96e43572009-03-02 22:40:39 +00003447 // Each case falls through to the previous one here.
3448 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003449 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003450 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003451 case AVX2:
3452 Builder.defineMacro("__AVX2__");
3453 case AVX:
3454 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003455 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003456 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003457 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003458 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003459 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003460 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003461 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003462 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003463 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003464 Builder.defineMacro("__SSE2__");
3465 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003466 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003467 Builder.defineMacro("__SSE__");
3468 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003469 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003470 break;
3471 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003472
Derek Schuffc7dd7222012-10-11 15:52:22 +00003473 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003474 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003475 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003476 case AVX2:
3477 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003478 case SSE42:
3479 case SSE41:
3480 case SSSE3:
3481 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003482 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003483 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003484 break;
3485 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003486 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003487 break;
3488 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003489 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003490 }
3491 }
3492
Anders Carlssone437c682010-01-27 03:47:49 +00003493 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003494 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003495 case AMD3DNowAthlon:
3496 Builder.defineMacro("__3dNOW_A__");
3497 case AMD3DNow:
3498 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003499 case MMX:
3500 Builder.defineMacro("__MMX__");
3501 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003502 break;
3503 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003504
3505 if (CPU >= CK_i486) {
3506 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3507 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3508 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3509 }
3510 if (CPU >= CK_i586)
3511 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003512}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003513
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003514bool X86TargetInfo::hasFeature(StringRef Feature) const {
3515 return llvm::StringSwitch<bool>(Feature)
3516 .Case("aes", HasAES)
3517 .Case("avx", SSELevel >= AVX)
3518 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003519 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003520 .Case("avx512cd", HasAVX512CD)
3521 .Case("avx512er", HasAVX512ER)
3522 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003523 .Case("avx512dq", HasAVX512DQ)
3524 .Case("avx512bw", HasAVX512BW)
3525 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003526 .Case("avx512vbmi", HasAVX512VBMI)
3527 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003528 .Case("bmi", HasBMI)
3529 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003530 .Case("clflushopt", HasCLFLUSHOPT)
3531 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003532 .Case("cx16", HasCX16)
3533 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003534 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003535 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003536 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003537 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003538 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003539 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3540 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3541 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003542 .Case("movbe", HasMOVBE)
3543 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003544 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003545 .Case("pcommit", HasPCOMMIT)
3546 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003547 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003548 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003549 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003550 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003551 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003552 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003553 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003554 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003555 .Case("sse", SSELevel >= SSE1)
3556 .Case("sse2", SSELevel >= SSE2)
3557 .Case("sse3", SSELevel >= SSE3)
3558 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003559 .Case("sse4.1", SSELevel >= SSE41)
3560 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003561 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003562 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003563 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003564 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003565 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3566 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003567 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003568 .Case("xsave", HasXSAVE)
3569 .Case("xsavec", HasXSAVEC)
3570 .Case("xsaves", HasXSAVES)
3571 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003572 .Default(false);
3573}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003574
Eric Christopherd9832702015-06-29 21:00:05 +00003575// We can't use a generic validation scheme for the features accepted here
3576// versus subtarget features accepted in the target attribute because the
3577// bitfield structure that's initialized in the runtime only supports the
3578// below currently rather than the full range of subtarget features. (See
3579// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3580bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3581 return llvm::StringSwitch<bool>(FeatureStr)
3582 .Case("cmov", true)
3583 .Case("mmx", true)
3584 .Case("popcnt", true)
3585 .Case("sse", true)
3586 .Case("sse2", true)
3587 .Case("sse3", true)
3588 .Case("sse4.1", true)
3589 .Case("sse4.2", true)
3590 .Case("avx", true)
3591 .Case("avx2", true)
3592 .Case("sse4a", true)
3593 .Case("fma4", true)
3594 .Case("xop", true)
3595 .Case("fma", true)
3596 .Case("avx512f", true)
3597 .Case("bmi", true)
3598 .Case("bmi2", true)
3599 .Default(false);
3600}
3601
Eli Friedman3fd920a2008-08-20 02:34:37 +00003602bool
Anders Carlsson58436352009-02-28 17:11:49 +00003603X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003604 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003605 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003606 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003607 // Constant constraints.
3608 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3609 // instructions.
3610 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3611 // x86_64 instructions.
3612 case 's':
3613 Info.setRequiresImmediate();
3614 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003615 case 'I':
3616 Info.setRequiresImmediate(0, 31);
3617 return true;
3618 case 'J':
3619 Info.setRequiresImmediate(0, 63);
3620 return true;
3621 case 'K':
3622 Info.setRequiresImmediate(-128, 127);
3623 return true;
3624 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003625 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003626 return true;
3627 case 'M':
3628 Info.setRequiresImmediate(0, 3);
3629 return true;
3630 case 'N':
3631 Info.setRequiresImmediate(0, 255);
3632 return true;
3633 case 'O':
3634 Info.setRequiresImmediate(0, 127);
3635 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003636 // Register constraints.
3637 case 'Y': // 'Y' is the first character for several 2-character constraints.
3638 // Shift the pointer to the second character of the constraint.
3639 Name++;
3640 switch (*Name) {
3641 default:
3642 return false;
3643 case '0': // First SSE register.
3644 case 't': // Any SSE register, when SSE2 is enabled.
3645 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3646 case 'm': // Any MMX register, when inter-unit moves enabled.
3647 Info.setAllowsRegister();
3648 return true;
3649 }
3650 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003651 // Constraint 'f' cannot be used for output operands.
3652 if (Info.ConstraintStr[0] == '=')
3653 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003654 Info.setAllowsRegister();
3655 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003656 case 'a': // eax.
3657 case 'b': // ebx.
3658 case 'c': // ecx.
3659 case 'd': // edx.
3660 case 'S': // esi.
3661 case 'D': // edi.
3662 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003663 case 't': // Top of floating point stack.
3664 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003665 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003666 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003667 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003668 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003669 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3670 case 'l': // "Index" registers: any general register that can be used as an
3671 // index in a base+index memory access.
3672 Info.setAllowsRegister();
3673 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003674 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003675 case 'C': // SSE floating point constant.
3676 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003677 return true;
3678 }
3679}
3680
Akira Hatanaka974131e2014-09-18 18:17:18 +00003681bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3682 unsigned Size) const {
3683 // Strip off constraint modifiers.
3684 while (Constraint[0] == '=' ||
3685 Constraint[0] == '+' ||
3686 Constraint[0] == '&')
3687 Constraint = Constraint.substr(1);
3688
3689 return validateOperandSize(Constraint, Size);
3690}
3691
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003692bool X86TargetInfo::validateInputSize(StringRef Constraint,
3693 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003694 return validateOperandSize(Constraint, Size);
3695}
3696
3697bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3698 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003699 switch (Constraint[0]) {
3700 default: break;
3701 case 'y':
3702 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003703 case 'f':
3704 case 't':
3705 case 'u':
3706 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003707 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003708 if (SSELevel >= AVX512F)
3709 // 512-bit zmm registers can be used if target supports AVX512F.
3710 return Size <= 512U;
3711 else if (SSELevel >= AVX)
3712 // 256-bit ymm registers can be used if target supports AVX.
3713 return Size <= 256U;
3714 return Size <= 128U;
3715 case 'Y':
3716 // 'Y' is the first character for several 2-character constraints.
3717 switch (Constraint[1]) {
3718 default: break;
3719 case 'm':
3720 // 'Ym' is synonymous with 'y'.
3721 return Size <= 64;
3722 case 'i':
3723 case 't':
3724 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3725 if (SSELevel >= AVX512F)
3726 return Size <= 512U;
3727 else if (SSELevel >= AVX)
3728 return Size <= 256U;
3729 return SSELevel >= SSE2 && Size <= 128U;
3730 }
3731
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003732 }
3733
3734 return true;
3735}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003736
Eli Friedman3fd920a2008-08-20 02:34:37 +00003737std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003738X86TargetInfo::convertConstraint(const char *&Constraint) const {
3739 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003740 case 'a': return std::string("{ax}");
3741 case 'b': return std::string("{bx}");
3742 case 'c': return std::string("{cx}");
3743 case 'd': return std::string("{dx}");
3744 case 'S': return std::string("{si}");
3745 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003746 case 'p': // address
3747 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003748 case 't': // top of floating point stack.
3749 return std::string("{st}");
3750 case 'u': // second from top of floating point stack.
3751 return std::string("{st(1)}"); // second from top of floating point stack.
3752 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003753 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003754 }
3755}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003756
Eli Friedman3fd920a2008-08-20 02:34:37 +00003757// X86-32 generic target
3758class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003759public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003760 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3761 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003762 DoubleAlign = LongLongAlign = 32;
3763 LongDoubleWidth = 96;
3764 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003765 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003766 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003767 SizeType = UnsignedInt;
3768 PtrDiffType = SignedInt;
3769 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003770 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003771
3772 // Use fpret for all types.
3773 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3774 (1 << TargetInfo::Double) |
3775 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003776
3777 // x86-32 has atomics up to 8 bytes
3778 // FIXME: Check that we actually have cmpxchg8b before setting
3779 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3780 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003781 }
Craig Topper3164f332014-03-11 03:39:26 +00003782 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003783 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003784 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003785
Craig Topper3164f332014-03-11 03:39:26 +00003786 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003787 if (RegNo == 0) return 0;
3788 if (RegNo == 1) return 2;
3789 return -1;
3790 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003791 bool validateOperandSize(StringRef Constraint,
3792 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003793 switch (Constraint[0]) {
3794 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003795 case 'R':
3796 case 'q':
3797 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003798 case 'a':
3799 case 'b':
3800 case 'c':
3801 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003802 case 'S':
3803 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003804 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003805 case 'A':
3806 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003807 }
3808
Akira Hatanaka974131e2014-09-18 18:17:18 +00003809 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003810 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003811};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003812
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003813class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3814public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003815 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3816 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003817
Craig Topper3164f332014-03-11 03:39:26 +00003818 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003819 unsigned Major, Minor, Micro;
3820 getTriple().getOSVersion(Major, Minor, Micro);
3821 // New NetBSD uses the default rounding mode.
3822 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3823 return X86_32TargetInfo::getFloatEvalMethod();
3824 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003825 return 1;
3826 }
3827};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003828
Eli Friedmane3aa4542009-07-05 18:47:56 +00003829class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3830public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003831 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3832 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003833 SizeType = UnsignedLong;
3834 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003835 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003836 }
3837};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003838
Eli Friedman9fa28852012-08-08 23:57:20 +00003839class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3840public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003841 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3842 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003843 SizeType = UnsignedLong;
3844 IntPtrType = SignedLong;
3845 PtrDiffType = SignedLong;
3846 }
3847};
Eli Friedman9fa28852012-08-08 23:57:20 +00003848
Torok Edwinb2b37c62009-06-30 17:10:35 +00003849class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003850public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003851 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3852 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003853 LongDoubleWidth = 128;
3854 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003855 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003856 MaxVectorAlign = 256;
3857 // The watchOS simulator uses the builtin bool type for Objective-C.
3858 llvm::Triple T = llvm::Triple(Triple);
3859 if (T.isWatchOS())
3860 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003861 SizeType = UnsignedLong;
3862 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00003863 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00003864 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003865 }
3866
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003867 bool handleTargetFeatures(std::vector<std::string> &Features,
3868 DiagnosticsEngine &Diags) override {
3869 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3870 Diags))
3871 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003872 // We now know the features we have: we can decide how to align vectors.
3873 MaxVectorAlign =
3874 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003875 return true;
3876 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003877};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003878
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003879// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003880class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003881public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003882 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3883 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003884 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003885 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003886 bool IsWinCOFF =
3887 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00003888 resetDataLayout(IsWinCOFF
3889 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3890 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003891 }
Craig Topper3164f332014-03-11 03:39:26 +00003892 void getTargetDefines(const LangOptions &Opts,
3893 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003894 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3895 }
3896};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003897
3898// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003899class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003900public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003901 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
3902 const TargetOptions &Opts)
3903 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00003904 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003905 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3906 }
Craig Topper3164f332014-03-11 03:39:26 +00003907 void getTargetDefines(const LangOptions &Opts,
3908 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003909 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3910 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3911 // The value of the following reflects processor type.
3912 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3913 // We lost the original triple, so we use the default.
3914 Builder.defineMacro("_M_IX86", "600");
3915 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003916};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003917
David Majnemerae1ed0e2015-05-28 04:36:18 +00003918static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003919 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3920 // supports __declspec natively under -fms-extensions, but we define a no-op
3921 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003922 if (Opts.MicrosoftExt)
3923 Builder.defineMacro("__declspec", "__declspec");
3924 else
3925 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3926
3927 if (!Opts.MicrosoftExt) {
3928 // Provide macros for all the calling convention keywords. Provide both
3929 // single and double underscore prefixed variants. These are available on
3930 // x64 as well as x86, even though they have no effect.
3931 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3932 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003933 std::string GCCSpelling = "__attribute__((__";
3934 GCCSpelling += CC;
3935 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003936 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3937 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3938 }
3939 }
3940}
3941
David Majnemerae1ed0e2015-05-28 04:36:18 +00003942static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3943 Builder.defineMacro("__MSVCRT__");
3944 Builder.defineMacro("__MINGW32__");
3945 addCygMingDefines(Opts, Builder);
3946}
3947
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003948// x86-32 MinGW target
3949class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3950public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003951 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3952 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00003953 void getTargetDefines(const LangOptions &Opts,
3954 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003955 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003956 DefineStd(Builder, "WIN32", Opts);
3957 DefineStd(Builder, "WINNT", Opts);
3958 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003959 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003960 }
3961};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003962
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003963// x86-32 Cygwin target
3964class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3965public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003966 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3967 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003968 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003969 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00003970 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 +00003971 }
Craig Topper3164f332014-03-11 03:39:26 +00003972 void getTargetDefines(const LangOptions &Opts,
3973 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003974 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003975 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003976 Builder.defineMacro("__CYGWIN__");
3977 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003978 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003979 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003980 if (Opts.CPlusPlus)
3981 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003982 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003983};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003984
Chris Lattnerb986aba2010-04-11 19:29:39 +00003985// x86-32 Haiku target
3986class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3987public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003988 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3989 : X86_32TargetInfo(Triple, Opts) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003990 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003991 IntPtrType = SignedLong;
3992 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003993 ProcessIDType = SignedLong;
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003994 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003995 }
Craig Topper3164f332014-03-11 03:39:26 +00003996 void getTargetDefines(const LangOptions &Opts,
3997 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003998 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3999 Builder.defineMacro("__INTEL__");
4000 Builder.defineMacro("__HAIKU__");
4001 }
4002};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004003
Alexey Bataevc99b0492015-11-25 09:24:26 +00004004// X86-32 MCU target
4005class MCUX86_32TargetInfo : public X86_32TargetInfo {
4006public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004007 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4008 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004009 LongDoubleWidth = 64;
4010 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004011 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 +00004012 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004013 }
4014
4015 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4016 // On MCU we support only C calling convention.
4017 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4018 }
4019
4020 void getTargetDefines(const LangOptions &Opts,
4021 MacroBuilder &Builder) const override {
4022 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4023 Builder.defineMacro("__iamcu");
4024 Builder.defineMacro("__iamcu__");
4025 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004026
4027 bool allowsLargerPreferedTypeAlignment() const override {
4028 return false;
4029 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004030};
4031
Douglas Gregor9fabd852011-07-01 22:41:14 +00004032// RTEMS Target
4033template<typename Target>
4034class RTEMSTargetInfo : public OSTargetInfo<Target> {
4035protected:
Craig Topper3164f332014-03-11 03:39:26 +00004036 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4037 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004038 // RTEMS defines; list based off of gcc output
4039
Douglas Gregor9fabd852011-07-01 22:41:14 +00004040 Builder.defineMacro("__rtems__");
4041 Builder.defineMacro("__ELF__");
4042 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004043
Douglas Gregor9fabd852011-07-01 22:41:14 +00004044public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004045 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4046 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004047 switch (Triple.getArch()) {
4048 default:
4049 case llvm::Triple::x86:
4050 // this->MCountName = ".mcount";
4051 break;
4052 case llvm::Triple::mips:
4053 case llvm::Triple::mipsel:
4054 case llvm::Triple::ppc:
4055 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004056 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004057 // this->MCountName = "_mcount";
4058 break;
4059 case llvm::Triple::arm:
4060 // this->MCountName = "__mcount";
4061 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004062 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004063 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004064};
4065
Douglas Gregor9fabd852011-07-01 22:41:14 +00004066// x86-32 RTEMS target
4067class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4068public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004069 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4070 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004071 SizeType = UnsignedLong;
4072 IntPtrType = SignedLong;
4073 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004074 }
Craig Topper3164f332014-03-11 03:39:26 +00004075 void getTargetDefines(const LangOptions &Opts,
4076 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004077 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4078 Builder.defineMacro("__INTEL__");
4079 Builder.defineMacro("__rtems__");
4080 }
4081};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004082
Eli Friedman3fd920a2008-08-20 02:34:37 +00004083// x86-64 generic target
4084class X86_64TargetInfo : public X86TargetInfo {
4085public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004086 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4087 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004088 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004089 bool IsWinCOFF =
4090 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004091 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004092 LongDoubleWidth = 128;
4093 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004094 LargeArrayMinWidth = 128;
4095 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004096 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004097 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4098 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4099 IntPtrType = IsX32 ? SignedInt : SignedLong;
4100 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004101 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004102 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004103
Eric Christopher917e9522014-11-18 22:36:15 +00004104 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004105 resetDataLayout(IsX32
4106 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4107 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4108 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004109
4110 // Use fpret only for long double.
4111 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004112
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004113 // Use fp2ret for _Complex long double.
4114 ComplexLongDoubleUsesFP2Ret = true;
4115
Charles Davisc7d5c942015-09-17 20:55:33 +00004116 // Make __builtin_ms_va_list available.
4117 HasBuiltinMSVaList = true;
4118
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004119 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004120 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004121 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004122 }
Craig Topper3164f332014-03-11 03:39:26 +00004123 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004124 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004125 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004126
Craig Topper3164f332014-03-11 03:39:26 +00004127 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004128 if (RegNo == 0) return 0;
4129 if (RegNo == 1) return 1;
4130 return -1;
4131 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004132
Craig Topper3164f332014-03-11 03:39:26 +00004133 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004134 switch (CC) {
4135 case CC_C:
4136 case CC_Swift:
4137 case CC_X86VectorCall:
4138 case CC_IntelOclBicc:
4139 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004140 case CC_PreserveMost:
4141 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004142 return CCCR_OK;
4143 default:
4144 return CCCR_Warning;
4145 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004146 }
4147
Craig Topper3164f332014-03-11 03:39:26 +00004148 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004149 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004150 }
4151
Pavel Chupinfd223e12014-08-04 12:39:43 +00004152 // for x32 we need it here explicitly
4153 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004154 unsigned getUnwindWordWidth() const override { return 64; }
4155 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004156
4157 bool validateGlobalRegisterVariable(StringRef RegName,
4158 unsigned RegSize,
4159 bool &HasSizeMismatch) const override {
4160 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4161 // handle.
4162 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4163 // Check that the register size is 64-bit.
4164 HasSizeMismatch = RegSize != 64;
4165 return true;
4166 }
4167
4168 // Check if the register is a 32-bit register the backend can handle.
4169 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4170 HasSizeMismatch);
4171 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004172};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004173
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004174// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004175class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004176public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004177 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4178 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004179 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004180 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004181 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004182 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004183 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004184 SizeType = UnsignedLongLong;
4185 PtrDiffType = SignedLongLong;
4186 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004187 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004188
Craig Topper3164f332014-03-11 03:39:26 +00004189 void getTargetDefines(const LangOptions &Opts,
4190 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004191 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004192 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004193 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004194
Craig Topper3164f332014-03-11 03:39:26 +00004195 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004196 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004197 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004198
Craig Topper3164f332014-03-11 03:39:26 +00004199 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004200 switch (CC) {
4201 case CC_X86StdCall:
4202 case CC_X86ThisCall:
4203 case CC_X86FastCall:
4204 return CCCR_Ignore;
4205 case CC_C:
4206 case CC_X86VectorCall:
4207 case CC_IntelOclBicc:
4208 case CC_X86_64SysV:
4209 return CCCR_OK;
4210 default:
4211 return CCCR_Warning;
4212 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004213 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004214};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004215
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004216// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004217class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004218public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004219 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4220 const TargetOptions &Opts)
4221 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004222 LongDoubleWidth = LongDoubleAlign = 64;
4223 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004224 }
Craig Topper3164f332014-03-11 03:39:26 +00004225 void getTargetDefines(const LangOptions &Opts,
4226 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004227 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4228 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004229 Builder.defineMacro("_M_X64", "100");
4230 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004231 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004232};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004233
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004234// x86-64 MinGW target
4235class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4236public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004237 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4238 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004239 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4240 // with x86 FP ops. Weird.
4241 LongDoubleWidth = LongDoubleAlign = 128;
4242 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4243 }
4244
Craig Topper3164f332014-03-11 03:39:26 +00004245 void getTargetDefines(const LangOptions &Opts,
4246 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004247 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004248 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004249 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004250 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004251
4252 // GCC defines this macro when it is using __gxx_personality_seh0.
4253 if (!Opts.SjLjExceptions)
4254 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004255 }
4256};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004257
Yaron Kerend030d112015-07-22 17:38:19 +00004258// x86-64 Cygwin target
4259class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4260public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004261 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4262 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004263 TLSSupported = false;
4264 WCharType = UnsignedShort;
4265 }
4266 void getTargetDefines(const LangOptions &Opts,
4267 MacroBuilder &Builder) const override {
4268 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4269 Builder.defineMacro("__x86_64__");
4270 Builder.defineMacro("__CYGWIN__");
4271 Builder.defineMacro("__CYGWIN64__");
4272 addCygMingDefines(Opts, Builder);
4273 DefineStd(Builder, "unix", Opts);
4274 if (Opts.CPlusPlus)
4275 Builder.defineMacro("_GNU_SOURCE");
4276
4277 // GCC defines this macro when it is using __gxx_personality_seh0.
4278 if (!Opts.SjLjExceptions)
4279 Builder.defineMacro("__SEH__");
4280 }
4281};
4282
Eli Friedman2857ccb2009-07-01 03:36:11 +00004283class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4284public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004285 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4286 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004287 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004288 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4289 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004290 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004291 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004292 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004293 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004294
4295 bool handleTargetFeatures(std::vector<std::string> &Features,
4296 DiagnosticsEngine &Diags) override {
4297 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4298 Diags))
4299 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004300 // We now know the features we have: we can decide how to align vectors.
4301 MaxVectorAlign =
4302 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004303 return true;
4304 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004305};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004306
Eli Friedman245f2292009-07-05 22:31:18 +00004307class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4308public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004309 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4310 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004311 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004312 Int64Type = SignedLongLong;
4313 }
4314};
Eli Friedman245f2292009-07-05 22:31:18 +00004315
Eli Friedman9fa28852012-08-08 23:57:20 +00004316class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4317public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004318 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4319 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004320 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004321 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004322 }
4323};
Tim Northover9bb857a2013-01-31 12:13:10 +00004324
Eli Friedmanf05b7722008-08-20 07:44:10 +00004325class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004326 // Possible FPU choices.
4327 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004328 VFP2FPU = (1 << 0),
4329 VFP3FPU = (1 << 1),
4330 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004331 NeonFPU = (1 << 3),
4332 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004333 };
4334
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004335 // Possible HWDiv features.
4336 enum HWDivMode {
4337 HWDivThumb = (1 << 0),
4338 HWDivARM = (1 << 1)
4339 };
4340
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004341 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004342 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004343 }
4344
4345 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4346 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004347
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004348 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004349
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004350 StringRef CPUProfile;
4351 StringRef CPUAttr;
4352
Rafael Espindolaeb265472013-08-21 21:59:03 +00004353 enum {
4354 FP_Default,
4355 FP_VFP,
4356 FP_Neon
4357 } FPMath;
4358
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004359 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004360 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004361 unsigned ArchProfile;
4362 unsigned ArchVersion;
4363
Bernard Ogdenda13af32013-10-24 18:32:51 +00004364 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004365
Logan Chien57086ce2012-10-10 06:56:20 +00004366 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004367 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004368
4369 // Initialized via features.
4370 unsigned SoftFloat : 1;
4371 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004372
Bernard Ogden18b57012013-10-29 09:47:51 +00004373 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004374 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004375 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004376 unsigned Unaligned : 1;
4377
4378 enum {
4379 LDREX_B = (1 << 0), /// byte (8-bit)
4380 LDREX_H = (1 << 1), /// half (16-bit)
4381 LDREX_W = (1 << 2), /// word (32-bit)
4382 LDREX_D = (1 << 3), /// double (64-bit)
4383 };
4384
4385 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004386
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004387 // ACLE 6.5.1 Hardware floating point
4388 enum {
4389 HW_FP_HP = (1 << 1), /// half (16-bit)
4390 HW_FP_SP = (1 << 2), /// single (32-bit)
4391 HW_FP_DP = (1 << 3), /// double (64-bit)
4392 };
4393 uint32_t HW_FP;
4394
Chris Lattner5cc15e02010-03-03 19:03:45 +00004395 static const Builtin::Info BuiltinInfo[];
4396
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004397 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004398 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004399
4400 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004401 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004402
Renato Golin9ba39232015-02-27 16:35:48 +00004403 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4404 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4405 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004406 SizeType = UnsignedLong;
4407 else
4408 SizeType = UnsignedInt;
4409
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004410 switch (T.getOS()) {
4411 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004412 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004413 break;
4414 case llvm::Triple::Win32:
4415 WCharType = UnsignedShort;
4416 break;
4417 case llvm::Triple::Linux:
4418 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004419 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4420 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004421 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004422 }
4423
4424 UseBitFieldTypeAlignment = true;
4425
4426 ZeroLengthBitfieldBoundary = 0;
4427
Tim Northover147cd2f2014-10-14 22:12:21 +00004428 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4429 // so set preferred for small types to 32.
4430 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004431 resetDataLayout(BigEndian
4432 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4433 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004434 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004435 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004436 resetDataLayout("e"
4437 "-m:w"
4438 "-p:32:32"
4439 "-i64:64"
4440 "-v128:64:128"
4441 "-a:0:32"
4442 "-n32"
4443 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004444 } else if (T.isOSNaCl()) {
4445 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004446 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004447 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004448 resetDataLayout(BigEndian
4449 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4450 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004451 }
4452
4453 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004454 }
4455
Tim Northover5627d392015-10-30 16:30:45 +00004456 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004457 const llvm::Triple &T = getTriple();
4458
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004459 IsAAPCS = false;
4460
Tim Northover5627d392015-10-30 16:30:45 +00004461 if (IsAAPCS16)
4462 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4463 else
4464 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004465
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004466 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004467 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004468 SizeType = UnsignedInt;
4469 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004470 SizeType = UnsignedLong;
4471
4472 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4473 WCharType = SignedInt;
4474
4475 // Do not respect the alignment of bit-field types when laying out
4476 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4477 UseBitFieldTypeAlignment = false;
4478
4479 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4480 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4481 /// gcc.
4482 ZeroLengthBitfieldBoundary = 32;
4483
Tim Northover5627d392015-10-30 16:30:45 +00004484 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4485 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004486 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004487 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004488 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004489 BigEndian
4490 ? "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 +00004491 : "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 +00004492 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004493 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004494 BigEndian
4495 ? "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 +00004496 : "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 +00004497
4498 // FIXME: Override "preferred align" for double and long long.
4499 }
4500
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004501 void setArchInfo() {
4502 StringRef ArchName = getTriple().getArchName();
4503
Renato Goline84b0002015-10-08 16:43:26 +00004504 ArchISA = llvm::ARM::parseArchISA(ArchName);
4505 CPU = llvm::ARM::getDefaultCPU(ArchName);
4506 unsigned AK = llvm::ARM::parseArch(ArchName);
4507 if (AK != llvm::ARM::AK_INVALID)
4508 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004509 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004510 }
4511
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004512 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004513 StringRef SubArch;
4514
4515 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004516 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004517 SubArch = llvm::ARM::getSubArch(ArchKind);
4518 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4519 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004520
4521 // cache CPU related strings
4522 CPUAttr = getCPUAttr();
4523 CPUProfile = getCPUProfile();
4524 }
4525
4526 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004527 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004528 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004529 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004530 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4531 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004532 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004533 if (ArchProfile == llvm::ARM::PK_M) {
4534 MaxAtomicPromoteWidth = 32;
4535 if (ShouldUseInlineAtomic)
4536 MaxAtomicInlineWidth = 32;
4537 }
4538 else {
4539 MaxAtomicPromoteWidth = 64;
4540 if (ShouldUseInlineAtomic)
4541 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004542 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004543 }
4544
4545 bool isThumb() const {
4546 return (ArchISA == llvm::ARM::IK_THUMB);
4547 }
4548
4549 bool supportsThumb() const {
4550 return CPUAttr.count('T') || ArchVersion >= 6;
4551 }
4552
4553 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004554 return CPUAttr.equals("6T2") ||
4555 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004556 }
4557
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004558 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004559 // For most sub-arches, the build attribute CPU name is enough.
4560 // For Cortex variants, it's slightly different.
4561 switch(ArchKind) {
4562 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004563 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004564 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004565 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004566 case llvm::ARM::AK_ARMV7S:
4567 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004568 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004569 return "7A";
4570 case llvm::ARM::AK_ARMV7R:
4571 return "7R";
4572 case llvm::ARM::AK_ARMV7M:
4573 return "7M";
4574 case llvm::ARM::AK_ARMV7EM:
4575 return "7EM";
4576 case llvm::ARM::AK_ARMV8A:
4577 return "8A";
4578 case llvm::ARM::AK_ARMV8_1A:
4579 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004580 case llvm::ARM::AK_ARMV8_2A:
4581 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004582 case llvm::ARM::AK_ARMV8MBaseline:
4583 return "8M_BASE";
4584 case llvm::ARM::AK_ARMV8MMainline:
4585 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004586 }
4587 }
4588
4589 StringRef getCPUProfile() const {
4590 switch(ArchProfile) {
4591 case llvm::ARM::PK_A:
4592 return "A";
4593 case llvm::ARM::PK_R:
4594 return "R";
4595 case llvm::ARM::PK_M:
4596 return "M";
4597 default:
4598 return "";
4599 }
4600 }
4601
Chris Lattner17df24e2008-04-21 18:56:49 +00004602public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004603 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4604 bool IsBigEndian)
4605 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4606 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004607 BigEndian = IsBigEndian;
4608
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004609 switch (getTriple().getOS()) {
4610 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004611 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004612 break;
4613 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004614 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004615 break;
4616 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004617
Renato Goline84b0002015-10-08 16:43:26 +00004618 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004619 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004620
Chris Lattner1a8f3942010-04-23 16:29:58 +00004621 // {} in inline assembly are neon specifiers, not assembly variant
4622 // specifiers.
4623 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004624
Eric Christopher0e261882014-12-05 01:06:59 +00004625 // FIXME: This duplicates code from the driver that sets the -target-abi
4626 // option - this code is used if -target-abi isn't passed and should
4627 // be unified in some way.
4628 if (Triple.isOSBinFormatMachO()) {
4629 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4630 // the frontend matches that.
4631 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4632 Triple.getOS() == llvm::Triple::UnknownOS ||
4633 StringRef(CPU).startswith("cortex-m")) {
4634 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004635 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004636 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004637 } else {
4638 setABI("apcs-gnu");
4639 }
4640 } else if (Triple.isOSWindows()) {
4641 // FIXME: this is invalid for WindowsCE
4642 setABI("aapcs");
4643 } else {
4644 // Select the default based on the platform.
4645 switch (Triple.getEnvironment()) {
4646 case llvm::Triple::Android:
4647 case llvm::Triple::GNUEABI:
4648 case llvm::Triple::GNUEABIHF:
4649 setABI("aapcs-linux");
4650 break;
4651 case llvm::Triple::EABIHF:
4652 case llvm::Triple::EABI:
4653 setABI("aapcs");
4654 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004655 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004656 setABI("apcs-gnu");
4657 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004658 default:
4659 if (Triple.getOS() == llvm::Triple::NetBSD)
4660 setABI("apcs-gnu");
4661 else
4662 setABI("aapcs");
4663 break;
4664 }
4665 }
John McCall86353412010-08-21 22:46:04 +00004666
4667 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004668 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004669
Renato Golin15b86152015-07-03 16:41:13 +00004670 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004671 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004672
James Molloya7139222012-03-12 09:14:10 +00004673 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004674 // the alignment of the zero-length bitfield is greater than the member
4675 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004676 // zero length bitfield.
4677 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004678
4679 if (Triple.getOS() == llvm::Triple::Linux ||
4680 Triple.getOS() == llvm::Triple::UnknownOS)
4681 this->MCountName =
4682 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004683 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004684
Alp Toker4925ba72014-06-07 23:30:42 +00004685 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004686
Craig Topper3164f332014-03-11 03:39:26 +00004687 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004688 ABI = Name;
4689
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004690 // The defaults (above) are for AAPCS, check if we need to change them.
4691 //
4692 // FIXME: We need support for -meabi... we could just mangle it into the
4693 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004694 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004695 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004696 return true;
4697 }
4698 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4699 setABIAAPCS();
4700 return true;
4701 }
4702 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004703 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004704
Renato Golinf5c4dec2015-05-27 13:33:00 +00004705 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004706 bool
4707 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4708 StringRef CPU,
4709 const std::vector<std::string> &FeaturesVec) const override {
4710
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004711 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004712 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004713
4714 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004715 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004716 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4717
4718 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004719 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004720 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4721
4722 for (const char *Feature : TargetFeatures)
4723 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004724 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004725
Eric Christopher007b0a02015-08-28 22:32:01 +00004726 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004727 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004728
Craig Topper3164f332014-03-11 03:39:26 +00004729 bool handleTargetFeatures(std::vector<std::string> &Features,
4730 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004731 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004732 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004733 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004734 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004735 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004736 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004737 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004738
Ranjeet Singhac08e532015-06-24 23:39:25 +00004739 // This does not diagnose illegal cases like having both
4740 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4741 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004742 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004743 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004744 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004745 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004746 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004747 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004748 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004749 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004750 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004751 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004752 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004753 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004754 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004755 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004756 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004757 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004758 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004759 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004760 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004761 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004762 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004763 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004764 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004765 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004766 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004767 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004768 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004769 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004770 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004771 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004772 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004773 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004774 } else if (Feature == "+strict-align") {
4775 Unaligned = 0;
4776 } else if (Feature == "+fp16") {
4777 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004778 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004779 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004780 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004781
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004782 switch (ArchVersion) {
4783 case 6:
4784 if (ArchProfile == llvm::ARM::PK_M)
4785 LDREX = 0;
4786 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4787 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4788 else
4789 LDREX = LDREX_W;
4790 break;
4791 case 7:
4792 if (ArchProfile == llvm::ARM::PK_M)
4793 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4794 else
4795 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4796 break;
4797 case 8:
4798 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4799 }
4800
Rafael Espindolaeb265472013-08-21 21:59:03 +00004801 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4802 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4803 return false;
4804 }
4805
4806 if (FPMath == FP_Neon)
4807 Features.push_back("+neonfp");
4808 else if (FPMath == FP_VFP)
4809 Features.push_back("-neonfp");
4810
Daniel Dunbar893d4752009-12-19 04:15:38 +00004811 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004812 auto Feature =
4813 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4814 if (Feature != Features.end())
4815 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004816
Rafael Espindolaeb265472013-08-21 21:59:03 +00004817 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004818 }
4819
Craig Topper3164f332014-03-11 03:39:26 +00004820 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004821 return llvm::StringSwitch<bool>(Feature)
4822 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004823 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004824 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004825 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004826 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004827 .Case("hwdiv", HWDiv & HWDivThumb)
4828 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004829 .Default(false);
4830 }
Renato Golin15b86152015-07-03 16:41:13 +00004831
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004832 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004833 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004834 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004835
Renato Golin15b86152015-07-03 16:41:13 +00004836 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004837 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004838 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004839 CPU = Name;
4840 return true;
4841 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004842
Craig Topper3164f332014-03-11 03:39:26 +00004843 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004844
Craig Topper3164f332014-03-11 03:39:26 +00004845 void getTargetDefines(const LangOptions &Opts,
4846 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004847 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004848 Builder.defineMacro("__arm");
4849 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00004850 // For bare-metal none-eabi.
4851 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
4852 getTriple().getEnvironment() == llvm::Triple::EABI)
4853 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004854
Chris Lattnerecd49032009-03-02 22:27:17 +00004855 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004856 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004857
4858 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4859 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004860 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004861 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4862
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004863 if (!CPUAttr.empty())
4864 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004865
4866 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004867 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004868 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004869
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004870 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004871 // ACLE 6.5.7 Crypto Extension
4872 if (Crypto)
4873 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4874 // ACLE 6.5.8 CRC32 Extension
4875 if (CRC)
4876 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4877 // ACLE 6.5.10 Numeric Maximum and Minimum
4878 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4879 // ACLE 6.5.9 Directed Rounding
4880 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004881 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004882
4883 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4884 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00004885 // NOTE that the default profile is assumed to be 'A'
4886 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004887 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4888
Bradley Smithf4affc12016-03-03 13:52:22 +00004889 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
4890 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
4891 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
4892 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004893 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004894 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004895 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004896 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4897
4898 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4899 // instruction set such as ARM or Thumb.
4900 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4901
4902 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4903
4904 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004905 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004906 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004907
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004908 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004909 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004910 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004911
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004912 // ACLE 6.4.4 LDREX/STREX
4913 if (LDREX)
4914 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4915
4916 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004917 if (ArchVersion == 5 ||
4918 (ArchVersion == 6 && CPUProfile != "M") ||
4919 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004920 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4921
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004922 // ACLE 6.5.1 Hardware Floating Point
4923 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004924 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004925
Yi Konga44c4d72014-06-27 21:25:42 +00004926 // ACLE predefines.
4927 Builder.defineMacro("__ARM_ACLE", "200");
4928
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004929 // FP16 support (we currently only support IEEE format).
4930 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4931 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4932
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004933 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4934 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4935 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4936
Mike Stump9d54bd72009-04-08 02:07:04 +00004937 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004938
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004939 // FIXME: It's more complicated than this and we don't really support
4940 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004941 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004942 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004943 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004944
David Tweed8f676532012-10-25 13:33:01 +00004945 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004946 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004947 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4948 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004949 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004950 Builder.defineMacro("__ARM_PCS", "1");
4951
David Tweed8f676532012-10-25 13:33:01 +00004952 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004953 Builder.defineMacro("__ARM_PCS_VFP", "1");
4954 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004955
Daniel Dunbar893d4752009-12-19 04:15:38 +00004956 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004957 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004958
4959 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004960 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004961
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004962 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004963 Builder.defineMacro("__THUMBEL__");
4964 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004965 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004966 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004967 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004968
4969 // ACLE 6.4.9 32-bit SIMD instructions
4970 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4971 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4972
4973 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004974 if (((HWDiv & HWDivThumb) && isThumb()) ||
4975 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004976 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004977 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004978 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004979
4980 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004981 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004982
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004983 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004984 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004985 if (FPU & VFP2FPU)
4986 Builder.defineMacro("__ARM_VFPV2__");
4987 if (FPU & VFP3FPU)
4988 Builder.defineMacro("__ARM_VFPV3__");
4989 if (FPU & VFP4FPU)
4990 Builder.defineMacro("__ARM_VFPV4__");
4991 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004992
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004993 // This only gets set when Neon instructions are actually available, unlike
4994 // the VFP define, hence the soft float and arch check. This is subtly
4995 // different from gcc, we follow the intent which was that it should be set
4996 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004997 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004998 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004999 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005000 // current AArch32 NEON implementations do not support double-precision
5001 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005002 Builder.defineMacro("__ARM_NEON_FP",
5003 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005004 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005005
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005006 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5007 Opts.ShortWChar ? "2" : "4");
5008
5009 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5010 Opts.ShortEnums ? "1" : "4");
5011
Bradley Smithf4affc12016-03-03 13:52:22 +00005012 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005013 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5014 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5015 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5016 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5017 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005018
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005019 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005020 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005021 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005022 }
5023
5024 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005025 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005026 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5027 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005028 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005029 }
5030
5031 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005032 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005033 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005034
5035 if (Opts.UnsafeFPMath)
5036 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005037
5038 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5039 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005040 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005041
Craig Topper6c03a542015-10-19 04:51:35 +00005042 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5043 return llvm::makeArrayRef(BuiltinInfo,
5044 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005045 }
Craig Topper3164f332014-03-11 03:39:26 +00005046 bool isCLZForZeroUndef() const override { return false; }
5047 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005048 return IsAAPCS
5049 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005050 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5051 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005052 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005053 ArrayRef<const char *> getGCCRegNames() const override;
5054 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005055 bool validateAsmConstraint(const char *&Name,
5056 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005057 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005058 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005059 case 'l': // r0-r7
5060 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005061 case 't': // VFP Floating point register single precision
5062 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005063 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005064 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005065 case 'I':
5066 case 'J':
5067 case 'K':
5068 case 'L':
5069 case 'M':
5070 // FIXME
5071 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005072 case 'Q': // A memory address that is a single base register.
5073 Info.setAllowsMemory();
5074 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005075 case 'U': // a memory reference...
5076 switch (Name[1]) {
5077 case 'q': // ...ARMV4 ldrsb
5078 case 'v': // ...VFP load/store (reg+constant offset)
5079 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005080 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005081 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005082 case 'n': // valid address for Neon doubleword vector load/store
5083 case 'm': // valid address for Neon element and structure load/store
5084 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005085 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005086 Info.setAllowsMemory();
5087 Name++;
5088 return true;
5089 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005090 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005091 return false;
5092 }
Craig Topper3164f332014-03-11 03:39:26 +00005093 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005094 std::string R;
5095 switch (*Constraint) {
5096 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005097 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005098 Constraint++;
5099 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005100 case 'p': // 'p' should be translated to 'r' by default.
5101 R = std::string("r");
5102 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005103 default:
5104 return std::string(1, *Constraint);
5105 }
5106 return R;
5107 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005108 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005109 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005110 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005111 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005112 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005113
Bill Wendling9d1ee112012-10-25 23:28:48 +00005114 // Strip off constraint modifiers.
5115 while (Constraint[0] == '=' ||
5116 Constraint[0] == '+' ||
5117 Constraint[0] == '&')
5118 Constraint = Constraint.substr(1);
5119
5120 switch (Constraint[0]) {
5121 default: break;
5122 case 'r': {
5123 switch (Modifier) {
5124 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005125 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005126 case 'q':
5127 // A register of size 32 cannot fit a vector type.
5128 return false;
5129 }
5130 }
5131 }
5132
5133 return true;
5134 }
Craig Topper3164f332014-03-11 03:39:26 +00005135 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005136 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005137 return "";
5138 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005139
Craig Topper3164f332014-03-11 03:39:26 +00005140 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005141 switch (CC) {
5142 case CC_AAPCS:
5143 case CC_AAPCS_VFP:
5144 case CC_Swift:
5145 return CCCR_OK;
5146 default:
5147 return CCCR_Warning;
5148 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005149 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005150
Craig Topper3164f332014-03-11 03:39:26 +00005151 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005152 if (RegNo == 0) return 0;
5153 if (RegNo == 1) return 1;
5154 return -1;
5155 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005156
5157 bool hasSjLjLowering() const override {
5158 return true;
5159 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005160};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005161
Rafael Espindolaeb265472013-08-21 21:59:03 +00005162bool ARMTargetInfo::setFPMath(StringRef Name) {
5163 if (Name == "neon") {
5164 FPMath = FP_Neon;
5165 return true;
5166 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5167 Name == "vfp4") {
5168 FPMath = FP_VFP;
5169 return true;
5170 }
5171 return false;
5172}
5173
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005174const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005175 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005176 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005177 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5178
5179 // Float registers
5180 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5181 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5182 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005183 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005184
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005185 // Double registers
5186 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5187 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005188 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5189 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005190
5191 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005192 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5193 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005194};
5195
Craig Topperf054e3a2015-10-19 03:52:27 +00005196ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5197 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005198}
5199
5200const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005201 { { "a1" }, "r0" },
5202 { { "a2" }, "r1" },
5203 { { "a3" }, "r2" },
5204 { { "a4" }, "r3" },
5205 { { "v1" }, "r4" },
5206 { { "v2" }, "r5" },
5207 { { "v3" }, "r6" },
5208 { { "v4" }, "r7" },
5209 { { "v5" }, "r8" },
5210 { { "v6", "rfp" }, "r9" },
5211 { { "sl" }, "r10" },
5212 { { "fp" }, "r11" },
5213 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005214 { { "r13" }, "sp" },
5215 { { "r14" }, "lr" },
5216 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005217 // The S, D and Q registers overlap, but aren't really aliases; we
5218 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005219};
5220
Craig Topperf054e3a2015-10-19 03:52:27 +00005221ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5222 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005223}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005224
5225const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005226#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005227 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005228#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5229 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005230#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005231
Craig Topper07d3b622015-08-07 05:14:44 +00005232#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005233 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005234#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005235 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005236#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5237 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005238#include "clang/Basic/BuiltinsARM.def"
5239};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005240
5241class ARMleTargetInfo : public ARMTargetInfo {
5242public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005243 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5244 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005245 void getTargetDefines(const LangOptions &Opts,
5246 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005247 Builder.defineMacro("__ARMEL__");
5248 ARMTargetInfo::getTargetDefines(Opts, Builder);
5249 }
5250};
5251
5252class ARMbeTargetInfo : public ARMTargetInfo {
5253public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005254 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5255 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005256 void getTargetDefines(const LangOptions &Opts,
5257 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005258 Builder.defineMacro("__ARMEB__");
5259 Builder.defineMacro("__ARM_BIG_ENDIAN");
5260 ARMTargetInfo::getTargetDefines(Opts, Builder);
5261 }
5262};
Chris Lattner17df24e2008-04-21 18:56:49 +00005263
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005264class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5265 const llvm::Triple Triple;
5266public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005267 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5268 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005269 WCharType = UnsignedShort;
5270 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005271 }
5272 void getVisualStudioDefines(const LangOptions &Opts,
5273 MacroBuilder &Builder) const {
5274 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5275
5276 // FIXME: this is invalid for WindowsCE
5277 Builder.defineMacro("_M_ARM_NT", "1");
5278 Builder.defineMacro("_M_ARMT", "_M_ARM");
5279 Builder.defineMacro("_M_THUMB", "_M_ARM");
5280
5281 assert((Triple.getArch() == llvm::Triple::arm ||
5282 Triple.getArch() == llvm::Triple::thumb) &&
5283 "invalid architecture for Windows ARM target info");
5284 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5285 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5286
5287 // TODO map the complete set of values
5288 // 31: VFPv3 40: VFPv4
5289 Builder.defineMacro("_M_ARM_FP", "31");
5290 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005291 BuiltinVaListKind getBuiltinVaListKind() const override {
5292 return TargetInfo::CharPtrBuiltinVaList;
5293 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005294 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5295 switch (CC) {
5296 case CC_X86StdCall:
5297 case CC_X86ThisCall:
5298 case CC_X86FastCall:
5299 case CC_X86VectorCall:
5300 return CCCR_Ignore;
5301 case CC_C:
5302 return CCCR_OK;
5303 default:
5304 return CCCR_Warning;
5305 }
5306 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005307};
5308
5309// Windows ARM + Itanium C++ ABI Target
5310class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005312 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5313 const TargetOptions &Opts)
5314 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005315 TheCXXABI.set(TargetCXXABI::GenericARM);
5316 }
5317
5318 void getTargetDefines(const LangOptions &Opts,
5319 MacroBuilder &Builder) const override {
5320 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5321
5322 if (Opts.MSVCCompat)
5323 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5324 }
5325};
5326
5327// Windows ARM, MS (C++) ABI
5328class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5329public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005330 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5331 const TargetOptions &Opts)
5332 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005333 TheCXXABI.set(TargetCXXABI::Microsoft);
5334 }
5335
5336 void getTargetDefines(const LangOptions &Opts,
5337 MacroBuilder &Builder) const override {
5338 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5339 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5340 }
5341};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005342
Yaron Keren321249c2015-07-15 13:32:23 +00005343// ARM MinGW target
5344class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5345public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005346 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5347 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005348 TheCXXABI.set(TargetCXXABI::GenericARM);
5349 }
5350
5351 void getTargetDefines(const LangOptions &Opts,
5352 MacroBuilder &Builder) const override {
5353 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5354 DefineStd(Builder, "WIN32", Opts);
5355 DefineStd(Builder, "WINNT", Opts);
5356 Builder.defineMacro("_ARM_");
5357 addMinGWDefines(Opts, Builder);
5358 }
5359};
5360
5361// ARM Cygwin target
5362class CygwinARMTargetInfo : public ARMleTargetInfo {
5363public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005364 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5365 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005366 TLSSupported = false;
5367 WCharType = UnsignedShort;
5368 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005369 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005370 }
5371 void getTargetDefines(const LangOptions &Opts,
5372 MacroBuilder &Builder) const override {
5373 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5374 Builder.defineMacro("_ARM_");
5375 Builder.defineMacro("__CYGWIN__");
5376 Builder.defineMacro("__CYGWIN32__");
5377 DefineStd(Builder, "unix", Opts);
5378 if (Opts.CPlusPlus)
5379 Builder.defineMacro("_GNU_SOURCE");
5380 }
5381};
5382
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005383class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005384protected:
Craig Topper3164f332014-03-11 03:39:26 +00005385 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5386 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005387 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005388 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005389
Torok Edwinb2b37c62009-06-30 17:10:35 +00005390public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005391 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5392 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005393 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005394 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005395 // FIXME: This should be based off of the target features in
5396 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005397 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005398
Tim Northoverd88ecb32016-01-27 19:32:40 +00005399 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005400 // Darwin on iOS uses a variant of the ARM C++ ABI.
5401 TheCXXABI.set(TargetCXXABI::WatchOS);
5402
5403 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5404 // size_t is long, it's a bit weird for it to be int.
5405 PtrDiffType = SignedLong;
5406
5407 // BOOL should be a real boolean on the new ABI
5408 UseSignedCharForObjCBool = false;
5409 } else
5410 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005411 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005412};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005413
Tim Northover573cbee2014-05-24 12:52:07 +00005414class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005415 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005416 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5417 static const char *const GCCRegNames[];
5418
James Molloy75f5f9e2014-04-16 15:33:48 +00005419 enum FPUModeEnum {
5420 FPUMode,
5421 NeonMode
5422 };
5423
5424 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005425 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005426 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005427 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005428 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005429
Tim Northovera2ee4332014-03-29 15:09:45 +00005430 static const Builtin::Info BuiltinInfo[];
5431
5432 std::string ABI;
5433
5434public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005435 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005436 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005437 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5438 WCharType = SignedInt;
5439
5440 // NetBSD apparently prefers consistency across ARM targets to consistency
5441 // across 64-bit targets.
5442 Int64Type = SignedLongLong;
5443 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005444 } else {
5445 WCharType = UnsignedInt;
5446 Int64Type = SignedLong;
5447 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005448 }
5449
Tim Northovera2ee4332014-03-29 15:09:45 +00005450 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005451 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005452 MaxAtomicInlineWidth = 128;
5453 MaxAtomicPromoteWidth = 128;
5454
Tim Northovera6a19f12015-02-06 01:25:07 +00005455 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005456 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5457
Tim Northovera2ee4332014-03-29 15:09:45 +00005458 // {} in inline assembly are neon specifiers, not assembly variant
5459 // specifiers.
5460 NoAsmVariants = true;
5461
Tim Northover7ad87af2015-01-16 18:44:04 +00005462 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5463 // contributes to the alignment of the containing aggregate in the same way
5464 // a plain (non bit-field) member of that type would, without exception for
5465 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005466 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005467 UseZeroLengthBitfieldAlignment = true;
5468
Tim Northover573cbee2014-05-24 12:52:07 +00005469 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005470 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005471
5472 if (Triple.getOS() == llvm::Triple::Linux ||
5473 Triple.getOS() == llvm::Triple::UnknownOS)
5474 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005475 }
5476
Alp Toker4925ba72014-06-07 23:30:42 +00005477 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005478 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005479 if (Name != "aapcs" && Name != "darwinpcs")
5480 return false;
5481
5482 ABI = Name;
5483 return true;
5484 }
5485
David Blaikie1cbb9712014-11-14 19:09:44 +00005486 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005487 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005488 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005489 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5490 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005491 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005492 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005493 .Default(false);
5494 return CPUKnown;
5495 }
5496
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005497 void getTargetDefines(const LangOptions &Opts,
5498 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005499 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005500 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005501
5502 // Target properties.
5503 Builder.defineMacro("_LP64");
5504 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005505
5506 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5507 Builder.defineMacro("__ARM_ACLE", "200");
5508 Builder.defineMacro("__ARM_ARCH", "8");
5509 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5510
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005511 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005512 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005513 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005514
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005515 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5516 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5517 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5518 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005519 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005520 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5521 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005522
5523 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5524
5525 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005526 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005527
5528 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5529 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005530 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5531 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005532
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005533 if (Opts.UnsafeFPMath)
5534 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005535
5536 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5537
5538 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5539 Opts.ShortEnums ? "1" : "4");
5540
James Molloy75f5f9e2014-04-16 15:33:48 +00005541 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005542 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005543 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005544 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005545 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005546
Bradley Smith418c5932014-05-02 15:17:51 +00005547 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005548 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005549
James Molloy75f5f9e2014-04-16 15:33:48 +00005550 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005551 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5552
5553 if (Unaligned)
5554 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005555
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005556 if (V8_1A)
5557 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5558
Reid Klecknerd167d422015-05-06 15:31:46 +00005559 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5560 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5561 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5562 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5563 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005564 }
5565
Craig Topper6c03a542015-10-19 04:51:35 +00005566 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5567 return llvm::makeArrayRef(BuiltinInfo,
5568 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005569 }
5570
David Blaikie1cbb9712014-11-14 19:09:44 +00005571 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005572 return Feature == "aarch64" ||
5573 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005574 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005575 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005576 }
5577
James Molloy5e73df52014-04-16 15:06:20 +00005578 bool handleTargetFeatures(std::vector<std::string> &Features,
5579 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005580 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005581 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005582 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005583 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005584 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005585
Eric Christopher610fe112015-08-26 08:21:55 +00005586 for (const auto &Feature : Features) {
5587 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005588 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005589 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005590 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005591 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005592 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005593 if (Feature == "+strict-align")
5594 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005595 if (Feature == "+v8.1a")
5596 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005597 }
5598
James Y Knightb214cbc2016-03-04 19:00:41 +00005599 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005600
5601 return true;
5602 }
5603
John McCall477f2bb2016-03-03 06:39:32 +00005604 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5605 switch (CC) {
5606 case CC_C:
5607 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005608 case CC_PreserveMost:
5609 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005610 return CCCR_OK;
5611 default:
5612 return CCCR_Warning;
5613 }
5614 }
5615
David Blaikie1cbb9712014-11-14 19:09:44 +00005616 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005617
David Blaikie1cbb9712014-11-14 19:09:44 +00005618 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005619 return TargetInfo::AArch64ABIBuiltinVaList;
5620 }
5621
Craig Topperf054e3a2015-10-19 03:52:27 +00005622 ArrayRef<const char *> getGCCRegNames() const override;
5623 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005624
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005625 bool validateAsmConstraint(const char *&Name,
5626 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005627 switch (*Name) {
5628 default:
5629 return false;
5630 case 'w': // Floating point and SIMD registers (V0-V31)
5631 Info.setAllowsRegister();
5632 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005633 case 'I': // Constant that can be used with an ADD instruction
5634 case 'J': // Constant that can be used with a SUB instruction
5635 case 'K': // Constant that can be used with a 32-bit logical instruction
5636 case 'L': // Constant that can be used with a 64-bit logical instruction
5637 case 'M': // Constant that can be used as a 32-bit MOV immediate
5638 case 'N': // Constant that can be used as a 64-bit MOV immediate
5639 case 'Y': // Floating point constant zero
5640 case 'Z': // Integer constant zero
5641 return true;
5642 case 'Q': // A memory reference with base register and no offset
5643 Info.setAllowsMemory();
5644 return true;
5645 case 'S': // A symbolic address
5646 Info.setAllowsRegister();
5647 return true;
5648 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005649 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5650 // Utf: A memory address suitable for ldp/stp in TF mode.
5651 // Usa: An absolute symbolic address.
5652 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5653 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005654 case 'z': // Zero register, wzr or xzr
5655 Info.setAllowsRegister();
5656 return true;
5657 case 'x': // Floating point and SIMD registers (V0-V15)
5658 Info.setAllowsRegister();
5659 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005660 }
5661 return false;
5662 }
5663
Akira Hatanaka987f1862014-08-22 06:05:21 +00005664 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005665 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005666 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005667 // Strip off constraint modifiers.
5668 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5669 Constraint = Constraint.substr(1);
5670
5671 switch (Constraint[0]) {
5672 default:
5673 return true;
5674 case 'z':
5675 case 'r': {
5676 switch (Modifier) {
5677 case 'x':
5678 case 'w':
5679 // For now assume that the person knows what they're
5680 // doing with the modifier.
5681 return true;
5682 default:
5683 // By default an 'r' constraint will be in the 'x'
5684 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005685 if (Size == 64)
5686 return true;
5687
5688 SuggestedModifier = "w";
5689 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005690 }
5691 }
5692 }
5693 }
5694
David Blaikie1cbb9712014-11-14 19:09:44 +00005695 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005696
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005697 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005698 if (RegNo == 0)
5699 return 0;
5700 if (RegNo == 1)
5701 return 1;
5702 return -1;
5703 }
5704};
5705
Tim Northover573cbee2014-05-24 12:52:07 +00005706const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005707 // 32-bit Integer registers
5708 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5709 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5710 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5711
5712 // 64-bit Integer registers
5713 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5714 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5715 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5716
5717 // 32-bit floating point regsisters
5718 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5719 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5720 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5721
5722 // 64-bit floating point regsisters
5723 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5724 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5725 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5726
5727 // Vector registers
5728 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5729 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5730 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5731};
5732
Craig Topperf054e3a2015-10-19 03:52:27 +00005733ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5734 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005735}
5736
Tim Northover573cbee2014-05-24 12:52:07 +00005737const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005738 { { "w31" }, "wsp" },
5739 { { "x29" }, "fp" },
5740 { { "x30" }, "lr" },
5741 { { "x31" }, "sp" },
5742 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5743 // don't want to substitute one of these for a different-sized one.
5744};
5745
Craig Topperf054e3a2015-10-19 03:52:27 +00005746ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5747 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005748}
5749
Tim Northover573cbee2014-05-24 12:52:07 +00005750const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005751#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005752 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005753#include "clang/Basic/BuiltinsNEON.def"
5754
5755#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005756 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005757#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005758};
James Molloy5e73df52014-04-16 15:06:20 +00005759
Tim Northover573cbee2014-05-24 12:52:07 +00005760class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005761 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005762 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005763 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005764 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005765 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005766 }
5767
5768public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005769 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5770 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00005771 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005772 }
James Molloy5e73df52014-04-16 15:06:20 +00005773 void getTargetDefines(const LangOptions &Opts,
5774 MacroBuilder &Builder) const override {
5775 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005776 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005777 }
5778};
5779
Tim Northover573cbee2014-05-24 12:52:07 +00005780class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005781 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005782 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005783 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005784 }
5785
5786public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005787 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5788 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00005789 void getTargetDefines(const LangOptions &Opts,
5790 MacroBuilder &Builder) const override {
5791 Builder.defineMacro("__AARCH64EB__");
5792 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5793 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005794 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005795 }
5796};
Tim Northovera2ee4332014-03-29 15:09:45 +00005797
Tim Northover573cbee2014-05-24 12:52:07 +00005798class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005799protected:
5800 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5801 MacroBuilder &Builder) const override {
5802 Builder.defineMacro("__AARCH64_SIMD__");
5803 Builder.defineMacro("__ARM64_ARCH_8__");
5804 Builder.defineMacro("__ARM_NEON__");
5805 Builder.defineMacro("__LITTLE_ENDIAN__");
5806 Builder.defineMacro("__REGISTER_PREFIX__", "");
5807 Builder.defineMacro("__arm64", "1");
5808 Builder.defineMacro("__arm64__", "1");
5809
5810 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5811 }
5812
Tim Northovera2ee4332014-03-29 15:09:45 +00005813public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005814 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5815 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005816 Int64Type = SignedLongLong;
5817 WCharType = SignedInt;
5818 UseSignedCharForObjCBool = false;
5819
Tim Northovera6a19f12015-02-06 01:25:07 +00005820 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005821 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5822
5823 TheCXXABI.set(TargetCXXABI::iOS64);
5824 }
5825
David Blaikie1cbb9712014-11-14 19:09:44 +00005826 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005827 return TargetInfo::CharPtrBuiltinVaList;
5828 }
5829};
Tim Northovera2ee4332014-03-29 15:09:45 +00005830
Tony Linthicum76329bf2011-12-12 21:14:55 +00005831// Hexagon abstract base class
5832class HexagonTargetInfo : public TargetInfo {
5833 static const Builtin::Info BuiltinInfo[];
5834 static const char * const GCCRegNames[];
5835 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5836 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005837 bool HasHVX, HasHVXDouble;
5838
Tony Linthicum76329bf2011-12-12 21:14:55 +00005839public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005840 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
5841 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005842 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005843 // Specify the vector alignment explicitly. For v512x1, the calculated
5844 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5845 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005846 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005847 "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 +00005848 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005849 SizeType = UnsignedInt;
5850 PtrDiffType = SignedInt;
5851 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005852
5853 // {} in inline assembly are packet specifiers, not assembly variant
5854 // specifiers.
5855 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005856
5857 LargeArrayMinWidth = 64;
5858 LargeArrayAlign = 64;
5859 UseBitFieldTypeAlignment = true;
5860 ZeroLengthBitfieldBoundary = 32;
5861 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005862 }
5863
Craig Topper6c03a542015-10-19 04:51:35 +00005864 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5865 return llvm::makeArrayRef(BuiltinInfo,
5866 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005867 }
5868
Craig Topper3164f332014-03-11 03:39:26 +00005869 bool validateAsmConstraint(const char *&Name,
5870 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005871 return true;
5872 }
5873
Craig Topper3164f332014-03-11 03:39:26 +00005874 void getTargetDefines(const LangOptions &Opts,
5875 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005876
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005877 bool isCLZForZeroUndef() const override { return false; }
5878
Craig Topper3164f332014-03-11 03:39:26 +00005879 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005880 return llvm::StringSwitch<bool>(Feature)
5881 .Case("hexagon", true)
5882 .Case("hvx", HasHVX)
5883 .Case("hvx-double", HasHVXDouble)
5884 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005885 }
Craig Topper3164f332014-03-11 03:39:26 +00005886
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005887 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5888 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5889 const override;
5890
5891 bool handleTargetFeatures(std::vector<std::string> &Features,
5892 DiagnosticsEngine &Diags) override;
5893
Craig Topper3164f332014-03-11 03:39:26 +00005894 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005895 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005896 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005897 ArrayRef<const char *> getGCCRegNames() const override;
5898 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005899 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005900 return "";
5901 }
Sebastian Pop86500282012-01-13 20:37:10 +00005902
5903 static const char *getHexagonCPUSuffix(StringRef Name) {
5904 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005905 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005906 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005907 .Case("hexagonv55", "55")
5908 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005909 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005910 }
5911
Craig Topper3164f332014-03-11 03:39:26 +00005912 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005913 if (!getHexagonCPUSuffix(Name))
5914 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005915 CPU = Name;
5916 return true;
5917 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005918
5919 int getEHDataRegisterNumber(unsigned RegNo) const override {
5920 return RegNo < 2 ? RegNo : -1;
5921 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005922};
5923
5924void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005925 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005926 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005927 Builder.defineMacro("__hexagon__", "1");
5928
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005929 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005930 Builder.defineMacro("__HEXAGON_V4__");
5931 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005932 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005933 Builder.defineMacro("__QDSP6_V4__");
5934 Builder.defineMacro("__QDSP6_ARCH__", "4");
5935 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005936 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005937 Builder.defineMacro("__HEXAGON_V5__");
5938 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5939 if(Opts.HexagonQdsp6Compat) {
5940 Builder.defineMacro("__QDSP6_V5__");
5941 Builder.defineMacro("__QDSP6_ARCH__", "5");
5942 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00005943 } else if (CPU == "hexagonv55") {
5944 Builder.defineMacro("__HEXAGON_V55__");
5945 Builder.defineMacro("__HEXAGON_ARCH__", "55");
5946 Builder.defineMacro("__QDSP6_V55__");
5947 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005948 } else if (CPU == "hexagonv60") {
5949 Builder.defineMacro("__HEXAGON_V60__");
5950 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5951 Builder.defineMacro("__QDSP6_V60__");
5952 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005953 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00005954
5955 if (hasFeature("hvx")) {
5956 Builder.defineMacro("__HVX__");
5957 if (hasFeature("hvx-double"))
5958 Builder.defineMacro("__HVXDBL__");
5959 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005960}
5961
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005962bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5963 DiagnosticsEngine &Diags) {
5964 for (auto &F : Features) {
5965 if (F == "+hvx")
5966 HasHVX = true;
5967 else if (F == "-hvx")
5968 HasHVX = HasHVXDouble = false;
5969 else if (F == "+hvx-double")
5970 HasHVX = HasHVXDouble = true;
5971 else if (F == "-hvx-double")
5972 HasHVXDouble = false;
5973 }
5974 return true;
5975}
5976
5977bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5978 DiagnosticsEngine &Diags, StringRef CPU,
5979 const std::vector<std::string> &FeaturesVec) const {
5980 // Default for v60: -hvx, -hvx-double.
5981 Features["hvx"] = false;
5982 Features["hvx-double"] = false;
5983
5984 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5985}
5986
5987
5988const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005989 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5990 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5991 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5992 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5993 "p0", "p1", "p2", "p3",
5994 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5995};
5996
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005997ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005998 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005999}
6000
Tony Linthicum76329bf2011-12-12 21:14:55 +00006001const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6002 { { "sp" }, "r29" },
6003 { { "fp" }, "r30" },
6004 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006005};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006006
Craig Topperf054e3a2015-10-19 03:52:27 +00006007ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6008 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006009}
6010
6011
6012const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006013#define BUILTIN(ID, TYPE, ATTRS) \
6014 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6015#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6016 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006017#include "clang/Basic/BuiltinsHexagon.def"
6018};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006019
Jacques Pienaard964cc22016-03-28 21:02:54 +00006020class LanaiTargetInfo : public TargetInfo {
6021 // Class for Lanai (32-bit).
6022 // The CPU profiles supported by the Lanai backend
6023 enum CPUKind {
6024 CK_NONE,
6025 CK_V11,
6026 } CPU;
6027
6028 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6029 static const char *const GCCRegNames[];
6030
6031public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006032 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6033 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006034 // Description string has to be kept in sync with backend.
6035 resetDataLayout("E" // Big endian
6036 "-m:e" // ELF name manging
6037 "-p:32:32" // 32 bit pointers, 32 bit aligned
6038 "-i64:64" // 64 bit integers, 64 bit aligned
6039 "-a:0:32" // 32 bit alignment of objects of aggregate type
6040 "-n32" // 32 bit native integer width
6041 "-S64" // 64 bit natural stack alignment
6042 );
6043
6044 // Setting RegParmMax equal to what mregparm was set to in the old
6045 // toolchain
6046 RegParmMax = 4;
6047
6048 // Set the default CPU to V11
6049 CPU = CK_V11;
6050
6051 // Temporary approach to make everything at least word-aligned and allow for
6052 // safely casting between pointers with different alignment requirements.
6053 // TODO: Remove this when there are no more cast align warnings on the
6054 // firmware.
6055 MinGlobalAlign = 32;
6056 }
6057
6058 void getTargetDefines(const LangOptions &Opts,
6059 MacroBuilder &Builder) const override {
6060 // Define __lanai__ when building for target lanai.
6061 Builder.defineMacro("__lanai__");
6062
6063 // Set define for the CPU specified.
6064 switch (CPU) {
6065 case CK_V11:
6066 Builder.defineMacro("__LANAI_V11__");
6067 break;
6068 case CK_NONE:
6069 llvm_unreachable("Unhandled target CPU");
6070 }
6071 }
6072
6073 bool setCPU(const std::string &Name) override {
6074 CPU = llvm::StringSwitch<CPUKind>(Name)
6075 .Case("v11", CK_V11)
6076 .Default(CK_NONE);
6077
6078 return CPU != CK_NONE;
6079 }
6080
6081 bool hasFeature(StringRef Feature) const override {
6082 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6083 }
6084
6085 ArrayRef<const char *> getGCCRegNames() const override;
6086
6087 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6088
6089 BuiltinVaListKind getBuiltinVaListKind() const override {
6090 return TargetInfo::VoidPtrBuiltinVaList;
6091 }
6092
6093 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6094
6095 bool validateAsmConstraint(const char *&Name,
6096 TargetInfo::ConstraintInfo &info) const override {
6097 return false;
6098 }
6099
6100 const char *getClobbers() const override { return ""; }
6101};
6102
6103const char *const LanaiTargetInfo::GCCRegNames[] = {
6104 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6105 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6106 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6107
6108ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6109 return llvm::makeArrayRef(GCCRegNames);
6110}
6111
6112const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6113 {{"pc"}, "r2"},
6114 {{"sp"}, "r4"},
6115 {{"fp"}, "r5"},
6116 {{"rv"}, "r8"},
6117 {{"rr1"}, "r10"},
6118 {{"rr2"}, "r11"},
6119 {{"rca"}, "r15"},
6120};
6121
6122ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6123 return llvm::makeArrayRef(GCCRegAliases);
6124}
6125
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006126// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6127class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006128 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6129 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006130 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006131public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006132 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006133 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006134
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006135 int getEHDataRegisterNumber(unsigned RegNo) const override {
6136 if (RegNo == 0) return 24;
6137 if (RegNo == 1) return 25;
6138 return -1;
6139 }
6140
Craig Topper3164f332014-03-11 03:39:26 +00006141 bool handleTargetFeatures(std::vector<std::string> &Features,
6142 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006143 // The backend doesn't actually handle soft float yet, but in case someone
6144 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006145 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6146 if (Feature != Features.end()) {
6147 SoftFloat = true;
6148 Features.erase(Feature);
6149 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006150 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006151 }
Craig Topper3164f332014-03-11 03:39:26 +00006152 void getTargetDefines(const LangOptions &Opts,
6153 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006154 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006155 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006156
6157 if (SoftFloat)
6158 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006159 }
Craig Topper3164f332014-03-11 03:39:26 +00006160
6161 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006162 return llvm::StringSwitch<bool>(Feature)
6163 .Case("softfloat", SoftFloat)
6164 .Case("sparc", true)
6165 .Default(false);
6166 }
Craig Topper3164f332014-03-11 03:39:26 +00006167
Craig Topper6c03a542015-10-19 04:51:35 +00006168 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006169 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006170 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006171 }
Craig Topper3164f332014-03-11 03:39:26 +00006172 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006173 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006174 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006175 ArrayRef<const char *> getGCCRegNames() const override;
6176 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006177 bool validateAsmConstraint(const char *&Name,
6178 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006179 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006180 switch (*Name) {
6181 case 'I': // Signed 13-bit constant
6182 case 'J': // Zero
6183 case 'K': // 32-bit constant with the low 12 bits clear
6184 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6185 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6186 case 'N': // Same as 'K' but zext (required for SIMode)
6187 case 'O': // The constant 4096
6188 return true;
6189 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006190 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006191 }
Craig Topper3164f332014-03-11 03:39:26 +00006192 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006193 // FIXME: Implement!
6194 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006195 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006196
6197 // No Sparc V7 for now, the backend doesn't support it anyway.
6198 enum CPUKind {
6199 CK_GENERIC,
6200 CK_V8,
6201 CK_SUPERSPARC,
6202 CK_SPARCLITE,
6203 CK_F934,
6204 CK_HYPERSPARC,
6205 CK_SPARCLITE86X,
6206 CK_SPARCLET,
6207 CK_TSC701,
6208 CK_V9,
6209 CK_ULTRASPARC,
6210 CK_ULTRASPARC3,
6211 CK_NIAGARA,
6212 CK_NIAGARA2,
6213 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006214 CK_NIAGARA4,
6215 CK_MYRIAD2_1,
6216 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006217 } CPU = CK_GENERIC;
6218
6219 enum CPUGeneration {
6220 CG_V8,
6221 CG_V9,
6222 };
6223
6224 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6225 switch (Kind) {
6226 case CK_GENERIC:
6227 case CK_V8:
6228 case CK_SUPERSPARC:
6229 case CK_SPARCLITE:
6230 case CK_F934:
6231 case CK_HYPERSPARC:
6232 case CK_SPARCLITE86X:
6233 case CK_SPARCLET:
6234 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006235 case CK_MYRIAD2_1:
6236 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006237 return CG_V8;
6238 case CK_V9:
6239 case CK_ULTRASPARC:
6240 case CK_ULTRASPARC3:
6241 case CK_NIAGARA:
6242 case CK_NIAGARA2:
6243 case CK_NIAGARA3:
6244 case CK_NIAGARA4:
6245 return CG_V9;
6246 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006247 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006248 }
6249
6250 CPUKind getCPUKind(StringRef Name) const {
6251 return llvm::StringSwitch<CPUKind>(Name)
6252 .Case("v8", CK_V8)
6253 .Case("supersparc", CK_SUPERSPARC)
6254 .Case("sparclite", CK_SPARCLITE)
6255 .Case("f934", CK_F934)
6256 .Case("hypersparc", CK_HYPERSPARC)
6257 .Case("sparclite86x", CK_SPARCLITE86X)
6258 .Case("sparclet", CK_SPARCLET)
6259 .Case("tsc701", CK_TSC701)
6260 .Case("v9", CK_V9)
6261 .Case("ultrasparc", CK_ULTRASPARC)
6262 .Case("ultrasparc3", CK_ULTRASPARC3)
6263 .Case("niagara", CK_NIAGARA)
6264 .Case("niagara2", CK_NIAGARA2)
6265 .Case("niagara3", CK_NIAGARA3)
6266 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006267 .Case("myriad2", CK_MYRIAD2_1)
6268 .Case("myriad2.1", CK_MYRIAD2_1)
6269 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006270 .Default(CK_GENERIC);
6271 }
6272
6273 bool setCPU(const std::string &Name) override {
6274 CPU = getCPUKind(Name);
6275 return CPU != CK_GENERIC;
6276 }
Gabor Greif49991682008-02-21 16:29:08 +00006277};
6278
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006279const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006280 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6281 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6282 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6283 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6284};
6285
Craig Topperf054e3a2015-10-19 03:52:27 +00006286ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6287 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006288}
6289
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006290const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006291 { { "g0" }, "r0" },
6292 { { "g1" }, "r1" },
6293 { { "g2" }, "r2" },
6294 { { "g3" }, "r3" },
6295 { { "g4" }, "r4" },
6296 { { "g5" }, "r5" },
6297 { { "g6" }, "r6" },
6298 { { "g7" }, "r7" },
6299 { { "o0" }, "r8" },
6300 { { "o1" }, "r9" },
6301 { { "o2" }, "r10" },
6302 { { "o3" }, "r11" },
6303 { { "o4" }, "r12" },
6304 { { "o5" }, "r13" },
6305 { { "o6", "sp" }, "r14" },
6306 { { "o7" }, "r15" },
6307 { { "l0" }, "r16" },
6308 { { "l1" }, "r17" },
6309 { { "l2" }, "r18" },
6310 { { "l3" }, "r19" },
6311 { { "l4" }, "r20" },
6312 { { "l5" }, "r21" },
6313 { { "l6" }, "r22" },
6314 { { "l7" }, "r23" },
6315 { { "i0" }, "r24" },
6316 { { "i1" }, "r25" },
6317 { { "i2" }, "r26" },
6318 { { "i3" }, "r27" },
6319 { { "i4" }, "r28" },
6320 { { "i5" }, "r29" },
6321 { { "i6", "fp" }, "r30" },
6322 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006323};
6324
Craig Topperf054e3a2015-10-19 03:52:27 +00006325ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6326 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006327}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006328
6329// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6330class SparcV8TargetInfo : public SparcTargetInfo {
6331public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006332 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6333 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006334 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006335 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6336 switch (getTriple().getOS()) {
6337 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006338 SizeType = UnsignedInt;
6339 IntPtrType = SignedInt;
6340 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006341 break;
6342 case llvm::Triple::NetBSD:
6343 case llvm::Triple::OpenBSD:
6344 SizeType = UnsignedLong;
6345 IntPtrType = SignedLong;
6346 PtrDiffType = SignedLong;
6347 break;
Brad Smith56495d52015-08-13 22:00:53 +00006348 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006349 }
6350
Craig Topper3164f332014-03-11 03:39:26 +00006351 void getTargetDefines(const LangOptions &Opts,
6352 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006353 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006354 switch (getCPUGeneration(CPU)) {
6355 case CG_V8:
6356 Builder.defineMacro("__sparcv8");
6357 if (getTriple().getOS() != llvm::Triple::Solaris)
6358 Builder.defineMacro("__sparcv8__");
6359 break;
6360 case CG_V9:
6361 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006362 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006363 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006364 Builder.defineMacro("__sparc_v9__");
6365 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006366 break;
6367 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006368 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6369 switch (CPU) {
6370 case CK_MYRIAD2_1:
6371 Builder.defineMacro("__myriad2", "1");
6372 Builder.defineMacro("__myriad2__", "1");
6373 break;
6374 case CK_MYRIAD2_2:
6375 Builder.defineMacro("__myriad2", "2");
6376 Builder.defineMacro("__myriad2__", "2");
6377 break;
6378 default:
6379 break;
6380 }
6381 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006382 }
6383};
6384
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006385// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6386class SparcV8elTargetInfo : public SparcV8TargetInfo {
6387 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006388 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6389 : SparcV8TargetInfo(Triple, Opts) {
6390 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6391 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006392 }
6393};
6394
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006395// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6396class SparcV9TargetInfo : public SparcTargetInfo {
6397public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006398 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6399 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006400 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006401 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006402 // This is an LP64 platform.
6403 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006404
6405 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006406 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006407 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006408 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006409 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006410 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006411
6412 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6413 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6414 LongDoubleWidth = 128;
6415 LongDoubleAlign = 128;
6416 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006417 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006418 }
6419
Craig Topper3164f332014-03-11 03:39:26 +00006420 void getTargetDefines(const LangOptions &Opts,
6421 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006422 SparcTargetInfo::getTargetDefines(Opts, Builder);
6423 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006424 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006425 // Solaris doesn't need these variants, but the BSDs do.
6426 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006427 Builder.defineMacro("__sparc64__");
6428 Builder.defineMacro("__sparc_v9__");
6429 Builder.defineMacro("__sparcv9__");
6430 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006431 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006432
Craig Topper3164f332014-03-11 03:39:26 +00006433 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006434 if (!SparcTargetInfo::setCPU(Name))
6435 return false;
6436 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006437 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006438};
6439
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006440class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006441 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006442 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006443 std::string CPU;
6444 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006445 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006446
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006447public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006448 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006449 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6450 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006451 IntMaxType = SignedLong;
6452 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006453 TLSSupported = true;
6454 IntWidth = IntAlign = 32;
6455 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6456 PointerWidth = PointerAlign = 64;
6457 LongDoubleWidth = 128;
6458 LongDoubleAlign = 64;
6459 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006460 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006461 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006462 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 +00006463 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6464 }
6465 void getTargetDefines(const LangOptions &Opts,
6466 MacroBuilder &Builder) const override {
6467 Builder.defineMacro("__s390__");
6468 Builder.defineMacro("__s390x__");
6469 Builder.defineMacro("__zarch__");
6470 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006471
6472 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6473 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6474 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6475 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6476
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006477 if (HasTransactionalExecution)
6478 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006479 if (Opts.ZVector)
6480 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006481 }
Craig Topper6c03a542015-10-19 04:51:35 +00006482 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6483 return llvm::makeArrayRef(BuiltinInfo,
6484 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006485 }
6486
Craig Topperf054e3a2015-10-19 03:52:27 +00006487 ArrayRef<const char *> getGCCRegNames() const override;
6488 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006489 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006490 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006491 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006492 bool validateAsmConstraint(const char *&Name,
6493 TargetInfo::ConstraintInfo &info) const override;
6494 const char *getClobbers() const override {
6495 // FIXME: Is this really right?
6496 return "";
6497 }
6498 BuiltinVaListKind getBuiltinVaListKind() const override {
6499 return TargetInfo::SystemZBuiltinVaList;
6500 }
6501 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006502 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006503 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6504 .Case("z10", true)
6505 .Case("z196", true)
6506 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006507 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006508 .Default(false);
6509
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006510 return CPUKnown;
6511 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006512 bool
6513 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6514 StringRef CPU,
6515 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006516 if (CPU == "zEC12")
6517 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006518 if (CPU == "z13") {
6519 Features["transactional-execution"] = true;
6520 Features["vector"] = true;
6521 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006522 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006523 }
6524
6525 bool handleTargetFeatures(std::vector<std::string> &Features,
6526 DiagnosticsEngine &Diags) override {
6527 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006528 for (const auto &Feature : Features) {
6529 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006530 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006531 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006532 HasVector = true;
6533 }
6534 // If we use the vector ABI, vector types are 64-bit aligned.
6535 if (HasVector) {
6536 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006537 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6538 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006539 }
6540 return true;
6541 }
6542
6543 bool hasFeature(StringRef Feature) const override {
6544 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006545 .Case("systemz", true)
6546 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006547 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006548 .Default(false);
6549 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006550
6551 StringRef getABI() const override {
6552 if (HasVector)
6553 return "vector";
6554 return "";
6555 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006556
6557 bool useFloat128ManglingForLongDouble() const override {
6558 return true;
6559 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006560};
6561
6562const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6563#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006564 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006565#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6566 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006567#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006568};
6569
6570const char *const SystemZTargetInfo::GCCRegNames[] = {
6571 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6572 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6573 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6574 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6575};
6576
Craig Topperf054e3a2015-10-19 03:52:27 +00006577ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6578 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006579}
6580
6581bool SystemZTargetInfo::
6582validateAsmConstraint(const char *&Name,
6583 TargetInfo::ConstraintInfo &Info) const {
6584 switch (*Name) {
6585 default:
6586 return false;
6587
6588 case 'a': // Address register
6589 case 'd': // Data register (equivalent to 'r')
6590 case 'f': // Floating-point register
6591 Info.setAllowsRegister();
6592 return true;
6593
6594 case 'I': // Unsigned 8-bit constant
6595 case 'J': // Unsigned 12-bit constant
6596 case 'K': // Signed 16-bit constant
6597 case 'L': // Signed 20-bit displacement (on all targets we support)
6598 case 'M': // 0x7fffffff
6599 return true;
6600
6601 case 'Q': // Memory with base and unsigned 12-bit displacement
6602 case 'R': // Likewise, plus an index
6603 case 'S': // Memory with base and signed 20-bit displacement
6604 case 'T': // Likewise, plus an index
6605 Info.setAllowsMemory();
6606 return true;
6607 }
6608}
Ulrich Weigand47445072013-05-06 16:26:41 +00006609
Eric Christopherc48497a2015-09-18 21:26:24 +00006610class MSP430TargetInfo : public TargetInfo {
6611 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006612
Eric Christopherc48497a2015-09-18 21:26:24 +00006613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006614 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6615 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006616 BigEndian = false;
6617 TLSSupported = false;
6618 IntWidth = 16;
6619 IntAlign = 16;
6620 LongWidth = 32;
6621 LongLongWidth = 64;
6622 LongAlign = LongLongAlign = 16;
6623 PointerWidth = 16;
6624 PointerAlign = 16;
6625 SuitableAlign = 16;
6626 SizeType = UnsignedInt;
6627 IntMaxType = SignedLongLong;
6628 IntPtrType = SignedInt;
6629 PtrDiffType = SignedInt;
6630 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006631 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006632 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006633 void getTargetDefines(const LangOptions &Opts,
6634 MacroBuilder &Builder) const override {
6635 Builder.defineMacro("MSP430");
6636 Builder.defineMacro("__MSP430__");
6637 // FIXME: defines for different 'flavours' of MCU
6638 }
Craig Topper6c03a542015-10-19 04:51:35 +00006639 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006640 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006641 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006642 }
6643 bool hasFeature(StringRef Feature) const override {
6644 return Feature == "msp430";
6645 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006646 ArrayRef<const char *> getGCCRegNames() const override;
6647 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006648 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006649 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006650 }
6651 bool validateAsmConstraint(const char *&Name,
6652 TargetInfo::ConstraintInfo &info) const override {
6653 // FIXME: implement
6654 switch (*Name) {
6655 case 'K': // the constant 1
6656 case 'L': // constant -1^20 .. 1^19
6657 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006658 return true;
6659 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006660 // No target constraints for now.
6661 return false;
6662 }
6663 const char *getClobbers() const override {
6664 // FIXME: Is this really right?
6665 return "";
6666 }
6667 BuiltinVaListKind getBuiltinVaListKind() const override {
6668 // FIXME: implement
6669 return TargetInfo::CharPtrBuiltinVaList;
6670 }
6671};
6672
6673const char *const MSP430TargetInfo::GCCRegNames[] = {
6674 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6675 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6676
Craig Topperf054e3a2015-10-19 03:52:27 +00006677ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6678 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006679}
6680
6681// LLVM and Clang cannot be used directly to output native binaries for
6682// target, but is used to compile C code to llvm bitcode with correct
6683// type and alignment information.
6684//
6685// TCE uses the llvm bitcode as input and uses it for generating customized
6686// target processor and program binary. TCE co-design environment is
6687// publicly available in http://tce.cs.tut.fi
6688
6689static const unsigned TCEOpenCLAddrSpaceMap[] = {
6690 3, // opencl_global
6691 4, // opencl_local
6692 5, // opencl_constant
6693 // FIXME: generic has to be added to the target
6694 0, // opencl_generic
6695 0, // cuda_device
6696 0, // cuda_constant
6697 0 // cuda_shared
6698};
6699
6700class TCETargetInfo : public TargetInfo {
6701public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006702 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6703 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006704 TLSSupported = false;
6705 IntWidth = 32;
6706 LongWidth = LongLongWidth = 32;
6707 PointerWidth = 32;
6708 IntAlign = 32;
6709 LongAlign = LongLongAlign = 32;
6710 PointerAlign = 32;
6711 SuitableAlign = 32;
6712 SizeType = UnsignedInt;
6713 IntMaxType = SignedLong;
6714 IntPtrType = SignedInt;
6715 PtrDiffType = SignedInt;
6716 FloatWidth = 32;
6717 FloatAlign = 32;
6718 DoubleWidth = 32;
6719 DoubleAlign = 32;
6720 LongDoubleWidth = 32;
6721 LongDoubleAlign = 32;
6722 FloatFormat = &llvm::APFloat::IEEEsingle;
6723 DoubleFormat = &llvm::APFloat::IEEEsingle;
6724 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006725 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6726 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006727 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6728 UseAddrSpaceMapMangling = true;
6729 }
6730
6731 void getTargetDefines(const LangOptions &Opts,
6732 MacroBuilder &Builder) const override {
6733 DefineStd(Builder, "tce", Opts);
6734 Builder.defineMacro("__TCE__");
6735 Builder.defineMacro("__TCE_V1__");
6736 }
6737 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6738
Craig Topper6c03a542015-10-19 04:51:35 +00006739 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006740 const char *getClobbers() const override { return ""; }
6741 BuiltinVaListKind getBuiltinVaListKind() const override {
6742 return TargetInfo::VoidPtrBuiltinVaList;
6743 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006744 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006745 bool validateAsmConstraint(const char *&Name,
6746 TargetInfo::ConstraintInfo &info) const override {
6747 return true;
6748 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006749 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6750 return None;
6751 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006752};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006753
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006754class BPFTargetInfo : public TargetInfo {
6755public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006756 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6757 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006758 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6759 SizeType = UnsignedLong;
6760 PtrDiffType = SignedLong;
6761 IntPtrType = SignedLong;
6762 IntMaxType = SignedLong;
6763 Int64Type = SignedLong;
6764 RegParmMax = 5;
6765 if (Triple.getArch() == llvm::Triple::bpfeb) {
6766 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006767 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006768 } else {
6769 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006770 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006771 }
6772 MaxAtomicPromoteWidth = 64;
6773 MaxAtomicInlineWidth = 64;
6774 TLSSupported = false;
6775 }
6776 void getTargetDefines(const LangOptions &Opts,
6777 MacroBuilder &Builder) const override {
6778 DefineStd(Builder, "bpf", Opts);
6779 Builder.defineMacro("__BPF__");
6780 }
6781 bool hasFeature(StringRef Feature) const override {
6782 return Feature == "bpf";
6783 }
6784
Craig Topper6c03a542015-10-19 04:51:35 +00006785 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006786 const char *getClobbers() const override {
6787 return "";
6788 }
6789 BuiltinVaListKind getBuiltinVaListKind() const override {
6790 return TargetInfo::VoidPtrBuiltinVaList;
6791 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006792 ArrayRef<const char *> getGCCRegNames() const override {
6793 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006794 }
6795 bool validateAsmConstraint(const char *&Name,
6796 TargetInfo::ConstraintInfo &info) const override {
6797 return true;
6798 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006799 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6800 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006801 }
6802};
6803
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006804class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006805 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006806
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006807 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006808 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006809 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006810 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006811 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006812 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006813 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006814 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006815 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006816 enum DspRevEnum {
6817 NoDSP, DSP1, DSP2
6818 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006819 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006820
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006821protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006822 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006823 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006824
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006825public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006826 MipsTargetInfoBase(const llvm::Triple &Triple, const TargetOptions &,
6827 const std::string &ABIStr, const std::string &CPUStr)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006828 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006829 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006830 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6831 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6832 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006833
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006834 bool isNaN2008Default() const {
6835 return CPU == "mips32r6" || CPU == "mips64r6";
6836 }
6837
6838 bool isFP64Default() const {
6839 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6840 }
6841
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006842 bool isNan2008() const override {
6843 return IsNan2008;
6844 }
6845
Alp Toker4925ba72014-06-07 23:30:42 +00006846 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006847 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006848 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6849 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006850 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006851 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006852 .Case("mips1", IsMips32)
6853 .Case("mips2", IsMips32)
6854 .Case("mips3", true)
6855 .Case("mips4", true)
6856 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006857 .Case("mips32", IsMips32)
6858 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006859 .Case("mips32r3", IsMips32)
6860 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006861 .Case("mips32r6", IsMips32)
6862 .Case("mips64", true)
6863 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006864 .Case("mips64r3", true)
6865 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006866 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006867 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006868 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006869 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006870 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006871 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006872 bool
6873 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6874 StringRef CPU,
6875 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006876 if (CPU.empty())
6877 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006878 if (CPU == "octeon")
6879 Features["mips64r2"] = Features["cnmips"] = true;
6880 else
6881 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006882 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006883 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006884
Craig Topper3164f332014-03-11 03:39:26 +00006885 void getTargetDefines(const LangOptions &Opts,
6886 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006887 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006888 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006889 if (Opts.GNUMode)
6890 Builder.defineMacro("mips");
6891
Simon Atanasyan683535b2012-08-29 19:14:58 +00006892 Builder.defineMacro("__REGISTER_PREFIX__", "");
6893
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006894 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006895 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006896 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006897 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006898 case SoftFloat:
6899 Builder.defineMacro("__mips_soft_float", Twine(1));
6900 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006901 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006902
Simon Atanasyan16071912013-04-14 14:07:30 +00006903 if (IsSingleFloat)
6904 Builder.defineMacro("__mips_single_float", Twine(1));
6905
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006906 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6907 Builder.defineMacro("_MIPS_FPSET",
6908 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6909
Simon Atanasyan72244b62012-07-05 16:06:06 +00006910 if (IsMips16)
6911 Builder.defineMacro("__mips16", Twine(1));
6912
Simon Atanasyan60777612013-04-14 14:07:51 +00006913 if (IsMicromips)
6914 Builder.defineMacro("__mips_micromips", Twine(1));
6915
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006916 if (IsNan2008)
6917 Builder.defineMacro("__mips_nan2008", Twine(1));
6918
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006919 switch (DspRev) {
6920 default:
6921 break;
6922 case DSP1:
6923 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6924 Builder.defineMacro("__mips_dsp", Twine(1));
6925 break;
6926 case DSP2:
6927 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6928 Builder.defineMacro("__mips_dspr2", Twine(1));
6929 Builder.defineMacro("__mips_dsp", Twine(1));
6930 break;
6931 }
6932
Jack Carter44ff1e52013-08-12 17:20:29 +00006933 if (HasMSA)
6934 Builder.defineMacro("__mips_msa", Twine(1));
6935
Simon Atanasyan26f19672012-04-05 19:28:31 +00006936 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6937 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6938 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006939
6940 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6941 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006942
6943 // These shouldn't be defined for MIPS-I but there's no need to check
6944 // for that since MIPS-I isn't supported.
6945 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6946 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6947 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006948 }
6949
Craig Topper6c03a542015-10-19 04:51:35 +00006950 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6951 return llvm::makeArrayRef(BuiltinInfo,
6952 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006953 }
Craig Topper3164f332014-03-11 03:39:26 +00006954 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006955 return llvm::StringSwitch<bool>(Feature)
6956 .Case("mips", true)
6957 .Case("fp64", HasFP64)
6958 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006959 }
Craig Topper3164f332014-03-11 03:39:26 +00006960 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006961 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006962 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006963 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006964 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006965 // CPU register names
6966 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006967 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6968 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6969 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006970 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6971 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006972 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6973 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6974 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6975 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006976 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006977 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00006978 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
6979 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006980 // MSA register names
6981 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6982 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6983 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6984 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6985 // MSA control register names
6986 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6987 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006988 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006989 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006990 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006991 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006992 bool validateAsmConstraint(const char *&Name,
6993 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006994 switch (*Name) {
6995 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006996 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006997 case 'r': // CPU registers.
6998 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006999 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007000 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007001 case 'c': // $25 for indirect jumps
7002 case 'l': // lo register
7003 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007004 Info.setAllowsRegister();
7005 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007006 case 'I': // Signed 16-bit constant
7007 case 'J': // Integer 0
7008 case 'K': // Unsigned 16-bit constant
7009 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7010 case 'M': // Constants not loadable via lui, addiu, or ori
7011 case 'N': // Constant -1 to -65535
7012 case 'O': // A signed 15-bit constant
7013 case 'P': // A constant between 1 go 65535
7014 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007015 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007016 Info.setAllowsMemory();
7017 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007018 case 'Z':
7019 if (Name[1] == 'C') { // An address usable by ll, and sc.
7020 Info.setAllowsMemory();
7021 Name++; // Skip over 'Z'.
7022 return true;
7023 }
7024 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007025 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007026 }
7027
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007028 std::string convertConstraint(const char *&Constraint) const override {
7029 std::string R;
7030 switch (*Constraint) {
7031 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7032 if (Constraint[1] == 'C') {
7033 R = std::string("^") + std::string(Constraint, 2);
7034 Constraint++;
7035 return R;
7036 }
7037 break;
7038 }
7039 return TargetInfo::convertConstraint(Constraint);
7040 }
7041
Craig Topper3164f332014-03-11 03:39:26 +00007042 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007043 // In GCC, $1 is not widely used in generated code (it's used only in a few
7044 // specific situations), so there is no real need for users to add it to
7045 // the clobbers list if they want to use it in their inline assembly code.
7046 //
7047 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7048 // code generation, so using it in inline assembly without adding it to the
7049 // clobbers list can cause conflicts between the inline assembly code and
7050 // the surrounding generated code.
7051 //
7052 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7053 // operands, which will conflict with the ".set at" assembler option (which
7054 // we use only for inline assembly, in order to maintain compatibility with
7055 // GCC) and will also conflict with the user's usage of $1.
7056 //
7057 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7058 // register for generated code is to automatically clobber $1 for all inline
7059 // assembly code.
7060 //
7061 // FIXME: We should automatically clobber $1 only for inline assembly code
7062 // which actually uses it. This would allow LLVM to use $1 for inline
7063 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007064 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007065 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007066
Craig Topper3164f332014-03-11 03:39:26 +00007067 bool handleTargetFeatures(std::vector<std::string> &Features,
7068 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007069 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007070 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007071 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007072 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007073 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007074 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007075 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007076
Eric Christopher610fe112015-08-26 08:21:55 +00007077 for (const auto &Feature : Features) {
7078 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007079 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007080 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007081 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007082 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007083 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007084 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007085 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007086 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007087 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007088 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007089 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007090 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007091 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007092 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007093 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007094 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007095 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007096 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007097 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007098 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007099 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007100 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007101
James Y Knightb214cbc2016-03-04 19:00:41 +00007102 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007103
Rafael Espindolaeb265472013-08-21 21:59:03 +00007104 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007105 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007106
Craig Topper3164f332014-03-11 03:39:26 +00007107 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007108 if (RegNo == 0) return 4;
7109 if (RegNo == 1) return 5;
7110 return -1;
7111 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007112
7113 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007114};
7115
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007116const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007117#define BUILTIN(ID, TYPE, ATTRS) \
7118 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7119#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7120 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007121#include "clang/Basic/BuiltinsMips.def"
7122};
7123
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007124class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007125public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007126 Mips32TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7127 : MipsTargetInfoBase(Triple, Opts, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007128 SizeType = UnsignedInt;
7129 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007130 Int64Type = SignedLongLong;
7131 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007132 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007133 }
Craig Topper3164f332014-03-11 03:39:26 +00007134 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007135 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007136 ABI = Name;
7137 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007138 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007139 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007140 }
Craig Topper3164f332014-03-11 03:39:26 +00007141 void getTargetDefines(const LangOptions &Opts,
7142 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007143 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007144
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007145 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007146 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7147
7148 const std::string& CPUStr = getCPU();
7149 if (CPUStr == "mips32")
7150 Builder.defineMacro("__mips_isa_rev", "1");
7151 else if (CPUStr == "mips32r2")
7152 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007153 else if (CPUStr == "mips32r3")
7154 Builder.defineMacro("__mips_isa_rev", "3");
7155 else if (CPUStr == "mips32r5")
7156 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007157 else if (CPUStr == "mips32r6")
7158 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007159
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007160 if (ABI == "o32") {
7161 Builder.defineMacro("__mips_o32");
7162 Builder.defineMacro("_ABIO32", "1");
7163 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7164 }
7165 else if (ABI == "eabi")
7166 Builder.defineMacro("__mips_eabi");
7167 else
David Blaikie83d382b2011-09-23 05:06:16 +00007168 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007169 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007170 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007171 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7172 { { "at" }, "$1" },
7173 { { "v0" }, "$2" },
7174 { { "v1" }, "$3" },
7175 { { "a0" }, "$4" },
7176 { { "a1" }, "$5" },
7177 { { "a2" }, "$6" },
7178 { { "a3" }, "$7" },
7179 { { "t0" }, "$8" },
7180 { { "t1" }, "$9" },
7181 { { "t2" }, "$10" },
7182 { { "t3" }, "$11" },
7183 { { "t4" }, "$12" },
7184 { { "t5" }, "$13" },
7185 { { "t6" }, "$14" },
7186 { { "t7" }, "$15" },
7187 { { "s0" }, "$16" },
7188 { { "s1" }, "$17" },
7189 { { "s2" }, "$18" },
7190 { { "s3" }, "$19" },
7191 { { "s4" }, "$20" },
7192 { { "s5" }, "$21" },
7193 { { "s6" }, "$22" },
7194 { { "s7" }, "$23" },
7195 { { "t8" }, "$24" },
7196 { { "t9" }, "$25" },
7197 { { "k0" }, "$26" },
7198 { { "k1" }, "$27" },
7199 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007200 { { "sp","$sp" }, "$29" },
7201 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007202 { { "ra" }, "$31" }
7203 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007204 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007205 }
7206};
7207
7208class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007209 void setDataLayout() override {
7210 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007211 }
7212
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007213public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007214 Mips32EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7215 : Mips32TargetInfoBase(Triple, Opts) {
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00007216 }
Craig Topper3164f332014-03-11 03:39:26 +00007217 void getTargetDefines(const LangOptions &Opts,
7218 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007219 DefineStd(Builder, "MIPSEB", Opts);
7220 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007221 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007222 }
7223};
7224
7225class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007226 void setDataLayout() override {
7227 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007228 }
7229
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007231 Mips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7232 : Mips32TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007233 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007234 }
Craig Topper3164f332014-03-11 03:39:26 +00007235 void getTargetDefines(const LangOptions &Opts,
7236 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007237 DefineStd(Builder, "MIPSEL", Opts);
7238 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007239 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007240 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007241};
Akira Hatanakabef17452011-09-20 19:21:49 +00007242
7243class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007244public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007245 Mips64TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7246 : MipsTargetInfoBase(Triple, Opts, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007247 LongDoubleWidth = LongDoubleAlign = 128;
7248 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007249 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7250 LongDoubleWidth = LongDoubleAlign = 64;
7251 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7252 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007253 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007254 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007255 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007256 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007257
7258 void setN64ABITypes() {
7259 LongWidth = LongAlign = 64;
7260 PointerWidth = PointerAlign = 64;
7261 SizeType = UnsignedLong;
7262 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007263 Int64Type = SignedLong;
7264 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007265 }
7266
7267 void setN32ABITypes() {
7268 LongWidth = LongAlign = 32;
7269 PointerWidth = PointerAlign = 32;
7270 SizeType = UnsignedInt;
7271 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007272 Int64Type = SignedLongLong;
7273 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007274 }
7275
Craig Topper3164f332014-03-11 03:39:26 +00007276 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007277 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007278 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007279 ABI = Name;
7280 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007281 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007282 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007283 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007284 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007285 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007286 }
7287 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007288 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007289
Craig Topper3164f332014-03-11 03:39:26 +00007290 void getTargetDefines(const LangOptions &Opts,
7291 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007292 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007293
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007294 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007295 Builder.defineMacro("__mips64");
7296 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007297 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7298
7299 const std::string& CPUStr = getCPU();
7300 if (CPUStr == "mips64")
7301 Builder.defineMacro("__mips_isa_rev", "1");
7302 else if (CPUStr == "mips64r2")
7303 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007304 else if (CPUStr == "mips64r3")
7305 Builder.defineMacro("__mips_isa_rev", "3");
7306 else if (CPUStr == "mips64r5")
7307 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007308 else if (CPUStr == "mips64r6")
7309 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007310
Akira Hatanakabef17452011-09-20 19:21:49 +00007311 if (ABI == "n32") {
7312 Builder.defineMacro("__mips_n32");
7313 Builder.defineMacro("_ABIN32", "2");
7314 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7315 }
7316 else if (ABI == "n64") {
7317 Builder.defineMacro("__mips_n64");
7318 Builder.defineMacro("_ABI64", "3");
7319 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7320 }
7321 else
David Blaikie83d382b2011-09-23 05:06:16 +00007322 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007323
7324 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007325 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007326 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007327 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7328 { { "at" }, "$1" },
7329 { { "v0" }, "$2" },
7330 { { "v1" }, "$3" },
7331 { { "a0" }, "$4" },
7332 { { "a1" }, "$5" },
7333 { { "a2" }, "$6" },
7334 { { "a3" }, "$7" },
7335 { { "a4" }, "$8" },
7336 { { "a5" }, "$9" },
7337 { { "a6" }, "$10" },
7338 { { "a7" }, "$11" },
7339 { { "t0" }, "$12" },
7340 { { "t1" }, "$13" },
7341 { { "t2" }, "$14" },
7342 { { "t3" }, "$15" },
7343 { { "s0" }, "$16" },
7344 { { "s1" }, "$17" },
7345 { { "s2" }, "$18" },
7346 { { "s3" }, "$19" },
7347 { { "s4" }, "$20" },
7348 { { "s5" }, "$21" },
7349 { { "s6" }, "$22" },
7350 { { "s7" }, "$23" },
7351 { { "t8" }, "$24" },
7352 { { "t9" }, "$25" },
7353 { { "k0" }, "$26" },
7354 { { "k1" }, "$27" },
7355 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007356 { { "sp","$sp" }, "$29" },
7357 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007358 { { "ra" }, "$31" }
7359 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007360 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007361 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007362
7363 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007364};
7365
7366class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007367 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007368 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007369 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 +00007370 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007371 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007372 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007373
Akira Hatanakabef17452011-09-20 19:21:49 +00007374public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007375 Mips64EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7376 : Mips64TargetInfoBase(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00007377 void getTargetDefines(const LangOptions &Opts,
7378 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007379 DefineStd(Builder, "MIPSEB", Opts);
7380 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007381 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007382 }
7383};
7384
7385class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007386 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007387 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007388 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 +00007389 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007390 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007391 }
7392public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007393 Mips64ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7394 : Mips64TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007395 // Default ABI is n64.
7396 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007397 }
Craig Topper3164f332014-03-11 03:39:26 +00007398 void getTargetDefines(const LangOptions &Opts,
7399 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007400 DefineStd(Builder, "MIPSEL", Opts);
7401 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007402 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007403 }
7404};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007405
Ivan Krasindd7403e2011-08-24 20:22:22 +00007406class PNaClTargetInfo : public TargetInfo {
7407public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007408 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7409 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007410 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007411 this->LongAlign = 32;
7412 this->LongWidth = 32;
7413 this->PointerAlign = 32;
7414 this->PointerWidth = 32;
7415 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007416 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007417 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007418 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007419 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007420 this->SizeType = TargetInfo::UnsignedInt;
7421 this->PtrDiffType = TargetInfo::SignedInt;
7422 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007423 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007424 }
7425
Craig Toppere6f17d02014-03-11 04:07:52 +00007426 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007427 Builder.defineMacro("__le32__");
7428 Builder.defineMacro("__pnacl__");
7429 }
Craig Topper3164f332014-03-11 03:39:26 +00007430 void getTargetDefines(const LangOptions &Opts,
7431 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007432 getArchDefines(Opts, Builder);
7433 }
Craig Topper3164f332014-03-11 03:39:26 +00007434 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007435 return Feature == "pnacl";
7436 }
Craig Topper6c03a542015-10-19 04:51:35 +00007437 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007438 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007439 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007440 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007441 ArrayRef<const char *> getGCCRegNames() const override;
7442 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007443 bool validateAsmConstraint(const char *&Name,
7444 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007445 return false;
7446 }
7447
Craig Topper3164f332014-03-11 03:39:26 +00007448 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007449 return "";
7450 }
7451};
7452
Craig Topperf054e3a2015-10-19 03:52:27 +00007453ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7454 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007455}
7456
Craig Topperf054e3a2015-10-19 03:52:27 +00007457ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7458 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007459}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007460
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007461// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7462class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7463public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007464 NaClMips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7465 : Mips32ELTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007466
7467 BuiltinVaListKind getBuiltinVaListKind() const override {
7468 return TargetInfo::PNaClABIBuiltinVaList;
7469 }
7470};
7471
JF Bastien643817d2014-09-12 17:52:47 +00007472class Le64TargetInfo : public TargetInfo {
7473 static const Builtin::Info BuiltinInfo[];
7474
7475public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007476 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7477 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007478 BigEndian = false;
7479 NoAsmVariants = true;
7480 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7481 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007482 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007483 }
7484
7485 void getTargetDefines(const LangOptions &Opts,
7486 MacroBuilder &Builder) const override {
7487 DefineStd(Builder, "unix", Opts);
7488 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7489 Builder.defineMacro("__ELF__");
7490 }
Craig Topper6c03a542015-10-19 04:51:35 +00007491 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7492 return llvm::makeArrayRef(BuiltinInfo,
7493 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007494 }
7495 BuiltinVaListKind getBuiltinVaListKind() const override {
7496 return TargetInfo::PNaClABIBuiltinVaList;
7497 }
7498 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007499 ArrayRef<const char *> getGCCRegNames() const override {
7500 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007501 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007502 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7503 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007504 }
7505 bool validateAsmConstraint(const char *&Name,
7506 TargetInfo::ConstraintInfo &Info) const override {
7507 return false;
7508 }
7509
7510 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007511};
Dan Gohmanc2853072015-09-03 22:51:53 +00007512
7513class WebAssemblyTargetInfo : public TargetInfo {
7514 static const Builtin::Info BuiltinInfo[];
7515
7516 enum SIMDEnum {
7517 NoSIMD,
7518 SIMD128,
7519 } SIMDLevel;
7520
7521public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007522 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007523 : TargetInfo(T), SIMDLevel(NoSIMD) {
7524 BigEndian = false;
7525 NoAsmVariants = true;
7526 SuitableAlign = 128;
7527 LargeArrayMinWidth = 128;
7528 LargeArrayAlign = 128;
7529 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007530 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007531 LongDoubleWidth = LongDoubleAlign = 128;
7532 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007533 }
7534
7535protected:
7536 void getTargetDefines(const LangOptions &Opts,
7537 MacroBuilder &Builder) const override {
7538 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7539 if (SIMDLevel >= SIMD128)
7540 Builder.defineMacro("__wasm_simd128__");
7541 }
7542
7543private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007544 bool
7545 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7546 StringRef CPU,
7547 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007548 if (CPU == "bleeding-edge")
7549 Features["simd128"] = true;
7550 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7551 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007552 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007553 return llvm::StringSwitch<bool>(Feature)
7554 .Case("simd128", SIMDLevel >= SIMD128)
7555 .Default(false);
7556 }
7557 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007558 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007559 for (const auto &Feature : Features) {
7560 if (Feature == "+simd128") {
7561 SIMDLevel = std::max(SIMDLevel, SIMD128);
7562 continue;
7563 }
7564 if (Feature == "-simd128") {
7565 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7566 continue;
7567 }
7568
7569 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7570 << "-target-feature";
7571 return false;
7572 }
7573 return true;
7574 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007575 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007576 return llvm::StringSwitch<bool>(Name)
7577 .Case("mvp", true)
7578 .Case("bleeding-edge", true)
7579 .Case("generic", true)
7580 .Default(false);
7581 }
Craig Topper6c03a542015-10-19 04:51:35 +00007582 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7583 return llvm::makeArrayRef(BuiltinInfo,
7584 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007585 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007586 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007587 return VoidPtrBuiltinVaList;
7588 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007589 ArrayRef<const char *> getGCCRegNames() const final {
7590 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007591 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007592 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7593 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007594 }
7595 bool
7596 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007597 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007598 return false;
7599 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007600 const char *getClobbers() const final { return ""; }
7601 bool isCLZForZeroUndef() const final { return false; }
7602 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007603 IntType getIntTypeByWidth(unsigned BitWidth,
7604 bool IsSigned) const final {
7605 // WebAssembly prefers long long for explicitly 64-bit integers.
7606 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7607 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7608 }
7609 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7610 bool IsSigned) const final {
7611 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7612 return BitWidth == 64
7613 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7614 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7615 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007616};
7617
7618const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7619#define BUILTIN(ID, TYPE, ATTRS) \
7620 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7621#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7622 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7623#include "clang/Basic/BuiltinsWebAssembly.def"
7624};
7625
7626class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7627public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007628 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7629 const TargetOptions &Opts)
7630 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007631 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007632 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007633 }
7634
7635protected:
7636 void getTargetDefines(const LangOptions &Opts,
7637 MacroBuilder &Builder) const override {
7638 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7639 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7640 }
7641};
7642
7643class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7644public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007645 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7646 const TargetOptions &Opts)
7647 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007648 LongAlign = LongWidth = 64;
7649 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007650 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007651 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007652 }
7653
7654protected:
7655 void getTargetDefines(const LangOptions &Opts,
7656 MacroBuilder &Builder) const override {
7657 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7658 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7659 }
7660};
7661
JF Bastien643817d2014-09-12 17:52:47 +00007662const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7663#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007664 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007665#include "clang/Basic/BuiltinsLe64.def"
7666};
7667
Eric Christopherc48497a2015-09-18 21:26:24 +00007668static const unsigned SPIRAddrSpaceMap[] = {
7669 1, // opencl_global
7670 3, // opencl_local
7671 2, // opencl_constant
7672 4, // opencl_generic
7673 0, // cuda_device
7674 0, // cuda_constant
7675 0 // cuda_shared
7676};
7677class SPIRTargetInfo : public TargetInfo {
7678public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007679 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7680 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007681 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7682 "SPIR target must use unknown OS");
7683 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7684 "SPIR target must use unknown environment type");
7685 BigEndian = false;
7686 TLSSupported = false;
7687 LongWidth = LongAlign = 64;
7688 AddrSpaceMap = &SPIRAddrSpaceMap;
7689 UseAddrSpaceMapMangling = true;
7690 // Define available target features
7691 // These must be defined in sorted order!
7692 NoAsmVariants = true;
7693 }
7694 void getTargetDefines(const LangOptions &Opts,
7695 MacroBuilder &Builder) const override {
7696 DefineStd(Builder, "SPIR", Opts);
7697 }
7698 bool hasFeature(StringRef Feature) const override {
7699 return Feature == "spir";
7700 }
Craig Topper3164f332014-03-11 03:39:26 +00007701
Craig Topper6c03a542015-10-19 04:51:35 +00007702 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007703 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007704 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007705 bool validateAsmConstraint(const char *&Name,
7706 TargetInfo::ConstraintInfo &info) const override {
7707 return true;
7708 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007709 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7710 return None;
7711 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007712 BuiltinVaListKind getBuiltinVaListKind() const override {
7713 return TargetInfo::VoidPtrBuiltinVaList;
7714 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007715
Eric Christopherc48497a2015-09-18 21:26:24 +00007716 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7717 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7718 : CCCR_Warning;
7719 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007720
Eric Christopherc48497a2015-09-18 21:26:24 +00007721 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7722 return CC_SpirFunction;
7723 }
7724};
Guy Benyeib798fc92012-12-11 21:38:14 +00007725
Eric Christopherc48497a2015-09-18 21:26:24 +00007726class SPIR32TargetInfo : public SPIRTargetInfo {
7727public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007728 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7729 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007730 PointerWidth = PointerAlign = 32;
7731 SizeType = TargetInfo::UnsignedInt;
7732 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007733 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7734 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007735 }
7736 void getTargetDefines(const LangOptions &Opts,
7737 MacroBuilder &Builder) const override {
7738 DefineStd(Builder, "SPIR32", Opts);
7739 }
7740};
Guy Benyeib798fc92012-12-11 21:38:14 +00007741
Eric Christopherc48497a2015-09-18 21:26:24 +00007742class SPIR64TargetInfo : public SPIRTargetInfo {
7743public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007744 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7745 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007746 PointerWidth = PointerAlign = 64;
7747 SizeType = TargetInfo::UnsignedLong;
7748 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007749 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7750 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007751 }
7752 void getTargetDefines(const LangOptions &Opts,
7753 MacroBuilder &Builder) const override {
7754 DefineStd(Builder, "SPIR64", Opts);
7755 }
7756};
Guy Benyeib798fc92012-12-11 21:38:14 +00007757
Robert Lytton0e076492013-08-13 09:43:10 +00007758class XCoreTargetInfo : public TargetInfo {
7759 static const Builtin::Info BuiltinInfo[];
7760public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007761 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7762 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007763 BigEndian = false;
7764 NoAsmVariants = true;
7765 LongLongAlign = 32;
7766 SuitableAlign = 32;
7767 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007768 SizeType = UnsignedInt;
7769 PtrDiffType = SignedInt;
7770 IntPtrType = SignedInt;
7771 WCharType = UnsignedChar;
7772 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007773 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007774 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7775 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007776 }
Craig Topper3164f332014-03-11 03:39:26 +00007777 void getTargetDefines(const LangOptions &Opts,
7778 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007779 Builder.defineMacro("__XS1B__");
7780 }
Craig Topper6c03a542015-10-19 04:51:35 +00007781 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7782 return llvm::makeArrayRef(BuiltinInfo,
7783 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007784 }
Craig Topper3164f332014-03-11 03:39:26 +00007785 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007786 return TargetInfo::VoidPtrBuiltinVaList;
7787 }
Craig Topper3164f332014-03-11 03:39:26 +00007788 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007789 return "";
7790 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007791 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007792 static const char * const GCCRegNames[] = {
7793 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7794 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7795 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007796 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007797 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007798 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7799 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007800 }
Craig Topper3164f332014-03-11 03:39:26 +00007801 bool validateAsmConstraint(const char *&Name,
7802 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007803 return false;
7804 }
Craig Topper3164f332014-03-11 03:39:26 +00007805 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007806 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7807 return (RegNo < 2)? RegNo : -1;
7808 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007809 bool allowsLargerPreferedTypeAlignment() const override {
7810 return false;
7811 }
Robert Lytton0e076492013-08-13 09:43:10 +00007812};
7813
7814const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007815#define BUILTIN(ID, TYPE, ATTRS) \
7816 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7817#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7818 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007819#include "clang/Basic/BuiltinsXCore.def"
7820};
Robert Lytton0e076492013-08-13 09:43:10 +00007821
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007822// x86_32 Android target
7823class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7824public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007825 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7826 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007827 SuitableAlign = 32;
7828 LongDoubleWidth = 64;
7829 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7830 }
7831};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007832
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007833// x86_64 Android target
7834class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7835public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007836 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7837 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007838 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7839 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007840
7841 bool useFloat128ManglingForLongDouble() const override {
7842 return true;
7843 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007844};
7845} // end anonymous namespace
7846
Chris Lattner5ba61f02006-10-14 07:39:34 +00007847//===----------------------------------------------------------------------===//
7848// Driver code
7849//===----------------------------------------------------------------------===//
7850
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007851static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
7852 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007853 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007854
Daniel Dunbar52322032009-08-18 05:47:58 +00007855 switch (Triple.getArch()) {
7856 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007857 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007858
Tim Northover2a0783d2014-05-30 14:14:07 +00007859 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007860 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007861
7862 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007863 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007864
Jacques Pienaard964cc22016-03-28 21:02:54 +00007865 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007866 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00007867
Tim Northover2a0783d2014-05-30 14:14:07 +00007868 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007869 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007870 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007871
7872 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007873 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007874 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00007875 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007876 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007877 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007878 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00007879 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007880 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007881 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007882 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00007883 }
7884
Christian Pirker9b019ae2014-02-25 13:51:00 +00007885 case llvm::Triple::aarch64_be:
7886 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007887 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007888 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007889 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007890 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007891 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007892 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007893 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007894 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00007895 }
7896
Daniel Dunbar52322032009-08-18 05:47:58 +00007897 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007898 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007899 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007900 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007901
Daniel Dunbar52322032009-08-18 05:47:58 +00007902 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007903 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007904 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00007905 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007906 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007907 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007908 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007909 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007910 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00007911 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007912 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007913 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007914 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007915 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007916 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007917 case llvm::Triple::Win32:
7918 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007919 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007920 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00007921 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007922 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007923 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007924 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007925 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007926 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007927 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007928 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007929 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007930 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007931 }
7932
7933 case llvm::Triple::armeb:
7934 case llvm::Triple::thumbeb:
7935 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007936 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007937
7938 switch (os) {
7939 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007940 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007941 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007942 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007943 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007944 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007945 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007946 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007947 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007948 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007949 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007950 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007951 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007952 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007953 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007954 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00007955 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007956
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007957 case llvm::Triple::bpfeb:
7958 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007959 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007960
Daniel Dunbar52322032009-08-18 05:47:58 +00007961 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007962 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00007963
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007964 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007965 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007966 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007967 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007968 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007969 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007970 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007971 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007972 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007973 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007974 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007975 return new Mips32EBTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007976 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007977
7978 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007979 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007980 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007981 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007982 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007983 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007984 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007985 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007986 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007987 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007988 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007989 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007990 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007991 return new Mips32ELTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007992 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007993
Akira Hatanakabef17452011-09-20 19:21:49 +00007994 case llvm::Triple::mips64:
7995 switch (os) {
7996 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007997 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00007998 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007999 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008000 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008001 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008002 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008003 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008004 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008005 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008006 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008007 return new Mips64EBTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008008 }
8009
8010 case llvm::Triple::mips64el:
8011 switch (os) {
8012 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008013 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008014 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008015 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008016 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008017 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008018 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008019 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008020 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008021 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008022 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008023 return new Mips64ELTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008024 }
8025
Ivan Krasindd7403e2011-08-24 20:22:22 +00008026 case llvm::Triple::le32:
8027 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008028 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008029 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008030 default:
8031 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008032 }
8033
JF Bastien643817d2014-09-12 17:52:47 +00008034 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008035 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008036
Daniel Dunbar52322032009-08-18 05:47:58 +00008037 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008038 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008039 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008040 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008041 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008042 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008043 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008044 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008045 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008046 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008047 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008048 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008049 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008050 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008051 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008052 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008053 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008054
8055 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008056 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008057 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008058 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008059 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008060 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008061 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008062 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008063 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008064 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008065 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008066 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008067 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008068 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008069 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008070
Bill Schmidt778d3872013-07-26 01:36:11 +00008071 case llvm::Triple::ppc64le:
8072 switch (os) {
8073 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008074 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008075 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008076 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008077 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008078 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008079 }
8080
Peter Collingbournec947aae2012-05-20 23:28:41 +00008081 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008082 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008083 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008084 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008085
Tom Stellardd8e38a32015-01-06 20:34:47 +00008086 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008087 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008088 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008089
Daniel Dunbar52322032009-08-18 05:47:58 +00008090 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008091 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008092 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008093 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008094 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008095 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008096 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008097 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008098 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008099 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008100 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008101 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008102 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008103 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008104 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008105
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008106 // The 'sparcel' architecture copies all the above cases except for Solaris.
8107 case llvm::Triple::sparcel:
8108 switch (os) {
8109 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008110 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008111 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008112 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008113 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008114 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008115 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008116 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008117 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008118 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008119 }
8120
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008121 case llvm::Triple::sparcv9:
8122 switch (os) {
8123 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008124 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008125 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008126 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008127 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008128 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008129 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008130 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008131 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008132 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008133 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008134 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008135 }
8136
Ulrich Weigand47445072013-05-06 16:26:41 +00008137 case llvm::Triple::systemz:
8138 switch (os) {
8139 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008140 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008141 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008142 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008143 }
8144
Eli Friedmana9c3d712009-08-19 20:47:07 +00008145 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008146 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008147
Daniel Dunbar52322032009-08-18 05:47:58 +00008148 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008149 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008150 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008151
Daniel Dunbar52322032009-08-18 05:47:58 +00008152 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008153 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008154 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008155 case llvm::Triple::Linux: {
8156 switch (Triple.getEnvironment()) {
8157 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008158 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008159 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008160 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008161 }
8162 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008163 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008164 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008165 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008166 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008167 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008168 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008169 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008170 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008171 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008172 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008173 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008174 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008175 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008176 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008177 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008178 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008179 case llvm::Triple::Win32: {
8180 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008181 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008182 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008183 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008184 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008185 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008186 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008187 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008188 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008189 }
8190 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008191 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008192 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008193 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008194 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008195 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008196 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008197 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008198 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008199 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008200 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008201 }
8202
8203 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008204 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008205 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008206
Daniel Dunbar52322032009-08-18 05:47:58 +00008207 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008208 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008209 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008210 case llvm::Triple::Linux: {
8211 switch (Triple.getEnvironment()) {
8212 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008213 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008214 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008215 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008216 }
8217 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008218 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008219 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008220 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008222 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008224 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008226 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008228 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008230 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008231 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008232 case llvm::Triple::Win32: {
8233 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008234 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008236 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008238 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008239 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008240 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008241 }
8242 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008243 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008244 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008245 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008246 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008247 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008248 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008249 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008250
Douglas Katzman78d7c542015-05-12 21:18:10 +00008251 case llvm::Triple::spir: {
8252 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8253 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8254 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008256 }
8257 case llvm::Triple::spir64: {
8258 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8259 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8260 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008262 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008263 case llvm::Triple::wasm32:
8264 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8265 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008266 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008267 case llvm::Triple::wasm64:
8268 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8269 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008270 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008271 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008272}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008273
8274/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008275/// options.
Alp Toker80758082014-07-06 05:26:44 +00008276TargetInfo *
8277TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008278 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008279 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008280
8281 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008282 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008283 if (!Target) {
8284 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008285 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008286 }
Alp Toker80758082014-07-06 05:26:44 +00008287 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008288
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008289 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008290 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8291 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008292 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008293 }
8294
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008295 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008296 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8297 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008298 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008299 }
8300
Rafael Espindolaeb265472013-08-21 21:59:03 +00008301 // Set the fp math unit.
8302 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8303 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008304 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008305 }
8306
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008307 // Compute the default target features, we need the target to handle this
8308 // because features may have dependencies on one another.
8309 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008310 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8311 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008312 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008313
8314 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008315 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008316 for (const auto &F : Features)
8317 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8318
Eric Christopher3ff21b32013-10-16 21:26:26 +00008319 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008320 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008321
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008322 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008323}