blob: f9bc72dc7987b91925d9e1639c22b9d390147810 [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 Parzyszek1e6e3c62015-12-14 15:03:57 +00005943 } else if (CPU == "hexagonv60") {
5944 Builder.defineMacro("__HEXAGON_V60__");
5945 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5946 Builder.defineMacro("__QDSP6_V60__");
5947 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005948 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005949}
5950
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005951bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5952 DiagnosticsEngine &Diags) {
5953 for (auto &F : Features) {
5954 if (F == "+hvx")
5955 HasHVX = true;
5956 else if (F == "-hvx")
5957 HasHVX = HasHVXDouble = false;
5958 else if (F == "+hvx-double")
5959 HasHVX = HasHVXDouble = true;
5960 else if (F == "-hvx-double")
5961 HasHVXDouble = false;
5962 }
5963 return true;
5964}
5965
5966bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5967 DiagnosticsEngine &Diags, StringRef CPU,
5968 const std::vector<std::string> &FeaturesVec) const {
5969 // Default for v60: -hvx, -hvx-double.
5970 Features["hvx"] = false;
5971 Features["hvx-double"] = false;
5972
5973 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5974}
5975
5976
5977const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005978 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5979 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5980 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5981 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5982 "p0", "p1", "p2", "p3",
5983 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5984};
5985
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005986ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005987 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005988}
5989
Tony Linthicum76329bf2011-12-12 21:14:55 +00005990const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5991 { { "sp" }, "r29" },
5992 { { "fp" }, "r30" },
5993 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005994};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005995
Craig Topperf054e3a2015-10-19 03:52:27 +00005996ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5997 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005998}
5999
6000
6001const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006002#define BUILTIN(ID, TYPE, ATTRS) \
6003 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6004#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6005 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006006#include "clang/Basic/BuiltinsHexagon.def"
6007};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006008
Jacques Pienaard964cc22016-03-28 21:02:54 +00006009class LanaiTargetInfo : public TargetInfo {
6010 // Class for Lanai (32-bit).
6011 // The CPU profiles supported by the Lanai backend
6012 enum CPUKind {
6013 CK_NONE,
6014 CK_V11,
6015 } CPU;
6016
6017 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6018 static const char *const GCCRegNames[];
6019
6020public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006021 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6022 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006023 // Description string has to be kept in sync with backend.
6024 resetDataLayout("E" // Big endian
6025 "-m:e" // ELF name manging
6026 "-p:32:32" // 32 bit pointers, 32 bit aligned
6027 "-i64:64" // 64 bit integers, 64 bit aligned
6028 "-a:0:32" // 32 bit alignment of objects of aggregate type
6029 "-n32" // 32 bit native integer width
6030 "-S64" // 64 bit natural stack alignment
6031 );
6032
6033 // Setting RegParmMax equal to what mregparm was set to in the old
6034 // toolchain
6035 RegParmMax = 4;
6036
6037 // Set the default CPU to V11
6038 CPU = CK_V11;
6039
6040 // Temporary approach to make everything at least word-aligned and allow for
6041 // safely casting between pointers with different alignment requirements.
6042 // TODO: Remove this when there are no more cast align warnings on the
6043 // firmware.
6044 MinGlobalAlign = 32;
6045 }
6046
6047 void getTargetDefines(const LangOptions &Opts,
6048 MacroBuilder &Builder) const override {
6049 // Define __lanai__ when building for target lanai.
6050 Builder.defineMacro("__lanai__");
6051
6052 // Set define for the CPU specified.
6053 switch (CPU) {
6054 case CK_V11:
6055 Builder.defineMacro("__LANAI_V11__");
6056 break;
6057 case CK_NONE:
6058 llvm_unreachable("Unhandled target CPU");
6059 }
6060 }
6061
6062 bool setCPU(const std::string &Name) override {
6063 CPU = llvm::StringSwitch<CPUKind>(Name)
6064 .Case("v11", CK_V11)
6065 .Default(CK_NONE);
6066
6067 return CPU != CK_NONE;
6068 }
6069
6070 bool hasFeature(StringRef Feature) const override {
6071 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6072 }
6073
6074 ArrayRef<const char *> getGCCRegNames() const override;
6075
6076 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6077
6078 BuiltinVaListKind getBuiltinVaListKind() const override {
6079 return TargetInfo::VoidPtrBuiltinVaList;
6080 }
6081
6082 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6083
6084 bool validateAsmConstraint(const char *&Name,
6085 TargetInfo::ConstraintInfo &info) const override {
6086 return false;
6087 }
6088
6089 const char *getClobbers() const override { return ""; }
6090};
6091
6092const char *const LanaiTargetInfo::GCCRegNames[] = {
6093 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6094 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6095 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6096
6097ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6098 return llvm::makeArrayRef(GCCRegNames);
6099}
6100
6101const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6102 {{"pc"}, "r2"},
6103 {{"sp"}, "r4"},
6104 {{"fp"}, "r5"},
6105 {{"rv"}, "r8"},
6106 {{"rr1"}, "r10"},
6107 {{"rr2"}, "r11"},
6108 {{"rca"}, "r15"},
6109};
6110
6111ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6112 return llvm::makeArrayRef(GCCRegAliases);
6113}
6114
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006115// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6116class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006117 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6118 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006119 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006120public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006121 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006122 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006123
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006124 int getEHDataRegisterNumber(unsigned RegNo) const override {
6125 if (RegNo == 0) return 24;
6126 if (RegNo == 1) return 25;
6127 return -1;
6128 }
6129
Craig Topper3164f332014-03-11 03:39:26 +00006130 bool handleTargetFeatures(std::vector<std::string> &Features,
6131 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006132 // The backend doesn't actually handle soft float yet, but in case someone
6133 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006134 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6135 if (Feature != Features.end()) {
6136 SoftFloat = true;
6137 Features.erase(Feature);
6138 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006139 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006140 }
Craig Topper3164f332014-03-11 03:39:26 +00006141 void getTargetDefines(const LangOptions &Opts,
6142 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006143 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006144 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006145
6146 if (SoftFloat)
6147 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006148 }
Craig Topper3164f332014-03-11 03:39:26 +00006149
6150 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006151 return llvm::StringSwitch<bool>(Feature)
6152 .Case("softfloat", SoftFloat)
6153 .Case("sparc", true)
6154 .Default(false);
6155 }
Craig Topper3164f332014-03-11 03:39:26 +00006156
Craig Topper6c03a542015-10-19 04:51:35 +00006157 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006158 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006159 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006160 }
Craig Topper3164f332014-03-11 03:39:26 +00006161 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006162 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006163 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006164 ArrayRef<const char *> getGCCRegNames() const override;
6165 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006166 bool validateAsmConstraint(const char *&Name,
6167 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006168 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006169 switch (*Name) {
6170 case 'I': // Signed 13-bit constant
6171 case 'J': // Zero
6172 case 'K': // 32-bit constant with the low 12 bits clear
6173 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6174 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6175 case 'N': // Same as 'K' but zext (required for SIMode)
6176 case 'O': // The constant 4096
6177 return true;
6178 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006179 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006180 }
Craig Topper3164f332014-03-11 03:39:26 +00006181 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006182 // FIXME: Implement!
6183 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006184 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006185
6186 // No Sparc V7 for now, the backend doesn't support it anyway.
6187 enum CPUKind {
6188 CK_GENERIC,
6189 CK_V8,
6190 CK_SUPERSPARC,
6191 CK_SPARCLITE,
6192 CK_F934,
6193 CK_HYPERSPARC,
6194 CK_SPARCLITE86X,
6195 CK_SPARCLET,
6196 CK_TSC701,
6197 CK_V9,
6198 CK_ULTRASPARC,
6199 CK_ULTRASPARC3,
6200 CK_NIAGARA,
6201 CK_NIAGARA2,
6202 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006203 CK_NIAGARA4,
6204 CK_MYRIAD2_1,
6205 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006206 } CPU = CK_GENERIC;
6207
6208 enum CPUGeneration {
6209 CG_V8,
6210 CG_V9,
6211 };
6212
6213 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6214 switch (Kind) {
6215 case CK_GENERIC:
6216 case CK_V8:
6217 case CK_SUPERSPARC:
6218 case CK_SPARCLITE:
6219 case CK_F934:
6220 case CK_HYPERSPARC:
6221 case CK_SPARCLITE86X:
6222 case CK_SPARCLET:
6223 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006224 case CK_MYRIAD2_1:
6225 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006226 return CG_V8;
6227 case CK_V9:
6228 case CK_ULTRASPARC:
6229 case CK_ULTRASPARC3:
6230 case CK_NIAGARA:
6231 case CK_NIAGARA2:
6232 case CK_NIAGARA3:
6233 case CK_NIAGARA4:
6234 return CG_V9;
6235 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006236 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006237 }
6238
6239 CPUKind getCPUKind(StringRef Name) const {
6240 return llvm::StringSwitch<CPUKind>(Name)
6241 .Case("v8", CK_V8)
6242 .Case("supersparc", CK_SUPERSPARC)
6243 .Case("sparclite", CK_SPARCLITE)
6244 .Case("f934", CK_F934)
6245 .Case("hypersparc", CK_HYPERSPARC)
6246 .Case("sparclite86x", CK_SPARCLITE86X)
6247 .Case("sparclet", CK_SPARCLET)
6248 .Case("tsc701", CK_TSC701)
6249 .Case("v9", CK_V9)
6250 .Case("ultrasparc", CK_ULTRASPARC)
6251 .Case("ultrasparc3", CK_ULTRASPARC3)
6252 .Case("niagara", CK_NIAGARA)
6253 .Case("niagara2", CK_NIAGARA2)
6254 .Case("niagara3", CK_NIAGARA3)
6255 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006256 .Case("myriad2", CK_MYRIAD2_1)
6257 .Case("myriad2.1", CK_MYRIAD2_1)
6258 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006259 .Default(CK_GENERIC);
6260 }
6261
6262 bool setCPU(const std::string &Name) override {
6263 CPU = getCPUKind(Name);
6264 return CPU != CK_GENERIC;
6265 }
Gabor Greif49991682008-02-21 16:29:08 +00006266};
6267
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006268const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006269 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6270 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6271 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6272 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6273};
6274
Craig Topperf054e3a2015-10-19 03:52:27 +00006275ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6276 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006277}
6278
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006279const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006280 { { "g0" }, "r0" },
6281 { { "g1" }, "r1" },
6282 { { "g2" }, "r2" },
6283 { { "g3" }, "r3" },
6284 { { "g4" }, "r4" },
6285 { { "g5" }, "r5" },
6286 { { "g6" }, "r6" },
6287 { { "g7" }, "r7" },
6288 { { "o0" }, "r8" },
6289 { { "o1" }, "r9" },
6290 { { "o2" }, "r10" },
6291 { { "o3" }, "r11" },
6292 { { "o4" }, "r12" },
6293 { { "o5" }, "r13" },
6294 { { "o6", "sp" }, "r14" },
6295 { { "o7" }, "r15" },
6296 { { "l0" }, "r16" },
6297 { { "l1" }, "r17" },
6298 { { "l2" }, "r18" },
6299 { { "l3" }, "r19" },
6300 { { "l4" }, "r20" },
6301 { { "l5" }, "r21" },
6302 { { "l6" }, "r22" },
6303 { { "l7" }, "r23" },
6304 { { "i0" }, "r24" },
6305 { { "i1" }, "r25" },
6306 { { "i2" }, "r26" },
6307 { { "i3" }, "r27" },
6308 { { "i4" }, "r28" },
6309 { { "i5" }, "r29" },
6310 { { "i6", "fp" }, "r30" },
6311 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006312};
6313
Craig Topperf054e3a2015-10-19 03:52:27 +00006314ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6315 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006316}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006317
6318// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6319class SparcV8TargetInfo : public SparcTargetInfo {
6320public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006321 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6322 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006323 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006324 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6325 switch (getTriple().getOS()) {
6326 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006327 SizeType = UnsignedInt;
6328 IntPtrType = SignedInt;
6329 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006330 break;
6331 case llvm::Triple::NetBSD:
6332 case llvm::Triple::OpenBSD:
6333 SizeType = UnsignedLong;
6334 IntPtrType = SignedLong;
6335 PtrDiffType = SignedLong;
6336 break;
Brad Smith56495d52015-08-13 22:00:53 +00006337 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006338 }
6339
Craig Topper3164f332014-03-11 03:39:26 +00006340 void getTargetDefines(const LangOptions &Opts,
6341 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006342 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006343 switch (getCPUGeneration(CPU)) {
6344 case CG_V8:
6345 Builder.defineMacro("__sparcv8");
6346 if (getTriple().getOS() != llvm::Triple::Solaris)
6347 Builder.defineMacro("__sparcv8__");
6348 break;
6349 case CG_V9:
6350 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006351 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006352 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006353 Builder.defineMacro("__sparc_v9__");
6354 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006355 break;
6356 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006357 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6358 switch (CPU) {
6359 case CK_MYRIAD2_1:
6360 Builder.defineMacro("__myriad2", "1");
6361 Builder.defineMacro("__myriad2__", "1");
6362 break;
6363 case CK_MYRIAD2_2:
6364 Builder.defineMacro("__myriad2", "2");
6365 Builder.defineMacro("__myriad2__", "2");
6366 break;
6367 default:
6368 break;
6369 }
6370 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006371 }
6372};
6373
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006374// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6375class SparcV8elTargetInfo : public SparcV8TargetInfo {
6376 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006377 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6378 : SparcV8TargetInfo(Triple, Opts) {
6379 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6380 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006381 }
6382};
6383
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006384// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6385class SparcV9TargetInfo : public SparcTargetInfo {
6386public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006387 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6388 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006389 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006390 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006391 // This is an LP64 platform.
6392 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006393
6394 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006395 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006396 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006397 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006398 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006399 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006400
6401 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6402 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6403 LongDoubleWidth = 128;
6404 LongDoubleAlign = 128;
6405 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006406 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006407 }
6408
Craig Topper3164f332014-03-11 03:39:26 +00006409 void getTargetDefines(const LangOptions &Opts,
6410 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006411 SparcTargetInfo::getTargetDefines(Opts, Builder);
6412 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006413 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006414 // Solaris doesn't need these variants, but the BSDs do.
6415 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006416 Builder.defineMacro("__sparc64__");
6417 Builder.defineMacro("__sparc_v9__");
6418 Builder.defineMacro("__sparcv9__");
6419 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006420 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006421
Craig Topper3164f332014-03-11 03:39:26 +00006422 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006423 if (!SparcTargetInfo::setCPU(Name))
6424 return false;
6425 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006426 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006427};
6428
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006429class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006430 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006431 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006432 std::string CPU;
6433 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006434 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006435
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006436public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006437 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006438 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6439 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006440 IntMaxType = SignedLong;
6441 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006442 TLSSupported = true;
6443 IntWidth = IntAlign = 32;
6444 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6445 PointerWidth = PointerAlign = 64;
6446 LongDoubleWidth = 128;
6447 LongDoubleAlign = 64;
6448 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006449 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006450 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006451 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 +00006452 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6453 }
6454 void getTargetDefines(const LangOptions &Opts,
6455 MacroBuilder &Builder) const override {
6456 Builder.defineMacro("__s390__");
6457 Builder.defineMacro("__s390x__");
6458 Builder.defineMacro("__zarch__");
6459 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006460
6461 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6462 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6463 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6464 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6465
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006466 if (HasTransactionalExecution)
6467 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006468 if (Opts.ZVector)
6469 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006470 }
Craig Topper6c03a542015-10-19 04:51:35 +00006471 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6472 return llvm::makeArrayRef(BuiltinInfo,
6473 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006474 }
6475
Craig Topperf054e3a2015-10-19 03:52:27 +00006476 ArrayRef<const char *> getGCCRegNames() const override;
6477 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006478 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006479 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006480 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006481 bool validateAsmConstraint(const char *&Name,
6482 TargetInfo::ConstraintInfo &info) const override;
6483 const char *getClobbers() const override {
6484 // FIXME: Is this really right?
6485 return "";
6486 }
6487 BuiltinVaListKind getBuiltinVaListKind() const override {
6488 return TargetInfo::SystemZBuiltinVaList;
6489 }
6490 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006491 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006492 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6493 .Case("z10", true)
6494 .Case("z196", true)
6495 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006496 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006497 .Default(false);
6498
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006499 return CPUKnown;
6500 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006501 bool
6502 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6503 StringRef CPU,
6504 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006505 if (CPU == "zEC12")
6506 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006507 if (CPU == "z13") {
6508 Features["transactional-execution"] = true;
6509 Features["vector"] = true;
6510 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006511 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006512 }
6513
6514 bool handleTargetFeatures(std::vector<std::string> &Features,
6515 DiagnosticsEngine &Diags) override {
6516 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006517 for (const auto &Feature : Features) {
6518 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006519 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006520 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006521 HasVector = true;
6522 }
6523 // If we use the vector ABI, vector types are 64-bit aligned.
6524 if (HasVector) {
6525 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006526 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6527 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006528 }
6529 return true;
6530 }
6531
6532 bool hasFeature(StringRef Feature) const override {
6533 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006534 .Case("systemz", true)
6535 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006536 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006537 .Default(false);
6538 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006539
6540 StringRef getABI() const override {
6541 if (HasVector)
6542 return "vector";
6543 return "";
6544 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006545
6546 bool useFloat128ManglingForLongDouble() const override {
6547 return true;
6548 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006549};
6550
6551const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6552#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006553 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006554#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6555 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006556#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006557};
6558
6559const char *const SystemZTargetInfo::GCCRegNames[] = {
6560 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6561 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6562 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6563 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6564};
6565
Craig Topperf054e3a2015-10-19 03:52:27 +00006566ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6567 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006568}
6569
6570bool SystemZTargetInfo::
6571validateAsmConstraint(const char *&Name,
6572 TargetInfo::ConstraintInfo &Info) const {
6573 switch (*Name) {
6574 default:
6575 return false;
6576
6577 case 'a': // Address register
6578 case 'd': // Data register (equivalent to 'r')
6579 case 'f': // Floating-point register
6580 Info.setAllowsRegister();
6581 return true;
6582
6583 case 'I': // Unsigned 8-bit constant
6584 case 'J': // Unsigned 12-bit constant
6585 case 'K': // Signed 16-bit constant
6586 case 'L': // Signed 20-bit displacement (on all targets we support)
6587 case 'M': // 0x7fffffff
6588 return true;
6589
6590 case 'Q': // Memory with base and unsigned 12-bit displacement
6591 case 'R': // Likewise, plus an index
6592 case 'S': // Memory with base and signed 20-bit displacement
6593 case 'T': // Likewise, plus an index
6594 Info.setAllowsMemory();
6595 return true;
6596 }
6597}
Ulrich Weigand47445072013-05-06 16:26:41 +00006598
Eric Christopherc48497a2015-09-18 21:26:24 +00006599class MSP430TargetInfo : public TargetInfo {
6600 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006601
Eric Christopherc48497a2015-09-18 21:26:24 +00006602public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006603 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6604 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006605 BigEndian = false;
6606 TLSSupported = false;
6607 IntWidth = 16;
6608 IntAlign = 16;
6609 LongWidth = 32;
6610 LongLongWidth = 64;
6611 LongAlign = LongLongAlign = 16;
6612 PointerWidth = 16;
6613 PointerAlign = 16;
6614 SuitableAlign = 16;
6615 SizeType = UnsignedInt;
6616 IntMaxType = SignedLongLong;
6617 IntPtrType = SignedInt;
6618 PtrDiffType = SignedInt;
6619 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006620 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006621 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006622 void getTargetDefines(const LangOptions &Opts,
6623 MacroBuilder &Builder) const override {
6624 Builder.defineMacro("MSP430");
6625 Builder.defineMacro("__MSP430__");
6626 // FIXME: defines for different 'flavours' of MCU
6627 }
Craig Topper6c03a542015-10-19 04:51:35 +00006628 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006629 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006630 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006631 }
6632 bool hasFeature(StringRef Feature) const override {
6633 return Feature == "msp430";
6634 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006635 ArrayRef<const char *> getGCCRegNames() const override;
6636 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006637 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006638 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006639 }
6640 bool validateAsmConstraint(const char *&Name,
6641 TargetInfo::ConstraintInfo &info) const override {
6642 // FIXME: implement
6643 switch (*Name) {
6644 case 'K': // the constant 1
6645 case 'L': // constant -1^20 .. 1^19
6646 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006647 return true;
6648 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006649 // No target constraints for now.
6650 return false;
6651 }
6652 const char *getClobbers() const override {
6653 // FIXME: Is this really right?
6654 return "";
6655 }
6656 BuiltinVaListKind getBuiltinVaListKind() const override {
6657 // FIXME: implement
6658 return TargetInfo::CharPtrBuiltinVaList;
6659 }
6660};
6661
6662const char *const MSP430TargetInfo::GCCRegNames[] = {
6663 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6664 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6665
Craig Topperf054e3a2015-10-19 03:52:27 +00006666ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6667 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006668}
6669
6670// LLVM and Clang cannot be used directly to output native binaries for
6671// target, but is used to compile C code to llvm bitcode with correct
6672// type and alignment information.
6673//
6674// TCE uses the llvm bitcode as input and uses it for generating customized
6675// target processor and program binary. TCE co-design environment is
6676// publicly available in http://tce.cs.tut.fi
6677
6678static const unsigned TCEOpenCLAddrSpaceMap[] = {
6679 3, // opencl_global
6680 4, // opencl_local
6681 5, // opencl_constant
6682 // FIXME: generic has to be added to the target
6683 0, // opencl_generic
6684 0, // cuda_device
6685 0, // cuda_constant
6686 0 // cuda_shared
6687};
6688
6689class TCETargetInfo : public TargetInfo {
6690public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006691 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6692 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006693 TLSSupported = false;
6694 IntWidth = 32;
6695 LongWidth = LongLongWidth = 32;
6696 PointerWidth = 32;
6697 IntAlign = 32;
6698 LongAlign = LongLongAlign = 32;
6699 PointerAlign = 32;
6700 SuitableAlign = 32;
6701 SizeType = UnsignedInt;
6702 IntMaxType = SignedLong;
6703 IntPtrType = SignedInt;
6704 PtrDiffType = SignedInt;
6705 FloatWidth = 32;
6706 FloatAlign = 32;
6707 DoubleWidth = 32;
6708 DoubleAlign = 32;
6709 LongDoubleWidth = 32;
6710 LongDoubleAlign = 32;
6711 FloatFormat = &llvm::APFloat::IEEEsingle;
6712 DoubleFormat = &llvm::APFloat::IEEEsingle;
6713 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006714 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6715 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006716 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6717 UseAddrSpaceMapMangling = true;
6718 }
6719
6720 void getTargetDefines(const LangOptions &Opts,
6721 MacroBuilder &Builder) const override {
6722 DefineStd(Builder, "tce", Opts);
6723 Builder.defineMacro("__TCE__");
6724 Builder.defineMacro("__TCE_V1__");
6725 }
6726 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6727
Craig Topper6c03a542015-10-19 04:51:35 +00006728 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006729 const char *getClobbers() const override { return ""; }
6730 BuiltinVaListKind getBuiltinVaListKind() const override {
6731 return TargetInfo::VoidPtrBuiltinVaList;
6732 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006733 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006734 bool validateAsmConstraint(const char *&Name,
6735 TargetInfo::ConstraintInfo &info) const override {
6736 return true;
6737 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006738 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6739 return None;
6740 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006741};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006742
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006743class BPFTargetInfo : public TargetInfo {
6744public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006745 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6746 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006747 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6748 SizeType = UnsignedLong;
6749 PtrDiffType = SignedLong;
6750 IntPtrType = SignedLong;
6751 IntMaxType = SignedLong;
6752 Int64Type = SignedLong;
6753 RegParmMax = 5;
6754 if (Triple.getArch() == llvm::Triple::bpfeb) {
6755 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006756 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006757 } else {
6758 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006759 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006760 }
6761 MaxAtomicPromoteWidth = 64;
6762 MaxAtomicInlineWidth = 64;
6763 TLSSupported = false;
6764 }
6765 void getTargetDefines(const LangOptions &Opts,
6766 MacroBuilder &Builder) const override {
6767 DefineStd(Builder, "bpf", Opts);
6768 Builder.defineMacro("__BPF__");
6769 }
6770 bool hasFeature(StringRef Feature) const override {
6771 return Feature == "bpf";
6772 }
6773
Craig Topper6c03a542015-10-19 04:51:35 +00006774 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006775 const char *getClobbers() const override {
6776 return "";
6777 }
6778 BuiltinVaListKind getBuiltinVaListKind() const override {
6779 return TargetInfo::VoidPtrBuiltinVaList;
6780 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006781 ArrayRef<const char *> getGCCRegNames() const override {
6782 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006783 }
6784 bool validateAsmConstraint(const char *&Name,
6785 TargetInfo::ConstraintInfo &info) const override {
6786 return true;
6787 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006788 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6789 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006790 }
6791};
6792
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006793class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006794 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006795
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006796 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006797 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006798 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006799 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006800 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006801 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006802 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006803 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006804 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006805 enum DspRevEnum {
6806 NoDSP, DSP1, DSP2
6807 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006808 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006809
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006810protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006811 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006812 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006813
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006814public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006815 MipsTargetInfoBase(const llvm::Triple &Triple, const TargetOptions &,
6816 const std::string &ABIStr, const std::string &CPUStr)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006817 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006818 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006819 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6820 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6821 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006822
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006823 bool isNaN2008Default() const {
6824 return CPU == "mips32r6" || CPU == "mips64r6";
6825 }
6826
6827 bool isFP64Default() const {
6828 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6829 }
6830
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006831 bool isNan2008() const override {
6832 return IsNan2008;
6833 }
6834
Alp Toker4925ba72014-06-07 23:30:42 +00006835 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006836 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006837 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6838 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006839 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006840 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006841 .Case("mips1", IsMips32)
6842 .Case("mips2", IsMips32)
6843 .Case("mips3", true)
6844 .Case("mips4", true)
6845 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006846 .Case("mips32", IsMips32)
6847 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006848 .Case("mips32r3", IsMips32)
6849 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006850 .Case("mips32r6", IsMips32)
6851 .Case("mips64", true)
6852 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006853 .Case("mips64r3", true)
6854 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006855 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006856 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006857 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006858 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006859 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006860 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006861 bool
6862 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6863 StringRef CPU,
6864 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006865 if (CPU.empty())
6866 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006867 if (CPU == "octeon")
6868 Features["mips64r2"] = Features["cnmips"] = true;
6869 else
6870 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006871 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006872 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006873
Craig Topper3164f332014-03-11 03:39:26 +00006874 void getTargetDefines(const LangOptions &Opts,
6875 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006876 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006877 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006878 if (Opts.GNUMode)
6879 Builder.defineMacro("mips");
6880
Simon Atanasyan683535b2012-08-29 19:14:58 +00006881 Builder.defineMacro("__REGISTER_PREFIX__", "");
6882
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006883 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006884 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006885 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006886 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006887 case SoftFloat:
6888 Builder.defineMacro("__mips_soft_float", Twine(1));
6889 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006890 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006891
Simon Atanasyan16071912013-04-14 14:07:30 +00006892 if (IsSingleFloat)
6893 Builder.defineMacro("__mips_single_float", Twine(1));
6894
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006895 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6896 Builder.defineMacro("_MIPS_FPSET",
6897 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6898
Simon Atanasyan72244b62012-07-05 16:06:06 +00006899 if (IsMips16)
6900 Builder.defineMacro("__mips16", Twine(1));
6901
Simon Atanasyan60777612013-04-14 14:07:51 +00006902 if (IsMicromips)
6903 Builder.defineMacro("__mips_micromips", Twine(1));
6904
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006905 if (IsNan2008)
6906 Builder.defineMacro("__mips_nan2008", Twine(1));
6907
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006908 switch (DspRev) {
6909 default:
6910 break;
6911 case DSP1:
6912 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6913 Builder.defineMacro("__mips_dsp", Twine(1));
6914 break;
6915 case DSP2:
6916 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6917 Builder.defineMacro("__mips_dspr2", Twine(1));
6918 Builder.defineMacro("__mips_dsp", Twine(1));
6919 break;
6920 }
6921
Jack Carter44ff1e52013-08-12 17:20:29 +00006922 if (HasMSA)
6923 Builder.defineMacro("__mips_msa", Twine(1));
6924
Simon Atanasyan26f19672012-04-05 19:28:31 +00006925 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6926 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6927 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006928
6929 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6930 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006931
6932 // These shouldn't be defined for MIPS-I but there's no need to check
6933 // for that since MIPS-I isn't supported.
6934 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6935 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6936 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006937 }
6938
Craig Topper6c03a542015-10-19 04:51:35 +00006939 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6940 return llvm::makeArrayRef(BuiltinInfo,
6941 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006942 }
Craig Topper3164f332014-03-11 03:39:26 +00006943 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006944 return llvm::StringSwitch<bool>(Feature)
6945 .Case("mips", true)
6946 .Case("fp64", HasFP64)
6947 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006948 }
Craig Topper3164f332014-03-11 03:39:26 +00006949 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006950 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006951 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006952 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006953 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006954 // CPU register names
6955 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006956 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6957 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6958 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006959 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6960 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006961 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6962 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6963 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6964 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006965 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006966 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00006967 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
6968 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006969 // MSA register names
6970 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6971 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6972 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6973 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6974 // MSA control register names
6975 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6976 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006977 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006978 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006979 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006980 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006981 bool validateAsmConstraint(const char *&Name,
6982 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006983 switch (*Name) {
6984 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006985 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006986 case 'r': // CPU registers.
6987 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006988 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006989 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006990 case 'c': // $25 for indirect jumps
6991 case 'l': // lo register
6992 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006993 Info.setAllowsRegister();
6994 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006995 case 'I': // Signed 16-bit constant
6996 case 'J': // Integer 0
6997 case 'K': // Unsigned 16-bit constant
6998 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6999 case 'M': // Constants not loadable via lui, addiu, or ori
7000 case 'N': // Constant -1 to -65535
7001 case 'O': // A signed 15-bit constant
7002 case 'P': // A constant between 1 go 65535
7003 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007004 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007005 Info.setAllowsMemory();
7006 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007007 case 'Z':
7008 if (Name[1] == 'C') { // An address usable by ll, and sc.
7009 Info.setAllowsMemory();
7010 Name++; // Skip over 'Z'.
7011 return true;
7012 }
7013 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007014 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007015 }
7016
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007017 std::string convertConstraint(const char *&Constraint) const override {
7018 std::string R;
7019 switch (*Constraint) {
7020 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7021 if (Constraint[1] == 'C') {
7022 R = std::string("^") + std::string(Constraint, 2);
7023 Constraint++;
7024 return R;
7025 }
7026 break;
7027 }
7028 return TargetInfo::convertConstraint(Constraint);
7029 }
7030
Craig Topper3164f332014-03-11 03:39:26 +00007031 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007032 // In GCC, $1 is not widely used in generated code (it's used only in a few
7033 // specific situations), so there is no real need for users to add it to
7034 // the clobbers list if they want to use it in their inline assembly code.
7035 //
7036 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7037 // code generation, so using it in inline assembly without adding it to the
7038 // clobbers list can cause conflicts between the inline assembly code and
7039 // the surrounding generated code.
7040 //
7041 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7042 // operands, which will conflict with the ".set at" assembler option (which
7043 // we use only for inline assembly, in order to maintain compatibility with
7044 // GCC) and will also conflict with the user's usage of $1.
7045 //
7046 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7047 // register for generated code is to automatically clobber $1 for all inline
7048 // assembly code.
7049 //
7050 // FIXME: We should automatically clobber $1 only for inline assembly code
7051 // which actually uses it. This would allow LLVM to use $1 for inline
7052 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007053 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007054 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007055
Craig Topper3164f332014-03-11 03:39:26 +00007056 bool handleTargetFeatures(std::vector<std::string> &Features,
7057 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007058 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007059 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007060 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007061 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007062 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007063 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007064 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007065
Eric Christopher610fe112015-08-26 08:21:55 +00007066 for (const auto &Feature : Features) {
7067 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007068 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007069 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007070 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007071 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007072 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007073 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007074 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007075 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007076 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007077 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007078 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007079 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007080 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007081 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007082 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007083 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007084 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007085 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007086 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007087 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007088 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007089 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007090
James Y Knightb214cbc2016-03-04 19:00:41 +00007091 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007092
Rafael Espindolaeb265472013-08-21 21:59:03 +00007093 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007094 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007095
Craig Topper3164f332014-03-11 03:39:26 +00007096 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007097 if (RegNo == 0) return 4;
7098 if (RegNo == 1) return 5;
7099 return -1;
7100 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007101
7102 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007103};
7104
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007105const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007106#define BUILTIN(ID, TYPE, ATTRS) \
7107 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7108#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7109 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007110#include "clang/Basic/BuiltinsMips.def"
7111};
7112
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007113class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007114public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007115 Mips32TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7116 : MipsTargetInfoBase(Triple, Opts, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007117 SizeType = UnsignedInt;
7118 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007119 Int64Type = SignedLongLong;
7120 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007121 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007122 }
Craig Topper3164f332014-03-11 03:39:26 +00007123 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007124 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007125 ABI = Name;
7126 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007127 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007128 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007129 }
Craig Topper3164f332014-03-11 03:39:26 +00007130 void getTargetDefines(const LangOptions &Opts,
7131 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007132 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007133
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007134 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007135 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7136
7137 const std::string& CPUStr = getCPU();
7138 if (CPUStr == "mips32")
7139 Builder.defineMacro("__mips_isa_rev", "1");
7140 else if (CPUStr == "mips32r2")
7141 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007142 else if (CPUStr == "mips32r3")
7143 Builder.defineMacro("__mips_isa_rev", "3");
7144 else if (CPUStr == "mips32r5")
7145 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007146 else if (CPUStr == "mips32r6")
7147 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007148
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007149 if (ABI == "o32") {
7150 Builder.defineMacro("__mips_o32");
7151 Builder.defineMacro("_ABIO32", "1");
7152 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7153 }
7154 else if (ABI == "eabi")
7155 Builder.defineMacro("__mips_eabi");
7156 else
David Blaikie83d382b2011-09-23 05:06:16 +00007157 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007158 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007159 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007160 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7161 { { "at" }, "$1" },
7162 { { "v0" }, "$2" },
7163 { { "v1" }, "$3" },
7164 { { "a0" }, "$4" },
7165 { { "a1" }, "$5" },
7166 { { "a2" }, "$6" },
7167 { { "a3" }, "$7" },
7168 { { "t0" }, "$8" },
7169 { { "t1" }, "$9" },
7170 { { "t2" }, "$10" },
7171 { { "t3" }, "$11" },
7172 { { "t4" }, "$12" },
7173 { { "t5" }, "$13" },
7174 { { "t6" }, "$14" },
7175 { { "t7" }, "$15" },
7176 { { "s0" }, "$16" },
7177 { { "s1" }, "$17" },
7178 { { "s2" }, "$18" },
7179 { { "s3" }, "$19" },
7180 { { "s4" }, "$20" },
7181 { { "s5" }, "$21" },
7182 { { "s6" }, "$22" },
7183 { { "s7" }, "$23" },
7184 { { "t8" }, "$24" },
7185 { { "t9" }, "$25" },
7186 { { "k0" }, "$26" },
7187 { { "k1" }, "$27" },
7188 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007189 { { "sp","$sp" }, "$29" },
7190 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007191 { { "ra" }, "$31" }
7192 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007193 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007194 }
7195};
7196
7197class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007198 void setDataLayout() override {
7199 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007200 }
7201
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007202public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007203 Mips32EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7204 : Mips32TargetInfoBase(Triple, Opts) {
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00007205 }
Craig Topper3164f332014-03-11 03:39:26 +00007206 void getTargetDefines(const LangOptions &Opts,
7207 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007208 DefineStd(Builder, "MIPSEB", Opts);
7209 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007210 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007211 }
7212};
7213
7214class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007215 void setDataLayout() override {
7216 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007217 }
7218
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007219public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007220 Mips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7221 : Mips32TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007222 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007223 }
Craig Topper3164f332014-03-11 03:39:26 +00007224 void getTargetDefines(const LangOptions &Opts,
7225 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007226 DefineStd(Builder, "MIPSEL", Opts);
7227 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007228 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007229 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007230};
Akira Hatanakabef17452011-09-20 19:21:49 +00007231
7232class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007233public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007234 Mips64TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7235 : MipsTargetInfoBase(Triple, Opts, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007236 LongDoubleWidth = LongDoubleAlign = 128;
7237 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007238 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7239 LongDoubleWidth = LongDoubleAlign = 64;
7240 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7241 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007242 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007243 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007244 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007245 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007246
7247 void setN64ABITypes() {
7248 LongWidth = LongAlign = 64;
7249 PointerWidth = PointerAlign = 64;
7250 SizeType = UnsignedLong;
7251 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007252 Int64Type = SignedLong;
7253 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007254 }
7255
7256 void setN32ABITypes() {
7257 LongWidth = LongAlign = 32;
7258 PointerWidth = PointerAlign = 32;
7259 SizeType = UnsignedInt;
7260 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007261 Int64Type = SignedLongLong;
7262 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007263 }
7264
Craig Topper3164f332014-03-11 03:39:26 +00007265 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007266 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007267 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007268 ABI = Name;
7269 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007270 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007271 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007272 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007273 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007274 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007275 }
7276 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007277 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007278
Craig Topper3164f332014-03-11 03:39:26 +00007279 void getTargetDefines(const LangOptions &Opts,
7280 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007281 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007282
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007283 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007284 Builder.defineMacro("__mips64");
7285 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007286 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7287
7288 const std::string& CPUStr = getCPU();
7289 if (CPUStr == "mips64")
7290 Builder.defineMacro("__mips_isa_rev", "1");
7291 else if (CPUStr == "mips64r2")
7292 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007293 else if (CPUStr == "mips64r3")
7294 Builder.defineMacro("__mips_isa_rev", "3");
7295 else if (CPUStr == "mips64r5")
7296 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007297 else if (CPUStr == "mips64r6")
7298 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007299
Akira Hatanakabef17452011-09-20 19:21:49 +00007300 if (ABI == "n32") {
7301 Builder.defineMacro("__mips_n32");
7302 Builder.defineMacro("_ABIN32", "2");
7303 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7304 }
7305 else if (ABI == "n64") {
7306 Builder.defineMacro("__mips_n64");
7307 Builder.defineMacro("_ABI64", "3");
7308 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7309 }
7310 else
David Blaikie83d382b2011-09-23 05:06:16 +00007311 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007312
7313 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007314 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007315 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007316 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7317 { { "at" }, "$1" },
7318 { { "v0" }, "$2" },
7319 { { "v1" }, "$3" },
7320 { { "a0" }, "$4" },
7321 { { "a1" }, "$5" },
7322 { { "a2" }, "$6" },
7323 { { "a3" }, "$7" },
7324 { { "a4" }, "$8" },
7325 { { "a5" }, "$9" },
7326 { { "a6" }, "$10" },
7327 { { "a7" }, "$11" },
7328 { { "t0" }, "$12" },
7329 { { "t1" }, "$13" },
7330 { { "t2" }, "$14" },
7331 { { "t3" }, "$15" },
7332 { { "s0" }, "$16" },
7333 { { "s1" }, "$17" },
7334 { { "s2" }, "$18" },
7335 { { "s3" }, "$19" },
7336 { { "s4" }, "$20" },
7337 { { "s5" }, "$21" },
7338 { { "s6" }, "$22" },
7339 { { "s7" }, "$23" },
7340 { { "t8" }, "$24" },
7341 { { "t9" }, "$25" },
7342 { { "k0" }, "$26" },
7343 { { "k1" }, "$27" },
7344 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007345 { { "sp","$sp" }, "$29" },
7346 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007347 { { "ra" }, "$31" }
7348 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007349 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007350 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007351
7352 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007353};
7354
7355class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007356 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007357 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007358 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 +00007359 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007360 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007361 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007362
Akira Hatanakabef17452011-09-20 19:21:49 +00007363public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007364 Mips64EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7365 : Mips64TargetInfoBase(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00007366 void getTargetDefines(const LangOptions &Opts,
7367 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007368 DefineStd(Builder, "MIPSEB", Opts);
7369 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007370 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007371 }
7372};
7373
7374class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007375 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007376 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007377 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 +00007378 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007379 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007380 }
7381public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007382 Mips64ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7383 : Mips64TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007384 // Default ABI is n64.
7385 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007386 }
Craig Topper3164f332014-03-11 03:39:26 +00007387 void getTargetDefines(const LangOptions &Opts,
7388 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007389 DefineStd(Builder, "MIPSEL", Opts);
7390 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007391 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007392 }
7393};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007394
Ivan Krasindd7403e2011-08-24 20:22:22 +00007395class PNaClTargetInfo : public TargetInfo {
7396public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007397 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7398 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007399 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007400 this->LongAlign = 32;
7401 this->LongWidth = 32;
7402 this->PointerAlign = 32;
7403 this->PointerWidth = 32;
7404 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007405 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007406 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007407 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007408 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007409 this->SizeType = TargetInfo::UnsignedInt;
7410 this->PtrDiffType = TargetInfo::SignedInt;
7411 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007412 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007413 }
7414
Craig Toppere6f17d02014-03-11 04:07:52 +00007415 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007416 Builder.defineMacro("__le32__");
7417 Builder.defineMacro("__pnacl__");
7418 }
Craig Topper3164f332014-03-11 03:39:26 +00007419 void getTargetDefines(const LangOptions &Opts,
7420 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007421 getArchDefines(Opts, Builder);
7422 }
Craig Topper3164f332014-03-11 03:39:26 +00007423 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007424 return Feature == "pnacl";
7425 }
Craig Topper6c03a542015-10-19 04:51:35 +00007426 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007427 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007428 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007429 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007430 ArrayRef<const char *> getGCCRegNames() const override;
7431 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007432 bool validateAsmConstraint(const char *&Name,
7433 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007434 return false;
7435 }
7436
Craig Topper3164f332014-03-11 03:39:26 +00007437 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007438 return "";
7439 }
7440};
7441
Craig Topperf054e3a2015-10-19 03:52:27 +00007442ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7443 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007444}
7445
Craig Topperf054e3a2015-10-19 03:52:27 +00007446ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7447 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007448}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007449
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007450// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7451class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7452public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007453 NaClMips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7454 : Mips32ELTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007455
7456 BuiltinVaListKind getBuiltinVaListKind() const override {
7457 return TargetInfo::PNaClABIBuiltinVaList;
7458 }
7459};
7460
JF Bastien643817d2014-09-12 17:52:47 +00007461class Le64TargetInfo : public TargetInfo {
7462 static const Builtin::Info BuiltinInfo[];
7463
7464public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007465 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7466 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007467 BigEndian = false;
7468 NoAsmVariants = true;
7469 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7470 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007471 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007472 }
7473
7474 void getTargetDefines(const LangOptions &Opts,
7475 MacroBuilder &Builder) const override {
7476 DefineStd(Builder, "unix", Opts);
7477 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7478 Builder.defineMacro("__ELF__");
7479 }
Craig Topper6c03a542015-10-19 04:51:35 +00007480 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7481 return llvm::makeArrayRef(BuiltinInfo,
7482 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007483 }
7484 BuiltinVaListKind getBuiltinVaListKind() const override {
7485 return TargetInfo::PNaClABIBuiltinVaList;
7486 }
7487 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007488 ArrayRef<const char *> getGCCRegNames() const override {
7489 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007490 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007491 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7492 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007493 }
7494 bool validateAsmConstraint(const char *&Name,
7495 TargetInfo::ConstraintInfo &Info) const override {
7496 return false;
7497 }
7498
7499 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007500};
Dan Gohmanc2853072015-09-03 22:51:53 +00007501
7502class WebAssemblyTargetInfo : public TargetInfo {
7503 static const Builtin::Info BuiltinInfo[];
7504
7505 enum SIMDEnum {
7506 NoSIMD,
7507 SIMD128,
7508 } SIMDLevel;
7509
7510public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007511 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007512 : TargetInfo(T), SIMDLevel(NoSIMD) {
7513 BigEndian = false;
7514 NoAsmVariants = true;
7515 SuitableAlign = 128;
7516 LargeArrayMinWidth = 128;
7517 LargeArrayAlign = 128;
7518 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007519 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007520 LongDoubleWidth = LongDoubleAlign = 128;
7521 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007522 }
7523
7524protected:
7525 void getTargetDefines(const LangOptions &Opts,
7526 MacroBuilder &Builder) const override {
7527 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7528 if (SIMDLevel >= SIMD128)
7529 Builder.defineMacro("__wasm_simd128__");
7530 }
7531
7532private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007533 bool
7534 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7535 StringRef CPU,
7536 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007537 if (CPU == "bleeding-edge")
7538 Features["simd128"] = true;
7539 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7540 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007541 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007542 return llvm::StringSwitch<bool>(Feature)
7543 .Case("simd128", SIMDLevel >= SIMD128)
7544 .Default(false);
7545 }
7546 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007547 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007548 for (const auto &Feature : Features) {
7549 if (Feature == "+simd128") {
7550 SIMDLevel = std::max(SIMDLevel, SIMD128);
7551 continue;
7552 }
7553 if (Feature == "-simd128") {
7554 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7555 continue;
7556 }
7557
7558 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7559 << "-target-feature";
7560 return false;
7561 }
7562 return true;
7563 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007564 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007565 return llvm::StringSwitch<bool>(Name)
7566 .Case("mvp", true)
7567 .Case("bleeding-edge", true)
7568 .Case("generic", true)
7569 .Default(false);
7570 }
Craig Topper6c03a542015-10-19 04:51:35 +00007571 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7572 return llvm::makeArrayRef(BuiltinInfo,
7573 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007574 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007575 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007576 return VoidPtrBuiltinVaList;
7577 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007578 ArrayRef<const char *> getGCCRegNames() const final {
7579 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007580 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007581 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7582 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007583 }
7584 bool
7585 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007586 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007587 return false;
7588 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007589 const char *getClobbers() const final { return ""; }
7590 bool isCLZForZeroUndef() const final { return false; }
7591 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007592 IntType getIntTypeByWidth(unsigned BitWidth,
7593 bool IsSigned) const final {
7594 // WebAssembly prefers long long for explicitly 64-bit integers.
7595 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7596 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7597 }
7598 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7599 bool IsSigned) const final {
7600 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7601 return BitWidth == 64
7602 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7603 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7604 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007605};
7606
7607const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7608#define BUILTIN(ID, TYPE, ATTRS) \
7609 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7610#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7611 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7612#include "clang/Basic/BuiltinsWebAssembly.def"
7613};
7614
7615class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7616public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007617 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7618 const TargetOptions &Opts)
7619 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007620 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007621 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007622 }
7623
7624protected:
7625 void getTargetDefines(const LangOptions &Opts,
7626 MacroBuilder &Builder) const override {
7627 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7628 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7629 }
7630};
7631
7632class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007634 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7635 const TargetOptions &Opts)
7636 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007637 LongAlign = LongWidth = 64;
7638 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007639 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007640 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007641 }
7642
7643protected:
7644 void getTargetDefines(const LangOptions &Opts,
7645 MacroBuilder &Builder) const override {
7646 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7647 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7648 }
7649};
7650
JF Bastien643817d2014-09-12 17:52:47 +00007651const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7652#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007653 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007654#include "clang/Basic/BuiltinsLe64.def"
7655};
7656
Eric Christopherc48497a2015-09-18 21:26:24 +00007657static const unsigned SPIRAddrSpaceMap[] = {
7658 1, // opencl_global
7659 3, // opencl_local
7660 2, // opencl_constant
7661 4, // opencl_generic
7662 0, // cuda_device
7663 0, // cuda_constant
7664 0 // cuda_shared
7665};
7666class SPIRTargetInfo : public TargetInfo {
7667public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007668 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7669 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007670 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7671 "SPIR target must use unknown OS");
7672 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7673 "SPIR target must use unknown environment type");
7674 BigEndian = false;
7675 TLSSupported = false;
7676 LongWidth = LongAlign = 64;
7677 AddrSpaceMap = &SPIRAddrSpaceMap;
7678 UseAddrSpaceMapMangling = true;
7679 // Define available target features
7680 // These must be defined in sorted order!
7681 NoAsmVariants = true;
7682 }
7683 void getTargetDefines(const LangOptions &Opts,
7684 MacroBuilder &Builder) const override {
7685 DefineStd(Builder, "SPIR", Opts);
7686 }
7687 bool hasFeature(StringRef Feature) const override {
7688 return Feature == "spir";
7689 }
Craig Topper3164f332014-03-11 03:39:26 +00007690
Craig Topper6c03a542015-10-19 04:51:35 +00007691 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007692 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007693 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007694 bool validateAsmConstraint(const char *&Name,
7695 TargetInfo::ConstraintInfo &info) const override {
7696 return true;
7697 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007698 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7699 return None;
7700 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007701 BuiltinVaListKind getBuiltinVaListKind() const override {
7702 return TargetInfo::VoidPtrBuiltinVaList;
7703 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007704
Eric Christopherc48497a2015-09-18 21:26:24 +00007705 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7706 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7707 : CCCR_Warning;
7708 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007709
Eric Christopherc48497a2015-09-18 21:26:24 +00007710 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7711 return CC_SpirFunction;
7712 }
7713};
Guy Benyeib798fc92012-12-11 21:38:14 +00007714
Eric Christopherc48497a2015-09-18 21:26:24 +00007715class SPIR32TargetInfo : public SPIRTargetInfo {
7716public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007717 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7718 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007719 PointerWidth = PointerAlign = 32;
7720 SizeType = TargetInfo::UnsignedInt;
7721 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007722 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7723 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007724 }
7725 void getTargetDefines(const LangOptions &Opts,
7726 MacroBuilder &Builder) const override {
7727 DefineStd(Builder, "SPIR32", Opts);
7728 }
7729};
Guy Benyeib798fc92012-12-11 21:38:14 +00007730
Eric Christopherc48497a2015-09-18 21:26:24 +00007731class SPIR64TargetInfo : public SPIRTargetInfo {
7732public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007733 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7734 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007735 PointerWidth = PointerAlign = 64;
7736 SizeType = TargetInfo::UnsignedLong;
7737 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007738 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7739 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007740 }
7741 void getTargetDefines(const LangOptions &Opts,
7742 MacroBuilder &Builder) const override {
7743 DefineStd(Builder, "SPIR64", Opts);
7744 }
7745};
Guy Benyeib798fc92012-12-11 21:38:14 +00007746
Robert Lytton0e076492013-08-13 09:43:10 +00007747class XCoreTargetInfo : public TargetInfo {
7748 static const Builtin::Info BuiltinInfo[];
7749public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007750 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7751 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007752 BigEndian = false;
7753 NoAsmVariants = true;
7754 LongLongAlign = 32;
7755 SuitableAlign = 32;
7756 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007757 SizeType = UnsignedInt;
7758 PtrDiffType = SignedInt;
7759 IntPtrType = SignedInt;
7760 WCharType = UnsignedChar;
7761 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007762 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007763 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7764 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007765 }
Craig Topper3164f332014-03-11 03:39:26 +00007766 void getTargetDefines(const LangOptions &Opts,
7767 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007768 Builder.defineMacro("__XS1B__");
7769 }
Craig Topper6c03a542015-10-19 04:51:35 +00007770 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7771 return llvm::makeArrayRef(BuiltinInfo,
7772 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007773 }
Craig Topper3164f332014-03-11 03:39:26 +00007774 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007775 return TargetInfo::VoidPtrBuiltinVaList;
7776 }
Craig Topper3164f332014-03-11 03:39:26 +00007777 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007778 return "";
7779 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007780 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007781 static const char * const GCCRegNames[] = {
7782 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7783 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7784 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007785 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007786 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007787 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7788 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007789 }
Craig Topper3164f332014-03-11 03:39:26 +00007790 bool validateAsmConstraint(const char *&Name,
7791 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007792 return false;
7793 }
Craig Topper3164f332014-03-11 03:39:26 +00007794 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007795 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7796 return (RegNo < 2)? RegNo : -1;
7797 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007798 bool allowsLargerPreferedTypeAlignment() const override {
7799 return false;
7800 }
Robert Lytton0e076492013-08-13 09:43:10 +00007801};
7802
7803const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007804#define BUILTIN(ID, TYPE, ATTRS) \
7805 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7806#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7807 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007808#include "clang/Basic/BuiltinsXCore.def"
7809};
Robert Lytton0e076492013-08-13 09:43:10 +00007810
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007811// x86_32 Android target
7812class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7813public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007814 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7815 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007816 SuitableAlign = 32;
7817 LongDoubleWidth = 64;
7818 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7819 }
7820};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007821
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007822// x86_64 Android target
7823class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7824public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007825 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7826 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007827 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7828 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007829
7830 bool useFloat128ManglingForLongDouble() const override {
7831 return true;
7832 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007833};
7834} // end anonymous namespace
7835
Chris Lattner5ba61f02006-10-14 07:39:34 +00007836//===----------------------------------------------------------------------===//
7837// Driver code
7838//===----------------------------------------------------------------------===//
7839
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007840static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
7841 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007842 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007843
Daniel Dunbar52322032009-08-18 05:47:58 +00007844 switch (Triple.getArch()) {
7845 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007846 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007847
Tim Northover2a0783d2014-05-30 14:14:07 +00007848 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007849 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007850
7851 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007852 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007853
Jacques Pienaard964cc22016-03-28 21:02:54 +00007854 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007855 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00007856
Tim Northover2a0783d2014-05-30 14:14:07 +00007857 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007858 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007859 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007860
7861 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007862 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007863 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00007864 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007865 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007866 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007867 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00007868 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007869 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007870 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007871 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00007872 }
7873
Christian Pirker9b019ae2014-02-25 13:51:00 +00007874 case llvm::Triple::aarch64_be:
7875 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007876 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007877 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007878 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007879 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007880 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007881 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007882 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007883 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00007884 }
7885
Daniel Dunbar52322032009-08-18 05:47:58 +00007886 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007887 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007888 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007889 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007890
Daniel Dunbar52322032009-08-18 05:47:58 +00007891 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007892 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007893 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00007894 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007895 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007896 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007897 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007898 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007899 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00007900 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007901 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007902 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007903 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007904 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007905 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007906 case llvm::Triple::Win32:
7907 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007908 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007909 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00007910 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007911 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007912 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007913 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007914 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007915 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007916 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007917 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007918 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007919 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007920 }
7921
7922 case llvm::Triple::armeb:
7923 case llvm::Triple::thumbeb:
7924 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007925 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007926
7927 switch (os) {
7928 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007929 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007930 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007931 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007932 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007933 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007934 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007935 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007936 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007937 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007938 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007939 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007940 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007941 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007942 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007943 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00007944 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007945
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007946 case llvm::Triple::bpfeb:
7947 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007948 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007949
Daniel Dunbar52322032009-08-18 05:47:58 +00007950 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007951 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00007952
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007953 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007954 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007955 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007956 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007957 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007958 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007959 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007960 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007961 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007962 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007963 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007964 return new Mips32EBTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007965 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007966
7967 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007968 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007969 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007970 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007971 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007972 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007973 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007974 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007975 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007976 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007977 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007978 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007979 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007980 return new Mips32ELTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007981 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007982
Akira Hatanakabef17452011-09-20 19:21:49 +00007983 case llvm::Triple::mips64:
7984 switch (os) {
7985 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007986 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00007987 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007988 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00007989 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007990 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00007991 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007992 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007993 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007994 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00007995 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007996 return new Mips64EBTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00007997 }
7998
7999 case llvm::Triple::mips64el:
8000 switch (os) {
8001 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008002 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008003 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008004 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008005 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008006 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008007 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008008 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008009 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008010 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008011 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008012 return new Mips64ELTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008013 }
8014
Ivan Krasindd7403e2011-08-24 20:22:22 +00008015 case llvm::Triple::le32:
8016 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008017 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008018 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008019 default:
8020 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008021 }
8022
JF Bastien643817d2014-09-12 17:52:47 +00008023 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008024 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008025
Daniel Dunbar52322032009-08-18 05:47:58 +00008026 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008027 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008028 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008029 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008030 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008031 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008032 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008033 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008034 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008035 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008036 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008037 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008038 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008039 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008040 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008041 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008042 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008043
8044 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008045 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008046 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008047 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008048 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008049 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008050 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008051 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008052 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008053 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008054 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008055 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008056 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008057 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008058 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008059
Bill Schmidt778d3872013-07-26 01:36:11 +00008060 case llvm::Triple::ppc64le:
8061 switch (os) {
8062 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008063 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008064 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008065 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008066 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008067 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008068 }
8069
Peter Collingbournec947aae2012-05-20 23:28:41 +00008070 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008071 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008072 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008073 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008074
Tom Stellardd8e38a32015-01-06 20:34:47 +00008075 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008076 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008077 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008078
Daniel Dunbar52322032009-08-18 05:47:58 +00008079 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008080 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008081 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008082 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008083 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008084 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008085 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008086 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008087 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008088 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008089 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008090 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008091 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008092 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008093 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008094
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008095 // The 'sparcel' architecture copies all the above cases except for Solaris.
8096 case llvm::Triple::sparcel:
8097 switch (os) {
8098 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008099 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008100 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008101 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008102 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008103 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008104 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008105 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008106 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008107 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008108 }
8109
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008110 case llvm::Triple::sparcv9:
8111 switch (os) {
8112 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008113 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008114 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008115 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008116 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008117 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008118 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008119 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008120 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008121 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008122 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008123 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008124 }
8125
Ulrich Weigand47445072013-05-06 16:26:41 +00008126 case llvm::Triple::systemz:
8127 switch (os) {
8128 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008129 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008130 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008131 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008132 }
8133
Eli Friedmana9c3d712009-08-19 20:47:07 +00008134 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008135 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008136
Daniel Dunbar52322032009-08-18 05:47:58 +00008137 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008138 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008139 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008140
Daniel Dunbar52322032009-08-18 05:47:58 +00008141 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008142 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008143 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008144 case llvm::Triple::Linux: {
8145 switch (Triple.getEnvironment()) {
8146 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008147 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008148 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008149 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008150 }
8151 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008152 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008153 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008154 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008155 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008156 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008157 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008158 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008159 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008160 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008161 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008162 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008163 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008164 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008165 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008166 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008167 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008168 case llvm::Triple::Win32: {
8169 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008170 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008171 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008172 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008173 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008174 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008175 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008176 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008177 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008178 }
8179 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008180 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008181 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008182 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008183 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008184 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008185 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008186 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008187 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008188 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008189 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008190 }
8191
8192 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008193 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008194 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008195
Daniel Dunbar52322032009-08-18 05:47:58 +00008196 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008197 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008198 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008199 case llvm::Triple::Linux: {
8200 switch (Triple.getEnvironment()) {
8201 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008202 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008203 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008204 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008205 }
8206 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008207 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008208 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008209 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008210 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008211 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008212 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008213 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008214 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008215 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008216 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008217 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008218 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008219 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008220 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008221 case llvm::Triple::Win32: {
8222 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008223 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008224 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008225 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008226 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008227 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008228 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008230 }
8231 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008232 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008233 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008234 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008236 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008238 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008239
Douglas Katzman78d7c542015-05-12 21:18:10 +00008240 case llvm::Triple::spir: {
8241 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8242 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8243 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008244 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008245 }
8246 case llvm::Triple::spir64: {
8247 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8248 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8249 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008250 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008251 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008252 case llvm::Triple::wasm32:
8253 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8254 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008256 case llvm::Triple::wasm64:
8257 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8258 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008260 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008261}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008262
8263/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008264/// options.
Alp Toker80758082014-07-06 05:26:44 +00008265TargetInfo *
8266TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008267 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008268 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008269
8270 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008272 if (!Target) {
8273 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008274 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008275 }
Alp Toker80758082014-07-06 05:26:44 +00008276 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008277
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008278 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008279 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8280 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008281 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008282 }
8283
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008284 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008285 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8286 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008287 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008288 }
8289
Rafael Espindolaeb265472013-08-21 21:59:03 +00008290 // Set the fp math unit.
8291 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8292 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008293 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008294 }
8295
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008296 // Compute the default target features, we need the target to handle this
8297 // because features may have dependencies on one another.
8298 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008299 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8300 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008301 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008302
8303 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008304 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008305 for (const auto &F : Features)
8306 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8307
Eric Christopher3ff21b32013-10-16 21:26:26 +00008308 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008309 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008310
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008311 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008312}