blob: 70db97d7fb8db2138f4e25d4c286d06cebe9dcc1 [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
Chris Lattner5ba61f02006-10-14 07:39:34 +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:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000079 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000080 void getTargetDefines(const LangOptions &Opts,
81 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 TgtInfo::getTargetDefines(Opts, Builder);
83 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000084 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000085
86};
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Eric Christopher7d0c7252015-09-24 21:17:04 +000088// CloudABI Target
89template <typename Target>
90class CloudABITargetInfo : public OSTargetInfo<Target> {
91protected:
92 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
93 MacroBuilder &Builder) const override {
94 Builder.defineMacro("__CloudABI__");
95 Builder.defineMacro("__ELF__");
96
97 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
98 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
99 Builder.defineMacro("__STDC_UTF_16__");
100 Builder.defineMacro("__STDC_UTF_32__");
101 }
102
103public:
104 CloudABITargetInfo(const llvm::Triple &Triple)
James Y Knightb214cbc2016-03-04 19:00:41 +0000105 : OSTargetInfo<Target>(Triple) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000106};
107
Daniel Dunbard86666f2010-01-26 01:44:04 +0000108static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000109 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000110 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000111 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000112 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000113 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000115 // AddressSanitizer doesn't play well with source fortification, which is on
116 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000117 if (Opts.Sanitize.has(SanitizerKind::Address))
118 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000119
John McCall460ce582015-10-22 18:38:17 +0000120 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
121 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000122 // __weak is always defined, for use in blocks and with objc pointers.
123 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000124 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000125 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000126 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000127
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000128 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000129 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000130 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000131 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000132
133 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000134 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000135
Daniel Dunbarecf13562011-04-19 21:40:34 +0000136 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000137 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000138 if (Triple.isMacOSX()) {
139 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000141 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 Triple.getOSVersion(Maj, Min, Rev);
143 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000145
Sebastian Pop422377c2012-01-20 22:01:23 +0000146 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000147 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000148 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
149 if (PlatformName == "win32") {
150 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
151 return;
152 }
153
Evan Cheng31dd9a62014-01-26 23:12:43 +0000154 // Set the appropriate OS version define.
155 if (Triple.isiOS()) {
156 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
157 char Str[6];
158 Str[0] = '0' + Maj;
159 Str[1] = '0' + (Min / 10);
160 Str[2] = '0' + (Min % 10);
161 Str[3] = '0' + (Rev / 10);
162 Str[4] = '0' + (Rev % 10);
163 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000164 if (Triple.isTvOS())
165 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
166 else
167 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
168 Str);
169
170 } else if (Triple.isWatchOS()) {
171 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
172 char Str[6];
173 Str[0] = '0' + Maj;
174 Str[1] = '0' + (Min / 10);
175 Str[2] = '0' + (Min % 10);
176 Str[3] = '0' + (Rev / 10);
177 Str[4] = '0' + (Rev % 10);
178 Str[5] = '\0';
179 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000180 } else if (Triple.isMacOSX()) {
181 // Note that the Driver allows versions which aren't representable in the
182 // define (because we only get a single digit for the minor and micro
183 // revision numbers). So, we limit them to the maximum representable
184 // version.
185 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000186 char Str[7];
187 if (Maj < 10 || (Maj == 10 && Min < 10)) {
188 Str[0] = '0' + (Maj / 10);
189 Str[1] = '0' + (Maj % 10);
190 Str[2] = '0' + std::min(Min, 9U);
191 Str[3] = '0' + std::min(Rev, 9U);
192 Str[4] = '\0';
193 } else {
194 // Handle versions > 10.9.
195 Str[0] = '0' + (Maj / 10);
196 Str[1] = '0' + (Maj % 10);
197 Str[2] = '0' + (Min / 10);
198 Str[3] = '0' + (Min % 10);
199 Str[4] = '0' + (Rev / 10);
200 Str[5] = '0' + (Rev % 10);
201 Str[6] = '\0';
202 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000203 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000204 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000205
Tim Northover157d9112014-01-16 08:48:16 +0000206 // Tell users about the kernel if there is one.
207 if (Triple.isOSDarwin())
208 Builder.defineMacro("__MACH__");
209
Daniel Dunbarecf13562011-04-19 21:40:34 +0000210 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000211}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000212
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213template<typename Target>
214class DarwinTargetInfo : public OSTargetInfo<Target> {
215protected:
Craig Topper3164f332014-03-11 03:39:26 +0000216 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
217 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000218 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000219 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000220 }
Mike Stump11289f42009-09-09 15:08:12 +0000221
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000223 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000224 // By default, no TLS, and we whitelist permitted architecture/OS
225 // combinations.
226 this->TLSSupported = false;
227
228 if (Triple.isMacOSX())
229 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
230 else if (Triple.isiOS()) {
231 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
232 if (Triple.getArch() == llvm::Triple::x86_64 ||
233 Triple.getArch() == llvm::Triple::aarch64)
234 this->TLSSupported = !Triple.isOSVersionLT(8);
235 else if (Triple.getArch() == llvm::Triple::x86 ||
236 Triple.getArch() == llvm::Triple::arm ||
237 Triple.getArch() == llvm::Triple::thumb)
238 this->TLSSupported = !Triple.isOSVersionLT(9);
239 } else if (Triple.isWatchOS())
240 this->TLSSupported = !Triple.isOSVersionLT(2);
241
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000242 this->MCountName = "\01mcount";
243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244
Craig Topper3164f332014-03-11 03:39:26 +0000245 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000246 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000247 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000248 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000249 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000250 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000251 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000252 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000255 // FIXME: We should return 0 when building kexts.
256 return "__TEXT,__StaticInit,regular,pure_instructions";
257 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000258
John McCalleed64c72012-01-29 01:20:30 +0000259 /// Darwin does not support protected visibility. Darwin's "default"
260 /// is very similar to ELF's "protected"; Darwin requires a "weak"
261 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000262 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000263 return false;
264 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000265
266 unsigned getExnObjectAlignment() const override {
267 // The alignment of an exception object is 8-bytes for darwin since
268 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
269 // and therefore doesn't guarantee 16-byte alignment.
270 return 64;
271 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000272};
273
Chris Lattner30ba6742009-08-10 19:03:04 +0000274
Torok Edwinb2b37c62009-06-30 17:10:35 +0000275// DragonFlyBSD Target
276template<typename Target>
277class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
278protected:
Craig Topper3164f332014-03-11 03:39:26 +0000279 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
280 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000282 Builder.defineMacro("__DragonFly__");
283 Builder.defineMacro("__DragonFly_cc_version", "100001");
284 Builder.defineMacro("__ELF__");
285 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
286 Builder.defineMacro("__tune_i386__");
287 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000288 }
289public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000290 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
291 : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000292 switch (Triple.getArch()) {
293 default:
294 case llvm::Triple::x86:
295 case llvm::Triple::x86_64:
296 this->MCountName = ".mcount";
297 break;
298 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000299 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000300};
301
302// FreeBSD Target
303template<typename Target>
304class FreeBSDTargetInfo : public OSTargetInfo<Target> {
305protected:
Craig Topper3164f332014-03-11 03:39:26 +0000306 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
307 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000308 // FreeBSD defines; list based off of gcc output
309
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000310 unsigned Release = Triple.getOSMajorVersion();
311 if (Release == 0U)
312 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000313
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000314 Builder.defineMacro("__FreeBSD__", Twine(Release));
315 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000316 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
317 DefineStd(Builder, "unix", Opts);
318 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000319
320 // On FreeBSD, wchar_t contains the number of the code point as
321 // used by the character set of the locale. These character sets are
322 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000323 //
324 // FIXME: This is wrong; the macro refers to the numerical values
325 // of wchar_t *literals*, which are not locale-dependent. However,
326 // FreeBSD systems apparently depend on us getting this wrong, and
327 // setting this to 1 is conforming even if all the basic source
328 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000329 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000330 }
331public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000332 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000333 switch (Triple.getArch()) {
334 default:
335 case llvm::Triple::x86:
336 case llvm::Triple::x86_64:
337 this->MCountName = ".mcount";
338 break;
339 case llvm::Triple::mips:
340 case llvm::Triple::mipsel:
341 case llvm::Triple::ppc:
342 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000343 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000344 this->MCountName = "_mcount";
345 break;
346 case llvm::Triple::arm:
347 this->MCountName = "__mcount";
348 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000349 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000350 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000351};
352
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000353// GNU/kFreeBSD Target
354template<typename Target>
355class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
356protected:
Craig Topper3164f332014-03-11 03:39:26 +0000357 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
358 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000359 // GNU/kFreeBSD defines; list based off of gcc output
360
361 DefineStd(Builder, "unix", Opts);
362 Builder.defineMacro("__FreeBSD_kernel__");
363 Builder.defineMacro("__GLIBC__");
364 Builder.defineMacro("__ELF__");
365 if (Opts.POSIXThreads)
366 Builder.defineMacro("_REENTRANT");
367 if (Opts.CPlusPlus)
368 Builder.defineMacro("_GNU_SOURCE");
369 }
370public:
Eric Christopher917e9522014-11-18 22:36:15 +0000371 KFreeBSDTargetInfo(const llvm::Triple &Triple)
James Y Knightb214cbc2016-03-04 19:00:41 +0000372 : OSTargetInfo<Target>(Triple) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000373};
374
Chris Lattner3e2ee142010-07-07 16:01:42 +0000375// Minix Target
376template<typename Target>
377class MinixTargetInfo : public OSTargetInfo<Target> {
378protected:
Craig Topper3164f332014-03-11 03:39:26 +0000379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000381 // Minix defines
382
383 Builder.defineMacro("__minix", "3");
384 Builder.defineMacro("_EM_WSIZE", "4");
385 Builder.defineMacro("_EM_PSIZE", "4");
386 Builder.defineMacro("_EM_SSIZE", "2");
387 Builder.defineMacro("_EM_LSIZE", "4");
388 Builder.defineMacro("_EM_FSIZE", "4");
389 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000390 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000391 DefineStd(Builder, "unix", Opts);
392 }
393public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000394 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000395};
396
Torok Edwinb2b37c62009-06-30 17:10:35 +0000397// Linux target
398template<typename Target>
399class LinuxTargetInfo : public OSTargetInfo<Target> {
400protected:
Craig Topper3164f332014-03-11 03:39:26 +0000401 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
402 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000403 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000404 DefineStd(Builder, "unix", Opts);
405 DefineStd(Builder, "linux", Opts);
406 Builder.defineMacro("__gnu_linux__");
407 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000408 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000409 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000410 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000411 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000412 this->PlatformName = "android";
413 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
414 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000415 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000416 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000417 if (Opts.CPlusPlus)
418 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419 }
420public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000421 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000422 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000423
424 switch (Triple.getArch()) {
425 default:
426 break;
427 case llvm::Triple::ppc:
428 case llvm::Triple::ppc64:
429 case llvm::Triple::ppc64le:
430 this->MCountName = "_mcount";
431 break;
432 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000433 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000434
Craig Topper3164f332014-03-11 03:39:26 +0000435 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000436 return ".text.startup";
437 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438};
439
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000440// NetBSD Target
441template<typename Target>
442class NetBSDTargetInfo : public OSTargetInfo<Target> {
443protected:
Craig Topper3164f332014-03-11 03:39:26 +0000444 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
445 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000446 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000447 Builder.defineMacro("__NetBSD__");
448 Builder.defineMacro("__unix__");
449 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000450 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000451 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000452
453 switch (Triple.getArch()) {
454 default:
455 break;
456 case llvm::Triple::arm:
457 case llvm::Triple::armeb:
458 case llvm::Triple::thumb:
459 case llvm::Triple::thumbeb:
460 Builder.defineMacro("__ARM_DWARF_EH__");
461 break;
462 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000463 }
464public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000465 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000466 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000467 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000468};
469
Torok Edwinb2b37c62009-06-30 17:10:35 +0000470// OpenBSD Target
471template<typename Target>
472class OpenBSDTargetInfo : public OSTargetInfo<Target> {
473protected:
Craig Topper3164f332014-03-11 03:39:26 +0000474 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
475 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000476 // OpenBSD defines; list based off of gcc output
477
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000478 Builder.defineMacro("__OpenBSD__");
479 DefineStd(Builder, "unix", Opts);
480 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000481 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000482 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000483 }
484public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000485 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000486 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000487
Eli Friedman3715d1f2011-12-15 02:15:56 +0000488 switch (Triple.getArch()) {
489 default:
490 case llvm::Triple::x86:
491 case llvm::Triple::x86_64:
492 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000493 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000494 this->MCountName = "__mcount";
495 break;
496 case llvm::Triple::mips64:
497 case llvm::Triple::mips64el:
498 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000499 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000500 this->MCountName = "_mcount";
501 break;
502 }
503 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000504};
505
Eli Friedman9fa28852012-08-08 23:57:20 +0000506// Bitrig Target
507template<typename Target>
508class BitrigTargetInfo : public OSTargetInfo<Target> {
509protected:
Craig Topper3164f332014-03-11 03:39:26 +0000510 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
511 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000512 // Bitrig defines; list based off of gcc output
513
514 Builder.defineMacro("__Bitrig__");
515 DefineStd(Builder, "unix", Opts);
516 Builder.defineMacro("__ELF__");
517 if (Opts.POSIXThreads)
518 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000519
520 switch (Triple.getArch()) {
521 default:
522 break;
523 case llvm::Triple::arm:
524 case llvm::Triple::armeb:
525 case llvm::Triple::thumb:
526 case llvm::Triple::thumbeb:
527 Builder.defineMacro("__ARM_DWARF_EH__");
528 break;
529 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000530 }
531public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000533 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000534 }
535};
536
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000537// PSP Target
538template<typename Target>
539class PSPTargetInfo : public OSTargetInfo<Target> {
540protected:
Craig Topper3164f332014-03-11 03:39:26 +0000541 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
542 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000543 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000544 Builder.defineMacro("PSP");
545 Builder.defineMacro("_PSP");
546 Builder.defineMacro("__psp__");
547 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000548 }
549public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000550 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000551};
552
John Thompsone467e192009-11-19 17:18:50 +0000553// PS3 PPU Target
554template<typename Target>
555class PS3PPUTargetInfo : public OSTargetInfo<Target> {
556protected:
Craig Topper3164f332014-03-11 03:39:26 +0000557 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
558 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000559 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000560 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000561 Builder.defineMacro("__PPU__");
562 Builder.defineMacro("__CELLOS_LV2__");
563 Builder.defineMacro("__ELF__");
564 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000565 Builder.defineMacro("_ARCH_PPC64");
566 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000567 }
568public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000569 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000570 this->LongWidth = this->LongAlign = 32;
571 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000572 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000573 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000574 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000575 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000576 }
577};
578
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000579template <typename Target>
580class PS4OSTargetInfo : public OSTargetInfo<Target> {
581protected:
582 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
583 MacroBuilder &Builder) const override {
584 Builder.defineMacro("__FreeBSD__", "9");
585 Builder.defineMacro("__FreeBSD_cc_version", "900001");
586 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
587 DefineStd(Builder, "unix", Opts);
588 Builder.defineMacro("__ELF__");
589 Builder.defineMacro("__PS4__");
590 }
591public:
592 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
593 this->WCharType = this->UnsignedShort;
594
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000595 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
596 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000597
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000598 // On PS4, do not honor explicit bit field alignment,
599 // as in "__attribute__((aligned(2))) int b : 1;".
600 this->UseExplicitBitFieldAlignment = false;
601
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000602 switch (Triple.getArch()) {
603 default:
604 case llvm::Triple::x86_64:
605 this->MCountName = ".mcount";
606 break;
607 }
608 }
609};
610
Torok Edwinb2b37c62009-06-30 17:10:35 +0000611// Solaris target
612template<typename Target>
613class SolarisTargetInfo : public OSTargetInfo<Target> {
614protected:
Craig Topper3164f332014-03-11 03:39:26 +0000615 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
616 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000617 DefineStd(Builder, "sun", Opts);
618 DefineStd(Builder, "unix", Opts);
619 Builder.defineMacro("__ELF__");
620 Builder.defineMacro("__svr4__");
621 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000622 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
623 // newer, but to 500 for everything else. feature_test.h has a check to
624 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000625 // with a new version.
626 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000627 Builder.defineMacro("_XOPEN_SOURCE", "600");
628 else
629 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000630 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000631 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000632 Builder.defineMacro("_LARGEFILE_SOURCE");
633 Builder.defineMacro("_LARGEFILE64_SOURCE");
634 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000635 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000636 }
637public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000638 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
David Chisnallb526e932012-03-28 18:04:14 +0000639 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000640 // FIXME: WIntType should be SignedLong
641 }
642};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000643
644// Windows target
645template<typename Target>
646class WindowsTargetInfo : public OSTargetInfo<Target> {
647protected:
Craig Topper3164f332014-03-11 03:39:26 +0000648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000650 Builder.defineMacro("_WIN32");
651 }
652 void getVisualStudioDefines(const LangOptions &Opts,
653 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000654 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000655 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000656 Builder.defineMacro("_CPPRTTI");
657
Reid Kleckner16514352015-01-30 21:42:55 +0000658 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000659 Builder.defineMacro("_CPPUNWIND");
660 }
661
David Majnemer6a658902015-07-22 22:36:26 +0000662 if (Opts.Bool)
663 Builder.defineMacro("__BOOL_DEFINED");
664
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000665 if (!Opts.CharIsSigned)
666 Builder.defineMacro("_CHAR_UNSIGNED");
667
668 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
669 // but it works for now.
670 if (Opts.POSIXThreads)
671 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000672
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000673 if (Opts.MSCompatibilityVersion) {
674 Builder.defineMacro("_MSC_VER",
675 Twine(Opts.MSCompatibilityVersion / 100000));
676 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000677 // FIXME We cannot encode the revision information into 32-bits
678 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000679
David Majnemerb710a932015-05-11 03:57:49 +0000680 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000681 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000682 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000683
684 if (Opts.MicrosoftExt) {
685 Builder.defineMacro("_MSC_EXTENSIONS");
686
687 if (Opts.CPlusPlus11) {
688 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
689 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
690 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
691 }
692 }
693
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000694 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000695 }
696
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000697public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000698 WindowsTargetInfo(const llvm::Triple &Triple)
699 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000700};
701
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000702template <typename Target>
703class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000704protected:
Craig Topper3164f332014-03-11 03:39:26 +0000705 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
706 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000707 if (Opts.POSIXThreads)
708 Builder.defineMacro("_REENTRANT");
709 if (Opts.CPlusPlus)
710 Builder.defineMacro("_GNU_SOURCE");
711
712 DefineStd(Builder, "unix", Opts);
713 Builder.defineMacro("__ELF__");
714 Builder.defineMacro("__native_client__");
715 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000716
717public:
718 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000719 this->LongAlign = 32;
720 this->LongWidth = 32;
721 this->PointerAlign = 32;
722 this->PointerWidth = 32;
723 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000724 this->Int64Type = TargetInfo::SignedLongLong;
725 this->DoubleAlign = 64;
726 this->LongDoubleWidth = 64;
727 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000728 this->LongLongWidth = 64;
729 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000730 this->SizeType = TargetInfo::UnsignedInt;
731 this->PtrDiffType = TargetInfo::SignedInt;
732 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000733 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000734 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000735 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000736 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000737 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000738 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000739 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000740 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000741 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000742 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000743 } else {
744 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000745 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000746 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000747 }
748};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000749
Dan Gohmanc2853072015-09-03 22:51:53 +0000750// WebAssembly target
751template <typename Target>
752class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
753 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000754 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000755 // A common platform macro.
756 if (Opts.POSIXThreads)
757 Builder.defineMacro("_REENTRANT");
758 // Follow g++ convention and predefine _GNU_SOURCE for C++.
759 if (Opts.CPlusPlus)
760 Builder.defineMacro("_GNU_SOURCE");
761 }
762
763 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000764 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000765 return ".text.__startup";
766 }
767
768public:
769 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
770 : OSTargetInfo<Target>(Triple) {
771 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000772 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
773 }
774};
Dan Gohmanc2853072015-09-03 22:51:53 +0000775
Chris Lattner09d98f52008-10-05 21:50:58 +0000776//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000777// Specific target implementations.
778//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000779
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000780// PPC abstract base class
781class PPCTargetInfo : public TargetInfo {
782 static const Builtin::Info BuiltinInfo[];
783 static const char * const GCCRegNames[];
784 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000785 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000786
787 // Target cpu features.
788 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000789 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000790 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000791 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000792 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000793 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000794 bool HasBPERMD;
795 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000796
Ulrich Weigand8afad612014-07-28 13:17:52 +0000797protected:
798 std::string ABI;
799
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000800public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000801 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000802 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000803 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000804 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000805 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000806 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000807 LongDoubleWidth = LongDoubleAlign = 128;
808 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
809 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000810
Hal Finkel6b984f02012-07-03 16:51:04 +0000811 /// \brief Flags for architecture specific defines.
812 typedef enum {
813 ArchDefineNone = 0,
814 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
815 ArchDefinePpcgr = 1 << 1,
816 ArchDefinePpcsq = 1 << 2,
817 ArchDefine440 = 1 << 3,
818 ArchDefine603 = 1 << 4,
819 ArchDefine604 = 1 << 5,
820 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000821 ArchDefinePwr5 = 1 << 7,
822 ArchDefinePwr5x = 1 << 8,
823 ArchDefinePwr6 = 1 << 9,
824 ArchDefinePwr6x = 1 << 10,
825 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000826 ArchDefinePwr8 = 1 << 12,
827 ArchDefineA2 = 1 << 13,
828 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000829 } ArchDefineTypes;
830
Bill Schmidt38378a02013-02-01 20:23:10 +0000831 // Note: GCC recognizes the following additional cpus:
832 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
833 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
834 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000835 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000836 bool CPUKnown = llvm::StringSwitch<bool>(Name)
837 .Case("generic", true)
838 .Case("440", true)
839 .Case("450", true)
840 .Case("601", true)
841 .Case("602", true)
842 .Case("603", true)
843 .Case("603e", true)
844 .Case("603ev", true)
845 .Case("604", true)
846 .Case("604e", true)
847 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000848 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000849 .Case("g3", true)
850 .Case("7400", true)
851 .Case("g4", true)
852 .Case("7450", true)
853 .Case("g4+", true)
854 .Case("750", true)
855 .Case("970", true)
856 .Case("g5", true)
857 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000858 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000859 .Case("e500mc", true)
860 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000861 .Case("power3", true)
862 .Case("pwr3", true)
863 .Case("power4", true)
864 .Case("pwr4", true)
865 .Case("power5", true)
866 .Case("pwr5", true)
867 .Case("power5x", true)
868 .Case("pwr5x", true)
869 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000870 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000871 .Case("power6x", true)
872 .Case("pwr6x", true)
873 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000874 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000875 .Case("power8", true)
876 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000877 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000878 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000879 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000880 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000881 .Case("powerpc64le", true)
882 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000883 .Default(false);
884
885 if (CPUKnown)
886 CPU = Name;
887
888 return CPUKnown;
889 }
890
Ulrich Weigand8afad612014-07-28 13:17:52 +0000891
892 StringRef getABI() const override { return ABI; }
893
Craig Topper6c03a542015-10-19 04:51:35 +0000894 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
895 return llvm::makeArrayRef(BuiltinInfo,
896 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000897 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000898
Craig Topper3164f332014-03-11 03:39:26 +0000899 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000900
Craig Topper3164f332014-03-11 03:39:26 +0000901 void getTargetDefines(const LangOptions &Opts,
902 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000903
Eric Christopher8c47b422015-10-09 18:39:55 +0000904 bool
905 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
906 StringRef CPU,
907 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000908
Craig Topper3164f332014-03-11 03:39:26 +0000909 bool handleTargetFeatures(std::vector<std::string> &Features,
910 DiagnosticsEngine &Diags) override;
911 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000912 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
913 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000914
Craig Topperf054e3a2015-10-19 03:52:27 +0000915 ArrayRef<const char *> getGCCRegNames() const override;
916 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000917 bool validateAsmConstraint(const char *&Name,
918 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000919 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000920 default: return false;
921 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000922 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000923 case 'b': // Base register
924 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000925 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000926 break;
927 // FIXME: The following are added to allow parsing.
928 // I just took a guess at what the actions should be.
929 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000930 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000931 case 'v': // Altivec vector register
932 Info.setAllowsRegister();
933 break;
934 case 'w':
935 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000936 case 'd':// VSX vector register to hold vector double data
937 case 'f':// VSX vector register to hold vector float data
938 case 's':// VSX vector register to hold scalar float data
939 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000940 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000941 break;
942 default:
943 return false;
944 }
945 Info.setAllowsRegister();
946 Name++; // Skip over 'w'.
947 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000948 case 'h': // `MQ', `CTR', or `LINK' register
949 case 'q': // `MQ' register
950 case 'c': // `CTR' register
951 case 'l': // `LINK' register
952 case 'x': // `CR' register (condition register) number 0
953 case 'y': // `CR' register (condition register)
954 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000955 Info.setAllowsRegister();
956 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000957 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000958 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000959 // (use `L' instead for SImode constants)
960 case 'K': // Unsigned 16-bit constant
961 case 'L': // Signed 16-bit constant shifted left 16 bits
962 case 'M': // Constant larger than 31
963 case 'N': // Exact power of 2
964 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000965 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000966 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000967 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000968 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000969 break;
970 case 'm': // Memory operand. Note that on PowerPC targets, m can
971 // include addresses that update the base register. It
972 // is therefore only safe to use `m' in an asm statement
973 // if that asm statement accesses the operand exactly once.
974 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000975 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000976 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000977 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000978 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000979 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
980 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000981 // register to be updated.
982 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000983 if (Name[1] != 's')
984 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000985 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000986 // include any automodification of the base register. Unlike
987 // `m', this constraint can be used in asm statements that
988 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000989 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000990 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000991 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000992 break;
993 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000994 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 'Z': // Memory operand that is an indexed or indirect from a
996 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000997 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000998 Info.setAllowsMemory();
999 Info.setAllowsRegister();
1000 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001002 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001003 // register (`p' is preferable for asm statements)
1004 case 'S': // Constant suitable as a 64-bit mask operand
1005 case 'T': // Constant suitable as a 32-bit mask operand
1006 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001007 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001008 // instructions
1009 case 'W': // Vector constant that does not require memory
1010 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001011 break;
1012 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001013 }
John Thompson07a61a42010-06-24 22:44:13 +00001014 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001015 }
Craig Topper3164f332014-03-11 03:39:26 +00001016 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001017 std::string R;
1018 switch (*Constraint) {
1019 case 'e':
1020 case 'w':
1021 // Two-character constraint; add "^" hint for later parsing.
1022 R = std::string("^") + std::string(Constraint, 2);
1023 Constraint++;
1024 break;
1025 default:
1026 return TargetInfo::convertConstraint(Constraint);
1027 }
1028 return R;
1029 }
Craig Topper3164f332014-03-11 03:39:26 +00001030 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001031 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001032 }
Craig Topper3164f332014-03-11 03:39:26 +00001033 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001034 if (RegNo == 0) return 3;
1035 if (RegNo == 1) return 4;
1036 return -1;
1037 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001038
1039 bool hasSjLjLowering() const override {
1040 return true;
1041 }
David Majnemer2617ea62015-06-09 18:05:33 +00001042
1043 bool useFloat128ManglingForLongDouble() const override {
1044 return LongDoubleWidth == 128 &&
1045 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1046 getTriple().isOSBinFormatELF();
1047 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001048};
Anders Carlssonf511f642007-11-27 04:11:28 +00001049
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001050const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001051#define BUILTIN(ID, TYPE, ATTRS) \
1052 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1053#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1054 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001055#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001056};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001057
Eric Christopher917e9522014-11-18 22:36:15 +00001058/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001059/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001060bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001061 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001062 for (const auto &Feature : Features) {
1063 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001064 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001065 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001066 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001067 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001068 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001069 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001070 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001071 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001072 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001073 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001074 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001075 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001076 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001077 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001078 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001079 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001080 // TODO: Finish this list and add an assert that we've handled them
1081 // all.
1082 }
Eric Christopher02c33352015-08-25 00:59:11 +00001083
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001084 return true;
1085}
1086
Chris Lattnerecd49032009-03-02 22:27:17 +00001087/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1088/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001089void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001090 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001091 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001092 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001093 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001094 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001095 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001096 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001097 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001098 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001099 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001100 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001101 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001102 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001103
Chris Lattnerecd49032009-03-02 22:27:17 +00001104 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001105 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1106 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001107 } else {
1108 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1109 getTriple().getOS() != llvm::Triple::OpenBSD)
1110 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001111 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001112
Ulrich Weigand8afad612014-07-28 13:17:52 +00001113 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001114 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001115 Builder.defineMacro("_CALL_ELF", "1");
1116 if (ABI == "elfv2")
1117 Builder.defineMacro("_CALL_ELF", "2");
1118
Chris Lattnerecd49032009-03-02 22:27:17 +00001119 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001120 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1121 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001122
Chris Lattnerecd49032009-03-02 22:27:17 +00001123 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001124 if (LongDoubleWidth == 128)
1125 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001126
John Thompsone467e192009-11-19 17:18:50 +00001127 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001128 Builder.defineMacro("__VEC__", "10206");
1129 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001130 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001131
1132 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001133 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1134 .Case("440", ArchDefineName)
1135 .Case("450", ArchDefineName | ArchDefine440)
1136 .Case("601", ArchDefineName)
1137 .Case("602", ArchDefineName | ArchDefinePpcgr)
1138 .Case("603", ArchDefineName | ArchDefinePpcgr)
1139 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1140 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1141 .Case("604", ArchDefineName | ArchDefinePpcgr)
1142 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1143 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001144 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001145 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1146 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1147 .Case("750", ArchDefineName | ArchDefinePpcgr)
1148 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1149 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001150 .Case("a2", ArchDefineA2)
1151 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001152 .Case("pwr3", ArchDefinePpcgr)
1153 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1154 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1155 | ArchDefinePpcsq)
1156 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1157 | ArchDefinePpcgr | ArchDefinePpcsq)
1158 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1159 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1160 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1161 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1162 | ArchDefinePpcsq)
1163 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1164 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001165 | ArchDefinePpcgr | ArchDefinePpcsq)
1166 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1167 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1168 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001169 .Case("power3", ArchDefinePpcgr)
1170 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1171 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1172 | ArchDefinePpcsq)
1173 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1174 | ArchDefinePpcgr | ArchDefinePpcsq)
1175 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1176 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1177 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1178 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1179 | ArchDefinePpcsq)
1180 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1181 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001182 | ArchDefinePpcgr | ArchDefinePpcsq)
1183 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1184 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1185 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001186 .Default(ArchDefineNone);
1187
1188 if (defs & ArchDefineName)
1189 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1190 if (defs & ArchDefinePpcgr)
1191 Builder.defineMacro("_ARCH_PPCGR");
1192 if (defs & ArchDefinePpcsq)
1193 Builder.defineMacro("_ARCH_PPCSQ");
1194 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001195 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001196 if (defs & ArchDefine603)
1197 Builder.defineMacro("_ARCH_603");
1198 if (defs & ArchDefine604)
1199 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001200 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001201 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001202 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001203 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001204 if (defs & ArchDefinePwr5x)
1205 Builder.defineMacro("_ARCH_PWR5X");
1206 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001207 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001208 if (defs & ArchDefinePwr6x)
1209 Builder.defineMacro("_ARCH_PWR6X");
1210 if (defs & ArchDefinePwr7)
1211 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001212 if (defs & ArchDefinePwr8)
1213 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001214 if (defs & ArchDefineA2)
1215 Builder.defineMacro("_ARCH_A2");
1216 if (defs & ArchDefineA2q) {
1217 Builder.defineMacro("_ARCH_A2Q");
1218 Builder.defineMacro("_ARCH_QP");
1219 }
1220
1221 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1222 Builder.defineMacro("__bg__");
1223 Builder.defineMacro("__THW_BLUEGENE__");
1224 Builder.defineMacro("__bgq__");
1225 Builder.defineMacro("__TOS_BGQ__");
1226 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001227
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001228 if (HasVSX)
1229 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001230 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001231 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001232 if (HasP8Crypto)
1233 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001234 if (HasHTM)
1235 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001236
1237 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1238 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1239 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1240 if (PointerWidth == 64)
1241 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001242
Bill Schmidt38378a02013-02-01 20:23:10 +00001243 // FIXME: The following are not yet generated here by Clang, but are
1244 // generated by GCC:
1245 //
1246 // _SOFT_FLOAT_
1247 // __RECIP_PRECISION__
1248 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001249 // __RECIP__
1250 // __RECIPF__
1251 // __RSQRTE__
1252 // __RSQRTEF__
1253 // _SOFT_DOUBLE_
1254 // __NO_LWSYNC__
1255 // __HAVE_BSWAP__
1256 // __LONGDOUBLE128
1257 // __CMODEL_MEDIUM__
1258 // __CMODEL_LARGE__
1259 // _CALL_SYSV
1260 // _CALL_DARWIN
1261 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001262}
1263
Eric Christophera8a14c32015-08-31 18:39:16 +00001264// Handle explicit options being passed to the compiler here: if we've
1265// explicitly turned off vsx and turned on power8-vector or direct-move then
1266// go ahead and error since the customer has expressed a somewhat incompatible
1267// set of options.
1268static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001269 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001270
1271 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1272 FeaturesVec.end()) {
1273 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1274 FeaturesVec.end()) {
1275 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1276 << "-mno-vsx";
1277 return false;
1278 }
1279
1280 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1281 FeaturesVec.end()) {
1282 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1283 << "-mno-vsx";
1284 return false;
1285 }
1286 }
1287
1288 return true;
1289}
1290
Eric Christopher8c47b422015-10-09 18:39:55 +00001291bool PPCTargetInfo::initFeatureMap(
1292 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1293 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001294 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1295 .Case("7400", true)
1296 .Case("g4", true)
1297 .Case("7450", true)
1298 .Case("g4+", true)
1299 .Case("970", true)
1300 .Case("g5", true)
1301 .Case("pwr6", true)
1302 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001303 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001304 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001305 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001306 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001307
1308 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001309 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1310 .Case("ppc64le", true)
1311 .Case("pwr8", true)
1312 .Default(false);
1313 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1314 .Case("ppc64le", true)
1315 .Case("pwr8", true)
1316 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001317 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1318 .Case("ppc64le", true)
1319 .Case("pwr8", true)
1320 .Case("pwr7", true)
1321 .Default(false);
1322 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1323 .Case("ppc64le", true)
1324 .Case("pwr8", true)
1325 .Case("pwr7", true)
1326 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001327 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1328 .Case("ppc64le", true)
1329 .Case("pwr8", true)
1330 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001331 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1332 .Case("ppc64le", true)
1333 .Case("pwr8", true)
1334 .Case("pwr7", true)
1335 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001336
Eric Christophera8a14c32015-08-31 18:39:16 +00001337 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1338 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001339
Eric Christopher007b0a02015-08-28 22:32:01 +00001340 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001341}
1342
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001343bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001344 return llvm::StringSwitch<bool>(Feature)
1345 .Case("powerpc", true)
1346 .Case("vsx", HasVSX)
1347 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001348 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001349 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001350 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001351 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001352 .Case("bpermd", HasBPERMD)
1353 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001354 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001355}
Chris Lattner17df24e2008-04-21 18:56:49 +00001356
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001357void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1358 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001359 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1360 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1361 // incompatible options.
1362 if (Enabled) {
1363 if (Name == "vsx") {
1364 Features[Name] = true;
1365 } else if (Name == "direct-move") {
1366 Features[Name] = Features["vsx"] = true;
1367 } else if (Name == "power8-vector") {
1368 Features[Name] = Features["vsx"] = true;
1369 } else {
1370 Features[Name] = true;
1371 }
1372 } else {
1373 if (Name == "vsx") {
1374 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1375 false;
1376 } else {
1377 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001378 }
1379 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001380}
1381
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001382const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001383 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1384 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1385 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1386 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1387 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1388 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1389 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1390 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001391 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001392 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001393 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001394 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1395 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1396 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1397 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001398 "vrsave", "vscr",
1399 "spe_acc", "spefscr",
1400 "sfp"
1401};
Chris Lattner10a5b382007-01-29 05:24:35 +00001402
Craig Topperf054e3a2015-10-19 03:52:27 +00001403ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1404 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001405}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001406
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001407const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1408 // While some of these aliases do map to different registers
1409 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001410 { { "0" }, "r0" },
1411 { { "1"}, "r1" },
1412 { { "2" }, "r2" },
1413 { { "3" }, "r3" },
1414 { { "4" }, "r4" },
1415 { { "5" }, "r5" },
1416 { { "6" }, "r6" },
1417 { { "7" }, "r7" },
1418 { { "8" }, "r8" },
1419 { { "9" }, "r9" },
1420 { { "10" }, "r10" },
1421 { { "11" }, "r11" },
1422 { { "12" }, "r12" },
1423 { { "13" }, "r13" },
1424 { { "14" }, "r14" },
1425 { { "15" }, "r15" },
1426 { { "16" }, "r16" },
1427 { { "17" }, "r17" },
1428 { { "18" }, "r18" },
1429 { { "19" }, "r19" },
1430 { { "20" }, "r20" },
1431 { { "21" }, "r21" },
1432 { { "22" }, "r22" },
1433 { { "23" }, "r23" },
1434 { { "24" }, "r24" },
1435 { { "25" }, "r25" },
1436 { { "26" }, "r26" },
1437 { { "27" }, "r27" },
1438 { { "28" }, "r28" },
1439 { { "29" }, "r29" },
1440 { { "30" }, "r30" },
1441 { { "31" }, "r31" },
1442 { { "fr0" }, "f0" },
1443 { { "fr1" }, "f1" },
1444 { { "fr2" }, "f2" },
1445 { { "fr3" }, "f3" },
1446 { { "fr4" }, "f4" },
1447 { { "fr5" }, "f5" },
1448 { { "fr6" }, "f6" },
1449 { { "fr7" }, "f7" },
1450 { { "fr8" }, "f8" },
1451 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001452 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001453 { { "fr11" }, "f11" },
1454 { { "fr12" }, "f12" },
1455 { { "fr13" }, "f13" },
1456 { { "fr14" }, "f14" },
1457 { { "fr15" }, "f15" },
1458 { { "fr16" }, "f16" },
1459 { { "fr17" }, "f17" },
1460 { { "fr18" }, "f18" },
1461 { { "fr19" }, "f19" },
1462 { { "fr20" }, "f20" },
1463 { { "fr21" }, "f21" },
1464 { { "fr22" }, "f22" },
1465 { { "fr23" }, "f23" },
1466 { { "fr24" }, "f24" },
1467 { { "fr25" }, "f25" },
1468 { { "fr26" }, "f26" },
1469 { { "fr27" }, "f27" },
1470 { { "fr28" }, "f28" },
1471 { { "fr29" }, "f29" },
1472 { { "fr30" }, "f30" },
1473 { { "fr31" }, "f31" },
1474 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001475};
1476
Craig Topperf054e3a2015-10-19 03:52:27 +00001477ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1478 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001479}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001480
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001481class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001482public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001483 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001484 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001485
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001486 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001487 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001488 case llvm::Triple::FreeBSD:
1489 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001490 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001491 PtrDiffType = SignedInt;
1492 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001493 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001494 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001495 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001496 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001497
Roman Divacky3ffe7462012-03-13 19:20:17 +00001498 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1499 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001500 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001501 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001502
1503 // PPC32 supports atomics up to 4 bytes.
1504 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001505 }
1506
Craig Topper3164f332014-03-11 03:39:26 +00001507 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001508 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001509 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001510 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001511};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001512
Bill Schmidt778d3872013-07-26 01:36:11 +00001513// Note: ABI differences may eventually require us to have a separate
1514// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001515class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001516public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001517 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001518 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001519 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001520 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001521
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001522 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001523 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001524 ABI = "elfv2";
1525 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001526 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001527 ABI = "elfv1";
1528 }
1529
1530 switch (getTriple().getOS()) {
1531 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001532 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001533 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001534 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001535 case llvm::Triple::NetBSD:
1536 IntMaxType = SignedLongLong;
1537 Int64Type = SignedLongLong;
1538 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001539 default:
1540 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001541 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001542
1543 // PPC64 supports atomics up to 8 bytes.
1544 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001545 }
Craig Topper3164f332014-03-11 03:39:26 +00001546 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001547 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001548 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001549 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001550 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001551 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001552 ABI = Name;
1553 return true;
1554 }
1555 return false;
1556 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001558
Roman Divacky965b0b72011-01-06 08:27:10 +00001559class DarwinPPC32TargetInfo :
1560 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001561public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001562 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1563 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001564 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001565 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001566 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001567 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001568 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001569 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001570 }
Craig Topper3164f332014-03-11 03:39:26 +00001571 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001572 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001573 }
1574};
1575
1576class DarwinPPC64TargetInfo :
1577 public DarwinTargetInfo<PPC64TargetInfo> {
1578public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001579 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1580 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001581 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001582 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001583 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001584 }
1585};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001586
Eric Christopherc48497a2015-09-18 21:26:24 +00001587static const unsigned NVPTXAddrSpaceMap[] = {
1588 1, // opencl_global
1589 3, // opencl_local
1590 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001591 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001592 0, // opencl_generic
1593 1, // cuda_device
1594 4, // cuda_constant
1595 3, // cuda_shared
1596};
1597
1598class NVPTXTargetInfo : public TargetInfo {
1599 static const char *const GCCRegNames[];
1600 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001601
1602 // The GPU profiles supported by the NVPTX backend
1603 enum GPUKind {
1604 GK_NONE,
1605 GK_SM20,
1606 GK_SM21,
1607 GK_SM30,
1608 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001609 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001610 } GPU;
1611
Eric Christopherc48497a2015-09-18 21:26:24 +00001612public:
1613 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1614 BigEndian = false;
1615 TLSSupported = false;
1616 LongWidth = LongAlign = 64;
1617 AddrSpaceMap = &NVPTXAddrSpaceMap;
1618 UseAddrSpaceMapMangling = true;
1619 // Define available target features
1620 // These must be defined in sorted order!
1621 NoAsmVariants = true;
1622 // Set the default GPU to sm20
1623 GPU = GK_SM20;
1624 }
1625 void getTargetDefines(const LangOptions &Opts,
1626 MacroBuilder &Builder) const override {
1627 Builder.defineMacro("__PTX__");
1628 Builder.defineMacro("__NVPTX__");
1629 if (Opts.CUDAIsDevice) {
1630 // Set __CUDA_ARCH__ for the GPU specified.
1631 std::string CUDAArchCode;
1632 switch (GPU) {
1633 case GK_SM20:
1634 CUDAArchCode = "200";
1635 break;
1636 case GK_SM21:
1637 CUDAArchCode = "210";
1638 break;
1639 case GK_SM30:
1640 CUDAArchCode = "300";
1641 break;
1642 case GK_SM35:
1643 CUDAArchCode = "350";
1644 break;
1645 case GK_SM37:
1646 CUDAArchCode = "370";
1647 break;
1648 default:
1649 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001650 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001651 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001652 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001653 }
Craig Topper6c03a542015-10-19 04:51:35 +00001654 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1655 return llvm::makeArrayRef(BuiltinInfo,
1656 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001657 }
1658 bool hasFeature(StringRef Feature) const override {
1659 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001660 }
1661
Craig Topperf054e3a2015-10-19 03:52:27 +00001662 ArrayRef<const char *> getGCCRegNames() const override;
1663 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001664 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001665 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001666 }
1667 bool validateAsmConstraint(const char *&Name,
1668 TargetInfo::ConstraintInfo &Info) const override {
1669 switch (*Name) {
1670 default:
1671 return false;
1672 case 'c':
1673 case 'h':
1674 case 'r':
1675 case 'l':
1676 case 'f':
1677 case 'd':
1678 Info.setAllowsRegister();
1679 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001680 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001681 }
1682 const char *getClobbers() const override {
1683 // FIXME: Is this really right?
1684 return "";
1685 }
1686 BuiltinVaListKind getBuiltinVaListKind() const override {
1687 // FIXME: implement
1688 return TargetInfo::CharPtrBuiltinVaList;
1689 }
1690 bool setCPU(const std::string &Name) override {
1691 GPU = llvm::StringSwitch<GPUKind>(Name)
1692 .Case("sm_20", GK_SM20)
1693 .Case("sm_21", GK_SM21)
1694 .Case("sm_30", GK_SM30)
1695 .Case("sm_35", GK_SM35)
1696 .Case("sm_37", GK_SM37)
1697 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001698
Eric Christopherc48497a2015-09-18 21:26:24 +00001699 return GPU != GK_NONE;
1700 }
1701};
1702
1703const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1704#define BUILTIN(ID, TYPE, ATTRS) \
1705 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1706#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1707 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1708#include "clang/Basic/BuiltinsNVPTX.def"
1709};
1710
1711const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1712
Craig Topperf054e3a2015-10-19 03:52:27 +00001713ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1714 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001715}
1716
1717class NVPTX32TargetInfo : public NVPTXTargetInfo {
1718public:
1719 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001720 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001721 PointerWidth = PointerAlign = 32;
1722 SizeType = TargetInfo::UnsignedInt;
1723 PtrDiffType = TargetInfo::SignedInt;
1724 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001725 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001726 }
1727};
1728
1729class NVPTX64TargetInfo : public NVPTXTargetInfo {
1730public:
1731 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1732 PointerWidth = PointerAlign = 64;
1733 SizeType = TargetInfo::UnsignedLong;
1734 PtrDiffType = TargetInfo::SignedLong;
1735 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001736 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001737 }
1738};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001739
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001740static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001741 1, // opencl_global
1742 3, // opencl_local
1743 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001744 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001745 1, // cuda_device
1746 2, // cuda_constant
1747 3 // cuda_shared
1748};
1749
Tom Stellarda96344b2014-08-21 13:58:40 +00001750// If you edit the description strings, make sure you update
1751// getPointerWidthV().
1752
Craig Topper273dbc62015-10-18 05:29:26 +00001753static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001754 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1755 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001756
Craig Topper273dbc62015-10-18 05:29:26 +00001757static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001758 "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 +00001759 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1760 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001761
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001762class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001763 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001764 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001765
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001766 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001767 enum GPUKind {
1768 GK_NONE,
1769 GK_R600,
1770 GK_R600_DOUBLE_OPS,
1771 GK_R700,
1772 GK_R700_DOUBLE_OPS,
1773 GK_EVERGREEN,
1774 GK_EVERGREEN_DOUBLE_OPS,
1775 GK_NORTHERN_ISLANDS,
1776 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001777 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001778 GK_SEA_ISLANDS,
1779 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001780 } GPU;
1781
Jan Veselyeebeaea2015-05-04 19:53:36 +00001782 bool hasFP64:1;
1783 bool hasFMAF:1;
1784 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001785
Eli Friedmand13b41e2012-10-12 23:32:00 +00001786public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001787 AMDGPUTargetInfo(const llvm::Triple &Triple)
1788 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001789
1790 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001791 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001792 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001793 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001794 hasFMAF = true;
1795 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001796 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001797 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001798 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001799 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001800 hasFMAF = false;
1801 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001802 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001803 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001804 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001805 }
1806
Tom Stellarda96344b2014-08-21 13:58:40 +00001807 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1808 if (GPU <= GK_CAYMAN)
1809 return 32;
1810
1811 switch(AddrSpace) {
1812 default:
1813 return 64;
1814 case 0:
1815 case 3:
1816 case 5:
1817 return 32;
1818 }
1819 }
1820
Craig Topper3164f332014-03-11 03:39:26 +00001821 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001822 return "";
1823 }
1824
Craig Topperf054e3a2015-10-19 03:52:27 +00001825 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001826
Craig Topperf054e3a2015-10-19 03:52:27 +00001827 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1828 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001829 }
1830
Craig Topper3164f332014-03-11 03:39:26 +00001831 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001832 TargetInfo::ConstraintInfo &Info) const override {
1833 switch (*Name) {
1834 default: break;
1835 case 'v': // vgpr
1836 case 's': // sgpr
1837 Info.setAllowsRegister();
1838 return true;
1839 }
1840 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001841 }
1842
Craig Topper6c03a542015-10-19 04:51:35 +00001843 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1844 return llvm::makeArrayRef(BuiltinInfo,
1845 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001846 }
1847
Craig Topper3164f332014-03-11 03:39:26 +00001848 void getTargetDefines(const LangOptions &Opts,
1849 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001850 if (getTriple().getArch() == llvm::Triple::amdgcn)
1851 Builder.defineMacro("__AMDGCN__");
1852 else
1853 Builder.defineMacro("__R600__");
1854
Jan Veselyeebeaea2015-05-04 19:53:36 +00001855 if (hasFMAF)
1856 Builder.defineMacro("__HAS_FMAF__");
1857 if (hasLDEXPF)
1858 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001859 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001860 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001861 if (Opts.OpenCL) {
1862 if (GPU >= GK_NORTHERN_ISLANDS) {
1863 Builder.defineMacro("cl_khr_byte_addressable_store");
1864 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1865 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1866 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1867 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1868 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001869 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001870 }
1871
Craig Topper3164f332014-03-11 03:39:26 +00001872 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001873 return TargetInfo::CharPtrBuiltinVaList;
1874 }
1875
Craig Topper3164f332014-03-11 03:39:26 +00001876 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001877 GPU = llvm::StringSwitch<GPUKind>(Name)
1878 .Case("r600" , GK_R600)
1879 .Case("rv610", GK_R600)
1880 .Case("rv620", GK_R600)
1881 .Case("rv630", GK_R600)
1882 .Case("rv635", GK_R600)
1883 .Case("rs780", GK_R600)
1884 .Case("rs880", GK_R600)
1885 .Case("rv670", GK_R600_DOUBLE_OPS)
1886 .Case("rv710", GK_R700)
1887 .Case("rv730", GK_R700)
1888 .Case("rv740", GK_R700_DOUBLE_OPS)
1889 .Case("rv770", GK_R700_DOUBLE_OPS)
1890 .Case("palm", GK_EVERGREEN)
1891 .Case("cedar", GK_EVERGREEN)
1892 .Case("sumo", GK_EVERGREEN)
1893 .Case("sumo2", GK_EVERGREEN)
1894 .Case("redwood", GK_EVERGREEN)
1895 .Case("juniper", GK_EVERGREEN)
1896 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1897 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1898 .Case("barts", GK_NORTHERN_ISLANDS)
1899 .Case("turks", GK_NORTHERN_ISLANDS)
1900 .Case("caicos", GK_NORTHERN_ISLANDS)
1901 .Case("cayman", GK_CAYMAN)
1902 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001903 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001904 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1905 .Case("verde", GK_SOUTHERN_ISLANDS)
1906 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001907 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001908 .Case("bonaire", GK_SEA_ISLANDS)
1909 .Case("kabini", GK_SEA_ISLANDS)
1910 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001911 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001912 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001913 .Case("tonga", GK_VOLCANIC_ISLANDS)
1914 .Case("iceland", GK_VOLCANIC_ISLANDS)
1915 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00001916 .Case("fiji", GK_VOLCANIC_ISLANDS)
1917 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001918 .Default(GK_NONE);
1919
1920 if (GPU == GK_NONE) {
1921 return false;
1922 }
1923
1924 // Set the correct data layout
1925 switch (GPU) {
1926 case GK_NONE:
1927 case GK_R600:
1928 case GK_R700:
1929 case GK_EVERGREEN:
1930 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001931 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001932 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001933 hasFMAF = false;
1934 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001935 break;
1936 case GK_R600_DOUBLE_OPS:
1937 case GK_R700_DOUBLE_OPS:
1938 case GK_EVERGREEN_DOUBLE_OPS:
1939 case GK_CAYMAN:
Matt Arsenaultedc7c6b2016-03-30 21:32:37 +00001940 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001941 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001942 hasFMAF = true;
1943 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001944 break;
1945 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001946 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001947 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00001948 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00001949 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001950 hasFMAF = true;
1951 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001952 break;
1953 }
1954
1955 return true;
1956 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001957};
1958
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001959const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001960#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001961 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001962#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001963};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001964const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001965 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1966 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1967 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1968 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1969 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1970 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1971 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1972 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1973 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1974 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1975 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1976 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1977 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1978 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1979 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1980 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1981 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1982 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1983 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1984 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1985 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1986 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1987 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1988 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1989 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1990 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1991 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1992 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1993 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1994 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1995 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1996 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1997 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1998 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1999 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2000 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2001 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2002 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2003 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2004 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2005 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2006 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2007 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2008 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2009 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2010 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2011 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002012 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002013 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2014 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002015};
2016
Craig Topperf054e3a2015-10-19 03:52:27 +00002017ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2018 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002019}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002020
Eli Friedman3fd920a2008-08-20 02:34:37 +00002021// Namespace for x86 abstract base class
2022const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002023#define BUILTIN(ID, TYPE, ATTRS) \
2024 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002025#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002026 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002027#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002028 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002029#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002030};
Eli Friedmanb5366062008-05-20 14:21:01 +00002031
Nuno Lopescfca1f02009-12-23 17:49:57 +00002032static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002033 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2034 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002035 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002036 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2037 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2038 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002039 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002040 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2041 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002042 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2043 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2044 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2045 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2046 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2047 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2048 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2049 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002050};
2051
Eric Christophercdd36352011-06-21 00:05:20 +00002052const TargetInfo::AddlRegName AddlRegNames[] = {
2053 { { "al", "ah", "eax", "rax" }, 0 },
2054 { { "bl", "bh", "ebx", "rbx" }, 3 },
2055 { { "cl", "ch", "ecx", "rcx" }, 2 },
2056 { { "dl", "dh", "edx", "rdx" }, 1 },
2057 { { "esi", "rsi" }, 4 },
2058 { { "edi", "rdi" }, 5 },
2059 { { "esp", "rsp" }, 7 },
2060 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002061 { { "r8d", "r8w", "r8b" }, 38 },
2062 { { "r9d", "r9w", "r9b" }, 39 },
2063 { { "r10d", "r10w", "r10b" }, 40 },
2064 { { "r11d", "r11w", "r11b" }, 41 },
2065 { { "r12d", "r12w", "r12b" }, 42 },
2066 { { "r13d", "r13w", "r13b" }, 43 },
2067 { { "r14d", "r14w", "r14b" }, 44 },
2068 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002069};
2070
2071// X86 target abstract base class; x86-32 and x86-64 are very close, so
2072// most of the implementation can be shared.
2073class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002074 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002075 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002076 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002077 enum MMX3DNowEnum {
2078 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002079 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002080 enum XOPEnum {
2081 NoXOP,
2082 SSE4A,
2083 FMA4,
2084 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002085 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002086
Craig Topper543f3bd2015-10-14 23:47:57 +00002087 bool HasAES = false;
2088 bool HasPCLMUL = false;
2089 bool HasLZCNT = false;
2090 bool HasRDRND = false;
2091 bool HasFSGSBASE = false;
2092 bool HasBMI = false;
2093 bool HasBMI2 = false;
2094 bool HasPOPCNT = false;
2095 bool HasRTM = false;
2096 bool HasPRFCHW = false;
2097 bool HasRDSEED = false;
2098 bool HasADX = false;
2099 bool HasTBM = false;
2100 bool HasFMA = false;
2101 bool HasF16C = false;
2102 bool HasAVX512CD = false;
2103 bool HasAVX512ER = false;
2104 bool HasAVX512PF = false;
2105 bool HasAVX512DQ = false;
2106 bool HasAVX512BW = false;
2107 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002108 bool HasAVX512VBMI = false;
2109 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002110 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002111 bool HasMPX = false;
2112 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002113 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002114 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002115 bool HasXSAVE = false;
2116 bool HasXSAVEOPT = false;
2117 bool HasXSAVEC = false;
2118 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002119 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002120 bool HasCLFLUSHOPT = false;
2121 bool HasPCOMMIT = false;
2122 bool HasCLWB = false;
2123 bool HasUMIP = false;
2124 bool HasMOVBE = false;
2125 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002126
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002127 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2128 ///
2129 /// Each enumeration represents a particular CPU supported by Clang. These
2130 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2131 enum CPUKind {
2132 CK_Generic,
2133
2134 /// \name i386
2135 /// i386-generation processors.
2136 //@{
2137 CK_i386,
2138 //@}
2139
2140 /// \name i486
2141 /// i486-generation processors.
2142 //@{
2143 CK_i486,
2144 CK_WinChipC6,
2145 CK_WinChip2,
2146 CK_C3,
2147 //@}
2148
2149 /// \name i586
2150 /// i586-generation processors, P5 microarchitecture based.
2151 //@{
2152 CK_i586,
2153 CK_Pentium,
2154 CK_PentiumMMX,
2155 //@}
2156
2157 /// \name i686
2158 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2159 //@{
2160 CK_i686,
2161 CK_PentiumPro,
2162 CK_Pentium2,
2163 CK_Pentium3,
2164 CK_Pentium3M,
2165 CK_PentiumM,
2166 CK_C3_2,
2167
2168 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2169 /// Clang however has some logic to suport this.
2170 // FIXME: Warn, deprecate, and potentially remove this.
2171 CK_Yonah,
2172 //@}
2173
2174 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002175 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002176 //@{
2177 CK_Pentium4,
2178 CK_Pentium4M,
2179 CK_Prescott,
2180 CK_Nocona,
2181 //@}
2182
2183 /// \name Core
2184 /// Core microarchitecture based processors.
2185 //@{
2186 CK_Core2,
2187
2188 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2189 /// codename which GCC no longer accepts as an option to -march, but Clang
2190 /// has some logic for recognizing it.
2191 // FIXME: Warn, deprecate, and potentially remove this.
2192 CK_Penryn,
2193 //@}
2194
2195 /// \name Atom
2196 /// Atom processors
2197 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002198 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002199 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002200 //@}
2201
2202 /// \name Nehalem
2203 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002204 CK_Nehalem,
2205
2206 /// \name Westmere
2207 /// Westmere microarchitecture based processors.
2208 CK_Westmere,
2209
2210 /// \name Sandy Bridge
2211 /// Sandy Bridge microarchitecture based processors.
2212 CK_SandyBridge,
2213
2214 /// \name Ivy Bridge
2215 /// Ivy Bridge microarchitecture based processors.
2216 CK_IvyBridge,
2217
2218 /// \name Haswell
2219 /// Haswell microarchitecture based processors.
2220 CK_Haswell,
2221
2222 /// \name Broadwell
2223 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002224 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002225
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002226 /// \name Skylake Client
2227 /// Skylake client microarchitecture based processors.
2228 CK_SkylakeClient,
2229
2230 /// \name Skylake Server
2231 /// Skylake server microarchitecture based processors.
2232 CK_SkylakeServer,
2233
2234 /// \name Cannonlake Client
2235 /// Cannonlake client microarchitecture based processors.
2236 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002237
Craig Topper449314e2013-08-20 07:09:39 +00002238 /// \name Knights Landing
2239 /// Knights Landing processor.
2240 CK_KNL,
2241
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002242 /// \name K6
2243 /// K6 architecture processors.
2244 //@{
2245 CK_K6,
2246 CK_K6_2,
2247 CK_K6_3,
2248 //@}
2249
2250 /// \name K7
2251 /// K7 architecture processors.
2252 //@{
2253 CK_Athlon,
2254 CK_AthlonThunderbird,
2255 CK_Athlon4,
2256 CK_AthlonXP,
2257 CK_AthlonMP,
2258 //@}
2259
2260 /// \name K8
2261 /// K8 architecture processors.
2262 //@{
2263 CK_Athlon64,
2264 CK_Athlon64SSE3,
2265 CK_AthlonFX,
2266 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002267 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002268 CK_Opteron,
2269 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002270 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002271 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002272
Benjamin Kramer569f2152012-01-10 11:50:18 +00002273 /// \name Bobcat
2274 /// Bobcat architecture processors.
2275 //@{
2276 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002277 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002278 //@}
2279
2280 /// \name Bulldozer
2281 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002282 //@{
2283 CK_BDVER1,
2284 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002285 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002286 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002287 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002288
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002289 /// This specification is deprecated and will be removed in the future.
2290 /// Users should prefer \see CK_K8.
2291 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002292 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002293 CK_x86_64,
2294 //@}
2295
2296 /// \name Geode
2297 /// Geode processors.
2298 //@{
2299 CK_Geode
2300 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002301 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002302
Eric Christopherc50738f2015-08-27 00:05:50 +00002303 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002304 return llvm::StringSwitch<CPUKind>(CPU)
2305 .Case("i386", CK_i386)
2306 .Case("i486", CK_i486)
2307 .Case("winchip-c6", CK_WinChipC6)
2308 .Case("winchip2", CK_WinChip2)
2309 .Case("c3", CK_C3)
2310 .Case("i586", CK_i586)
2311 .Case("pentium", CK_Pentium)
2312 .Case("pentium-mmx", CK_PentiumMMX)
2313 .Case("i686", CK_i686)
2314 .Case("pentiumpro", CK_PentiumPro)
2315 .Case("pentium2", CK_Pentium2)
2316 .Case("pentium3", CK_Pentium3)
2317 .Case("pentium3m", CK_Pentium3M)
2318 .Case("pentium-m", CK_PentiumM)
2319 .Case("c3-2", CK_C3_2)
2320 .Case("yonah", CK_Yonah)
2321 .Case("pentium4", CK_Pentium4)
2322 .Case("pentium4m", CK_Pentium4M)
2323 .Case("prescott", CK_Prescott)
2324 .Case("nocona", CK_Nocona)
2325 .Case("core2", CK_Core2)
2326 .Case("penryn", CK_Penryn)
2327 .Case("bonnell", CK_Bonnell)
2328 .Case("atom", CK_Bonnell) // Legacy name.
2329 .Case("silvermont", CK_Silvermont)
2330 .Case("slm", CK_Silvermont) // Legacy name.
2331 .Case("nehalem", CK_Nehalem)
2332 .Case("corei7", CK_Nehalem) // Legacy name.
2333 .Case("westmere", CK_Westmere)
2334 .Case("sandybridge", CK_SandyBridge)
2335 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2336 .Case("ivybridge", CK_IvyBridge)
2337 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2338 .Case("haswell", CK_Haswell)
2339 .Case("core-avx2", CK_Haswell) // Legacy name.
2340 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002341 .Case("skylake", CK_SkylakeClient)
2342 .Case("skylake-avx512", CK_SkylakeServer)
2343 .Case("skx", CK_SkylakeServer) // Legacy name.
2344 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002345 .Case("knl", CK_KNL)
2346 .Case("k6", CK_K6)
2347 .Case("k6-2", CK_K6_2)
2348 .Case("k6-3", CK_K6_3)
2349 .Case("athlon", CK_Athlon)
2350 .Case("athlon-tbird", CK_AthlonThunderbird)
2351 .Case("athlon-4", CK_Athlon4)
2352 .Case("athlon-xp", CK_AthlonXP)
2353 .Case("athlon-mp", CK_AthlonMP)
2354 .Case("athlon64", CK_Athlon64)
2355 .Case("athlon64-sse3", CK_Athlon64SSE3)
2356 .Case("athlon-fx", CK_AthlonFX)
2357 .Case("k8", CK_K8)
2358 .Case("k8-sse3", CK_K8SSE3)
2359 .Case("opteron", CK_Opteron)
2360 .Case("opteron-sse3", CK_OpteronSSE3)
2361 .Case("barcelona", CK_AMDFAM10)
2362 .Case("amdfam10", CK_AMDFAM10)
2363 .Case("btver1", CK_BTVER1)
2364 .Case("btver2", CK_BTVER2)
2365 .Case("bdver1", CK_BDVER1)
2366 .Case("bdver2", CK_BDVER2)
2367 .Case("bdver3", CK_BDVER3)
2368 .Case("bdver4", CK_BDVER4)
2369 .Case("x86-64", CK_x86_64)
2370 .Case("geode", CK_Geode)
2371 .Default(CK_Generic);
2372 }
2373
Rafael Espindolaeb265472013-08-21 21:59:03 +00002374 enum FPMathKind {
2375 FP_Default,
2376 FP_SSE,
2377 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002378 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002379
Eli Friedman3fd920a2008-08-20 02:34:37 +00002380public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002381 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002382 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002383 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002384 }
Craig Topper3164f332014-03-11 03:39:26 +00002385 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002386 // X87 evaluates with 80 bits "long double" precision.
2387 return SSELevel == NoSSE ? 2 : 0;
2388 }
Craig Topper6c03a542015-10-19 04:51:35 +00002389 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2390 return llvm::makeArrayRef(BuiltinInfo,
2391 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002392 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002393 ArrayRef<const char *> getGCCRegNames() const override {
2394 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002395 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002396 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2397 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002398 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002399 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2400 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002401 }
Eric Christopherd9832702015-06-29 21:00:05 +00002402 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002403 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002404 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002405
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002406 bool validateGlobalRegisterVariable(StringRef RegName,
2407 unsigned RegSize,
2408 bool &HasSizeMismatch) const override {
2409 // esp and ebp are the only 32-bit registers the x86 backend can currently
2410 // handle.
2411 if (RegName.equals("esp") || RegName.equals("ebp")) {
2412 // Check that the register size is 32-bit.
2413 HasSizeMismatch = RegSize != 32;
2414 return true;
2415 }
2416
2417 return false;
2418 }
2419
Akira Hatanaka974131e2014-09-18 18:17:18 +00002420 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2421
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002422 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2423
Akira Hatanaka974131e2014-09-18 18:17:18 +00002424 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2425
Craig Topper3164f332014-03-11 03:39:26 +00002426 std::string convertConstraint(const char *&Constraint) const override;
2427 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002428 return "~{dirflag},~{fpsr},~{flags}";
2429 }
Craig Topper3164f332014-03-11 03:39:26 +00002430 void getTargetDefines(const LangOptions &Opts,
2431 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002432 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2433 bool Enabled);
2434 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2435 bool Enabled);
2436 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2437 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002438 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2439 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002440 setFeatureEnabledImpl(Features, Name, Enabled);
2441 }
2442 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002443 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002444 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2445 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002446 bool
2447 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2448 StringRef CPU,
2449 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002450 bool hasFeature(StringRef Feature) const override;
2451 bool handleTargetFeatures(std::vector<std::string> &Features,
2452 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002453 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002454 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2455 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002456 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002457 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002458 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002459 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002460 return "no-mmx";
2461 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002462 }
Craig Topper3164f332014-03-11 03:39:26 +00002463 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002464 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002465
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002466 // Perform any per-CPU checks necessary to determine if this CPU is
2467 // acceptable.
2468 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2469 // invalid without explaining *why*.
2470 switch (CPU) {
2471 case CK_Generic:
2472 // No processor selected!
2473 return false;
2474
2475 case CK_i386:
2476 case CK_i486:
2477 case CK_WinChipC6:
2478 case CK_WinChip2:
2479 case CK_C3:
2480 case CK_i586:
2481 case CK_Pentium:
2482 case CK_PentiumMMX:
2483 case CK_i686:
2484 case CK_PentiumPro:
2485 case CK_Pentium2:
2486 case CK_Pentium3:
2487 case CK_Pentium3M:
2488 case CK_PentiumM:
2489 case CK_Yonah:
2490 case CK_C3_2:
2491 case CK_Pentium4:
2492 case CK_Pentium4M:
2493 case CK_Prescott:
2494 case CK_K6:
2495 case CK_K6_2:
2496 case CK_K6_3:
2497 case CK_Athlon:
2498 case CK_AthlonThunderbird:
2499 case CK_Athlon4:
2500 case CK_AthlonXP:
2501 case CK_AthlonMP:
2502 case CK_Geode:
2503 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002504 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002505 return false;
2506
2507 // Fallthrough
2508 case CK_Nocona:
2509 case CK_Core2:
2510 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002511 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002512 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002513 case CK_Nehalem:
2514 case CK_Westmere:
2515 case CK_SandyBridge:
2516 case CK_IvyBridge:
2517 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002518 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002519 case CK_SkylakeClient:
2520 case CK_SkylakeServer:
2521 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002522 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002523 case CK_Athlon64:
2524 case CK_Athlon64SSE3:
2525 case CK_AthlonFX:
2526 case CK_K8:
2527 case CK_K8SSE3:
2528 case CK_Opteron:
2529 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002530 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002531 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002532 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002533 case CK_BDVER1:
2534 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002535 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002536 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002537 case CK_x86_64:
2538 return true;
2539 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002540 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002541 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002542
Craig Topper3164f332014-03-11 03:39:26 +00002543 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002544
Craig Topper3164f332014-03-11 03:39:26 +00002545 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002546 // Most of the non-ARM calling conventions are i386 conventions.
2547 switch (CC) {
2548 case CC_X86ThisCall:
2549 case CC_X86FastCall:
2550 case CC_X86StdCall:
2551 case CC_X86VectorCall:
2552 case CC_C:
2553 case CC_Swift:
2554 case CC_X86Pascal:
2555 case CC_IntelOclBicc:
2556 return CCCR_OK;
2557 default:
2558 return CCCR_Warning;
2559 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002560 }
2561
Craig Topper3164f332014-03-11 03:39:26 +00002562 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002563 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002564 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002565
2566 bool hasSjLjLowering() const override {
2567 return true;
2568 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002569};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002570
Rafael Espindolaeb265472013-08-21 21:59:03 +00002571bool X86TargetInfo::setFPMath(StringRef Name) {
2572 if (Name == "387") {
2573 FPMath = FP_387;
2574 return true;
2575 }
2576 if (Name == "sse") {
2577 FPMath = FP_SSE;
2578 return true;
2579 }
2580 return false;
2581}
2582
Eric Christopher007b0a02015-08-28 22:32:01 +00002583bool X86TargetInfo::initFeatureMap(
2584 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002585 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002586 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002587 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002588 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002589 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002590
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002591 // Enable X87 for all X86 processors.
2592 setFeatureEnabledImpl(Features, "x87", true);
2593
Eric Christopher2b4a7252015-08-27 00:05:52 +00002594 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002595 case CK_Generic:
2596 case CK_i386:
2597 case CK_i486:
2598 case CK_i586:
2599 case CK_Pentium:
2600 case CK_i686:
2601 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002602 break;
2603 case CK_PentiumMMX:
2604 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002605 case CK_K6:
2606 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002607 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002608 break;
2609 case CK_Pentium3:
2610 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002611 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002612 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002613 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002614 break;
2615 case CK_PentiumM:
2616 case CK_Pentium4:
2617 case CK_Pentium4M:
2618 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002619 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002620 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002621 break;
2622 case CK_Yonah:
2623 case CK_Prescott:
2624 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002625 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002626 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002627 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002628 break;
2629 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002630 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002631 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002632 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002633 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002634 break;
2635 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002636 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002637 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002638 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002639 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002640 case CK_Cannonlake:
2641 setFeatureEnabledImpl(Features, "avx512ifma", true);
2642 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2643 setFeatureEnabledImpl(Features, "sha", true);
2644 setFeatureEnabledImpl(Features, "umip", true);
2645 // FALLTHROUGH
2646 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002647 setFeatureEnabledImpl(Features, "avx512f", true);
2648 setFeatureEnabledImpl(Features, "avx512cd", true);
2649 setFeatureEnabledImpl(Features, "avx512dq", true);
2650 setFeatureEnabledImpl(Features, "avx512bw", true);
2651 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002652 setFeatureEnabledImpl(Features, "pku", true);
2653 setFeatureEnabledImpl(Features, "pcommit", true);
2654 setFeatureEnabledImpl(Features, "clwb", true);
2655 // FALLTHROUGH
2656 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002657 setFeatureEnabledImpl(Features, "xsavec", true);
2658 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002659 setFeatureEnabledImpl(Features, "mpx", true);
2660 setFeatureEnabledImpl(Features, "sgx", true);
2661 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002662 // FALLTHROUGH
2663 case CK_Broadwell:
2664 setFeatureEnabledImpl(Features, "rdseed", true);
2665 setFeatureEnabledImpl(Features, "adx", true);
2666 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002667 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002668 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002669 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002670 setFeatureEnabledImpl(Features, "bmi", true);
2671 setFeatureEnabledImpl(Features, "bmi2", true);
2672 setFeatureEnabledImpl(Features, "rtm", true);
2673 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002674 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002675 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002676 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002677 setFeatureEnabledImpl(Features, "rdrnd", true);
2678 setFeatureEnabledImpl(Features, "f16c", true);
2679 setFeatureEnabledImpl(Features, "fsgsbase", true);
2680 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002681 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002682 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002683 setFeatureEnabledImpl(Features, "xsave", true);
2684 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002685 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002686 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002687 case CK_Silvermont:
2688 setFeatureEnabledImpl(Features, "aes", true);
2689 setFeatureEnabledImpl(Features, "pclmul", true);
2690 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002691 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002692 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002693 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002694 setFeatureEnabledImpl(Features, "cx16", true);
2695 break;
2696 case CK_KNL:
2697 setFeatureEnabledImpl(Features, "avx512f", true);
2698 setFeatureEnabledImpl(Features, "avx512cd", true);
2699 setFeatureEnabledImpl(Features, "avx512er", true);
2700 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002701 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002702 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002703 setFeatureEnabledImpl(Features, "rdseed", true);
2704 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002705 setFeatureEnabledImpl(Features, "lzcnt", true);
2706 setFeatureEnabledImpl(Features, "bmi", true);
2707 setFeatureEnabledImpl(Features, "bmi2", true);
2708 setFeatureEnabledImpl(Features, "rtm", true);
2709 setFeatureEnabledImpl(Features, "fma", true);
2710 setFeatureEnabledImpl(Features, "rdrnd", true);
2711 setFeatureEnabledImpl(Features, "f16c", true);
2712 setFeatureEnabledImpl(Features, "fsgsbase", true);
2713 setFeatureEnabledImpl(Features, "aes", true);
2714 setFeatureEnabledImpl(Features, "pclmul", true);
2715 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002716 setFeatureEnabledImpl(Features, "xsaveopt", true);
2717 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002718 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002719 break;
2720 case CK_K6_2:
2721 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002722 case CK_WinChip2:
2723 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002724 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002725 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002726 case CK_Athlon:
2727 case CK_AthlonThunderbird:
2728 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002729 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002730 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002731 case CK_Athlon4:
2732 case CK_AthlonXP:
2733 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002734 setFeatureEnabledImpl(Features, "sse", true);
2735 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002736 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002737 break;
2738 case CK_K8:
2739 case CK_Opteron:
2740 case CK_Athlon64:
2741 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002742 setFeatureEnabledImpl(Features, "sse2", true);
2743 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002744 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002745 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002746 case CK_AMDFAM10:
2747 setFeatureEnabledImpl(Features, "sse4a", true);
2748 setFeatureEnabledImpl(Features, "lzcnt", true);
2749 setFeatureEnabledImpl(Features, "popcnt", true);
2750 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002751 case CK_K8SSE3:
2752 case CK_OpteronSSE3:
2753 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002754 setFeatureEnabledImpl(Features, "sse3", true);
2755 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002756 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002757 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002758 case CK_BTVER2:
2759 setFeatureEnabledImpl(Features, "avx", true);
2760 setFeatureEnabledImpl(Features, "aes", true);
2761 setFeatureEnabledImpl(Features, "pclmul", true);
2762 setFeatureEnabledImpl(Features, "bmi", true);
2763 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002764 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002765 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002766 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002767 setFeatureEnabledImpl(Features, "ssse3", true);
2768 setFeatureEnabledImpl(Features, "sse4a", true);
2769 setFeatureEnabledImpl(Features, "lzcnt", true);
2770 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002771 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002772 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002773 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002774 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002775 case CK_BDVER4:
2776 setFeatureEnabledImpl(Features, "avx2", true);
2777 setFeatureEnabledImpl(Features, "bmi2", true);
2778 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002779 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002780 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002781 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002782 // FALLTHROUGH
2783 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002784 setFeatureEnabledImpl(Features, "bmi", true);
2785 setFeatureEnabledImpl(Features, "fma", true);
2786 setFeatureEnabledImpl(Features, "f16c", true);
2787 setFeatureEnabledImpl(Features, "tbm", true);
2788 // FALLTHROUGH
2789 case CK_BDVER1:
2790 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002791 setFeatureEnabledImpl(Features, "xop", true);
2792 setFeatureEnabledImpl(Features, "lzcnt", true);
2793 setFeatureEnabledImpl(Features, "aes", true);
2794 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002795 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002796 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002797 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002798 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002799 break;
Eli Friedman33465822011-07-08 23:31:17 +00002800 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002801 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2802 return false;
2803
2804 // Can't do this earlier because we need to be able to explicitly enable
2805 // or disable these features and the things that they depend upon.
2806
2807 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2808 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002809 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002810 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2811 FeaturesVec.end())
2812 Features["popcnt"] = true;
2813
2814 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2815 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002816 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002817 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2818 FeaturesVec.end())
2819 Features["prfchw"] = true;
2820
Eric Christophera7260af2015-10-08 20:10:18 +00002821 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2822 // then enable MMX.
2823 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002824 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002825 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2826 FeaturesVec.end())
2827 Features["mmx"] = true;
2828
Eric Christopherbbd746d2015-10-08 20:10:14 +00002829 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002830}
2831
Rafael Espindolae62e2792013-08-20 13:44:29 +00002832void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002833 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002834 if (Enabled) {
2835 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002836 case AVX512F:
2837 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002838 case AVX2:
2839 Features["avx2"] = true;
2840 case AVX:
2841 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002842 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002843 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002844 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002845 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002846 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002847 case SSSE3:
2848 Features["ssse3"] = true;
2849 case SSE3:
2850 Features["sse3"] = true;
2851 case SSE2:
2852 Features["sse2"] = true;
2853 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002854 Features["sse"] = true;
2855 case NoSSE:
2856 break;
2857 }
2858 return;
2859 }
2860
2861 switch (Level) {
2862 case NoSSE:
2863 case SSE1:
2864 Features["sse"] = false;
2865 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002866 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2867 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002868 case SSE3:
2869 Features["sse3"] = false;
2870 setXOPLevel(Features, NoXOP, false);
2871 case SSSE3:
2872 Features["ssse3"] = false;
2873 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002874 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002875 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002876 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002877 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002878 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2879 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002880 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002881 case AVX2:
2882 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002883 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002884 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002885 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00002886 Features["avx512vl"] = Features["avx512vbmi"] =
2887 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002888 }
2889}
2890
2891void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002892 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002893 if (Enabled) {
2894 switch (Level) {
2895 case AMD3DNowAthlon:
2896 Features["3dnowa"] = true;
2897 case AMD3DNow:
2898 Features["3dnow"] = true;
2899 case MMX:
2900 Features["mmx"] = true;
2901 case NoMMX3DNow:
2902 break;
2903 }
2904 return;
2905 }
2906
2907 switch (Level) {
2908 case NoMMX3DNow:
2909 case MMX:
2910 Features["mmx"] = false;
2911 case AMD3DNow:
2912 Features["3dnow"] = false;
2913 case AMD3DNowAthlon:
2914 Features["3dnowa"] = false;
2915 }
2916}
2917
2918void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002919 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002920 if (Enabled) {
2921 switch (Level) {
2922 case XOP:
2923 Features["xop"] = true;
2924 case FMA4:
2925 Features["fma4"] = true;
2926 setSSELevel(Features, AVX, true);
2927 case SSE4A:
2928 Features["sse4a"] = true;
2929 setSSELevel(Features, SSE3, true);
2930 case NoXOP:
2931 break;
2932 }
2933 return;
2934 }
2935
2936 switch (Level) {
2937 case NoXOP:
2938 case SSE4A:
2939 Features["sse4a"] = false;
2940 case FMA4:
2941 Features["fma4"] = false;
2942 case XOP:
2943 Features["xop"] = false;
2944 }
2945}
2946
Craig Topper86d79ef2013-09-17 04:51:29 +00002947void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2948 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002949 // This is a bit of a hack to deal with the sse4 target feature when used
2950 // as part of the target attribute. We handle sse4 correctly everywhere
2951 // else. See below for more information on how we handle the sse4 options.
2952 if (Name != "sse4")
2953 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002954
Craig Topper29561122013-09-19 01:13:07 +00002955 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002956 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002957 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002958 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002959 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002960 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002961 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002962 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002963 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002964 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002965 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002966 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002967 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002968 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002969 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002970 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002971 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002972 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002973 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002974 if (Enabled)
2975 setSSELevel(Features, SSE2, Enabled);
2976 } else if (Name == "pclmul") {
2977 if (Enabled)
2978 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002979 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002980 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002981 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002982 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002983 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002984 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00002985 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
2986 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
2987 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00002988 if (Enabled)
2989 setSSELevel(Features, AVX512F, Enabled);
2990 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002991 if (Enabled)
2992 setSSELevel(Features, AVX, Enabled);
2993 } else if (Name == "fma4") {
2994 setXOPLevel(Features, FMA4, Enabled);
2995 } else if (Name == "xop") {
2996 setXOPLevel(Features, XOP, Enabled);
2997 } else if (Name == "sse4a") {
2998 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002999 } else if (Name == "f16c") {
3000 if (Enabled)
3001 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003002 } else if (Name == "sha") {
3003 if (Enabled)
3004 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003005 } else if (Name == "sse4") {
3006 // We can get here via the __target__ attribute since that's not controlled
3007 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3008 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3009 // disabled.
3010 if (Enabled)
3011 setSSELevel(Features, SSE42, Enabled);
3012 else
3013 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003014 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003015 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003016 Features["xsaveopt"] = false;
3017 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003018 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003019 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003020 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003021}
3022
Eric Christopher3ff21b32013-10-16 21:26:26 +00003023/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003024/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003025bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003026 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003027 for (const auto &Feature : Features) {
3028 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003029 continue;
3030
Eric Christopher610fe112015-08-26 08:21:55 +00003031 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003032 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003033 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003034 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003035 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003036 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003037 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003038 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003039 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003040 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003041 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003042 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003043 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003044 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003045 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003046 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003047 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003048 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003049 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003050 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003051 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003052 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003053 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003054 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003055 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003056 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003057 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003058 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003059 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003060 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003061 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003062 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003063 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003064 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003065 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003066 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003067 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003068 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003069 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003070 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003071 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003072 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003073 } else if (Feature == "+avx512vbmi") {
3074 HasAVX512VBMI = true;
3075 } else if (Feature == "+avx512ifma") {
3076 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003077 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003078 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003079 } else if (Feature == "+mpx") {
3080 HasMPX = true;
3081 } else if (Feature == "+movbe") {
3082 HasMOVBE = true;
3083 } else if (Feature == "+sgx") {
3084 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003085 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003086 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003087 } else if (Feature == "+fxsr") {
3088 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003089 } else if (Feature == "+xsave") {
3090 HasXSAVE = true;
3091 } else if (Feature == "+xsaveopt") {
3092 HasXSAVEOPT = true;
3093 } else if (Feature == "+xsavec") {
3094 HasXSAVEC = true;
3095 } else if (Feature == "+xsaves") {
3096 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003097 } else if (Feature == "+pku") {
3098 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003099 } else if (Feature == "+clflushopt") {
3100 HasCLFLUSHOPT = true;
3101 } else if (Feature == "+pcommit") {
3102 HasPCOMMIT = true;
3103 } else if (Feature == "+clwb") {
3104 HasCLWB = true;
3105 } else if (Feature == "+umip") {
3106 HasUMIP = true;
3107 } else if (Feature == "+prefetchwt1") {
3108 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003109 }
3110
Benjamin Kramer27402c62012-03-05 15:10:44 +00003111 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003112 .Case("+avx512f", AVX512F)
3113 .Case("+avx2", AVX2)
3114 .Case("+avx", AVX)
3115 .Case("+sse4.2", SSE42)
3116 .Case("+sse4.1", SSE41)
3117 .Case("+ssse3", SSSE3)
3118 .Case("+sse3", SSE3)
3119 .Case("+sse2", SSE2)
3120 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003121 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003122 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003123
Eli Friedman33465822011-07-08 23:31:17 +00003124 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003125 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003126 .Case("+3dnowa", AMD3DNowAthlon)
3127 .Case("+3dnow", AMD3DNow)
3128 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003129 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003130 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003131
3132 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003133 .Case("+xop", XOP)
3134 .Case("+fma4", FMA4)
3135 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003136 .Default(NoXOP);
3137 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003138 }
Eli Friedman33465822011-07-08 23:31:17 +00003139
Rafael Espindolaeb265472013-08-21 21:59:03 +00003140 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3141 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003142 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3143 (FPMath == FP_387 && SSELevel >= SSE1)) {
3144 Diags.Report(diag::err_target_unsupported_fpmath) <<
3145 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003146 return false;
3147 }
3148
Alexey Bataev00396512015-07-02 03:40:19 +00003149 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003150 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003151 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003152}
Chris Lattnerecd49032009-03-02 22:27:17 +00003153
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003154/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3155/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003156void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003157 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003158 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003159 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003160 Builder.defineMacro("__amd64__");
3161 Builder.defineMacro("__amd64");
3162 Builder.defineMacro("__x86_64");
3163 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003164 if (getTriple().getArchName() == "x86_64h") {
3165 Builder.defineMacro("__x86_64h");
3166 Builder.defineMacro("__x86_64h__");
3167 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003168 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003169 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003170 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003171
Chris Lattnerecd49032009-03-02 22:27:17 +00003172 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003173 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3174 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003175 switch (CPU) {
3176 case CK_Generic:
3177 break;
3178 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003179 // The rest are coming from the i386 define above.
3180 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003181 break;
3182 case CK_i486:
3183 case CK_WinChipC6:
3184 case CK_WinChip2:
3185 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003186 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003187 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003188 case CK_PentiumMMX:
3189 Builder.defineMacro("__pentium_mmx__");
3190 Builder.defineMacro("__tune_pentium_mmx__");
3191 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003192 case CK_i586:
3193 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003194 defineCPUMacros(Builder, "i586");
3195 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003196 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003197 case CK_Pentium3:
3198 case CK_Pentium3M:
3199 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003200 Builder.defineMacro("__tune_pentium3__");
3201 // Fallthrough
3202 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003203 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003204 Builder.defineMacro("__tune_pentium2__");
3205 // Fallthrough
3206 case CK_PentiumPro:
3207 Builder.defineMacro("__tune_i686__");
3208 Builder.defineMacro("__tune_pentiumpro__");
3209 // Fallthrough
3210 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003211 Builder.defineMacro("__i686");
3212 Builder.defineMacro("__i686__");
3213 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3214 Builder.defineMacro("__pentiumpro");
3215 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003216 break;
3217 case CK_Pentium4:
3218 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003219 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003220 break;
3221 case CK_Yonah:
3222 case CK_Prescott:
3223 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003224 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003225 break;
3226 case CK_Core2:
3227 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003228 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003229 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003230 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003231 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003232 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003233 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003234 defineCPUMacros(Builder, "slm");
3235 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003236 case CK_Nehalem:
3237 case CK_Westmere:
3238 case CK_SandyBridge:
3239 case CK_IvyBridge:
3240 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003241 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003242 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003243 // FIXME: Historically, we defined this legacy name, it would be nice to
3244 // remove it at some point. We've never exposed fine-grained names for
3245 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003246 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003247 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003248 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003249 defineCPUMacros(Builder, "skx");
3250 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003251 case CK_Cannonlake:
3252 break;
Craig Topper449314e2013-08-20 07:09:39 +00003253 case CK_KNL:
3254 defineCPUMacros(Builder, "knl");
3255 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003256 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003257 Builder.defineMacro("__k6_2__");
3258 Builder.defineMacro("__tune_k6_2__");
3259 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003260 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003261 if (CPU != CK_K6_2) { // In case of fallthrough
3262 // FIXME: GCC may be enabling these in cases where some other k6
3263 // architecture is specified but -m3dnow is explicitly provided. The
3264 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003265 Builder.defineMacro("__k6_3__");
3266 Builder.defineMacro("__tune_k6_3__");
3267 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003268 // Fallthrough
3269 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003270 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003271 break;
3272 case CK_Athlon:
3273 case CK_AthlonThunderbird:
3274 case CK_Athlon4:
3275 case CK_AthlonXP:
3276 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003277 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003278 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003279 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003280 Builder.defineMacro("__tune_athlon_sse__");
3281 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003282 break;
3283 case CK_K8:
3284 case CK_K8SSE3:
3285 case CK_x86_64:
3286 case CK_Opteron:
3287 case CK_OpteronSSE3:
3288 case CK_Athlon64:
3289 case CK_Athlon64SSE3:
3290 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003291 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003292 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003293 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003294 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003295 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003296 case CK_BTVER1:
3297 defineCPUMacros(Builder, "btver1");
3298 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003299 case CK_BTVER2:
3300 defineCPUMacros(Builder, "btver2");
3301 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003302 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003303 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003304 break;
3305 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003306 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003307 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003308 case CK_BDVER3:
3309 defineCPUMacros(Builder, "bdver3");
3310 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003311 case CK_BDVER4:
3312 defineCPUMacros(Builder, "bdver4");
3313 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003314 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003315 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003316 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003317 }
Chris Lattner96e43572009-03-02 22:40:39 +00003318
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003319 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003320 Builder.defineMacro("__REGISTER_PREFIX__", "");
3321
Chris Lattner6df41af2009-04-19 17:32:33 +00003322 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3323 // functions in glibc header files that use FP Stack inline asm which the
3324 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003325 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003326
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003327 if (HasAES)
3328 Builder.defineMacro("__AES__");
3329
Craig Topper3f122a72012-05-31 05:18:48 +00003330 if (HasPCLMUL)
3331 Builder.defineMacro("__PCLMUL__");
3332
Craig Topper22967d42011-12-25 05:06:45 +00003333 if (HasLZCNT)
3334 Builder.defineMacro("__LZCNT__");
3335
Benjamin Kramer1e250392012-07-07 09:39:18 +00003336 if (HasRDRND)
3337 Builder.defineMacro("__RDRND__");
3338
Craig Topper8c7f2512014-11-03 06:51:41 +00003339 if (HasFSGSBASE)
3340 Builder.defineMacro("__FSGSBASE__");
3341
Craig Topper22967d42011-12-25 05:06:45 +00003342 if (HasBMI)
3343 Builder.defineMacro("__BMI__");
3344
3345 if (HasBMI2)
3346 Builder.defineMacro("__BMI2__");
3347
Craig Topper1de83482011-12-29 16:10:46 +00003348 if (HasPOPCNT)
3349 Builder.defineMacro("__POPCNT__");
3350
Michael Liao625a8752012-11-10 05:17:46 +00003351 if (HasRTM)
3352 Builder.defineMacro("__RTM__");
3353
Michael Liao74f4eaf2013-03-26 17:52:08 +00003354 if (HasPRFCHW)
3355 Builder.defineMacro("__PRFCHW__");
3356
Michael Liaoffaae352013-03-29 05:17:55 +00003357 if (HasRDSEED)
3358 Builder.defineMacro("__RDSEED__");
3359
Robert Khasanov50e6f582014-09-19 09:53:48 +00003360 if (HasADX)
3361 Builder.defineMacro("__ADX__");
3362
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003363 if (HasTBM)
3364 Builder.defineMacro("__TBM__");
3365
Rafael Espindolae62e2792013-08-20 13:44:29 +00003366 switch (XOPLevel) {
3367 case XOP:
3368 Builder.defineMacro("__XOP__");
3369 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003370 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003371 case SSE4A:
3372 Builder.defineMacro("__SSE4A__");
3373 case NoXOP:
3374 break;
3375 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003376
Craig Topperbba778b2012-06-03 21:46:30 +00003377 if (HasFMA)
3378 Builder.defineMacro("__FMA__");
3379
Manman Rena45358c2012-10-11 00:59:55 +00003380 if (HasF16C)
3381 Builder.defineMacro("__F16C__");
3382
Craig Topper679b53a2013-08-21 05:29:10 +00003383 if (HasAVX512CD)
3384 Builder.defineMacro("__AVX512CD__");
3385 if (HasAVX512ER)
3386 Builder.defineMacro("__AVX512ER__");
3387 if (HasAVX512PF)
3388 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003389 if (HasAVX512DQ)
3390 Builder.defineMacro("__AVX512DQ__");
3391 if (HasAVX512BW)
3392 Builder.defineMacro("__AVX512BW__");
3393 if (HasAVX512VL)
3394 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003395 if (HasAVX512VBMI)
3396 Builder.defineMacro("__AVX512VBMI__");
3397 if (HasAVX512IFMA)
3398 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003399
Ben Langmuir58078d02013-09-19 13:22:04 +00003400 if (HasSHA)
3401 Builder.defineMacro("__SHA__");
3402
Craig Toppere33f51f2015-10-16 06:22:36 +00003403 if (HasFXSR)
3404 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003405 if (HasXSAVE)
3406 Builder.defineMacro("__XSAVE__");
3407 if (HasXSAVEOPT)
3408 Builder.defineMacro("__XSAVEOPT__");
3409 if (HasXSAVEC)
3410 Builder.defineMacro("__XSAVEC__");
3411 if (HasXSAVES)
3412 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003413 if (HasPKU)
3414 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003415 if (HasCX16)
3416 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3417
Chris Lattner96e43572009-03-02 22:40:39 +00003418 // Each case falls through to the previous one here.
3419 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003420 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003421 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003422 case AVX2:
3423 Builder.defineMacro("__AVX2__");
3424 case AVX:
3425 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003426 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003427 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003428 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003429 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003430 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003431 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003432 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003433 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003434 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003435 Builder.defineMacro("__SSE2__");
3436 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003437 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003438 Builder.defineMacro("__SSE__");
3439 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003440 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003441 break;
3442 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003443
Derek Schuffc7dd7222012-10-11 15:52:22 +00003444 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003445 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003446 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003447 case AVX2:
3448 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003449 case SSE42:
3450 case SSE41:
3451 case SSSE3:
3452 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003453 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003454 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003455 break;
3456 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003457 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003458 break;
3459 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003460 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003461 }
3462 }
3463
Anders Carlssone437c682010-01-27 03:47:49 +00003464 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003465 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003466 case AMD3DNowAthlon:
3467 Builder.defineMacro("__3dNOW_A__");
3468 case AMD3DNow:
3469 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003470 case MMX:
3471 Builder.defineMacro("__MMX__");
3472 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003473 break;
3474 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003475
3476 if (CPU >= CK_i486) {
3477 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3478 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3479 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3480 }
3481 if (CPU >= CK_i586)
3482 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003483}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003484
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003485bool X86TargetInfo::hasFeature(StringRef Feature) const {
3486 return llvm::StringSwitch<bool>(Feature)
3487 .Case("aes", HasAES)
3488 .Case("avx", SSELevel >= AVX)
3489 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003490 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003491 .Case("avx512cd", HasAVX512CD)
3492 .Case("avx512er", HasAVX512ER)
3493 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003494 .Case("avx512dq", HasAVX512DQ)
3495 .Case("avx512bw", HasAVX512BW)
3496 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003497 .Case("avx512vbmi", HasAVX512VBMI)
3498 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003499 .Case("bmi", HasBMI)
3500 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003501 .Case("clflushopt", HasCLFLUSHOPT)
3502 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003503 .Case("cx16", HasCX16)
3504 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003505 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003506 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003507 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003508 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003509 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003510 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3511 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3512 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003513 .Case("movbe", HasMOVBE)
3514 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003515 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003516 .Case("pcommit", HasPCOMMIT)
3517 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003518 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003519 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003520 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003521 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003522 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003523 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003524 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003525 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003526 .Case("sse", SSELevel >= SSE1)
3527 .Case("sse2", SSELevel >= SSE2)
3528 .Case("sse3", SSELevel >= SSE3)
3529 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003530 .Case("sse4.1", SSELevel >= SSE41)
3531 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003532 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003533 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003534 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003535 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003536 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3537 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003538 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003539 .Case("xsave", HasXSAVE)
3540 .Case("xsavec", HasXSAVEC)
3541 .Case("xsaves", HasXSAVES)
3542 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003543 .Default(false);
3544}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003545
Eric Christopherd9832702015-06-29 21:00:05 +00003546// We can't use a generic validation scheme for the features accepted here
3547// versus subtarget features accepted in the target attribute because the
3548// bitfield structure that's initialized in the runtime only supports the
3549// below currently rather than the full range of subtarget features. (See
3550// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3551bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3552 return llvm::StringSwitch<bool>(FeatureStr)
3553 .Case("cmov", true)
3554 .Case("mmx", true)
3555 .Case("popcnt", true)
3556 .Case("sse", true)
3557 .Case("sse2", true)
3558 .Case("sse3", true)
3559 .Case("sse4.1", true)
3560 .Case("sse4.2", true)
3561 .Case("avx", true)
3562 .Case("avx2", true)
3563 .Case("sse4a", true)
3564 .Case("fma4", true)
3565 .Case("xop", true)
3566 .Case("fma", true)
3567 .Case("avx512f", true)
3568 .Case("bmi", true)
3569 .Case("bmi2", true)
3570 .Default(false);
3571}
3572
Eli Friedman3fd920a2008-08-20 02:34:37 +00003573bool
Anders Carlsson58436352009-02-28 17:11:49 +00003574X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003575 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003576 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003577 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003578 // Constant constraints.
3579 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3580 // instructions.
3581 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3582 // x86_64 instructions.
3583 case 's':
3584 Info.setRequiresImmediate();
3585 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003586 case 'I':
3587 Info.setRequiresImmediate(0, 31);
3588 return true;
3589 case 'J':
3590 Info.setRequiresImmediate(0, 63);
3591 return true;
3592 case 'K':
3593 Info.setRequiresImmediate(-128, 127);
3594 return true;
3595 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003596 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003597 return true;
3598 case 'M':
3599 Info.setRequiresImmediate(0, 3);
3600 return true;
3601 case 'N':
3602 Info.setRequiresImmediate(0, 255);
3603 return true;
3604 case 'O':
3605 Info.setRequiresImmediate(0, 127);
3606 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003607 // Register constraints.
3608 case 'Y': // 'Y' is the first character for several 2-character constraints.
3609 // Shift the pointer to the second character of the constraint.
3610 Name++;
3611 switch (*Name) {
3612 default:
3613 return false;
3614 case '0': // First SSE register.
3615 case 't': // Any SSE register, when SSE2 is enabled.
3616 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3617 case 'm': // Any MMX register, when inter-unit moves enabled.
3618 Info.setAllowsRegister();
3619 return true;
3620 }
3621 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003622 // Constraint 'f' cannot be used for output operands.
3623 if (Info.ConstraintStr[0] == '=')
3624 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003625 Info.setAllowsRegister();
3626 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003627 case 'a': // eax.
3628 case 'b': // ebx.
3629 case 'c': // ecx.
3630 case 'd': // edx.
3631 case 'S': // esi.
3632 case 'D': // edi.
3633 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003634 case 't': // Top of floating point stack.
3635 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003636 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003637 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003638 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003639 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003640 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3641 case 'l': // "Index" registers: any general register that can be used as an
3642 // index in a base+index memory access.
3643 Info.setAllowsRegister();
3644 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003645 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003646 case 'C': // SSE floating point constant.
3647 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003648 return true;
3649 }
3650}
3651
Akira Hatanaka974131e2014-09-18 18:17:18 +00003652bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3653 unsigned Size) const {
3654 // Strip off constraint modifiers.
3655 while (Constraint[0] == '=' ||
3656 Constraint[0] == '+' ||
3657 Constraint[0] == '&')
3658 Constraint = Constraint.substr(1);
3659
3660 return validateOperandSize(Constraint, Size);
3661}
3662
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003663bool X86TargetInfo::validateInputSize(StringRef Constraint,
3664 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003665 return validateOperandSize(Constraint, Size);
3666}
3667
3668bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3669 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003670 switch (Constraint[0]) {
3671 default: break;
3672 case 'y':
3673 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003674 case 'f':
3675 case 't':
3676 case 'u':
3677 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003678 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003679 if (SSELevel >= AVX512F)
3680 // 512-bit zmm registers can be used if target supports AVX512F.
3681 return Size <= 512U;
3682 else if (SSELevel >= AVX)
3683 // 256-bit ymm registers can be used if target supports AVX.
3684 return Size <= 256U;
3685 return Size <= 128U;
3686 case 'Y':
3687 // 'Y' is the first character for several 2-character constraints.
3688 switch (Constraint[1]) {
3689 default: break;
3690 case 'm':
3691 // 'Ym' is synonymous with 'y'.
3692 return Size <= 64;
3693 case 'i':
3694 case 't':
3695 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3696 if (SSELevel >= AVX512F)
3697 return Size <= 512U;
3698 else if (SSELevel >= AVX)
3699 return Size <= 256U;
3700 return SSELevel >= SSE2 && Size <= 128U;
3701 }
3702
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003703 }
3704
3705 return true;
3706}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003707
Eli Friedman3fd920a2008-08-20 02:34:37 +00003708std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003709X86TargetInfo::convertConstraint(const char *&Constraint) const {
3710 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003711 case 'a': return std::string("{ax}");
3712 case 'b': return std::string("{bx}");
3713 case 'c': return std::string("{cx}");
3714 case 'd': return std::string("{dx}");
3715 case 'S': return std::string("{si}");
3716 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003717 case 'p': // address
3718 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003719 case 't': // top of floating point stack.
3720 return std::string("{st}");
3721 case 'u': // second from top of floating point stack.
3722 return std::string("{st(1)}"); // second from top of floating point stack.
3723 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003724 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003725 }
3726}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003727
Eli Friedman3fd920a2008-08-20 02:34:37 +00003728// X86-32 generic target
3729class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003730public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003731 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003732 DoubleAlign = LongLongAlign = 32;
3733 LongDoubleWidth = 96;
3734 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003735 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003736 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003737 SizeType = UnsignedInt;
3738 PtrDiffType = SignedInt;
3739 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003740 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003741
3742 // Use fpret for all types.
3743 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3744 (1 << TargetInfo::Double) |
3745 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003746
3747 // x86-32 has atomics up to 8 bytes
3748 // FIXME: Check that we actually have cmpxchg8b before setting
3749 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3750 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003751 }
Craig Topper3164f332014-03-11 03:39:26 +00003752 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003753 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003754 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003755
Craig Topper3164f332014-03-11 03:39:26 +00003756 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003757 if (RegNo == 0) return 0;
3758 if (RegNo == 1) return 2;
3759 return -1;
3760 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003761 bool validateOperandSize(StringRef Constraint,
3762 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003763 switch (Constraint[0]) {
3764 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003765 case 'R':
3766 case 'q':
3767 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003768 case 'a':
3769 case 'b':
3770 case 'c':
3771 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003772 case 'S':
3773 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003774 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003775 case 'A':
3776 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003777 }
3778
Akira Hatanaka974131e2014-09-18 18:17:18 +00003779 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003780 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003781};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003782
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003783class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3784public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003785 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3786 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003787
Craig Topper3164f332014-03-11 03:39:26 +00003788 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003789 unsigned Major, Minor, Micro;
3790 getTriple().getOSVersion(Major, Minor, Micro);
3791 // New NetBSD uses the default rounding mode.
3792 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3793 return X86_32TargetInfo::getFloatEvalMethod();
3794 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003795 return 1;
3796 }
3797};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003798
Eli Friedmane3aa4542009-07-05 18:47:56 +00003799class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3800public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003801 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3802 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003803 SizeType = UnsignedLong;
3804 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003805 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003806 }
3807};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003808
Eli Friedman9fa28852012-08-08 23:57:20 +00003809class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3810public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003811 BitrigI386TargetInfo(const llvm::Triple &Triple)
3812 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003813 SizeType = UnsignedLong;
3814 IntPtrType = SignedLong;
3815 PtrDiffType = SignedLong;
3816 }
3817};
Eli Friedman9fa28852012-08-08 23:57:20 +00003818
Torok Edwinb2b37c62009-06-30 17:10:35 +00003819class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003820public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003821 DarwinI386TargetInfo(const llvm::Triple &Triple)
3822 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003823 LongDoubleWidth = 128;
3824 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003825 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003826 MaxVectorAlign = 256;
3827 // The watchOS simulator uses the builtin bool type for Objective-C.
3828 llvm::Triple T = llvm::Triple(Triple);
3829 if (T.isWatchOS())
3830 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003831 SizeType = UnsignedLong;
3832 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00003833 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00003834 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003835 }
3836
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003837 bool handleTargetFeatures(std::vector<std::string> &Features,
3838 DiagnosticsEngine &Diags) override {
3839 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3840 Diags))
3841 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003842 // We now know the features we have: we can decide how to align vectors.
3843 MaxVectorAlign =
3844 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003845 return true;
3846 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003847};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003848
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003849// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003850class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003851public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003852 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3853 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003854 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003855 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003856 bool IsWinCOFF =
3857 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00003858 resetDataLayout(IsWinCOFF
3859 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3860 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003861 }
Craig Topper3164f332014-03-11 03:39:26 +00003862 void getTargetDefines(const LangOptions &Opts,
3863 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003864 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3865 }
3866};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003867
3868// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003869class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003870public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003871 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003872 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003873 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003874 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3875 }
Craig Topper3164f332014-03-11 03:39:26 +00003876 void getTargetDefines(const LangOptions &Opts,
3877 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003878 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3879 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3880 // The value of the following reflects processor type.
3881 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3882 // We lost the original triple, so we use the default.
3883 Builder.defineMacro("_M_IX86", "600");
3884 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003885};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003886
David Majnemerae1ed0e2015-05-28 04:36:18 +00003887static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003888 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3889 // supports __declspec natively under -fms-extensions, but we define a no-op
3890 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003891 if (Opts.MicrosoftExt)
3892 Builder.defineMacro("__declspec", "__declspec");
3893 else
3894 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3895
3896 if (!Opts.MicrosoftExt) {
3897 // Provide macros for all the calling convention keywords. Provide both
3898 // single and double underscore prefixed variants. These are available on
3899 // x64 as well as x86, even though they have no effect.
3900 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3901 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003902 std::string GCCSpelling = "__attribute__((__";
3903 GCCSpelling += CC;
3904 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003905 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3906 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3907 }
3908 }
3909}
3910
David Majnemerae1ed0e2015-05-28 04:36:18 +00003911static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3912 Builder.defineMacro("__MSVCRT__");
3913 Builder.defineMacro("__MINGW32__");
3914 addCygMingDefines(Opts, Builder);
3915}
3916
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003917// x86-32 MinGW target
3918class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3919public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003920 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003921 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003922 void getTargetDefines(const LangOptions &Opts,
3923 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003924 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003925 DefineStd(Builder, "WIN32", Opts);
3926 DefineStd(Builder, "WINNT", Opts);
3927 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003928 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003929 }
3930};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003931
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003932// x86-32 Cygwin target
3933class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3934public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003935 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3936 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003937 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003938 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00003939 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 +00003940 }
Craig Topper3164f332014-03-11 03:39:26 +00003941 void getTargetDefines(const LangOptions &Opts,
3942 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003943 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003944 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003945 Builder.defineMacro("__CYGWIN__");
3946 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003947 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003948 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003949 if (Opts.CPlusPlus)
3950 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003951 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003952};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003953
Chris Lattnerb986aba2010-04-11 19:29:39 +00003954// x86-32 Haiku target
3955class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3956public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003957 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003958 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003959 IntPtrType = SignedLong;
3960 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003961 ProcessIDType = SignedLong;
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003962 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003963 }
Craig Topper3164f332014-03-11 03:39:26 +00003964 void getTargetDefines(const LangOptions &Opts,
3965 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003966 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3967 Builder.defineMacro("__INTEL__");
3968 Builder.defineMacro("__HAIKU__");
3969 }
3970};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003971
Alexey Bataevc99b0492015-11-25 09:24:26 +00003972// X86-32 MCU target
3973class MCUX86_32TargetInfo : public X86_32TargetInfo {
3974public:
3975 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3976 LongDoubleWidth = 64;
3977 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00003978 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 +00003979 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00003980 }
3981
3982 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3983 // On MCU we support only C calling convention.
3984 return CC == CC_C ? CCCR_OK : CCCR_Warning;
3985 }
3986
3987 void getTargetDefines(const LangOptions &Opts,
3988 MacroBuilder &Builder) const override {
3989 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3990 Builder.defineMacro("__iamcu");
3991 Builder.defineMacro("__iamcu__");
3992 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00003993
3994 bool allowsLargerPreferedTypeAlignment() const override {
3995 return false;
3996 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00003997};
3998
Douglas Gregor9fabd852011-07-01 22:41:14 +00003999// RTEMS Target
4000template<typename Target>
4001class RTEMSTargetInfo : public OSTargetInfo<Target> {
4002protected:
Craig Topper3164f332014-03-11 03:39:26 +00004003 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4004 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004005 // RTEMS defines; list based off of gcc output
4006
Douglas Gregor9fabd852011-07-01 22:41:14 +00004007 Builder.defineMacro("__rtems__");
4008 Builder.defineMacro("__ELF__");
4009 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004010
Douglas Gregor9fabd852011-07-01 22:41:14 +00004011public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004012 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004013 switch (Triple.getArch()) {
4014 default:
4015 case llvm::Triple::x86:
4016 // this->MCountName = ".mcount";
4017 break;
4018 case llvm::Triple::mips:
4019 case llvm::Triple::mipsel:
4020 case llvm::Triple::ppc:
4021 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004022 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004023 // this->MCountName = "_mcount";
4024 break;
4025 case llvm::Triple::arm:
4026 // this->MCountName = "__mcount";
4027 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004028 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004029 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004030};
4031
Douglas Gregor9fabd852011-07-01 22:41:14 +00004032// x86-32 RTEMS target
4033class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4034public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004035 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004036 SizeType = UnsignedLong;
4037 IntPtrType = SignedLong;
4038 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004039 }
Craig Topper3164f332014-03-11 03:39:26 +00004040 void getTargetDefines(const LangOptions &Opts,
4041 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004042 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4043 Builder.defineMacro("__INTEL__");
4044 Builder.defineMacro("__rtems__");
4045 }
4046};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004047
Eli Friedman3fd920a2008-08-20 02:34:37 +00004048// x86-64 generic target
4049class X86_64TargetInfo : public X86TargetInfo {
4050public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004051 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00004052 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004053 bool IsWinCOFF =
4054 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004055 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004056 LongDoubleWidth = 128;
4057 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004058 LargeArrayMinWidth = 128;
4059 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004060 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004061 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4062 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4063 IntPtrType = IsX32 ? SignedInt : SignedLong;
4064 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004065 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004066 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004067
Eric Christopher917e9522014-11-18 22:36:15 +00004068 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004069 resetDataLayout(IsX32
4070 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4071 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4072 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004073
4074 // Use fpret only for long double.
4075 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004076
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004077 // Use fp2ret for _Complex long double.
4078 ComplexLongDoubleUsesFP2Ret = true;
4079
Charles Davisc7d5c942015-09-17 20:55:33 +00004080 // Make __builtin_ms_va_list available.
4081 HasBuiltinMSVaList = true;
4082
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004083 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004084 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004085 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004086 }
Craig Topper3164f332014-03-11 03:39:26 +00004087 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004088 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004089 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004090
Craig Topper3164f332014-03-11 03:39:26 +00004091 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004092 if (RegNo == 0) return 0;
4093 if (RegNo == 1) return 1;
4094 return -1;
4095 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004096
Craig Topper3164f332014-03-11 03:39:26 +00004097 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004098 switch (CC) {
4099 case CC_C:
4100 case CC_Swift:
4101 case CC_X86VectorCall:
4102 case CC_IntelOclBicc:
4103 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004104 case CC_PreserveMost:
4105 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004106 return CCCR_OK;
4107 default:
4108 return CCCR_Warning;
4109 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004110 }
4111
Craig Topper3164f332014-03-11 03:39:26 +00004112 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004113 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004114 }
4115
Pavel Chupinfd223e12014-08-04 12:39:43 +00004116 // for x32 we need it here explicitly
4117 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004118 unsigned getUnwindWordWidth() const override { return 64; }
4119 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004120
4121 bool validateGlobalRegisterVariable(StringRef RegName,
4122 unsigned RegSize,
4123 bool &HasSizeMismatch) const override {
4124 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4125 // handle.
4126 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4127 // Check that the register size is 64-bit.
4128 HasSizeMismatch = RegSize != 64;
4129 return true;
4130 }
4131
4132 // Check if the register is a 32-bit register the backend can handle.
4133 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4134 HasSizeMismatch);
4135 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004136};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004137
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004138// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004139class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004140public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004141 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4142 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004143 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004144 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004145 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004146 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004147 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004148 SizeType = UnsignedLongLong;
4149 PtrDiffType = SignedLongLong;
4150 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004151 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004152
Craig Topper3164f332014-03-11 03:39:26 +00004153 void getTargetDefines(const LangOptions &Opts,
4154 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004155 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004156 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004157 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004158
Craig Topper3164f332014-03-11 03:39:26 +00004159 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004160 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004161 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004162
Craig Topper3164f332014-03-11 03:39:26 +00004163 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004164 switch (CC) {
4165 case CC_X86StdCall:
4166 case CC_X86ThisCall:
4167 case CC_X86FastCall:
4168 return CCCR_Ignore;
4169 case CC_C:
4170 case CC_X86VectorCall:
4171 case CC_IntelOclBicc:
4172 case CC_X86_64SysV:
4173 return CCCR_OK;
4174 default:
4175 return CCCR_Warning;
4176 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004177 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004178};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004179
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004180// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004181class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004182public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004183 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004184 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004185 LongDoubleWidth = LongDoubleAlign = 64;
4186 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004187 }
Craig Topper3164f332014-03-11 03:39:26 +00004188 void getTargetDefines(const LangOptions &Opts,
4189 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004190 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4191 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004192 Builder.defineMacro("_M_X64", "100");
4193 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004194 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004195};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004196
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004197// x86-64 MinGW target
4198class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4199public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004200 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004201 : WindowsX86_64TargetInfo(Triple) {
4202 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4203 // with x86 FP ops. Weird.
4204 LongDoubleWidth = LongDoubleAlign = 128;
4205 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4206 }
4207
Craig Topper3164f332014-03-11 03:39:26 +00004208 void getTargetDefines(const LangOptions &Opts,
4209 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004210 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004211 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004212 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004213 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004214
4215 // GCC defines this macro when it is using __gxx_personality_seh0.
4216 if (!Opts.SjLjExceptions)
4217 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004218 }
4219};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004220
Yaron Kerend030d112015-07-22 17:38:19 +00004221// x86-64 Cygwin target
4222class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4223public:
4224 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4225 : X86_64TargetInfo(Triple) {
4226 TLSSupported = false;
4227 WCharType = UnsignedShort;
4228 }
4229 void getTargetDefines(const LangOptions &Opts,
4230 MacroBuilder &Builder) const override {
4231 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4232 Builder.defineMacro("__x86_64__");
4233 Builder.defineMacro("__CYGWIN__");
4234 Builder.defineMacro("__CYGWIN64__");
4235 addCygMingDefines(Opts, Builder);
4236 DefineStd(Builder, "unix", Opts);
4237 if (Opts.CPlusPlus)
4238 Builder.defineMacro("_GNU_SOURCE");
4239
4240 // GCC defines this macro when it is using __gxx_personality_seh0.
4241 if (!Opts.SjLjExceptions)
4242 Builder.defineMacro("__SEH__");
4243 }
4244};
4245
Eli Friedman2857ccb2009-07-01 03:36:11 +00004246class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4247public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004248 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4249 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004250 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004251 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4252 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004253 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004254 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004255 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004256 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004257
4258 bool handleTargetFeatures(std::vector<std::string> &Features,
4259 DiagnosticsEngine &Diags) override {
4260 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4261 Diags))
4262 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004263 // We now know the features we have: we can decide how to align vectors.
4264 MaxVectorAlign =
4265 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004266 return true;
4267 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004268};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004269
Eli Friedman245f2292009-07-05 22:31:18 +00004270class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4271public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004272 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4273 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004274 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004275 Int64Type = SignedLongLong;
4276 }
4277};
Eli Friedman245f2292009-07-05 22:31:18 +00004278
Eli Friedman9fa28852012-08-08 23:57:20 +00004279class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4280public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004281 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4282 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4283 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004284 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004285 }
4286};
Tim Northover9bb857a2013-01-31 12:13:10 +00004287
Eli Friedmanf05b7722008-08-20 07:44:10 +00004288class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004289 // Possible FPU choices.
4290 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004291 VFP2FPU = (1 << 0),
4292 VFP3FPU = (1 << 1),
4293 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004294 NeonFPU = (1 << 3),
4295 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004296 };
4297
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004298 // Possible HWDiv features.
4299 enum HWDivMode {
4300 HWDivThumb = (1 << 0),
4301 HWDivARM = (1 << 1)
4302 };
4303
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004304 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004305 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004306 }
4307
4308 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4309 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004310
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004311 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004312
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004313 StringRef CPUProfile;
4314 StringRef CPUAttr;
4315
Rafael Espindolaeb265472013-08-21 21:59:03 +00004316 enum {
4317 FP_Default,
4318 FP_VFP,
4319 FP_Neon
4320 } FPMath;
4321
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004322 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004323 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004324 unsigned ArchProfile;
4325 unsigned ArchVersion;
4326
Bernard Ogdenda13af32013-10-24 18:32:51 +00004327 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004328
Logan Chien57086ce2012-10-10 06:56:20 +00004329 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004330 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004331
4332 // Initialized via features.
4333 unsigned SoftFloat : 1;
4334 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004335
Bernard Ogden18b57012013-10-29 09:47:51 +00004336 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004337 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004338 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004339 unsigned Unaligned : 1;
4340
4341 enum {
4342 LDREX_B = (1 << 0), /// byte (8-bit)
4343 LDREX_H = (1 << 1), /// half (16-bit)
4344 LDREX_W = (1 << 2), /// word (32-bit)
4345 LDREX_D = (1 << 3), /// double (64-bit)
4346 };
4347
4348 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004349
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004350 // ACLE 6.5.1 Hardware floating point
4351 enum {
4352 HW_FP_HP = (1 << 1), /// half (16-bit)
4353 HW_FP_SP = (1 << 2), /// single (32-bit)
4354 HW_FP_DP = (1 << 3), /// double (64-bit)
4355 };
4356 uint32_t HW_FP;
4357
Chris Lattner5cc15e02010-03-03 19:03:45 +00004358 static const Builtin::Info BuiltinInfo[];
4359
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004360 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004361 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004362
4363 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004364 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004365
Renato Golin9ba39232015-02-27 16:35:48 +00004366 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4367 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4368 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004369 SizeType = UnsignedLong;
4370 else
4371 SizeType = UnsignedInt;
4372
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004373 switch (T.getOS()) {
4374 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004375 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004376 break;
4377 case llvm::Triple::Win32:
4378 WCharType = UnsignedShort;
4379 break;
4380 case llvm::Triple::Linux:
4381 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004382 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4383 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004384 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004385 }
4386
4387 UseBitFieldTypeAlignment = true;
4388
4389 ZeroLengthBitfieldBoundary = 0;
4390
Tim Northover147cd2f2014-10-14 22:12:21 +00004391 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4392 // so set preferred for small types to 32.
4393 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004394 resetDataLayout(BigEndian
4395 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4396 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004397 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004398 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004399 resetDataLayout("e"
4400 "-m:w"
4401 "-p:32:32"
4402 "-i64:64"
4403 "-v128:64:128"
4404 "-a:0:32"
4405 "-n32"
4406 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004407 } else if (T.isOSNaCl()) {
4408 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004409 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004410 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004411 resetDataLayout(BigEndian
4412 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4413 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004414 }
4415
4416 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004417 }
4418
Tim Northover5627d392015-10-30 16:30:45 +00004419 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004420 const llvm::Triple &T = getTriple();
4421
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004422 IsAAPCS = false;
4423
Tim Northover5627d392015-10-30 16:30:45 +00004424 if (IsAAPCS16)
4425 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4426 else
4427 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004428
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004429 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004430 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004431 SizeType = UnsignedInt;
4432 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004433 SizeType = UnsignedLong;
4434
4435 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4436 WCharType = SignedInt;
4437
4438 // Do not respect the alignment of bit-field types when laying out
4439 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4440 UseBitFieldTypeAlignment = false;
4441
4442 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4443 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4444 /// gcc.
4445 ZeroLengthBitfieldBoundary = 32;
4446
Tim Northover5627d392015-10-30 16:30:45 +00004447 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4448 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004449 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004450 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004451 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004452 BigEndian
4453 ? "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 +00004454 : "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 +00004455 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004456 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004457 BigEndian
4458 ? "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 +00004459 : "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 +00004460
4461 // FIXME: Override "preferred align" for double and long long.
4462 }
4463
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004464 void setArchInfo() {
4465 StringRef ArchName = getTriple().getArchName();
4466
Renato Goline84b0002015-10-08 16:43:26 +00004467 ArchISA = llvm::ARM::parseArchISA(ArchName);
4468 CPU = llvm::ARM::getDefaultCPU(ArchName);
4469 unsigned AK = llvm::ARM::parseArch(ArchName);
4470 if (AK != llvm::ARM::AK_INVALID)
4471 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004472 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004473 }
4474
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004475 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004476 StringRef SubArch;
4477
4478 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004479 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004480 SubArch = llvm::ARM::getSubArch(ArchKind);
4481 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4482 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004483
4484 // cache CPU related strings
4485 CPUAttr = getCPUAttr();
4486 CPUProfile = getCPUProfile();
4487 }
4488
4489 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004490 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004491 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004492 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004493 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4494 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004495 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004496 if (ArchProfile == llvm::ARM::PK_M) {
4497 MaxAtomicPromoteWidth = 32;
4498 if (ShouldUseInlineAtomic)
4499 MaxAtomicInlineWidth = 32;
4500 }
4501 else {
4502 MaxAtomicPromoteWidth = 64;
4503 if (ShouldUseInlineAtomic)
4504 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004505 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004506 }
4507
4508 bool isThumb() const {
4509 return (ArchISA == llvm::ARM::IK_THUMB);
4510 }
4511
4512 bool supportsThumb() const {
4513 return CPUAttr.count('T') || ArchVersion >= 6;
4514 }
4515
4516 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004517 return CPUAttr.equals("6T2") ||
4518 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004519 }
4520
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004521 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004522 // For most sub-arches, the build attribute CPU name is enough.
4523 // For Cortex variants, it's slightly different.
4524 switch(ArchKind) {
4525 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004526 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004527 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004528 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004529 case llvm::ARM::AK_ARMV7S:
4530 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004531 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004532 return "7A";
4533 case llvm::ARM::AK_ARMV7R:
4534 return "7R";
4535 case llvm::ARM::AK_ARMV7M:
4536 return "7M";
4537 case llvm::ARM::AK_ARMV7EM:
4538 return "7EM";
4539 case llvm::ARM::AK_ARMV8A:
4540 return "8A";
4541 case llvm::ARM::AK_ARMV8_1A:
4542 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004543 case llvm::ARM::AK_ARMV8_2A:
4544 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004545 case llvm::ARM::AK_ARMV8MBaseline:
4546 return "8M_BASE";
4547 case llvm::ARM::AK_ARMV8MMainline:
4548 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004549 }
4550 }
4551
4552 StringRef getCPUProfile() const {
4553 switch(ArchProfile) {
4554 case llvm::ARM::PK_A:
4555 return "A";
4556 case llvm::ARM::PK_R:
4557 return "R";
4558 case llvm::ARM::PK_M:
4559 return "M";
4560 default:
4561 return "";
4562 }
4563 }
4564
Chris Lattner17df24e2008-04-21 18:56:49 +00004565public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004566 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004567 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004568 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004569 BigEndian = IsBigEndian;
4570
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004571 switch (getTriple().getOS()) {
4572 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004573 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004574 break;
4575 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004576 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004577 break;
4578 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004579
Renato Goline84b0002015-10-08 16:43:26 +00004580 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004581 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004582
Chris Lattner1a8f3942010-04-23 16:29:58 +00004583 // {} in inline assembly are neon specifiers, not assembly variant
4584 // specifiers.
4585 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004586
Eric Christopher0e261882014-12-05 01:06:59 +00004587 // FIXME: This duplicates code from the driver that sets the -target-abi
4588 // option - this code is used if -target-abi isn't passed and should
4589 // be unified in some way.
4590 if (Triple.isOSBinFormatMachO()) {
4591 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4592 // the frontend matches that.
4593 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4594 Triple.getOS() == llvm::Triple::UnknownOS ||
4595 StringRef(CPU).startswith("cortex-m")) {
4596 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004597 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004598 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004599 } else {
4600 setABI("apcs-gnu");
4601 }
4602 } else if (Triple.isOSWindows()) {
4603 // FIXME: this is invalid for WindowsCE
4604 setABI("aapcs");
4605 } else {
4606 // Select the default based on the platform.
4607 switch (Triple.getEnvironment()) {
4608 case llvm::Triple::Android:
4609 case llvm::Triple::GNUEABI:
4610 case llvm::Triple::GNUEABIHF:
4611 setABI("aapcs-linux");
4612 break;
4613 case llvm::Triple::EABIHF:
4614 case llvm::Triple::EABI:
4615 setABI("aapcs");
4616 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004617 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004618 setABI("apcs-gnu");
4619 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004620 default:
4621 if (Triple.getOS() == llvm::Triple::NetBSD)
4622 setABI("apcs-gnu");
4623 else
4624 setABI("aapcs");
4625 break;
4626 }
4627 }
John McCall86353412010-08-21 22:46:04 +00004628
4629 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004630 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004631
Renato Golin15b86152015-07-03 16:41:13 +00004632 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004633 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004634
James Molloya7139222012-03-12 09:14:10 +00004635 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004636 // the alignment of the zero-length bitfield is greater than the member
4637 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004638 // zero length bitfield.
4639 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004640 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004641
Alp Toker4925ba72014-06-07 23:30:42 +00004642 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004643
Craig Topper3164f332014-03-11 03:39:26 +00004644 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004645 ABI = Name;
4646
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004647 // The defaults (above) are for AAPCS, check if we need to change them.
4648 //
4649 // FIXME: We need support for -meabi... we could just mangle it into the
4650 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004651 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004652 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004653 return true;
4654 }
4655 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4656 setABIAAPCS();
4657 return true;
4658 }
4659 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004660 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004661
Renato Golinf5c4dec2015-05-27 13:33:00 +00004662 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004663 bool
4664 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4665 StringRef CPU,
4666 const std::vector<std::string> &FeaturesVec) const override {
4667
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004668 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004669 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004670
4671 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004672 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004673 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4674
4675 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004676 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004677 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4678
4679 for (const char *Feature : TargetFeatures)
4680 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004681 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004682
Eric Christopher007b0a02015-08-28 22:32:01 +00004683 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004684 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004685
Craig Topper3164f332014-03-11 03:39:26 +00004686 bool handleTargetFeatures(std::vector<std::string> &Features,
4687 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004688 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004689 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004690 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004691 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004692 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004693 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004694 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004695
Ranjeet Singhac08e532015-06-24 23:39:25 +00004696 // This does not diagnose illegal cases like having both
4697 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4698 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004699 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004700 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004701 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004702 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004703 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004704 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004705 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004706 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004707 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004708 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004709 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004710 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004711 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004712 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004713 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004714 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004715 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004716 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004717 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004718 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004719 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004720 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004721 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004722 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004723 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004724 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004725 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004726 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004727 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004728 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004729 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004730 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004731 } else if (Feature == "+strict-align") {
4732 Unaligned = 0;
4733 } else if (Feature == "+fp16") {
4734 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004735 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004736 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004737 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004738
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004739 switch (ArchVersion) {
4740 case 6:
4741 if (ArchProfile == llvm::ARM::PK_M)
4742 LDREX = 0;
4743 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4744 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4745 else
4746 LDREX = LDREX_W;
4747 break;
4748 case 7:
4749 if (ArchProfile == llvm::ARM::PK_M)
4750 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4751 else
4752 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4753 break;
4754 case 8:
4755 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4756 }
4757
Rafael Espindolaeb265472013-08-21 21:59:03 +00004758 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4759 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4760 return false;
4761 }
4762
4763 if (FPMath == FP_Neon)
4764 Features.push_back("+neonfp");
4765 else if (FPMath == FP_VFP)
4766 Features.push_back("-neonfp");
4767
Daniel Dunbar893d4752009-12-19 04:15:38 +00004768 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004769 auto Feature =
4770 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4771 if (Feature != Features.end())
4772 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004773
Rafael Espindolaeb265472013-08-21 21:59:03 +00004774 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004775 }
4776
Craig Topper3164f332014-03-11 03:39:26 +00004777 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004778 return llvm::StringSwitch<bool>(Feature)
4779 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004780 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004781 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004782 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004783 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004784 .Case("hwdiv", HWDiv & HWDivThumb)
4785 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004786 .Default(false);
4787 }
Renato Golin15b86152015-07-03 16:41:13 +00004788
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004789 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004790 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004791 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004792
Renato Golin15b86152015-07-03 16:41:13 +00004793 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004794 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004795 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004796 CPU = Name;
4797 return true;
4798 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004799
Craig Topper3164f332014-03-11 03:39:26 +00004800 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004801
Craig Topper3164f332014-03-11 03:39:26 +00004802 void getTargetDefines(const LangOptions &Opts,
4803 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004804 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004805 Builder.defineMacro("__arm");
4806 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004807
Chris Lattnerecd49032009-03-02 22:27:17 +00004808 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004809 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004810
4811 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4812 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004813 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004814 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4815
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004816 if (!CPUAttr.empty())
4817 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004818
4819 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004820 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004821 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004822
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004823 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004824 // ACLE 6.5.7 Crypto Extension
4825 if (Crypto)
4826 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4827 // ACLE 6.5.8 CRC32 Extension
4828 if (CRC)
4829 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4830 // ACLE 6.5.10 Numeric Maximum and Minimum
4831 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4832 // ACLE 6.5.9 Directed Rounding
4833 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004834 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004835
4836 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4837 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00004838 // NOTE that the default profile is assumed to be 'A'
4839 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004840 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4841
Bradley Smithf4affc12016-03-03 13:52:22 +00004842 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
4843 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
4844 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
4845 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004846 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004847 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004848 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004849 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4850
4851 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4852 // instruction set such as ARM or Thumb.
4853 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4854
4855 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4856
4857 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004858 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004859 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004860
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004861 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004862 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004863 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004864
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004865 // ACLE 6.4.4 LDREX/STREX
4866 if (LDREX)
4867 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4868
4869 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004870 if (ArchVersion == 5 ||
4871 (ArchVersion == 6 && CPUProfile != "M") ||
4872 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004873 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4874
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004875 // ACLE 6.5.1 Hardware Floating Point
4876 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004877 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004878
Yi Konga44c4d72014-06-27 21:25:42 +00004879 // ACLE predefines.
4880 Builder.defineMacro("__ARM_ACLE", "200");
4881
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004882 // FP16 support (we currently only support IEEE format).
4883 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4884 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4885
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004886 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4887 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4888 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4889
Mike Stump9d54bd72009-04-08 02:07:04 +00004890 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004891
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004892 // FIXME: It's more complicated than this and we don't really support
4893 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004894 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004895 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004896 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004897
David Tweed8f676532012-10-25 13:33:01 +00004898 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004899 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004900 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4901 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004902 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004903 Builder.defineMacro("__ARM_PCS", "1");
4904
David Tweed8f676532012-10-25 13:33:01 +00004905 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004906 Builder.defineMacro("__ARM_PCS_VFP", "1");
4907 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004908
Daniel Dunbar893d4752009-12-19 04:15:38 +00004909 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004910 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004911
4912 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004913 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004914
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004915 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004916 Builder.defineMacro("__THUMBEL__");
4917 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004918 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004919 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004920 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004921
4922 // ACLE 6.4.9 32-bit SIMD instructions
4923 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4924 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4925
4926 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004927 if (((HWDiv & HWDivThumb) && isThumb()) ||
4928 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004929 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004930 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004931 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004932
4933 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004934 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004935
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004936 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004937 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004938 if (FPU & VFP2FPU)
4939 Builder.defineMacro("__ARM_VFPV2__");
4940 if (FPU & VFP3FPU)
4941 Builder.defineMacro("__ARM_VFPV3__");
4942 if (FPU & VFP4FPU)
4943 Builder.defineMacro("__ARM_VFPV4__");
4944 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004945
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004946 // This only gets set when Neon instructions are actually available, unlike
4947 // the VFP define, hence the soft float and arch check. This is subtly
4948 // different from gcc, we follow the intent which was that it should be set
4949 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004950 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004951 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004952 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004953 // current AArch32 NEON implementations do not support double-precision
4954 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004955 Builder.defineMacro("__ARM_NEON_FP",
4956 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004957 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004958
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004959 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4960 Opts.ShortWChar ? "2" : "4");
4961
4962 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4963 Opts.ShortEnums ? "1" : "4");
4964
Bradley Smithf4affc12016-03-03 13:52:22 +00004965 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004966 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4967 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4968 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4969 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4970 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004971
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004972 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004973 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004974 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004975 }
4976
4977 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004978 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004979 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4980 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004981 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004982 }
4983
4984 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004985 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004986 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004987
4988 if (Opts.UnsafeFPMath)
4989 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00004990
4991 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
4992 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004993 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004994
Craig Topper6c03a542015-10-19 04:51:35 +00004995 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4996 return llvm::makeArrayRef(BuiltinInfo,
4997 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004998 }
Craig Topper3164f332014-03-11 03:39:26 +00004999 bool isCLZForZeroUndef() const override { return false; }
5000 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005001 return IsAAPCS
5002 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005003 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5004 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005005 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005006 ArrayRef<const char *> getGCCRegNames() const override;
5007 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005008 bool validateAsmConstraint(const char *&Name,
5009 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005010 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005011 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005012 case 'l': // r0-r7
5013 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005014 case 't': // VFP Floating point register single precision
5015 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005016 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005017 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005018 case 'I':
5019 case 'J':
5020 case 'K':
5021 case 'L':
5022 case 'M':
5023 // FIXME
5024 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005025 case 'Q': // A memory address that is a single base register.
5026 Info.setAllowsMemory();
5027 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005028 case 'U': // a memory reference...
5029 switch (Name[1]) {
5030 case 'q': // ...ARMV4 ldrsb
5031 case 'v': // ...VFP load/store (reg+constant offset)
5032 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005033 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005034 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005035 case 'n': // valid address for Neon doubleword vector load/store
5036 case 'm': // valid address for Neon element and structure load/store
5037 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005038 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005039 Info.setAllowsMemory();
5040 Name++;
5041 return true;
5042 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005043 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005044 return false;
5045 }
Craig Topper3164f332014-03-11 03:39:26 +00005046 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005047 std::string R;
5048 switch (*Constraint) {
5049 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005050 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005051 Constraint++;
5052 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005053 case 'p': // 'p' should be translated to 'r' by default.
5054 R = std::string("r");
5055 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005056 default:
5057 return std::string(1, *Constraint);
5058 }
5059 return R;
5060 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005061 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005062 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005063 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005064 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005065 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005066
Bill Wendling9d1ee112012-10-25 23:28:48 +00005067 // Strip off constraint modifiers.
5068 while (Constraint[0] == '=' ||
5069 Constraint[0] == '+' ||
5070 Constraint[0] == '&')
5071 Constraint = Constraint.substr(1);
5072
5073 switch (Constraint[0]) {
5074 default: break;
5075 case 'r': {
5076 switch (Modifier) {
5077 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005078 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005079 case 'q':
5080 // A register of size 32 cannot fit a vector type.
5081 return false;
5082 }
5083 }
5084 }
5085
5086 return true;
5087 }
Craig Topper3164f332014-03-11 03:39:26 +00005088 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005089 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005090 return "";
5091 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005092
Craig Topper3164f332014-03-11 03:39:26 +00005093 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005094 switch (CC) {
5095 case CC_AAPCS:
5096 case CC_AAPCS_VFP:
5097 case CC_Swift:
5098 return CCCR_OK;
5099 default:
5100 return CCCR_Warning;
5101 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005102 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005103
Craig Topper3164f332014-03-11 03:39:26 +00005104 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005105 if (RegNo == 0) return 0;
5106 if (RegNo == 1) return 1;
5107 return -1;
5108 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005109
5110 bool hasSjLjLowering() const override {
5111 return true;
5112 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005113};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005114
Rafael Espindolaeb265472013-08-21 21:59:03 +00005115bool ARMTargetInfo::setFPMath(StringRef Name) {
5116 if (Name == "neon") {
5117 FPMath = FP_Neon;
5118 return true;
5119 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5120 Name == "vfp4") {
5121 FPMath = FP_VFP;
5122 return true;
5123 }
5124 return false;
5125}
5126
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005127const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005128 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005129 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005130 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5131
5132 // Float registers
5133 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5134 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5135 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005136 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005137
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005138 // Double registers
5139 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5140 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005141 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5142 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005143
5144 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005145 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5146 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005147};
5148
Craig Topperf054e3a2015-10-19 03:52:27 +00005149ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5150 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005151}
5152
5153const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005154 { { "a1" }, "r0" },
5155 { { "a2" }, "r1" },
5156 { { "a3" }, "r2" },
5157 { { "a4" }, "r3" },
5158 { { "v1" }, "r4" },
5159 { { "v2" }, "r5" },
5160 { { "v3" }, "r6" },
5161 { { "v4" }, "r7" },
5162 { { "v5" }, "r8" },
5163 { { "v6", "rfp" }, "r9" },
5164 { { "sl" }, "r10" },
5165 { { "fp" }, "r11" },
5166 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005167 { { "r13" }, "sp" },
5168 { { "r14" }, "lr" },
5169 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005170 // The S, D and Q registers overlap, but aren't really aliases; we
5171 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005172};
5173
Craig Topperf054e3a2015-10-19 03:52:27 +00005174ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5175 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005176}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005177
5178const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005179#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005180 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005181#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5182 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005183#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005184
Craig Topper07d3b622015-08-07 05:14:44 +00005185#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005186 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005187#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005188 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005189#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5190 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005191#include "clang/Basic/BuiltinsARM.def"
5192};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005193
5194class ARMleTargetInfo : public ARMTargetInfo {
5195public:
5196 ARMleTargetInfo(const llvm::Triple &Triple)
5197 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005198 void getTargetDefines(const LangOptions &Opts,
5199 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005200 Builder.defineMacro("__ARMEL__");
5201 ARMTargetInfo::getTargetDefines(Opts, Builder);
5202 }
5203};
5204
5205class ARMbeTargetInfo : public ARMTargetInfo {
5206public:
5207 ARMbeTargetInfo(const llvm::Triple &Triple)
5208 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005209 void getTargetDefines(const LangOptions &Opts,
5210 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005211 Builder.defineMacro("__ARMEB__");
5212 Builder.defineMacro("__ARM_BIG_ENDIAN");
5213 ARMTargetInfo::getTargetDefines(Opts, Builder);
5214 }
5215};
Chris Lattner17df24e2008-04-21 18:56:49 +00005216
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005217class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5218 const llvm::Triple Triple;
5219public:
5220 WindowsARMTargetInfo(const llvm::Triple &Triple)
5221 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005222 WCharType = UnsignedShort;
5223 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005224 }
5225 void getVisualStudioDefines(const LangOptions &Opts,
5226 MacroBuilder &Builder) const {
5227 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5228
5229 // FIXME: this is invalid for WindowsCE
5230 Builder.defineMacro("_M_ARM_NT", "1");
5231 Builder.defineMacro("_M_ARMT", "_M_ARM");
5232 Builder.defineMacro("_M_THUMB", "_M_ARM");
5233
5234 assert((Triple.getArch() == llvm::Triple::arm ||
5235 Triple.getArch() == llvm::Triple::thumb) &&
5236 "invalid architecture for Windows ARM target info");
5237 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5238 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5239
5240 // TODO map the complete set of values
5241 // 31: VFPv3 40: VFPv4
5242 Builder.defineMacro("_M_ARM_FP", "31");
5243 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005244 BuiltinVaListKind getBuiltinVaListKind() const override {
5245 return TargetInfo::CharPtrBuiltinVaList;
5246 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005247 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5248 switch (CC) {
5249 case CC_X86StdCall:
5250 case CC_X86ThisCall:
5251 case CC_X86FastCall:
5252 case CC_X86VectorCall:
5253 return CCCR_Ignore;
5254 case CC_C:
5255 return CCCR_OK;
5256 default:
5257 return CCCR_Warning;
5258 }
5259 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005260};
5261
5262// Windows ARM + Itanium C++ ABI Target
5263class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5264public:
5265 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5266 : WindowsARMTargetInfo(Triple) {
5267 TheCXXABI.set(TargetCXXABI::GenericARM);
5268 }
5269
5270 void getTargetDefines(const LangOptions &Opts,
5271 MacroBuilder &Builder) const override {
5272 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5273
5274 if (Opts.MSVCCompat)
5275 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5276 }
5277};
5278
5279// Windows ARM, MS (C++) ABI
5280class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5281public:
5282 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5283 : WindowsARMTargetInfo(Triple) {
5284 TheCXXABI.set(TargetCXXABI::Microsoft);
5285 }
5286
5287 void getTargetDefines(const LangOptions &Opts,
5288 MacroBuilder &Builder) const override {
5289 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5290 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5291 }
5292};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005293
Yaron Keren321249c2015-07-15 13:32:23 +00005294// ARM MinGW target
5295class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5296public:
5297 MinGWARMTargetInfo(const llvm::Triple &Triple)
5298 : WindowsARMTargetInfo(Triple) {
5299 TheCXXABI.set(TargetCXXABI::GenericARM);
5300 }
5301
5302 void getTargetDefines(const LangOptions &Opts,
5303 MacroBuilder &Builder) const override {
5304 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5305 DefineStd(Builder, "WIN32", Opts);
5306 DefineStd(Builder, "WINNT", Opts);
5307 Builder.defineMacro("_ARM_");
5308 addMinGWDefines(Opts, Builder);
5309 }
5310};
5311
5312// ARM Cygwin target
5313class CygwinARMTargetInfo : public ARMleTargetInfo {
5314public:
5315 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5316 TLSSupported = false;
5317 WCharType = UnsignedShort;
5318 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005319 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005320 }
5321 void getTargetDefines(const LangOptions &Opts,
5322 MacroBuilder &Builder) const override {
5323 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5324 Builder.defineMacro("_ARM_");
5325 Builder.defineMacro("__CYGWIN__");
5326 Builder.defineMacro("__CYGWIN32__");
5327 DefineStd(Builder, "unix", Opts);
5328 if (Opts.CPlusPlus)
5329 Builder.defineMacro("_GNU_SOURCE");
5330 }
5331};
5332
Mike Stump11289f42009-09-09 15:08:12 +00005333class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005334 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005335protected:
Craig Topper3164f332014-03-11 03:39:26 +00005336 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5337 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005338 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005339 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005340
Torok Edwinb2b37c62009-06-30 17:10:35 +00005341public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005342 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005343 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005344 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005345 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005346 // FIXME: This should be based off of the target features in
5347 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005348 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005349
Tim Northoverd88ecb32016-01-27 19:32:40 +00005350 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005351 // Darwin on iOS uses a variant of the ARM C++ ABI.
5352 TheCXXABI.set(TargetCXXABI::WatchOS);
5353
5354 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5355 // size_t is long, it's a bit weird for it to be int.
5356 PtrDiffType = SignedLong;
5357
5358 // BOOL should be a real boolean on the new ABI
5359 UseSignedCharForObjCBool = false;
5360 } else
5361 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005362 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005363};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005364
Tim Northover573cbee2014-05-24 12:52:07 +00005365class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005366 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005367 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5368 static const char *const GCCRegNames[];
5369
James Molloy75f5f9e2014-04-16 15:33:48 +00005370 enum FPUModeEnum {
5371 FPUMode,
5372 NeonMode
5373 };
5374
5375 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005376 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005377 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005378 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005379 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005380
Tim Northovera2ee4332014-03-29 15:09:45 +00005381 static const Builtin::Info BuiltinInfo[];
5382
5383 std::string ABI;
5384
5385public:
Tim Northover573cbee2014-05-24 12:52:07 +00005386 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005387 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005388
5389 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5390 WCharType = SignedInt;
5391
5392 // NetBSD apparently prefers consistency across ARM targets to consistency
5393 // across 64-bit targets.
5394 Int64Type = SignedLongLong;
5395 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005396 } else {
5397 WCharType = UnsignedInt;
5398 Int64Type = SignedLong;
5399 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005400 }
5401
Tim Northovera2ee4332014-03-29 15:09:45 +00005402 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005403 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005404 MaxAtomicInlineWidth = 128;
5405 MaxAtomicPromoteWidth = 128;
5406
Tim Northovera6a19f12015-02-06 01:25:07 +00005407 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005408 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5409
Tim Northovera2ee4332014-03-29 15:09:45 +00005410 // {} in inline assembly are neon specifiers, not assembly variant
5411 // specifiers.
5412 NoAsmVariants = true;
5413
Tim Northover7ad87af2015-01-16 18:44:04 +00005414 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5415 // contributes to the alignment of the containing aggregate in the same way
5416 // a plain (non bit-field) member of that type would, without exception for
5417 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005418 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005419 UseZeroLengthBitfieldAlignment = true;
5420
Tim Northover573cbee2014-05-24 12:52:07 +00005421 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005422 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5423 }
5424
Alp Toker4925ba72014-06-07 23:30:42 +00005425 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005426 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005427 if (Name != "aapcs" && Name != "darwinpcs")
5428 return false;
5429
5430 ABI = Name;
5431 return true;
5432 }
5433
David Blaikie1cbb9712014-11-14 19:09:44 +00005434 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005435 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005436 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005437 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5438 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005439 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005440 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005441 .Default(false);
5442 return CPUKnown;
5443 }
5444
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005445 void getTargetDefines(const LangOptions &Opts,
5446 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005447 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005448 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005449
5450 // Target properties.
5451 Builder.defineMacro("_LP64");
5452 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005453
5454 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5455 Builder.defineMacro("__ARM_ACLE", "200");
5456 Builder.defineMacro("__ARM_ARCH", "8");
5457 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5458
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005459 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005460 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005461 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005462
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005463 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5464 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5465 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5466 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005467 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005468 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5469 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005470
5471 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5472
5473 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005474 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005475
5476 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5477 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005478 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5479 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005480
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005481 if (Opts.UnsafeFPMath)
5482 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005483
5484 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5485
5486 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5487 Opts.ShortEnums ? "1" : "4");
5488
James Molloy75f5f9e2014-04-16 15:33:48 +00005489 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005490 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005491 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005492 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005493 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005494
Bradley Smith418c5932014-05-02 15:17:51 +00005495 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005496 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005497
James Molloy75f5f9e2014-04-16 15:33:48 +00005498 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005499 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5500
5501 if (Unaligned)
5502 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005503
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005504 if (V8_1A)
5505 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5506
Reid Klecknerd167d422015-05-06 15:31:46 +00005507 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5508 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5509 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5510 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5511 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005512 }
5513
Craig Topper6c03a542015-10-19 04:51:35 +00005514 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5515 return llvm::makeArrayRef(BuiltinInfo,
5516 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005517 }
5518
David Blaikie1cbb9712014-11-14 19:09:44 +00005519 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005520 return Feature == "aarch64" ||
5521 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005522 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005523 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005524 }
5525
James Molloy5e73df52014-04-16 15:06:20 +00005526 bool handleTargetFeatures(std::vector<std::string> &Features,
5527 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005528 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005529 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005530 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005531 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005532 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005533
Eric Christopher610fe112015-08-26 08:21:55 +00005534 for (const auto &Feature : Features) {
5535 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005536 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005537 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005538 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005539 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005540 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005541 if (Feature == "+strict-align")
5542 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005543 if (Feature == "+v8.1a")
5544 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005545 }
5546
James Y Knightb214cbc2016-03-04 19:00:41 +00005547 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005548
5549 return true;
5550 }
5551
John McCall477f2bb2016-03-03 06:39:32 +00005552 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5553 switch (CC) {
5554 case CC_C:
5555 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005556 case CC_PreserveMost:
5557 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005558 return CCCR_OK;
5559 default:
5560 return CCCR_Warning;
5561 }
5562 }
5563
David Blaikie1cbb9712014-11-14 19:09:44 +00005564 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005565
David Blaikie1cbb9712014-11-14 19:09:44 +00005566 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005567 return TargetInfo::AArch64ABIBuiltinVaList;
5568 }
5569
Craig Topperf054e3a2015-10-19 03:52:27 +00005570 ArrayRef<const char *> getGCCRegNames() const override;
5571 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005572
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005573 bool validateAsmConstraint(const char *&Name,
5574 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005575 switch (*Name) {
5576 default:
5577 return false;
5578 case 'w': // Floating point and SIMD registers (V0-V31)
5579 Info.setAllowsRegister();
5580 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005581 case 'I': // Constant that can be used with an ADD instruction
5582 case 'J': // Constant that can be used with a SUB instruction
5583 case 'K': // Constant that can be used with a 32-bit logical instruction
5584 case 'L': // Constant that can be used with a 64-bit logical instruction
5585 case 'M': // Constant that can be used as a 32-bit MOV immediate
5586 case 'N': // Constant that can be used as a 64-bit MOV immediate
5587 case 'Y': // Floating point constant zero
5588 case 'Z': // Integer constant zero
5589 return true;
5590 case 'Q': // A memory reference with base register and no offset
5591 Info.setAllowsMemory();
5592 return true;
5593 case 'S': // A symbolic address
5594 Info.setAllowsRegister();
5595 return true;
5596 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005597 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5598 // Utf: A memory address suitable for ldp/stp in TF mode.
5599 // Usa: An absolute symbolic address.
5600 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5601 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005602 case 'z': // Zero register, wzr or xzr
5603 Info.setAllowsRegister();
5604 return true;
5605 case 'x': // Floating point and SIMD registers (V0-V15)
5606 Info.setAllowsRegister();
5607 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005608 }
5609 return false;
5610 }
5611
Akira Hatanaka987f1862014-08-22 06:05:21 +00005612 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005613 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005614 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005615 // Strip off constraint modifiers.
5616 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5617 Constraint = Constraint.substr(1);
5618
5619 switch (Constraint[0]) {
5620 default:
5621 return true;
5622 case 'z':
5623 case 'r': {
5624 switch (Modifier) {
5625 case 'x':
5626 case 'w':
5627 // For now assume that the person knows what they're
5628 // doing with the modifier.
5629 return true;
5630 default:
5631 // By default an 'r' constraint will be in the 'x'
5632 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005633 if (Size == 64)
5634 return true;
5635
5636 SuggestedModifier = "w";
5637 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005638 }
5639 }
5640 }
5641 }
5642
David Blaikie1cbb9712014-11-14 19:09:44 +00005643 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005644
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005645 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005646 if (RegNo == 0)
5647 return 0;
5648 if (RegNo == 1)
5649 return 1;
5650 return -1;
5651 }
5652};
5653
Tim Northover573cbee2014-05-24 12:52:07 +00005654const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005655 // 32-bit Integer registers
5656 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5657 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5658 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5659
5660 // 64-bit Integer registers
5661 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5662 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5663 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5664
5665 // 32-bit floating point regsisters
5666 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5667 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5668 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5669
5670 // 64-bit floating point regsisters
5671 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5672 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5673 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5674
5675 // Vector registers
5676 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5677 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5678 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5679};
5680
Craig Topperf054e3a2015-10-19 03:52:27 +00005681ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5682 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005683}
5684
Tim Northover573cbee2014-05-24 12:52:07 +00005685const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005686 { { "w31" }, "wsp" },
5687 { { "x29" }, "fp" },
5688 { { "x30" }, "lr" },
5689 { { "x31" }, "sp" },
5690 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5691 // don't want to substitute one of these for a different-sized one.
5692};
5693
Craig Topperf054e3a2015-10-19 03:52:27 +00005694ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5695 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005696}
5697
Tim Northover573cbee2014-05-24 12:52:07 +00005698const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005699#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005700 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005701#include "clang/Basic/BuiltinsNEON.def"
5702
5703#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005704 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005705#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005706};
James Molloy5e73df52014-04-16 15:06:20 +00005707
Tim Northover573cbee2014-05-24 12:52:07 +00005708class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005709 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005710 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005711 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005712 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005713 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005714 }
5715
5716public:
Tim Northover573cbee2014-05-24 12:52:07 +00005717 AArch64leTargetInfo(const llvm::Triple &Triple)
5718 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005719 BigEndian = false;
5720 }
5721 void getTargetDefines(const LangOptions &Opts,
5722 MacroBuilder &Builder) const override {
5723 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005724 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005725 }
5726};
5727
Tim Northover573cbee2014-05-24 12:52:07 +00005728class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005729 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005730 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005731 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005732 }
5733
5734public:
Tim Northover573cbee2014-05-24 12:52:07 +00005735 AArch64beTargetInfo(const llvm::Triple &Triple)
5736 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005737 void getTargetDefines(const LangOptions &Opts,
5738 MacroBuilder &Builder) const override {
5739 Builder.defineMacro("__AARCH64EB__");
5740 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5741 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005742 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005743 }
5744};
Tim Northovera2ee4332014-03-29 15:09:45 +00005745
Tim Northover573cbee2014-05-24 12:52:07 +00005746class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005747protected:
5748 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5749 MacroBuilder &Builder) const override {
5750 Builder.defineMacro("__AARCH64_SIMD__");
5751 Builder.defineMacro("__ARM64_ARCH_8__");
5752 Builder.defineMacro("__ARM_NEON__");
5753 Builder.defineMacro("__LITTLE_ENDIAN__");
5754 Builder.defineMacro("__REGISTER_PREFIX__", "");
5755 Builder.defineMacro("__arm64", "1");
5756 Builder.defineMacro("__arm64__", "1");
5757
5758 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5759 }
5760
Tim Northovera2ee4332014-03-29 15:09:45 +00005761public:
Tim Northover573cbee2014-05-24 12:52:07 +00005762 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5763 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005764 Int64Type = SignedLongLong;
5765 WCharType = SignedInt;
5766 UseSignedCharForObjCBool = false;
5767
Tim Northovera6a19f12015-02-06 01:25:07 +00005768 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005769 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5770
5771 TheCXXABI.set(TargetCXXABI::iOS64);
5772 }
5773
David Blaikie1cbb9712014-11-14 19:09:44 +00005774 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005775 return TargetInfo::CharPtrBuiltinVaList;
5776 }
5777};
Tim Northovera2ee4332014-03-29 15:09:45 +00005778
Tony Linthicum76329bf2011-12-12 21:14:55 +00005779// Hexagon abstract base class
5780class HexagonTargetInfo : public TargetInfo {
5781 static const Builtin::Info BuiltinInfo[];
5782 static const char * const GCCRegNames[];
5783 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5784 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005785 bool HasHVX, HasHVXDouble;
5786
Tony Linthicum76329bf2011-12-12 21:14:55 +00005787public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005788 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005789 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005790 // Specify the vector alignment explicitly. For v512x1, the calculated
5791 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5792 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005793 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005794 "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 +00005795 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005796 SizeType = UnsignedInt;
5797 PtrDiffType = SignedInt;
5798 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005799
5800 // {} in inline assembly are packet specifiers, not assembly variant
5801 // specifiers.
5802 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005803
5804 LargeArrayMinWidth = 64;
5805 LargeArrayAlign = 64;
5806 UseBitFieldTypeAlignment = true;
5807 ZeroLengthBitfieldBoundary = 32;
5808 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005809 }
5810
Craig Topper6c03a542015-10-19 04:51:35 +00005811 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5812 return llvm::makeArrayRef(BuiltinInfo,
5813 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005814 }
5815
Craig Topper3164f332014-03-11 03:39:26 +00005816 bool validateAsmConstraint(const char *&Name,
5817 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005818 return true;
5819 }
5820
Craig Topper3164f332014-03-11 03:39:26 +00005821 void getTargetDefines(const LangOptions &Opts,
5822 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005823
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005824 bool isCLZForZeroUndef() const override { return false; }
5825
Craig Topper3164f332014-03-11 03:39:26 +00005826 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005827 return llvm::StringSwitch<bool>(Feature)
5828 .Case("hexagon", true)
5829 .Case("hvx", HasHVX)
5830 .Case("hvx-double", HasHVXDouble)
5831 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005832 }
Craig Topper3164f332014-03-11 03:39:26 +00005833
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005834 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5835 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5836 const override;
5837
5838 bool handleTargetFeatures(std::vector<std::string> &Features,
5839 DiagnosticsEngine &Diags) override;
5840
Craig Topper3164f332014-03-11 03:39:26 +00005841 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005842 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005843 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005844 ArrayRef<const char *> getGCCRegNames() const override;
5845 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005846 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005847 return "";
5848 }
Sebastian Pop86500282012-01-13 20:37:10 +00005849
5850 static const char *getHexagonCPUSuffix(StringRef Name) {
5851 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005852 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005853 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005854 .Case("hexagonv55", "55")
5855 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005856 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005857 }
5858
Craig Topper3164f332014-03-11 03:39:26 +00005859 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005860 if (!getHexagonCPUSuffix(Name))
5861 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005862 CPU = Name;
5863 return true;
5864 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005865
5866 int getEHDataRegisterNumber(unsigned RegNo) const override {
5867 return RegNo < 2 ? RegNo : -1;
5868 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005869};
5870
5871void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005872 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005873 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005874 Builder.defineMacro("__hexagon__", "1");
5875
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005876 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005877 Builder.defineMacro("__HEXAGON_V4__");
5878 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005879 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005880 Builder.defineMacro("__QDSP6_V4__");
5881 Builder.defineMacro("__QDSP6_ARCH__", "4");
5882 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005883 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005884 Builder.defineMacro("__HEXAGON_V5__");
5885 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5886 if(Opts.HexagonQdsp6Compat) {
5887 Builder.defineMacro("__QDSP6_V5__");
5888 Builder.defineMacro("__QDSP6_ARCH__", "5");
5889 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005890 } else if (CPU == "hexagonv60") {
5891 Builder.defineMacro("__HEXAGON_V60__");
5892 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5893 Builder.defineMacro("__QDSP6_V60__");
5894 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005895 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005896}
5897
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005898bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5899 DiagnosticsEngine &Diags) {
5900 for (auto &F : Features) {
5901 if (F == "+hvx")
5902 HasHVX = true;
5903 else if (F == "-hvx")
5904 HasHVX = HasHVXDouble = false;
5905 else if (F == "+hvx-double")
5906 HasHVX = HasHVXDouble = true;
5907 else if (F == "-hvx-double")
5908 HasHVXDouble = false;
5909 }
5910 return true;
5911}
5912
5913bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5914 DiagnosticsEngine &Diags, StringRef CPU,
5915 const std::vector<std::string> &FeaturesVec) const {
5916 // Default for v60: -hvx, -hvx-double.
5917 Features["hvx"] = false;
5918 Features["hvx-double"] = false;
5919
5920 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5921}
5922
5923
5924const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005925 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5926 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5927 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5928 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5929 "p0", "p1", "p2", "p3",
5930 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5931};
5932
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005933ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005934 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005935}
5936
Tony Linthicum76329bf2011-12-12 21:14:55 +00005937const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5938 { { "sp" }, "r29" },
5939 { { "fp" }, "r30" },
5940 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005941};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005942
Craig Topperf054e3a2015-10-19 03:52:27 +00005943ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5944 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005945}
5946
5947
5948const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005949#define BUILTIN(ID, TYPE, ATTRS) \
5950 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5951#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5952 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005953#include "clang/Basic/BuiltinsHexagon.def"
5954};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005955
Jacques Pienaard964cc22016-03-28 21:02:54 +00005956class LanaiTargetInfo : public TargetInfo {
5957 // Class for Lanai (32-bit).
5958 // The CPU profiles supported by the Lanai backend
5959 enum CPUKind {
5960 CK_NONE,
5961 CK_V11,
5962 } CPU;
5963
5964 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5965 static const char *const GCCRegNames[];
5966
5967public:
5968 LanaiTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5969 // Description string has to be kept in sync with backend.
5970 resetDataLayout("E" // Big endian
5971 "-m:e" // ELF name manging
5972 "-p:32:32" // 32 bit pointers, 32 bit aligned
5973 "-i64:64" // 64 bit integers, 64 bit aligned
5974 "-a:0:32" // 32 bit alignment of objects of aggregate type
5975 "-n32" // 32 bit native integer width
5976 "-S64" // 64 bit natural stack alignment
5977 );
5978
5979 // Setting RegParmMax equal to what mregparm was set to in the old
5980 // toolchain
5981 RegParmMax = 4;
5982
5983 // Set the default CPU to V11
5984 CPU = CK_V11;
5985
5986 // Temporary approach to make everything at least word-aligned and allow for
5987 // safely casting between pointers with different alignment requirements.
5988 // TODO: Remove this when there are no more cast align warnings on the
5989 // firmware.
5990 MinGlobalAlign = 32;
5991 }
5992
5993 void getTargetDefines(const LangOptions &Opts,
5994 MacroBuilder &Builder) const override {
5995 // Define __lanai__ when building for target lanai.
5996 Builder.defineMacro("__lanai__");
5997
5998 // Set define for the CPU specified.
5999 switch (CPU) {
6000 case CK_V11:
6001 Builder.defineMacro("__LANAI_V11__");
6002 break;
6003 case CK_NONE:
6004 llvm_unreachable("Unhandled target CPU");
6005 }
6006 }
6007
6008 bool setCPU(const std::string &Name) override {
6009 CPU = llvm::StringSwitch<CPUKind>(Name)
6010 .Case("v11", CK_V11)
6011 .Default(CK_NONE);
6012
6013 return CPU != CK_NONE;
6014 }
6015
6016 bool hasFeature(StringRef Feature) const override {
6017 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6018 }
6019
6020 ArrayRef<const char *> getGCCRegNames() const override;
6021
6022 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6023
6024 BuiltinVaListKind getBuiltinVaListKind() const override {
6025 return TargetInfo::VoidPtrBuiltinVaList;
6026 }
6027
6028 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6029
6030 bool validateAsmConstraint(const char *&Name,
6031 TargetInfo::ConstraintInfo &info) const override {
6032 return false;
6033 }
6034
6035 const char *getClobbers() const override { return ""; }
6036};
6037
6038const char *const LanaiTargetInfo::GCCRegNames[] = {
6039 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6040 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6041 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6042
6043ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6044 return llvm::makeArrayRef(GCCRegNames);
6045}
6046
6047const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6048 {{"pc"}, "r2"},
6049 {{"sp"}, "r4"},
6050 {{"fp"}, "r5"},
6051 {{"rv"}, "r8"},
6052 {{"rr1"}, "r10"},
6053 {{"rr2"}, "r11"},
6054 {{"rca"}, "r15"},
6055};
6056
6057ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6058 return llvm::makeArrayRef(GCCRegAliases);
6059}
6060
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006061// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6062class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006063 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6064 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006065 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006066public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00006067 SparcTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +00006068 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006069
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006070 int getEHDataRegisterNumber(unsigned RegNo) const override {
6071 if (RegNo == 0) return 24;
6072 if (RegNo == 1) return 25;
6073 return -1;
6074 }
6075
Craig Topper3164f332014-03-11 03:39:26 +00006076 bool handleTargetFeatures(std::vector<std::string> &Features,
6077 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006078 // The backend doesn't actually handle soft float yet, but in case someone
6079 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006080 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6081 if (Feature != Features.end()) {
6082 SoftFloat = true;
6083 Features.erase(Feature);
6084 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006085 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006086 }
Craig Topper3164f332014-03-11 03:39:26 +00006087 void getTargetDefines(const LangOptions &Opts,
6088 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006089 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006090 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006091
6092 if (SoftFloat)
6093 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006094 }
Craig Topper3164f332014-03-11 03:39:26 +00006095
6096 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006097 return llvm::StringSwitch<bool>(Feature)
6098 .Case("softfloat", SoftFloat)
6099 .Case("sparc", true)
6100 .Default(false);
6101 }
Craig Topper3164f332014-03-11 03:39:26 +00006102
Craig Topper6c03a542015-10-19 04:51:35 +00006103 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006104 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006105 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006106 }
Craig Topper3164f332014-03-11 03:39:26 +00006107 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006108 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006109 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006110 ArrayRef<const char *> getGCCRegNames() const override;
6111 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006112 bool validateAsmConstraint(const char *&Name,
6113 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006114 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006115 switch (*Name) {
6116 case 'I': // Signed 13-bit constant
6117 case 'J': // Zero
6118 case 'K': // 32-bit constant with the low 12 bits clear
6119 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6120 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6121 case 'N': // Same as 'K' but zext (required for SIMode)
6122 case 'O': // The constant 4096
6123 return true;
6124 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006125 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006126 }
Craig Topper3164f332014-03-11 03:39:26 +00006127 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006128 // FIXME: Implement!
6129 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006130 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006131
6132 // No Sparc V7 for now, the backend doesn't support it anyway.
6133 enum CPUKind {
6134 CK_GENERIC,
6135 CK_V8,
6136 CK_SUPERSPARC,
6137 CK_SPARCLITE,
6138 CK_F934,
6139 CK_HYPERSPARC,
6140 CK_SPARCLITE86X,
6141 CK_SPARCLET,
6142 CK_TSC701,
6143 CK_V9,
6144 CK_ULTRASPARC,
6145 CK_ULTRASPARC3,
6146 CK_NIAGARA,
6147 CK_NIAGARA2,
6148 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006149 CK_NIAGARA4,
6150 CK_MYRIAD2_1,
6151 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006152 } CPU = CK_GENERIC;
6153
6154 enum CPUGeneration {
6155 CG_V8,
6156 CG_V9,
6157 };
6158
6159 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6160 switch (Kind) {
6161 case CK_GENERIC:
6162 case CK_V8:
6163 case CK_SUPERSPARC:
6164 case CK_SPARCLITE:
6165 case CK_F934:
6166 case CK_HYPERSPARC:
6167 case CK_SPARCLITE86X:
6168 case CK_SPARCLET:
6169 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006170 case CK_MYRIAD2_1:
6171 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006172 return CG_V8;
6173 case CK_V9:
6174 case CK_ULTRASPARC:
6175 case CK_ULTRASPARC3:
6176 case CK_NIAGARA:
6177 case CK_NIAGARA2:
6178 case CK_NIAGARA3:
6179 case CK_NIAGARA4:
6180 return CG_V9;
6181 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006182 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006183 }
6184
6185 CPUKind getCPUKind(StringRef Name) const {
6186 return llvm::StringSwitch<CPUKind>(Name)
6187 .Case("v8", CK_V8)
6188 .Case("supersparc", CK_SUPERSPARC)
6189 .Case("sparclite", CK_SPARCLITE)
6190 .Case("f934", CK_F934)
6191 .Case("hypersparc", CK_HYPERSPARC)
6192 .Case("sparclite86x", CK_SPARCLITE86X)
6193 .Case("sparclet", CK_SPARCLET)
6194 .Case("tsc701", CK_TSC701)
6195 .Case("v9", CK_V9)
6196 .Case("ultrasparc", CK_ULTRASPARC)
6197 .Case("ultrasparc3", CK_ULTRASPARC3)
6198 .Case("niagara", CK_NIAGARA)
6199 .Case("niagara2", CK_NIAGARA2)
6200 .Case("niagara3", CK_NIAGARA3)
6201 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006202 .Case("myriad2", CK_MYRIAD2_1)
6203 .Case("myriad2.1", CK_MYRIAD2_1)
6204 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006205 .Default(CK_GENERIC);
6206 }
6207
6208 bool setCPU(const std::string &Name) override {
6209 CPU = getCPUKind(Name);
6210 return CPU != CK_GENERIC;
6211 }
Gabor Greif49991682008-02-21 16:29:08 +00006212};
6213
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006214const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006215 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6216 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6217 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6218 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6219};
6220
Craig Topperf054e3a2015-10-19 03:52:27 +00006221ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6222 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006223}
6224
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006225const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006226 { { "g0" }, "r0" },
6227 { { "g1" }, "r1" },
6228 { { "g2" }, "r2" },
6229 { { "g3" }, "r3" },
6230 { { "g4" }, "r4" },
6231 { { "g5" }, "r5" },
6232 { { "g6" }, "r6" },
6233 { { "g7" }, "r7" },
6234 { { "o0" }, "r8" },
6235 { { "o1" }, "r9" },
6236 { { "o2" }, "r10" },
6237 { { "o3" }, "r11" },
6238 { { "o4" }, "r12" },
6239 { { "o5" }, "r13" },
6240 { { "o6", "sp" }, "r14" },
6241 { { "o7" }, "r15" },
6242 { { "l0" }, "r16" },
6243 { { "l1" }, "r17" },
6244 { { "l2" }, "r18" },
6245 { { "l3" }, "r19" },
6246 { { "l4" }, "r20" },
6247 { { "l5" }, "r21" },
6248 { { "l6" }, "r22" },
6249 { { "l7" }, "r23" },
6250 { { "i0" }, "r24" },
6251 { { "i1" }, "r25" },
6252 { { "i2" }, "r26" },
6253 { { "i3" }, "r27" },
6254 { { "i4" }, "r28" },
6255 { { "i5" }, "r29" },
6256 { { "i6", "fp" }, "r30" },
6257 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006258};
6259
Craig Topperf054e3a2015-10-19 03:52:27 +00006260ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6261 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006262}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006263
6264// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6265class SparcV8TargetInfo : public SparcTargetInfo {
6266public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006267 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006268 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006269 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6270 switch (getTriple().getOS()) {
6271 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006272 SizeType = UnsignedInt;
6273 IntPtrType = SignedInt;
6274 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006275 break;
6276 case llvm::Triple::NetBSD:
6277 case llvm::Triple::OpenBSD:
6278 SizeType = UnsignedLong;
6279 IntPtrType = SignedLong;
6280 PtrDiffType = SignedLong;
6281 break;
Brad Smith56495d52015-08-13 22:00:53 +00006282 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006283 }
6284
Craig Topper3164f332014-03-11 03:39:26 +00006285 void getTargetDefines(const LangOptions &Opts,
6286 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006287 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006288 switch (getCPUGeneration(CPU)) {
6289 case CG_V8:
6290 Builder.defineMacro("__sparcv8");
6291 if (getTriple().getOS() != llvm::Triple::Solaris)
6292 Builder.defineMacro("__sparcv8__");
6293 break;
6294 case CG_V9:
6295 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006296 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006297 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006298 Builder.defineMacro("__sparc_v9__");
6299 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006300 break;
6301 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006302 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6303 switch (CPU) {
6304 case CK_MYRIAD2_1:
6305 Builder.defineMacro("__myriad2", "1");
6306 Builder.defineMacro("__myriad2__", "1");
6307 break;
6308 case CK_MYRIAD2_2:
6309 Builder.defineMacro("__myriad2", "2");
6310 Builder.defineMacro("__myriad2__", "2");
6311 break;
6312 default:
6313 break;
6314 }
6315 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006316 }
6317};
6318
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006319// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6320class SparcV8elTargetInfo : public SparcV8TargetInfo {
6321 public:
6322 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006323 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006324 BigEndian = false;
6325 }
6326};
6327
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006328// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6329class SparcV9TargetInfo : public SparcTargetInfo {
6330public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006331 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006332 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006333 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006334 // This is an LP64 platform.
6335 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006336
6337 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006338 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006339 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006340 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006341 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006342 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006343
6344 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6345 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6346 LongDoubleWidth = 128;
6347 LongDoubleAlign = 128;
6348 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006349 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006350 }
6351
Craig Topper3164f332014-03-11 03:39:26 +00006352 void getTargetDefines(const LangOptions &Opts,
6353 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006354 SparcTargetInfo::getTargetDefines(Opts, Builder);
6355 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006356 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006357 // Solaris doesn't need these variants, but the BSDs do.
6358 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006359 Builder.defineMacro("__sparc64__");
6360 Builder.defineMacro("__sparc_v9__");
6361 Builder.defineMacro("__sparcv9__");
6362 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006363 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006364
Craig Topper3164f332014-03-11 03:39:26 +00006365 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006366 if (!SparcTargetInfo::setCPU(Name))
6367 return false;
6368 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006369 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006370};
6371
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006372class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006373 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006374 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006375 std::string CPU;
6376 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006377 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006378
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006379public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006380 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006381 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6382 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006383 IntMaxType = SignedLong;
6384 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006385 TLSSupported = true;
6386 IntWidth = IntAlign = 32;
6387 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6388 PointerWidth = PointerAlign = 64;
6389 LongDoubleWidth = 128;
6390 LongDoubleAlign = 64;
6391 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006392 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006393 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006394 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 +00006395 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6396 }
6397 void getTargetDefines(const LangOptions &Opts,
6398 MacroBuilder &Builder) const override {
6399 Builder.defineMacro("__s390__");
6400 Builder.defineMacro("__s390x__");
6401 Builder.defineMacro("__zarch__");
6402 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006403
6404 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6405 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6406 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6407 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6408
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006409 if (HasTransactionalExecution)
6410 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006411 if (Opts.ZVector)
6412 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006413 }
Craig Topper6c03a542015-10-19 04:51:35 +00006414 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6415 return llvm::makeArrayRef(BuiltinInfo,
6416 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006417 }
6418
Craig Topperf054e3a2015-10-19 03:52:27 +00006419 ArrayRef<const char *> getGCCRegNames() const override;
6420 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006421 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006422 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006423 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006424 bool validateAsmConstraint(const char *&Name,
6425 TargetInfo::ConstraintInfo &info) const override;
6426 const char *getClobbers() const override {
6427 // FIXME: Is this really right?
6428 return "";
6429 }
6430 BuiltinVaListKind getBuiltinVaListKind() const override {
6431 return TargetInfo::SystemZBuiltinVaList;
6432 }
6433 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006434 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006435 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6436 .Case("z10", true)
6437 .Case("z196", true)
6438 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006439 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006440 .Default(false);
6441
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006442 return CPUKnown;
6443 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006444 bool
6445 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6446 StringRef CPU,
6447 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006448 if (CPU == "zEC12")
6449 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006450 if (CPU == "z13") {
6451 Features["transactional-execution"] = true;
6452 Features["vector"] = true;
6453 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006454 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006455 }
6456
6457 bool handleTargetFeatures(std::vector<std::string> &Features,
6458 DiagnosticsEngine &Diags) override {
6459 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006460 for (const auto &Feature : Features) {
6461 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006462 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006463 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006464 HasVector = true;
6465 }
6466 // If we use the vector ABI, vector types are 64-bit aligned.
6467 if (HasVector) {
6468 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006469 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6470 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006471 }
6472 return true;
6473 }
6474
6475 bool hasFeature(StringRef Feature) const override {
6476 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006477 .Case("systemz", true)
6478 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006479 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006480 .Default(false);
6481 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006482
6483 StringRef getABI() const override {
6484 if (HasVector)
6485 return "vector";
6486 return "";
6487 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006488
6489 bool useFloat128ManglingForLongDouble() const override {
6490 return true;
6491 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006492};
6493
6494const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6495#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006496 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006497#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6498 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006499#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006500};
6501
6502const char *const SystemZTargetInfo::GCCRegNames[] = {
6503 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6504 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6505 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6506 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6507};
6508
Craig Topperf054e3a2015-10-19 03:52:27 +00006509ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6510 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006511}
6512
6513bool SystemZTargetInfo::
6514validateAsmConstraint(const char *&Name,
6515 TargetInfo::ConstraintInfo &Info) const {
6516 switch (*Name) {
6517 default:
6518 return false;
6519
6520 case 'a': // Address register
6521 case 'd': // Data register (equivalent to 'r')
6522 case 'f': // Floating-point register
6523 Info.setAllowsRegister();
6524 return true;
6525
6526 case 'I': // Unsigned 8-bit constant
6527 case 'J': // Unsigned 12-bit constant
6528 case 'K': // Signed 16-bit constant
6529 case 'L': // Signed 20-bit displacement (on all targets we support)
6530 case 'M': // 0x7fffffff
6531 return true;
6532
6533 case 'Q': // Memory with base and unsigned 12-bit displacement
6534 case 'R': // Likewise, plus an index
6535 case 'S': // Memory with base and signed 20-bit displacement
6536 case 'T': // Likewise, plus an index
6537 Info.setAllowsMemory();
6538 return true;
6539 }
6540}
Ulrich Weigand47445072013-05-06 16:26:41 +00006541
Eric Christopherc48497a2015-09-18 21:26:24 +00006542class MSP430TargetInfo : public TargetInfo {
6543 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006544
Eric Christopherc48497a2015-09-18 21:26:24 +00006545public:
6546 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6547 BigEndian = false;
6548 TLSSupported = false;
6549 IntWidth = 16;
6550 IntAlign = 16;
6551 LongWidth = 32;
6552 LongLongWidth = 64;
6553 LongAlign = LongLongAlign = 16;
6554 PointerWidth = 16;
6555 PointerAlign = 16;
6556 SuitableAlign = 16;
6557 SizeType = UnsignedInt;
6558 IntMaxType = SignedLongLong;
6559 IntPtrType = SignedInt;
6560 PtrDiffType = SignedInt;
6561 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006562 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006563 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006564 void getTargetDefines(const LangOptions &Opts,
6565 MacroBuilder &Builder) const override {
6566 Builder.defineMacro("MSP430");
6567 Builder.defineMacro("__MSP430__");
6568 // FIXME: defines for different 'flavours' of MCU
6569 }
Craig Topper6c03a542015-10-19 04:51:35 +00006570 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006571 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006572 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006573 }
6574 bool hasFeature(StringRef Feature) const override {
6575 return Feature == "msp430";
6576 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006577 ArrayRef<const char *> getGCCRegNames() const override;
6578 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006579 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006580 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006581 }
6582 bool validateAsmConstraint(const char *&Name,
6583 TargetInfo::ConstraintInfo &info) const override {
6584 // FIXME: implement
6585 switch (*Name) {
6586 case 'K': // the constant 1
6587 case 'L': // constant -1^20 .. 1^19
6588 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006589 return true;
6590 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006591 // No target constraints for now.
6592 return false;
6593 }
6594 const char *getClobbers() const override {
6595 // FIXME: Is this really right?
6596 return "";
6597 }
6598 BuiltinVaListKind getBuiltinVaListKind() const override {
6599 // FIXME: implement
6600 return TargetInfo::CharPtrBuiltinVaList;
6601 }
6602};
6603
6604const char *const MSP430TargetInfo::GCCRegNames[] = {
6605 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6606 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6607
Craig Topperf054e3a2015-10-19 03:52:27 +00006608ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6609 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006610}
6611
6612// LLVM and Clang cannot be used directly to output native binaries for
6613// target, but is used to compile C code to llvm bitcode with correct
6614// type and alignment information.
6615//
6616// TCE uses the llvm bitcode as input and uses it for generating customized
6617// target processor and program binary. TCE co-design environment is
6618// publicly available in http://tce.cs.tut.fi
6619
6620static const unsigned TCEOpenCLAddrSpaceMap[] = {
6621 3, // opencl_global
6622 4, // opencl_local
6623 5, // opencl_constant
6624 // FIXME: generic has to be added to the target
6625 0, // opencl_generic
6626 0, // cuda_device
6627 0, // cuda_constant
6628 0 // cuda_shared
6629};
6630
6631class TCETargetInfo : public TargetInfo {
6632public:
6633 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6634 TLSSupported = false;
6635 IntWidth = 32;
6636 LongWidth = LongLongWidth = 32;
6637 PointerWidth = 32;
6638 IntAlign = 32;
6639 LongAlign = LongLongAlign = 32;
6640 PointerAlign = 32;
6641 SuitableAlign = 32;
6642 SizeType = UnsignedInt;
6643 IntMaxType = SignedLong;
6644 IntPtrType = SignedInt;
6645 PtrDiffType = SignedInt;
6646 FloatWidth = 32;
6647 FloatAlign = 32;
6648 DoubleWidth = 32;
6649 DoubleAlign = 32;
6650 LongDoubleWidth = 32;
6651 LongDoubleAlign = 32;
6652 FloatFormat = &llvm::APFloat::IEEEsingle;
6653 DoubleFormat = &llvm::APFloat::IEEEsingle;
6654 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006655 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6656 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006657 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6658 UseAddrSpaceMapMangling = true;
6659 }
6660
6661 void getTargetDefines(const LangOptions &Opts,
6662 MacroBuilder &Builder) const override {
6663 DefineStd(Builder, "tce", Opts);
6664 Builder.defineMacro("__TCE__");
6665 Builder.defineMacro("__TCE_V1__");
6666 }
6667 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6668
Craig Topper6c03a542015-10-19 04:51:35 +00006669 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006670 const char *getClobbers() const override { return ""; }
6671 BuiltinVaListKind getBuiltinVaListKind() const override {
6672 return TargetInfo::VoidPtrBuiltinVaList;
6673 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006674 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006675 bool validateAsmConstraint(const char *&Name,
6676 TargetInfo::ConstraintInfo &info) const override {
6677 return true;
6678 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006679 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6680 return None;
6681 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006682};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006683
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006684class BPFTargetInfo : public TargetInfo {
6685public:
6686 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6687 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6688 SizeType = UnsignedLong;
6689 PtrDiffType = SignedLong;
6690 IntPtrType = SignedLong;
6691 IntMaxType = SignedLong;
6692 Int64Type = SignedLong;
6693 RegParmMax = 5;
6694 if (Triple.getArch() == llvm::Triple::bpfeb) {
6695 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006696 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006697 } else {
6698 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006699 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006700 }
6701 MaxAtomicPromoteWidth = 64;
6702 MaxAtomicInlineWidth = 64;
6703 TLSSupported = false;
6704 }
6705 void getTargetDefines(const LangOptions &Opts,
6706 MacroBuilder &Builder) const override {
6707 DefineStd(Builder, "bpf", Opts);
6708 Builder.defineMacro("__BPF__");
6709 }
6710 bool hasFeature(StringRef Feature) const override {
6711 return Feature == "bpf";
6712 }
6713
Craig Topper6c03a542015-10-19 04:51:35 +00006714 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006715 const char *getClobbers() const override {
6716 return "";
6717 }
6718 BuiltinVaListKind getBuiltinVaListKind() const override {
6719 return TargetInfo::VoidPtrBuiltinVaList;
6720 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006721 ArrayRef<const char *> getGCCRegNames() const override {
6722 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006723 }
6724 bool validateAsmConstraint(const char *&Name,
6725 TargetInfo::ConstraintInfo &info) const override {
6726 return true;
6727 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006728 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6729 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006730 }
6731};
6732
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006733class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006734 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006735
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006736 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006737 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006738 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006739 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006740 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006741 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006742 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006743 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006744 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006745 enum DspRevEnum {
6746 NoDSP, DSP1, DSP2
6747 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006748 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006749
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006750protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006751 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006752 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006753
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006754public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006755 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6756 const std::string &CPUStr)
6757 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006758 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006759 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6760 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6761 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006762
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006763 bool isNaN2008Default() const {
6764 return CPU == "mips32r6" || CPU == "mips64r6";
6765 }
6766
6767 bool isFP64Default() const {
6768 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6769 }
6770
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006771 bool isNan2008() const override {
6772 return IsNan2008;
6773 }
6774
Alp Toker4925ba72014-06-07 23:30:42 +00006775 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006776 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006777 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6778 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006779 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006780 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006781 .Case("mips1", IsMips32)
6782 .Case("mips2", IsMips32)
6783 .Case("mips3", true)
6784 .Case("mips4", true)
6785 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006786 .Case("mips32", IsMips32)
6787 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006788 .Case("mips32r3", IsMips32)
6789 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006790 .Case("mips32r6", IsMips32)
6791 .Case("mips64", true)
6792 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006793 .Case("mips64r3", true)
6794 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006795 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006796 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006797 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006798 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006799 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006800 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006801 bool
6802 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6803 StringRef CPU,
6804 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006805 if (CPU.empty())
6806 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006807 if (CPU == "octeon")
6808 Features["mips64r2"] = Features["cnmips"] = true;
6809 else
6810 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006811 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006812 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006813
Craig Topper3164f332014-03-11 03:39:26 +00006814 void getTargetDefines(const LangOptions &Opts,
6815 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006816 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006817 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006818 if (Opts.GNUMode)
6819 Builder.defineMacro("mips");
6820
Simon Atanasyan683535b2012-08-29 19:14:58 +00006821 Builder.defineMacro("__REGISTER_PREFIX__", "");
6822
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006823 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006824 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006825 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006826 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006827 case SoftFloat:
6828 Builder.defineMacro("__mips_soft_float", Twine(1));
6829 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006830 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006831
Simon Atanasyan16071912013-04-14 14:07:30 +00006832 if (IsSingleFloat)
6833 Builder.defineMacro("__mips_single_float", Twine(1));
6834
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006835 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6836 Builder.defineMacro("_MIPS_FPSET",
6837 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6838
Simon Atanasyan72244b62012-07-05 16:06:06 +00006839 if (IsMips16)
6840 Builder.defineMacro("__mips16", Twine(1));
6841
Simon Atanasyan60777612013-04-14 14:07:51 +00006842 if (IsMicromips)
6843 Builder.defineMacro("__mips_micromips", Twine(1));
6844
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006845 if (IsNan2008)
6846 Builder.defineMacro("__mips_nan2008", Twine(1));
6847
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006848 switch (DspRev) {
6849 default:
6850 break;
6851 case DSP1:
6852 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6853 Builder.defineMacro("__mips_dsp", Twine(1));
6854 break;
6855 case DSP2:
6856 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6857 Builder.defineMacro("__mips_dspr2", Twine(1));
6858 Builder.defineMacro("__mips_dsp", Twine(1));
6859 break;
6860 }
6861
Jack Carter44ff1e52013-08-12 17:20:29 +00006862 if (HasMSA)
6863 Builder.defineMacro("__mips_msa", Twine(1));
6864
Simon Atanasyan26f19672012-04-05 19:28:31 +00006865 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6866 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6867 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006868
6869 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6870 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006871
6872 // These shouldn't be defined for MIPS-I but there's no need to check
6873 // for that since MIPS-I isn't supported.
6874 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6875 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6876 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006877 }
6878
Craig Topper6c03a542015-10-19 04:51:35 +00006879 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6880 return llvm::makeArrayRef(BuiltinInfo,
6881 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006882 }
Craig Topper3164f332014-03-11 03:39:26 +00006883 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006884 return llvm::StringSwitch<bool>(Feature)
6885 .Case("mips", true)
6886 .Case("fp64", HasFP64)
6887 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006888 }
Craig Topper3164f332014-03-11 03:39:26 +00006889 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006890 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006891 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006892 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006893 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006894 // CPU register names
6895 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006896 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6897 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6898 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006899 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6900 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006901 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6902 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6903 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6904 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006905 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006906 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00006907 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
6908 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006909 // MSA register names
6910 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6911 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6912 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6913 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6914 // MSA control register names
6915 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6916 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006917 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006918 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006919 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006920 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006921 bool validateAsmConstraint(const char *&Name,
6922 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006923 switch (*Name) {
6924 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006925 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006926 case 'r': // CPU registers.
6927 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006928 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006929 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006930 case 'c': // $25 for indirect jumps
6931 case 'l': // lo register
6932 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006933 Info.setAllowsRegister();
6934 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006935 case 'I': // Signed 16-bit constant
6936 case 'J': // Integer 0
6937 case 'K': // Unsigned 16-bit constant
6938 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6939 case 'M': // Constants not loadable via lui, addiu, or ori
6940 case 'N': // Constant -1 to -65535
6941 case 'O': // A signed 15-bit constant
6942 case 'P': // A constant between 1 go 65535
6943 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006944 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006945 Info.setAllowsMemory();
6946 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006947 case 'Z':
6948 if (Name[1] == 'C') { // An address usable by ll, and sc.
6949 Info.setAllowsMemory();
6950 Name++; // Skip over 'Z'.
6951 return true;
6952 }
6953 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006954 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006955 }
6956
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006957 std::string convertConstraint(const char *&Constraint) const override {
6958 std::string R;
6959 switch (*Constraint) {
6960 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6961 if (Constraint[1] == 'C') {
6962 R = std::string("^") + std::string(Constraint, 2);
6963 Constraint++;
6964 return R;
6965 }
6966 break;
6967 }
6968 return TargetInfo::convertConstraint(Constraint);
6969 }
6970
Craig Topper3164f332014-03-11 03:39:26 +00006971 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006972 // In GCC, $1 is not widely used in generated code (it's used only in a few
6973 // specific situations), so there is no real need for users to add it to
6974 // the clobbers list if they want to use it in their inline assembly code.
6975 //
6976 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6977 // code generation, so using it in inline assembly without adding it to the
6978 // clobbers list can cause conflicts between the inline assembly code and
6979 // the surrounding generated code.
6980 //
6981 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6982 // operands, which will conflict with the ".set at" assembler option (which
6983 // we use only for inline assembly, in order to maintain compatibility with
6984 // GCC) and will also conflict with the user's usage of $1.
6985 //
6986 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6987 // register for generated code is to automatically clobber $1 for all inline
6988 // assembly code.
6989 //
6990 // FIXME: We should automatically clobber $1 only for inline assembly code
6991 // which actually uses it. This would allow LLVM to use $1 for inline
6992 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006993 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006994 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006995
Craig Topper3164f332014-03-11 03:39:26 +00006996 bool handleTargetFeatures(std::vector<std::string> &Features,
6997 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006998 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006999 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007000 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007001 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007002 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007003 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007004 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007005
Eric Christopher610fe112015-08-26 08:21:55 +00007006 for (const auto &Feature : Features) {
7007 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007008 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007009 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007010 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007011 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007012 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007013 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007014 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007015 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007016 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007017 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007018 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007019 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007020 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007021 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007022 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007023 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007024 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007025 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007026 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007027 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007028 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007029 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007030
James Y Knightb214cbc2016-03-04 19:00:41 +00007031 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007032
Rafael Espindolaeb265472013-08-21 21:59:03 +00007033 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007034 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007035
Craig Topper3164f332014-03-11 03:39:26 +00007036 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007037 if (RegNo == 0) return 4;
7038 if (RegNo == 1) return 5;
7039 return -1;
7040 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007041
7042 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007043};
7044
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007045const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007046#define BUILTIN(ID, TYPE, ATTRS) \
7047 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7048#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7049 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007050#include "clang/Basic/BuiltinsMips.def"
7051};
7052
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007053class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007054public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007055 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00007056 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007057 SizeType = UnsignedInt;
7058 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007059 Int64Type = SignedLongLong;
7060 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007061 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007062 }
Craig Topper3164f332014-03-11 03:39:26 +00007063 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007064 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007065 ABI = Name;
7066 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007067 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007068 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007069 }
Craig Topper3164f332014-03-11 03:39:26 +00007070 void getTargetDefines(const LangOptions &Opts,
7071 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007072 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007073
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007074 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007075 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7076
7077 const std::string& CPUStr = getCPU();
7078 if (CPUStr == "mips32")
7079 Builder.defineMacro("__mips_isa_rev", "1");
7080 else if (CPUStr == "mips32r2")
7081 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007082 else if (CPUStr == "mips32r3")
7083 Builder.defineMacro("__mips_isa_rev", "3");
7084 else if (CPUStr == "mips32r5")
7085 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007086 else if (CPUStr == "mips32r6")
7087 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007088
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007089 if (ABI == "o32") {
7090 Builder.defineMacro("__mips_o32");
7091 Builder.defineMacro("_ABIO32", "1");
7092 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7093 }
7094 else if (ABI == "eabi")
7095 Builder.defineMacro("__mips_eabi");
7096 else
David Blaikie83d382b2011-09-23 05:06:16 +00007097 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007098 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007099 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007100 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7101 { { "at" }, "$1" },
7102 { { "v0" }, "$2" },
7103 { { "v1" }, "$3" },
7104 { { "a0" }, "$4" },
7105 { { "a1" }, "$5" },
7106 { { "a2" }, "$6" },
7107 { { "a3" }, "$7" },
7108 { { "t0" }, "$8" },
7109 { { "t1" }, "$9" },
7110 { { "t2" }, "$10" },
7111 { { "t3" }, "$11" },
7112 { { "t4" }, "$12" },
7113 { { "t5" }, "$13" },
7114 { { "t6" }, "$14" },
7115 { { "t7" }, "$15" },
7116 { { "s0" }, "$16" },
7117 { { "s1" }, "$17" },
7118 { { "s2" }, "$18" },
7119 { { "s3" }, "$19" },
7120 { { "s4" }, "$20" },
7121 { { "s5" }, "$21" },
7122 { { "s6" }, "$22" },
7123 { { "s7" }, "$23" },
7124 { { "t8" }, "$24" },
7125 { { "t9" }, "$25" },
7126 { { "k0" }, "$26" },
7127 { { "k1" }, "$27" },
7128 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007129 { { "sp","$sp" }, "$29" },
7130 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007131 { { "ra" }, "$31" }
7132 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007133 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007134 }
7135};
7136
7137class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007138 void setDataLayout() override {
7139 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007140 }
7141
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007142public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007143 Mips32EBTargetInfo(const llvm::Triple &Triple)
7144 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007145 }
Craig Topper3164f332014-03-11 03:39:26 +00007146 void getTargetDefines(const LangOptions &Opts,
7147 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007148 DefineStd(Builder, "MIPSEB", Opts);
7149 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007150 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007151 }
7152};
7153
7154class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007155 void setDataLayout() override {
7156 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007157 }
7158
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007159public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007160 Mips32ELTargetInfo(const llvm::Triple &Triple)
7161 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007162 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007163 }
Craig Topper3164f332014-03-11 03:39:26 +00007164 void getTargetDefines(const LangOptions &Opts,
7165 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007166 DefineStd(Builder, "MIPSEL", Opts);
7167 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007168 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007169 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007170};
Akira Hatanakabef17452011-09-20 19:21:49 +00007171
7172class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007173public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007174 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00007175 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007176 LongDoubleWidth = LongDoubleAlign = 128;
7177 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007178 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7179 LongDoubleWidth = LongDoubleAlign = 64;
7180 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7181 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007182 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007183 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007184 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007185 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007186
7187 void setN64ABITypes() {
7188 LongWidth = LongAlign = 64;
7189 PointerWidth = PointerAlign = 64;
7190 SizeType = UnsignedLong;
7191 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007192 Int64Type = SignedLong;
7193 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007194 }
7195
7196 void setN32ABITypes() {
7197 LongWidth = LongAlign = 32;
7198 PointerWidth = PointerAlign = 32;
7199 SizeType = UnsignedInt;
7200 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007201 Int64Type = SignedLongLong;
7202 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007203 }
7204
Craig Topper3164f332014-03-11 03:39:26 +00007205 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007206 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007207 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007208 ABI = Name;
7209 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007210 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007211 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007212 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007213 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007214 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007215 }
7216 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007217 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007218
Craig Topper3164f332014-03-11 03:39:26 +00007219 void getTargetDefines(const LangOptions &Opts,
7220 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007221 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007222
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007223 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007224 Builder.defineMacro("__mips64");
7225 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007226 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7227
7228 const std::string& CPUStr = getCPU();
7229 if (CPUStr == "mips64")
7230 Builder.defineMacro("__mips_isa_rev", "1");
7231 else if (CPUStr == "mips64r2")
7232 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007233 else if (CPUStr == "mips64r3")
7234 Builder.defineMacro("__mips_isa_rev", "3");
7235 else if (CPUStr == "mips64r5")
7236 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007237 else if (CPUStr == "mips64r6")
7238 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007239
Akira Hatanakabef17452011-09-20 19:21:49 +00007240 if (ABI == "n32") {
7241 Builder.defineMacro("__mips_n32");
7242 Builder.defineMacro("_ABIN32", "2");
7243 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7244 }
7245 else if (ABI == "n64") {
7246 Builder.defineMacro("__mips_n64");
7247 Builder.defineMacro("_ABI64", "3");
7248 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7249 }
7250 else
David Blaikie83d382b2011-09-23 05:06:16 +00007251 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007252
7253 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007254 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007255 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007256 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7257 { { "at" }, "$1" },
7258 { { "v0" }, "$2" },
7259 { { "v1" }, "$3" },
7260 { { "a0" }, "$4" },
7261 { { "a1" }, "$5" },
7262 { { "a2" }, "$6" },
7263 { { "a3" }, "$7" },
7264 { { "a4" }, "$8" },
7265 { { "a5" }, "$9" },
7266 { { "a6" }, "$10" },
7267 { { "a7" }, "$11" },
7268 { { "t0" }, "$12" },
7269 { { "t1" }, "$13" },
7270 { { "t2" }, "$14" },
7271 { { "t3" }, "$15" },
7272 { { "s0" }, "$16" },
7273 { { "s1" }, "$17" },
7274 { { "s2" }, "$18" },
7275 { { "s3" }, "$19" },
7276 { { "s4" }, "$20" },
7277 { { "s5" }, "$21" },
7278 { { "s6" }, "$22" },
7279 { { "s7" }, "$23" },
7280 { { "t8" }, "$24" },
7281 { { "t9" }, "$25" },
7282 { { "k0" }, "$26" },
7283 { { "k1" }, "$27" },
7284 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007285 { { "sp","$sp" }, "$29" },
7286 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007287 { { "ra" }, "$31" }
7288 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007289 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007290 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007291
7292 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007293};
7294
7295class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007296 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007297 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007298 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 +00007299 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007300 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007301 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007302
Akira Hatanakabef17452011-09-20 19:21:49 +00007303public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007304 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007305 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007306 void getTargetDefines(const LangOptions &Opts,
7307 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007308 DefineStd(Builder, "MIPSEB", Opts);
7309 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007310 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007311 }
7312};
7313
7314class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007315 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007316 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007317 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 +00007318 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007319 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007320 }
7321public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007322 Mips64ELTargetInfo(const llvm::Triple &Triple)
7323 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007324 // Default ABI is n64.
7325 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007326 }
Craig Topper3164f332014-03-11 03:39:26 +00007327 void getTargetDefines(const LangOptions &Opts,
7328 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007329 DefineStd(Builder, "MIPSEL", Opts);
7330 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007331 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007332 }
7333};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007334
Ivan Krasindd7403e2011-08-24 20:22:22 +00007335class PNaClTargetInfo : public TargetInfo {
7336public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007337 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007338 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007339 this->LongAlign = 32;
7340 this->LongWidth = 32;
7341 this->PointerAlign = 32;
7342 this->PointerWidth = 32;
7343 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007344 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007345 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007346 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007347 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007348 this->SizeType = TargetInfo::UnsignedInt;
7349 this->PtrDiffType = TargetInfo::SignedInt;
7350 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007351 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007352 }
7353
Craig Toppere6f17d02014-03-11 04:07:52 +00007354 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007355 Builder.defineMacro("__le32__");
7356 Builder.defineMacro("__pnacl__");
7357 }
Craig Topper3164f332014-03-11 03:39:26 +00007358 void getTargetDefines(const LangOptions &Opts,
7359 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007360 getArchDefines(Opts, Builder);
7361 }
Craig Topper3164f332014-03-11 03:39:26 +00007362 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007363 return Feature == "pnacl";
7364 }
Craig Topper6c03a542015-10-19 04:51:35 +00007365 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007366 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007367 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007368 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007369 ArrayRef<const char *> getGCCRegNames() const override;
7370 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007371 bool validateAsmConstraint(const char *&Name,
7372 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007373 return false;
7374 }
7375
Craig Topper3164f332014-03-11 03:39:26 +00007376 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007377 return "";
7378 }
7379};
7380
Craig Topperf054e3a2015-10-19 03:52:27 +00007381ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7382 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007383}
7384
Craig Topperf054e3a2015-10-19 03:52:27 +00007385ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7386 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007387}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007388
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007389// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7390class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7391public:
7392 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007393 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007394 }
7395
7396 BuiltinVaListKind getBuiltinVaListKind() const override {
7397 return TargetInfo::PNaClABIBuiltinVaList;
7398 }
7399};
7400
JF Bastien643817d2014-09-12 17:52:47 +00007401class Le64TargetInfo : public TargetInfo {
7402 static const Builtin::Info BuiltinInfo[];
7403
7404public:
7405 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7406 BigEndian = false;
7407 NoAsmVariants = true;
7408 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7409 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007410 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007411 }
7412
7413 void getTargetDefines(const LangOptions &Opts,
7414 MacroBuilder &Builder) const override {
7415 DefineStd(Builder, "unix", Opts);
7416 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7417 Builder.defineMacro("__ELF__");
7418 }
Craig Topper6c03a542015-10-19 04:51:35 +00007419 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7420 return llvm::makeArrayRef(BuiltinInfo,
7421 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007422 }
7423 BuiltinVaListKind getBuiltinVaListKind() const override {
7424 return TargetInfo::PNaClABIBuiltinVaList;
7425 }
7426 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007427 ArrayRef<const char *> getGCCRegNames() const override {
7428 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007429 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007430 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7431 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007432 }
7433 bool validateAsmConstraint(const char *&Name,
7434 TargetInfo::ConstraintInfo &Info) const override {
7435 return false;
7436 }
7437
7438 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007439};
Dan Gohmanc2853072015-09-03 22:51:53 +00007440
7441class WebAssemblyTargetInfo : public TargetInfo {
7442 static const Builtin::Info BuiltinInfo[];
7443
7444 enum SIMDEnum {
7445 NoSIMD,
7446 SIMD128,
7447 } SIMDLevel;
7448
7449public:
7450 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7451 : TargetInfo(T), SIMDLevel(NoSIMD) {
7452 BigEndian = false;
7453 NoAsmVariants = true;
7454 SuitableAlign = 128;
7455 LargeArrayMinWidth = 128;
7456 LargeArrayAlign = 128;
7457 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007458 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007459 LongDoubleWidth = LongDoubleAlign = 128;
7460 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007461 }
7462
7463protected:
7464 void getTargetDefines(const LangOptions &Opts,
7465 MacroBuilder &Builder) const override {
7466 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7467 if (SIMDLevel >= SIMD128)
7468 Builder.defineMacro("__wasm_simd128__");
7469 }
7470
7471private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007472 bool
7473 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7474 StringRef CPU,
7475 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007476 if (CPU == "bleeding-edge")
7477 Features["simd128"] = true;
7478 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7479 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007480 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007481 return llvm::StringSwitch<bool>(Feature)
7482 .Case("simd128", SIMDLevel >= SIMD128)
7483 .Default(false);
7484 }
7485 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007486 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007487 for (const auto &Feature : Features) {
7488 if (Feature == "+simd128") {
7489 SIMDLevel = std::max(SIMDLevel, SIMD128);
7490 continue;
7491 }
7492 if (Feature == "-simd128") {
7493 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7494 continue;
7495 }
7496
7497 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7498 << "-target-feature";
7499 return false;
7500 }
7501 return true;
7502 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007503 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007504 return llvm::StringSwitch<bool>(Name)
7505 .Case("mvp", true)
7506 .Case("bleeding-edge", true)
7507 .Case("generic", true)
7508 .Default(false);
7509 }
Craig Topper6c03a542015-10-19 04:51:35 +00007510 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7511 return llvm::makeArrayRef(BuiltinInfo,
7512 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007513 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007514 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007515 return VoidPtrBuiltinVaList;
7516 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007517 ArrayRef<const char *> getGCCRegNames() const final {
7518 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007519 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007520 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7521 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007522 }
7523 bool
7524 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007525 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007526 return false;
7527 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007528 const char *getClobbers() const final { return ""; }
7529 bool isCLZForZeroUndef() const final { return false; }
7530 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007531 IntType getIntTypeByWidth(unsigned BitWidth,
7532 bool IsSigned) const final {
7533 // WebAssembly prefers long long for explicitly 64-bit integers.
7534 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7535 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7536 }
7537 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7538 bool IsSigned) const final {
7539 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7540 return BitWidth == 64
7541 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7542 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7543 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007544};
7545
7546const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7547#define BUILTIN(ID, TYPE, ATTRS) \
7548 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7549#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7550 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7551#include "clang/Basic/BuiltinsWebAssembly.def"
7552};
7553
7554class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7555public:
7556 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7557 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007558 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007559 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007560 }
7561
7562protected:
7563 void getTargetDefines(const LangOptions &Opts,
7564 MacroBuilder &Builder) const override {
7565 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7566 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7567 }
7568};
7569
7570class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7571public:
7572 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7573 : WebAssemblyTargetInfo(T) {
7574 LongAlign = LongWidth = 64;
7575 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007576 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007577 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007578 }
7579
7580protected:
7581 void getTargetDefines(const LangOptions &Opts,
7582 MacroBuilder &Builder) const override {
7583 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7584 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7585 }
7586};
7587
JF Bastien643817d2014-09-12 17:52:47 +00007588const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7589#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007590 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007591#include "clang/Basic/BuiltinsLe64.def"
7592};
7593
Eric Christopherc48497a2015-09-18 21:26:24 +00007594static const unsigned SPIRAddrSpaceMap[] = {
7595 1, // opencl_global
7596 3, // opencl_local
7597 2, // opencl_constant
7598 4, // opencl_generic
7599 0, // cuda_device
7600 0, // cuda_constant
7601 0 // cuda_shared
7602};
7603class SPIRTargetInfo : public TargetInfo {
7604public:
7605 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7606 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7607 "SPIR target must use unknown OS");
7608 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7609 "SPIR target must use unknown environment type");
7610 BigEndian = false;
7611 TLSSupported = false;
7612 LongWidth = LongAlign = 64;
7613 AddrSpaceMap = &SPIRAddrSpaceMap;
7614 UseAddrSpaceMapMangling = true;
7615 // Define available target features
7616 // These must be defined in sorted order!
7617 NoAsmVariants = true;
7618 }
7619 void getTargetDefines(const LangOptions &Opts,
7620 MacroBuilder &Builder) const override {
7621 DefineStd(Builder, "SPIR", Opts);
7622 }
7623 bool hasFeature(StringRef Feature) const override {
7624 return Feature == "spir";
7625 }
Craig Topper3164f332014-03-11 03:39:26 +00007626
Craig Topper6c03a542015-10-19 04:51:35 +00007627 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007628 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007629 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007630 bool validateAsmConstraint(const char *&Name,
7631 TargetInfo::ConstraintInfo &info) const override {
7632 return true;
7633 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007634 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7635 return None;
7636 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007637 BuiltinVaListKind getBuiltinVaListKind() const override {
7638 return TargetInfo::VoidPtrBuiltinVaList;
7639 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007640
Eric Christopherc48497a2015-09-18 21:26:24 +00007641 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7642 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7643 : CCCR_Warning;
7644 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007645
Eric Christopherc48497a2015-09-18 21:26:24 +00007646 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7647 return CC_SpirFunction;
7648 }
7649};
Guy Benyeib798fc92012-12-11 21:38:14 +00007650
Eric Christopherc48497a2015-09-18 21:26:24 +00007651class SPIR32TargetInfo : public SPIRTargetInfo {
7652public:
7653 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7654 PointerWidth = PointerAlign = 32;
7655 SizeType = TargetInfo::UnsignedInt;
7656 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007657 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7658 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007659 }
7660 void getTargetDefines(const LangOptions &Opts,
7661 MacroBuilder &Builder) const override {
7662 DefineStd(Builder, "SPIR32", Opts);
7663 }
7664};
Guy Benyeib798fc92012-12-11 21:38:14 +00007665
Eric Christopherc48497a2015-09-18 21:26:24 +00007666class SPIR64TargetInfo : public SPIRTargetInfo {
7667public:
7668 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7669 PointerWidth = PointerAlign = 64;
7670 SizeType = TargetInfo::UnsignedLong;
7671 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007672 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7673 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007674 }
7675 void getTargetDefines(const LangOptions &Opts,
7676 MacroBuilder &Builder) const override {
7677 DefineStd(Builder, "SPIR64", Opts);
7678 }
7679};
Guy Benyeib798fc92012-12-11 21:38:14 +00007680
Robert Lytton0e076492013-08-13 09:43:10 +00007681class XCoreTargetInfo : public TargetInfo {
7682 static const Builtin::Info BuiltinInfo[];
7683public:
7684 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7685 BigEndian = false;
7686 NoAsmVariants = true;
7687 LongLongAlign = 32;
7688 SuitableAlign = 32;
7689 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007690 SizeType = UnsignedInt;
7691 PtrDiffType = SignedInt;
7692 IntPtrType = SignedInt;
7693 WCharType = UnsignedChar;
7694 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007695 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007696 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7697 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007698 }
Craig Topper3164f332014-03-11 03:39:26 +00007699 void getTargetDefines(const LangOptions &Opts,
7700 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007701 Builder.defineMacro("__XS1B__");
7702 }
Craig Topper6c03a542015-10-19 04:51:35 +00007703 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7704 return llvm::makeArrayRef(BuiltinInfo,
7705 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007706 }
Craig Topper3164f332014-03-11 03:39:26 +00007707 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007708 return TargetInfo::VoidPtrBuiltinVaList;
7709 }
Craig Topper3164f332014-03-11 03:39:26 +00007710 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007711 return "";
7712 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007713 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007714 static const char * const GCCRegNames[] = {
7715 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7716 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7717 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007718 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007719 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007720 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7721 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007722 }
Craig Topper3164f332014-03-11 03:39:26 +00007723 bool validateAsmConstraint(const char *&Name,
7724 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007725 return false;
7726 }
Craig Topper3164f332014-03-11 03:39:26 +00007727 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007728 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7729 return (RegNo < 2)? RegNo : -1;
7730 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007731 bool allowsLargerPreferedTypeAlignment() const override {
7732 return false;
7733 }
Robert Lytton0e076492013-08-13 09:43:10 +00007734};
7735
7736const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007737#define BUILTIN(ID, TYPE, ATTRS) \
7738 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7739#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7740 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007741#include "clang/Basic/BuiltinsXCore.def"
7742};
Robert Lytton0e076492013-08-13 09:43:10 +00007743
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007744// x86_32 Android target
7745class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7746public:
7747 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7748 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7749 SuitableAlign = 32;
7750 LongDoubleWidth = 64;
7751 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7752 }
7753};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007754
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007755// x86_64 Android target
7756class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7757public:
7758 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7759 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7760 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7761 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007762
7763 bool useFloat128ManglingForLongDouble() const override {
7764 return true;
7765 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007766};
7767} // end anonymous namespace
7768
Chris Lattner5ba61f02006-10-14 07:39:34 +00007769//===----------------------------------------------------------------------===//
7770// Driver code
7771//===----------------------------------------------------------------------===//
7772
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007773static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007774 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007775
Daniel Dunbar52322032009-08-18 05:47:58 +00007776 switch (Triple.getArch()) {
7777 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007778 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007779
Tim Northover2a0783d2014-05-30 14:14:07 +00007780 case llvm::Triple::xcore:
7781 return new XCoreTargetInfo(Triple);
7782
7783 case llvm::Triple::hexagon:
7784 return new HexagonTargetInfo(Triple);
7785
Jacques Pienaard964cc22016-03-28 21:02:54 +00007786 case llvm::Triple::lanai:
7787 return new LanaiTargetInfo(Triple);
7788
Tim Northover2a0783d2014-05-30 14:14:07 +00007789 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007790 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007791 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007792
7793 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007794 case llvm::Triple::CloudABI:
7795 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007796 case llvm::Triple::FreeBSD:
7797 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007798 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007799 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007800 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007801 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007802 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007803 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007804 }
7805
Christian Pirker9b019ae2014-02-25 13:51:00 +00007806 case llvm::Triple::aarch64_be:
7807 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007808 case llvm::Triple::FreeBSD:
7809 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007810 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007811 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007812 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007813 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007814 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007815 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007816 }
7817
Daniel Dunbar52322032009-08-18 05:47:58 +00007818 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007819 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007820 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007821 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007822
Daniel Dunbar52322032009-08-18 05:47:58 +00007823 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007824 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007825 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007826 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007827 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007828 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007829 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007830 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007831 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007832 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007833 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007834 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007835 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007836 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007837 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007838 case llvm::Triple::Win32:
7839 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007840 case llvm::Triple::Cygnus:
7841 return new CygwinARMTargetInfo(Triple);
7842 case llvm::Triple::GNU:
7843 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007844 case llvm::Triple::Itanium:
7845 return new ItaniumWindowsARMleTargetInfo(Triple);
7846 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007847 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007848 return new MicrosoftARMleTargetInfo(Triple);
7849 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007850 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007851 return new ARMleTargetInfo(Triple);
7852 }
7853
7854 case llvm::Triple::armeb:
7855 case llvm::Triple::thumbeb:
7856 if (Triple.isOSDarwin())
7857 return new DarwinARMTargetInfo(Triple);
7858
7859 switch (os) {
7860 case llvm::Triple::Linux:
7861 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7862 case llvm::Triple::FreeBSD:
7863 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7864 case llvm::Triple::NetBSD:
7865 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7866 case llvm::Triple::OpenBSD:
7867 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7868 case llvm::Triple::Bitrig:
7869 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7870 case llvm::Triple::RTEMS:
7871 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7872 case llvm::Triple::NaCl:
7873 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7874 default:
7875 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007876 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007877
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007878 case llvm::Triple::bpfeb:
7879 case llvm::Triple::bpfel:
7880 return new BPFTargetInfo(Triple);
7881
Daniel Dunbar52322032009-08-18 05:47:58 +00007882 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007883 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007884
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007885 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007886 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007887 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007888 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007889 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007890 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007891 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007892 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007893 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007894 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007895 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007896 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007897 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007898
7899 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007900 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007901 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007902 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007903 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007904 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007905 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007906 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007907 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007908 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007909 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007910 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007911 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007912 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007913 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007914
Akira Hatanakabef17452011-09-20 19:21:49 +00007915 case llvm::Triple::mips64:
7916 switch (os) {
7917 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007918 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007919 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007920 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007921 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007922 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007923 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007924 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007925 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007926 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007927 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007928 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007929 }
7930
7931 case llvm::Triple::mips64el:
7932 switch (os) {
7933 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007934 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007935 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007936 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007937 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007938 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007939 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007940 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007941 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007942 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007943 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007944 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007945 }
7946
Ivan Krasindd7403e2011-08-24 20:22:22 +00007947 case llvm::Triple::le32:
7948 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007949 case llvm::Triple::NaCl:
7950 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7951 default:
7952 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007953 }
7954
JF Bastien643817d2014-09-12 17:52:47 +00007955 case llvm::Triple::le64:
7956 return new Le64TargetInfo(Triple);
7957
Daniel Dunbar52322032009-08-18 05:47:58 +00007958 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007959 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007960 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007961 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007962 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007963 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007964 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007965 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007966 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007967 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007968 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007969 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007970 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007971 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007972 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007973 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007974 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007975
7976 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007977 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007978 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007979 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007980 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007981 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007982 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007983 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007984 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007985 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007986 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007987 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007988 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007989 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007990 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007991
Bill Schmidt778d3872013-07-26 01:36:11 +00007992 case llvm::Triple::ppc64le:
7993 switch (os) {
7994 case llvm::Triple::Linux:
7995 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007996 case llvm::Triple::NetBSD:
7997 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007998 default:
7999 return new PPC64TargetInfo(Triple);
8000 }
8001
Peter Collingbournec947aae2012-05-20 23:28:41 +00008002 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008003 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008004 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008005 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008006
Tom Stellardd8e38a32015-01-06 20:34:47 +00008007 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008008 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00008009 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008010
Daniel Dunbar52322032009-08-18 05:47:58 +00008011 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008012 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008013 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008014 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008015 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00008016 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008017 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008018 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008019 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008020 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008021 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008022 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008023 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008024 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008025 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008026
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008027 // The 'sparcel' architecture copies all the above cases except for Solaris.
8028 case llvm::Triple::sparcel:
8029 switch (os) {
8030 case llvm::Triple::Linux:
8031 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
8032 case llvm::Triple::NetBSD:
8033 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
8034 case llvm::Triple::OpenBSD:
8035 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
8036 case llvm::Triple::RTEMS:
8037 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
8038 default:
8039 return new SparcV8elTargetInfo(Triple);
8040 }
8041
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008042 case llvm::Triple::sparcv9:
8043 switch (os) {
8044 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008045 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008046 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008047 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008048 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008049 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008050 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008051 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008052 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008053 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008054 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008055 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008056 }
8057
Ulrich Weigand47445072013-05-06 16:26:41 +00008058 case llvm::Triple::systemz:
8059 switch (os) {
8060 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008061 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00008062 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008063 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00008064 }
8065
Eli Friedmana9c3d712009-08-19 20:47:07 +00008066 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008067 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008068
Daniel Dunbar52322032009-08-18 05:47:58 +00008069 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008070 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008071 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008072
Daniel Dunbar52322032009-08-18 05:47:58 +00008073 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008074 case llvm::Triple::CloudABI:
8075 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008076 case llvm::Triple::Linux: {
8077 switch (Triple.getEnvironment()) {
8078 default:
8079 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
8080 case llvm::Triple::Android:
8081 return new AndroidX86_32TargetInfo(Triple);
8082 }
8083 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008084 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008085 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008086 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008087 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008088 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008089 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00008090 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008091 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008092 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008093 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008094 case llvm::Triple::KFreeBSD:
8095 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008096 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008097 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008098 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008099 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008100 case llvm::Triple::Win32: {
8101 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008102 case llvm::Triple::Cygnus:
8103 return new CygwinX86_32TargetInfo(Triple);
8104 case llvm::Triple::GNU:
8105 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008106 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008107 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008108 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00008109 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008110 }
8111 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008112 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008113 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008114 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008115 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008116 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008117 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008118 case llvm::Triple::ELFIAMCU:
8119 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008120 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008121 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008122 }
8123
8124 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008125 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008126 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008127
Daniel Dunbar52322032009-08-18 05:47:58 +00008128 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008129 case llvm::Triple::CloudABI:
8130 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008131 case llvm::Triple::Linux: {
8132 switch (Triple.getEnvironment()) {
8133 default:
8134 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
8135 case llvm::Triple::Android:
8136 return new AndroidX86_64TargetInfo(Triple);
8137 }
8138 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008139 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008140 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008141 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008142 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008143 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008144 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00008145 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008146 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008147 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008148 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008149 case llvm::Triple::KFreeBSD:
8150 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008151 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008152 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008153 case llvm::Triple::Win32: {
8154 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008155 case llvm::Triple::Cygnus:
8156 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008157 case llvm::Triple::GNU:
8158 return new MinGWX86_64TargetInfo(Triple);
8159 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008160 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00008161 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008162 }
8163 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008164 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008165 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008166 case llvm::Triple::PS4:
8167 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008168 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008169 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008170 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008171
Douglas Katzman78d7c542015-05-12 21:18:10 +00008172 case llvm::Triple::spir: {
8173 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8174 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8175 return nullptr;
8176 return new SPIR32TargetInfo(Triple);
8177 }
8178 case llvm::Triple::spir64: {
8179 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8180 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8181 return nullptr;
8182 return new SPIR64TargetInfo(Triple);
8183 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008184 case llvm::Triple::wasm32:
8185 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8186 return nullptr;
8187 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
8188 case llvm::Triple::wasm64:
8189 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8190 return nullptr;
8191 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008192 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008193}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008194
8195/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008196/// options.
Alp Toker80758082014-07-06 05:26:44 +00008197TargetInfo *
8198TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
8199 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008200 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008201
8202 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00008203 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008204 if (!Target) {
8205 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008206 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008207 }
Alp Toker80758082014-07-06 05:26:44 +00008208 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008209
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008210 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008211 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8212 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008213 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008214 }
8215
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008216 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008217 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8218 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008219 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008220 }
8221
Rafael Espindolaeb265472013-08-21 21:59:03 +00008222 // Set the fp math unit.
8223 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8224 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008225 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008226 }
8227
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008228 // Compute the default target features, we need the target to handle this
8229 // because features may have dependencies on one another.
8230 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008231 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8232 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008233 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008234
8235 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008236 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008237 for (const auto &F : Features)
8238 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8239
Eric Christopher3ff21b32013-10-16 21:26:26 +00008240 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008241 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008242
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008243 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008244}