blob: 0a6339fabc6e586393bf964d8d3dc5d60ff32e14 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Saleem Abdulrasool10a49722016-04-08 16:52:00 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Justin Lebar76945b22016-04-29 23:05:19 +000068static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
69 const TargetOptions &Opts);
70
Chris Lattner09d98f52008-10-05 21:50:58 +000071//===----------------------------------------------------------------------===//
72// Defines specific to certain operating systems.
73//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000074
Torok Edwinb2b37c62009-06-30 17:10:35 +000075namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076template<typename TgtInfo>
77class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000078protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000079 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000082 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
83 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000084 void getTargetDefines(const LangOptions &Opts,
85 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000086 TgtInfo::getTargetDefines(Opts, Builder);
87 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000088 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000089
90};
Chris Lattner30ba6742009-08-10 19:03:04 +000091
Eric Christopher7d0c7252015-09-24 21:17:04 +000092// CloudABI Target
93template <typename Target>
94class CloudABITargetInfo : public OSTargetInfo<Target> {
95protected:
96 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
97 MacroBuilder &Builder) const override {
98 Builder.defineMacro("__CloudABI__");
99 Builder.defineMacro("__ELF__");
100
101 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
102 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
103 Builder.defineMacro("__STDC_UTF_16__");
104 Builder.defineMacro("__STDC_UTF_32__");
105 }
106
107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000108 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
109 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000110};
111
Daniel Dunbard86666f2010-01-26 01:44:04 +0000112static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000114 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000116 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000119 // AddressSanitizer doesn't play well with source fortification, which is on
120 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000121 if (Opts.Sanitize.has(SanitizerKind::Address))
122 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000123
John McCall460ce582015-10-22 18:38:17 +0000124 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
125 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000126 // __weak is always defined, for use in blocks and with objc pointers.
127 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000128 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000129 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000130 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000131
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000136
137 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 if (Triple.isMacOSX()) {
143 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000146 Triple.getOSVersion(Maj, Min, Rev);
147 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000148 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000149
Sebastian Pop422377c2012-01-20 22:01:23 +0000150 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000151 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000152 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153 if (PlatformName == "win32") {
154 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
155 return;
156 }
157
Evan Cheng31dd9a62014-01-26 23:12:43 +0000158 // Set the appropriate OS version define.
159 if (Triple.isiOS()) {
160 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
161 char Str[6];
162 Str[0] = '0' + Maj;
163 Str[1] = '0' + (Min / 10);
164 Str[2] = '0' + (Min % 10);
165 Str[3] = '0' + (Rev / 10);
166 Str[4] = '0' + (Rev % 10);
167 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000168 if (Triple.isTvOS())
169 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
170 else
171 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
172 Str);
173
174 } else if (Triple.isWatchOS()) {
175 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
176 char Str[6];
177 Str[0] = '0' + Maj;
178 Str[1] = '0' + (Min / 10);
179 Str[2] = '0' + (Min % 10);
180 Str[3] = '0' + (Rev / 10);
181 Str[4] = '0' + (Rev % 10);
182 Str[5] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000184 } else if (Triple.isMacOSX()) {
185 // Note that the Driver allows versions which aren't representable in the
186 // define (because we only get a single digit for the minor and micro
187 // revision numbers). So, we limit them to the maximum representable
188 // version.
189 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000190 char Str[7];
191 if (Maj < 10 || (Maj == 10 && Min < 10)) {
192 Str[0] = '0' + (Maj / 10);
193 Str[1] = '0' + (Maj % 10);
194 Str[2] = '0' + std::min(Min, 9U);
195 Str[3] = '0' + std::min(Rev, 9U);
196 Str[4] = '\0';
197 } else {
198 // Handle versions > 10.9.
199 Str[0] = '0' + (Maj / 10);
200 Str[1] = '0' + (Maj % 10);
201 Str[2] = '0' + (Min / 10);
202 Str[3] = '0' + (Min % 10);
203 Str[4] = '0' + (Rev / 10);
204 Str[5] = '0' + (Rev % 10);
205 Str[6] = '\0';
206 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000207 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000208 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210 // Tell users about the kernel if there is one.
211 if (Triple.isOSDarwin())
212 Builder.defineMacro("__MACH__");
213
Chris Bieneman46977b62016-04-29 17:53:00 +0000214 // The Watch ABI uses Dwarf EH.
215 if(Triple.isWatchABI())
216 Builder.defineMacro("__ARM_DWARF_EH__");
217
Daniel Dunbarecf13562011-04-19 21:40:34 +0000218 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000219}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000220
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221template<typename Target>
222class DarwinTargetInfo : public OSTargetInfo<Target> {
223protected:
Craig Topper3164f332014-03-11 03:39:26 +0000224 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
225 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000226 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000227 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228 }
Mike Stump11289f42009-09-09 15:08:12 +0000229
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000231 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
232 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000233 // By default, no TLS, and we whitelist permitted architecture/OS
234 // combinations.
235 this->TLSSupported = false;
236
237 if (Triple.isMacOSX())
238 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
239 else if (Triple.isiOS()) {
240 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
241 if (Triple.getArch() == llvm::Triple::x86_64 ||
242 Triple.getArch() == llvm::Triple::aarch64)
243 this->TLSSupported = !Triple.isOSVersionLT(8);
244 else if (Triple.getArch() == llvm::Triple::x86 ||
245 Triple.getArch() == llvm::Triple::arm ||
246 Triple.getArch() == llvm::Triple::thumb)
247 this->TLSSupported = !Triple.isOSVersionLT(9);
248 } else if (Triple.isWatchOS())
249 this->TLSSupported = !Triple.isOSVersionLT(2);
250
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000251 this->MCountName = "\01mcount";
252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000255 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000256 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000257 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000258 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000259 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000260 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000261 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000262
Craig Topper3164f332014-03-11 03:39:26 +0000263 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000264 // FIXME: We should return 0 when building kexts.
265 return "__TEXT,__StaticInit,regular,pure_instructions";
266 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000267
John McCalleed64c72012-01-29 01:20:30 +0000268 /// Darwin does not support protected visibility. Darwin's "default"
269 /// is very similar to ELF's "protected"; Darwin requires a "weak"
270 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000271 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000272 return false;
273 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000274
275 unsigned getExnObjectAlignment() const override {
276 // The alignment of an exception object is 8-bytes for darwin since
277 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
278 // and therefore doesn't guarantee 16-byte alignment.
279 return 64;
280 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281};
282
Chris Lattner30ba6742009-08-10 19:03:04 +0000283
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284// DragonFlyBSD Target
285template<typename Target>
286class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
287protected:
Craig Topper3164f332014-03-11 03:39:26 +0000288 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__DragonFly__");
292 Builder.defineMacro("__DragonFly_cc_version", "100001");
293 Builder.defineMacro("__ELF__");
294 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
295 Builder.defineMacro("__tune_i386__");
296 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297 }
298public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000299 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
300 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000301 switch (Triple.getArch()) {
302 default:
303 case llvm::Triple::x86:
304 case llvm::Triple::x86_64:
305 this->MCountName = ".mcount";
306 break;
307 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000308 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000309};
310
311// FreeBSD Target
312template<typename Target>
313class FreeBSDTargetInfo : public OSTargetInfo<Target> {
314protected:
Craig Topper3164f332014-03-11 03:39:26 +0000315 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
316 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000317 // FreeBSD defines; list based off of gcc output
318
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000319 unsigned Release = Triple.getOSMajorVersion();
320 if (Release == 0U)
321 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000323 Builder.defineMacro("__FreeBSD__", Twine(Release));
324 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000325 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
326 DefineStd(Builder, "unix", Opts);
327 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000328
329 // On FreeBSD, wchar_t contains the number of the code point as
330 // used by the character set of the locale. These character sets are
331 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000332 //
333 // FIXME: This is wrong; the macro refers to the numerical values
334 // of wchar_t *literals*, which are not locale-dependent. However,
335 // FreeBSD systems apparently depend on us getting this wrong, and
336 // setting this to 1 is conforming even if all the basic source
337 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000338 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000339 }
340public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000341 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
342 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000343 switch (Triple.getArch()) {
344 default:
345 case llvm::Triple::x86:
346 case llvm::Triple::x86_64:
347 this->MCountName = ".mcount";
348 break;
349 case llvm::Triple::mips:
350 case llvm::Triple::mipsel:
351 case llvm::Triple::ppc:
352 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000353 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000354 this->MCountName = "_mcount";
355 break;
356 case llvm::Triple::arm:
357 this->MCountName = "__mcount";
358 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000359 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000360 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000361};
362
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000363// GNU/kFreeBSD Target
364template<typename Target>
365class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
366protected:
Craig Topper3164f332014-03-11 03:39:26 +0000367 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
368 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000369 // GNU/kFreeBSD defines; list based off of gcc output
370
371 DefineStd(Builder, "unix", Opts);
372 Builder.defineMacro("__FreeBSD_kernel__");
373 Builder.defineMacro("__GLIBC__");
374 Builder.defineMacro("__ELF__");
375 if (Opts.POSIXThreads)
376 Builder.defineMacro("_REENTRANT");
377 if (Opts.CPlusPlus)
378 Builder.defineMacro("_GNU_SOURCE");
379 }
380public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000381 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
382 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383};
384
Reid Kleckner330fb172016-05-11 16:19:05 +0000385// Haiku Target
386template<typename Target>
387class HaikuTargetInfo : public OSTargetInfo<Target> {
388protected:
389 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
390 MacroBuilder &Builder) const override {
391 // Haiku defines; list based off of gcc output
392 Builder.defineMacro("__HAIKU__");
393 Builder.defineMacro("__ELF__");
394 DefineStd(Builder, "unix", Opts);
395 }
396public:
397 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
398 : OSTargetInfo<Target>(Triple, Opts) {
399 this->SizeType = TargetInfo::UnsignedLong;
400 this->IntPtrType = TargetInfo::SignedLong;
401 this->PtrDiffType = TargetInfo::SignedLong;
402 this->ProcessIDType = TargetInfo::SignedLong;
403 this->TLSSupported = false;
404
405 }
406};
407
Chris Lattner3e2ee142010-07-07 16:01:42 +0000408// Minix Target
409template<typename Target>
410class MinixTargetInfo : public OSTargetInfo<Target> {
411protected:
Craig Topper3164f332014-03-11 03:39:26 +0000412 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
413 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000414 // Minix defines
415
416 Builder.defineMacro("__minix", "3");
417 Builder.defineMacro("_EM_WSIZE", "4");
418 Builder.defineMacro("_EM_PSIZE", "4");
419 Builder.defineMacro("_EM_SSIZE", "2");
420 Builder.defineMacro("_EM_LSIZE", "4");
421 Builder.defineMacro("_EM_FSIZE", "4");
422 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000423 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000424 DefineStd(Builder, "unix", Opts);
425 }
426public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000427 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
428 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000429};
430
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431// Linux target
432template<typename Target>
433class LinuxTargetInfo : public OSTargetInfo<Target> {
434protected:
Craig Topper3164f332014-03-11 03:39:26 +0000435 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
436 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000437 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000438 DefineStd(Builder, "unix", Opts);
439 DefineStd(Builder, "linux", Opts);
440 Builder.defineMacro("__gnu_linux__");
441 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000442 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000443 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000444 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000445 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000446 this->PlatformName = "android";
447 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
448 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000449 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000450 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000451 if (Opts.CPlusPlus)
452 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000453 if (this->HasFloat128)
454 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000455 }
456public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000457 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
458 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000459 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000460
461 switch (Triple.getArch()) {
462 default:
463 break;
464 case llvm::Triple::ppc:
465 case llvm::Triple::ppc64:
466 case llvm::Triple::ppc64le:
467 this->MCountName = "_mcount";
468 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000469 case llvm::Triple::x86:
470 case llvm::Triple::x86_64:
471 case llvm::Triple::systemz:
472 this->HasFloat128 = true;
473 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000474 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000476
Craig Topper3164f332014-03-11 03:39:26 +0000477 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000478 return ".text.startup";
479 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000480};
481
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000482// NetBSD Target
483template<typename Target>
484class NetBSDTargetInfo : public OSTargetInfo<Target> {
485protected:
Craig Topper3164f332014-03-11 03:39:26 +0000486 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
487 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000488 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000489 Builder.defineMacro("__NetBSD__");
490 Builder.defineMacro("__unix__");
491 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000492 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000493 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000494
495 switch (Triple.getArch()) {
496 default:
497 break;
498 case llvm::Triple::arm:
499 case llvm::Triple::armeb:
500 case llvm::Triple::thumb:
501 case llvm::Triple::thumbeb:
502 Builder.defineMacro("__ARM_DWARF_EH__");
503 break;
504 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000505 }
506public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000507 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
508 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000509 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000510 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000511};
512
Torok Edwinb2b37c62009-06-30 17:10:35 +0000513// OpenBSD Target
514template<typename Target>
515class OpenBSDTargetInfo : public OSTargetInfo<Target> {
516protected:
Craig Topper3164f332014-03-11 03:39:26 +0000517 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
518 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000519 // OpenBSD defines; list based off of gcc output
520
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000521 Builder.defineMacro("__OpenBSD__");
522 DefineStd(Builder, "unix", Opts);
523 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000524 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000525 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000526 }
527public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000528 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
529 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000531
Eli Friedman3715d1f2011-12-15 02:15:56 +0000532 switch (Triple.getArch()) {
533 default:
534 case llvm::Triple::x86:
535 case llvm::Triple::x86_64:
536 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000537 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000538 this->MCountName = "__mcount";
539 break;
540 case llvm::Triple::mips64:
541 case llvm::Triple::mips64el:
542 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000543 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000544 this->MCountName = "_mcount";
545 break;
546 }
547 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000548};
549
Eli Friedman9fa28852012-08-08 23:57:20 +0000550// Bitrig Target
551template<typename Target>
552class BitrigTargetInfo : public OSTargetInfo<Target> {
553protected:
Craig Topper3164f332014-03-11 03:39:26 +0000554 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
555 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000556 // Bitrig defines; list based off of gcc output
557
558 Builder.defineMacro("__Bitrig__");
559 DefineStd(Builder, "unix", Opts);
560 Builder.defineMacro("__ELF__");
561 if (Opts.POSIXThreads)
562 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000563
564 switch (Triple.getArch()) {
565 default:
566 break;
567 case llvm::Triple::arm:
568 case llvm::Triple::armeb:
569 case llvm::Triple::thumb:
570 case llvm::Triple::thumbeb:
571 Builder.defineMacro("__ARM_DWARF_EH__");
572 break;
573 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000574 }
575public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000576 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
577 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000578 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000579 }
580};
581
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000582// PSP Target
583template<typename Target>
584class PSPTargetInfo : public OSTargetInfo<Target> {
585protected:
Craig Topper3164f332014-03-11 03:39:26 +0000586 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
587 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000588 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000589 Builder.defineMacro("PSP");
590 Builder.defineMacro("_PSP");
591 Builder.defineMacro("__psp__");
592 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000593 }
594public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000595 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000596};
597
John Thompsone467e192009-11-19 17:18:50 +0000598// PS3 PPU Target
599template<typename Target>
600class PS3PPUTargetInfo : public OSTargetInfo<Target> {
601protected:
Craig Topper3164f332014-03-11 03:39:26 +0000602 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
603 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000604 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000605 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000606 Builder.defineMacro("__PPU__");
607 Builder.defineMacro("__CELLOS_LV2__");
608 Builder.defineMacro("__ELF__");
609 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000610 Builder.defineMacro("_ARCH_PPC64");
611 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000612 }
613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000614 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
615 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000616 this->LongWidth = this->LongAlign = 32;
617 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000618 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000619 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000620 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000621 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000622 }
623};
624
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000625template <typename Target>
626class PS4OSTargetInfo : public OSTargetInfo<Target> {
627protected:
628 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
629 MacroBuilder &Builder) const override {
630 Builder.defineMacro("__FreeBSD__", "9");
631 Builder.defineMacro("__FreeBSD_cc_version", "900001");
632 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
633 DefineStd(Builder, "unix", Opts);
634 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000635 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000636 }
637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000638 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
639 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000640 this->WCharType = this->UnsignedShort;
641
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000642 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
643 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000644
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000645 // On PS4, do not honor explicit bit field alignment,
646 // as in "__attribute__((aligned(2))) int b : 1;".
647 this->UseExplicitBitFieldAlignment = false;
648
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000649 switch (Triple.getArch()) {
650 default:
651 case llvm::Triple::x86_64:
652 this->MCountName = ".mcount";
653 break;
654 }
655 }
656};
657
Torok Edwinb2b37c62009-06-30 17:10:35 +0000658// Solaris target
659template<typename Target>
660class SolarisTargetInfo : public OSTargetInfo<Target> {
661protected:
Craig Topper3164f332014-03-11 03:39:26 +0000662 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
663 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000664 DefineStd(Builder, "sun", Opts);
665 DefineStd(Builder, "unix", Opts);
666 Builder.defineMacro("__ELF__");
667 Builder.defineMacro("__svr4__");
668 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000669 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
670 // newer, but to 500 for everything else. feature_test.h has a check to
671 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000672 // with a new version.
673 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000674 Builder.defineMacro("_XOPEN_SOURCE", "600");
675 else
676 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000677 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000678 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000679 Builder.defineMacro("_LARGEFILE_SOURCE");
680 Builder.defineMacro("_LARGEFILE64_SOURCE");
681 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000682 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000683 }
684public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000685 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
686 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000687 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000688 // FIXME: WIntType should be SignedLong
689 }
690};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000691
692// Windows target
693template<typename Target>
694class WindowsTargetInfo : public OSTargetInfo<Target> {
695protected:
Craig Topper3164f332014-03-11 03:39:26 +0000696 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
697 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000698 Builder.defineMacro("_WIN32");
699 }
700 void getVisualStudioDefines(const LangOptions &Opts,
701 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000702 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000703 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000704 Builder.defineMacro("_CPPRTTI");
705
Reid Kleckner16514352015-01-30 21:42:55 +0000706 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000707 Builder.defineMacro("_CPPUNWIND");
708 }
709
David Majnemer6a658902015-07-22 22:36:26 +0000710 if (Opts.Bool)
711 Builder.defineMacro("__BOOL_DEFINED");
712
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000713 if (!Opts.CharIsSigned)
714 Builder.defineMacro("_CHAR_UNSIGNED");
715
716 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
717 // but it works for now.
718 if (Opts.POSIXThreads)
719 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000720
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000721 if (Opts.MSCompatibilityVersion) {
722 Builder.defineMacro("_MSC_VER",
723 Twine(Opts.MSCompatibilityVersion / 100000));
724 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000725 // FIXME We cannot encode the revision information into 32-bits
726 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000727
David Majnemerb710a932015-05-11 03:57:49 +0000728 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000729 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000730 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000731
732 if (Opts.MicrosoftExt) {
733 Builder.defineMacro("_MSC_EXTENSIONS");
734
735 if (Opts.CPlusPlus11) {
736 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
737 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
738 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
739 }
740 }
741
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000742 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000743 }
744
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000745public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000746 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
747 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000748};
749
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000750template <typename Target>
751class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000752protected:
Craig Topper3164f332014-03-11 03:39:26 +0000753 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
754 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000755 if (Opts.POSIXThreads)
756 Builder.defineMacro("_REENTRANT");
757 if (Opts.CPlusPlus)
758 Builder.defineMacro("_GNU_SOURCE");
759
760 DefineStd(Builder, "unix", Opts);
761 Builder.defineMacro("__ELF__");
762 Builder.defineMacro("__native_client__");
763 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000764
765public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000766 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
767 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000768 this->LongAlign = 32;
769 this->LongWidth = 32;
770 this->PointerAlign = 32;
771 this->PointerWidth = 32;
772 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000773 this->Int64Type = TargetInfo::SignedLongLong;
774 this->DoubleAlign = 64;
775 this->LongDoubleWidth = 64;
776 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000777 this->LongLongWidth = 64;
778 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000779 this->SizeType = TargetInfo::UnsignedInt;
780 this->PtrDiffType = TargetInfo::SignedInt;
781 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000782 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000783 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000784 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000785 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000786 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000787 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000788 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000789 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000790 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000791 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000792 } else {
793 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000794 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000795 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000796 }
797};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000798
Dan Gohmanc2853072015-09-03 22:51:53 +0000799// WebAssembly target
800template <typename Target>
801class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
802 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000803 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000804 // A common platform macro.
805 if (Opts.POSIXThreads)
806 Builder.defineMacro("_REENTRANT");
807 // Follow g++ convention and predefine _GNU_SOURCE for C++.
808 if (Opts.CPlusPlus)
809 Builder.defineMacro("_GNU_SOURCE");
810 }
811
812 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000813 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000814 return ".text.__startup";
815 }
816
817public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000818 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
819 const TargetOptions &Opts)
820 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000821 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000822 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
823 }
824};
Dan Gohmanc2853072015-09-03 22:51:53 +0000825
Chris Lattner09d98f52008-10-05 21:50:58 +0000826//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000827// Specific target implementations.
828//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000829
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000830// PPC abstract base class
831class PPCTargetInfo : public TargetInfo {
832 static const Builtin::Info BuiltinInfo[];
833 static const char * const GCCRegNames[];
834 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000835 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000836
837 // Target cpu features.
838 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000839 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000840 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000841 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000842 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000843 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000844 bool HasBPERMD;
845 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000846
Ulrich Weigand8afad612014-07-28 13:17:52 +0000847protected:
848 std::string ABI;
849
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000850public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000851 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000852 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
853 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000854 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000855 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000856 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000857 LongDoubleWidth = LongDoubleAlign = 128;
858 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
859 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000860
Hal Finkel6b984f02012-07-03 16:51:04 +0000861 /// \brief Flags for architecture specific defines.
862 typedef enum {
863 ArchDefineNone = 0,
864 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
865 ArchDefinePpcgr = 1 << 1,
866 ArchDefinePpcsq = 1 << 2,
867 ArchDefine440 = 1 << 3,
868 ArchDefine603 = 1 << 4,
869 ArchDefine604 = 1 << 5,
870 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000871 ArchDefinePwr5 = 1 << 7,
872 ArchDefinePwr5x = 1 << 8,
873 ArchDefinePwr6 = 1 << 9,
874 ArchDefinePwr6x = 1 << 10,
875 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000876 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000877 ArchDefinePwr9 = 1 << 13,
878 ArchDefineA2 = 1 << 14,
879 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000880 } ArchDefineTypes;
881
Bill Schmidt38378a02013-02-01 20:23:10 +0000882 // Note: GCC recognizes the following additional cpus:
883 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
884 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
885 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000886 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000887 bool CPUKnown = llvm::StringSwitch<bool>(Name)
888 .Case("generic", true)
889 .Case("440", true)
890 .Case("450", true)
891 .Case("601", true)
892 .Case("602", true)
893 .Case("603", true)
894 .Case("603e", true)
895 .Case("603ev", true)
896 .Case("604", true)
897 .Case("604e", true)
898 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000899 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000900 .Case("g3", true)
901 .Case("7400", true)
902 .Case("g4", true)
903 .Case("7450", true)
904 .Case("g4+", true)
905 .Case("750", true)
906 .Case("970", true)
907 .Case("g5", true)
908 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000909 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000910 .Case("e500mc", true)
911 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000912 .Case("power3", true)
913 .Case("pwr3", true)
914 .Case("power4", true)
915 .Case("pwr4", true)
916 .Case("power5", true)
917 .Case("pwr5", true)
918 .Case("power5x", true)
919 .Case("pwr5x", true)
920 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000921 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000922 .Case("power6x", true)
923 .Case("pwr6x", true)
924 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000925 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000926 .Case("power8", true)
927 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000928 .Case("power9", true)
929 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000930 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000931 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000932 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000933 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000934 .Case("powerpc64le", true)
935 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000936 .Default(false);
937
938 if (CPUKnown)
939 CPU = Name;
940
941 return CPUKnown;
942 }
943
Ulrich Weigand8afad612014-07-28 13:17:52 +0000944
945 StringRef getABI() const override { return ABI; }
946
Craig Topper6c03a542015-10-19 04:51:35 +0000947 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
948 return llvm::makeArrayRef(BuiltinInfo,
949 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000950 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000951
Craig Topper3164f332014-03-11 03:39:26 +0000952 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000953
Craig Topper3164f332014-03-11 03:39:26 +0000954 void getTargetDefines(const LangOptions &Opts,
955 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000956
Eric Christopher8c47b422015-10-09 18:39:55 +0000957 bool
958 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
959 StringRef CPU,
960 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000961
Craig Topper3164f332014-03-11 03:39:26 +0000962 bool handleTargetFeatures(std::vector<std::string> &Features,
963 DiagnosticsEngine &Diags) override;
964 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000965 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
966 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000967
Craig Topperf054e3a2015-10-19 03:52:27 +0000968 ArrayRef<const char *> getGCCRegNames() const override;
969 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000970 bool validateAsmConstraint(const char *&Name,
971 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000972 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000973 default: return false;
974 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000975 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000976 case 'b': // Base register
977 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000978 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000979 break;
980 // FIXME: The following are added to allow parsing.
981 // I just took a guess at what the actions should be.
982 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000983 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000984 case 'v': // Altivec vector register
985 Info.setAllowsRegister();
986 break;
987 case 'w':
988 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000989 case 'd':// VSX vector register to hold vector double data
990 case 'f':// VSX vector register to hold vector float data
991 case 's':// VSX vector register to hold scalar float data
992 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000993 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000994 break;
995 default:
996 return false;
997 }
998 Info.setAllowsRegister();
999 Name++; // Skip over 'w'.
1000 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 case 'h': // `MQ', `CTR', or `LINK' register
1002 case 'q': // `MQ' register
1003 case 'c': // `CTR' register
1004 case 'l': // `LINK' register
1005 case 'x': // `CR' register (condition register) number 0
1006 case 'y': // `CR' register (condition register)
1007 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001008 Info.setAllowsRegister();
1009 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001011 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001012 // (use `L' instead for SImode constants)
1013 case 'K': // Unsigned 16-bit constant
1014 case 'L': // Signed 16-bit constant shifted left 16 bits
1015 case 'M': // Constant larger than 31
1016 case 'N': // Exact power of 2
1017 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001018 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001019 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001020 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001021 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001022 break;
1023 case 'm': // Memory operand. Note that on PowerPC targets, m can
1024 // include addresses that update the base register. It
1025 // is therefore only safe to use `m' in an asm statement
1026 // if that asm statement accesses the operand exactly once.
1027 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001028 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001029 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001030 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001031 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001032 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1033 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001034 // register to be updated.
1035 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001036 if (Name[1] != 's')
1037 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001038 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001039 // include any automodification of the base register. Unlike
1040 // `m', this constraint can be used in asm statements that
1041 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001042 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001043 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001044 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001045 break;
1046 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001047 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001048 case 'Z': // Memory operand that is an indexed or indirect from a
1049 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001050 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001051 Info.setAllowsMemory();
1052 Info.setAllowsRegister();
1053 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001054 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001055 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001056 // register (`p' is preferable for asm statements)
1057 case 'S': // Constant suitable as a 64-bit mask operand
1058 case 'T': // Constant suitable as a 32-bit mask operand
1059 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001060 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // instructions
1062 case 'W': // Vector constant that does not require memory
1063 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001064 break;
1065 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001066 }
John Thompson07a61a42010-06-24 22:44:13 +00001067 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001068 }
Craig Topper3164f332014-03-11 03:39:26 +00001069 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001070 std::string R;
1071 switch (*Constraint) {
1072 case 'e':
1073 case 'w':
1074 // Two-character constraint; add "^" hint for later parsing.
1075 R = std::string("^") + std::string(Constraint, 2);
1076 Constraint++;
1077 break;
1078 default:
1079 return TargetInfo::convertConstraint(Constraint);
1080 }
1081 return R;
1082 }
Craig Topper3164f332014-03-11 03:39:26 +00001083 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001084 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001085 }
Craig Topper3164f332014-03-11 03:39:26 +00001086 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001087 if (RegNo == 0) return 3;
1088 if (RegNo == 1) return 4;
1089 return -1;
1090 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001091
1092 bool hasSjLjLowering() const override {
1093 return true;
1094 }
David Majnemer2617ea62015-06-09 18:05:33 +00001095
1096 bool useFloat128ManglingForLongDouble() const override {
1097 return LongDoubleWidth == 128 &&
1098 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1099 getTriple().isOSBinFormatELF();
1100 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001101};
Anders Carlssonf511f642007-11-27 04:11:28 +00001102
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001103const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001104#define BUILTIN(ID, TYPE, ATTRS) \
1105 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1106#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1107 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001108#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001109};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001110
Eric Christopher917e9522014-11-18 22:36:15 +00001111/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001112/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001113bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001114 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001115 for (const auto &Feature : Features) {
1116 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001117 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001118 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001119 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001120 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001121 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001122 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001123 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001124 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001125 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001126 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001127 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001128 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001129 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001130 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001131 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001132 } else if (Feature == "+float128") {
1133 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001134 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001135 // TODO: Finish this list and add an assert that we've handled them
1136 // all.
1137 }
Eric Christopher02c33352015-08-25 00:59:11 +00001138
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001139 return true;
1140}
1141
Chris Lattnerecd49032009-03-02 22:27:17 +00001142/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1143/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001144void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001145 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001146 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001147 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001148 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001149 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001150 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001151 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001152 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001153 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001154 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001155 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001156 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001157 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001158
Chris Lattnerecd49032009-03-02 22:27:17 +00001159 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001160 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1161 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001162 } else {
1163 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1164 getTriple().getOS() != llvm::Triple::OpenBSD)
1165 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001166 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001167
Ulrich Weigand8afad612014-07-28 13:17:52 +00001168 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001169 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001170 Builder.defineMacro("_CALL_ELF", "1");
1171 if (ABI == "elfv2")
1172 Builder.defineMacro("_CALL_ELF", "2");
1173
Chris Lattnerecd49032009-03-02 22:27:17 +00001174 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001175 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1176 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001177
Chris Lattnerecd49032009-03-02 22:27:17 +00001178 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001179 if (LongDoubleWidth == 128)
1180 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001181
John Thompsone467e192009-11-19 17:18:50 +00001182 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001183 Builder.defineMacro("__VEC__", "10206");
1184 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001185 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001186
1187 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001188 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1189 .Case("440", ArchDefineName)
1190 .Case("450", ArchDefineName | ArchDefine440)
1191 .Case("601", ArchDefineName)
1192 .Case("602", ArchDefineName | ArchDefinePpcgr)
1193 .Case("603", ArchDefineName | ArchDefinePpcgr)
1194 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1195 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1196 .Case("604", ArchDefineName | ArchDefinePpcgr)
1197 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1198 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001199 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001200 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1201 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1202 .Case("750", ArchDefineName | ArchDefinePpcgr)
1203 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1204 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001205 .Case("a2", ArchDefineA2)
1206 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001207 .Case("pwr3", ArchDefinePpcgr)
1208 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1209 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1210 | ArchDefinePpcsq)
1211 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1212 | ArchDefinePpcgr | ArchDefinePpcsq)
1213 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1214 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1215 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1216 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1217 | ArchDefinePpcsq)
1218 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1219 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001220 | ArchDefinePpcgr | ArchDefinePpcsq)
1221 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1222 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1223 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001224 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1225 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1226 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1227 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 .Case("power3", ArchDefinePpcgr)
1229 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1230 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1231 | ArchDefinePpcsq)
1232 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1233 | ArchDefinePpcgr | ArchDefinePpcsq)
1234 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1235 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1236 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1237 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1238 | ArchDefinePpcsq)
1239 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1240 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001241 | ArchDefinePpcgr | ArchDefinePpcsq)
1242 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1243 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1244 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001245 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1246 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1247 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1248 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001249 .Default(ArchDefineNone);
1250
1251 if (defs & ArchDefineName)
1252 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1253 if (defs & ArchDefinePpcgr)
1254 Builder.defineMacro("_ARCH_PPCGR");
1255 if (defs & ArchDefinePpcsq)
1256 Builder.defineMacro("_ARCH_PPCSQ");
1257 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001258 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001259 if (defs & ArchDefine603)
1260 Builder.defineMacro("_ARCH_603");
1261 if (defs & ArchDefine604)
1262 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001263 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001264 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001265 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001266 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001267 if (defs & ArchDefinePwr5x)
1268 Builder.defineMacro("_ARCH_PWR5X");
1269 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001270 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001271 if (defs & ArchDefinePwr6x)
1272 Builder.defineMacro("_ARCH_PWR6X");
1273 if (defs & ArchDefinePwr7)
1274 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001275 if (defs & ArchDefinePwr8)
1276 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001277 if (defs & ArchDefinePwr9)
1278 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001279 if (defs & ArchDefineA2)
1280 Builder.defineMacro("_ARCH_A2");
1281 if (defs & ArchDefineA2q) {
1282 Builder.defineMacro("_ARCH_A2Q");
1283 Builder.defineMacro("_ARCH_QP");
1284 }
1285
1286 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1287 Builder.defineMacro("__bg__");
1288 Builder.defineMacro("__THW_BLUEGENE__");
1289 Builder.defineMacro("__bgq__");
1290 Builder.defineMacro("__TOS_BGQ__");
1291 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001292
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001293 if (HasVSX)
1294 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001295 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001296 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001297 if (HasP8Crypto)
1298 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001299 if (HasHTM)
1300 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001301 if (HasFloat128)
1302 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001303
1304 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1305 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1306 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1307 if (PointerWidth == 64)
1308 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001309
Bill Schmidt38378a02013-02-01 20:23:10 +00001310 // FIXME: The following are not yet generated here by Clang, but are
1311 // generated by GCC:
1312 //
1313 // _SOFT_FLOAT_
1314 // __RECIP_PRECISION__
1315 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 // __RECIP__
1317 // __RECIPF__
1318 // __RSQRTE__
1319 // __RSQRTEF__
1320 // _SOFT_DOUBLE_
1321 // __NO_LWSYNC__
1322 // __HAVE_BSWAP__
1323 // __LONGDOUBLE128
1324 // __CMODEL_MEDIUM__
1325 // __CMODEL_LARGE__
1326 // _CALL_SYSV
1327 // _CALL_DARWIN
1328 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001329}
1330
Eric Christophera8a14c32015-08-31 18:39:16 +00001331// Handle explicit options being passed to the compiler here: if we've
1332// explicitly turned off vsx and turned on power8-vector or direct-move then
1333// go ahead and error since the customer has expressed a somewhat incompatible
1334// set of options.
1335static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001336 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001337
1338 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1339 FeaturesVec.end()) {
1340 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1341 FeaturesVec.end()) {
1342 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1343 << "-mno-vsx";
1344 return false;
1345 }
1346
1347 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1348 FeaturesVec.end()) {
1349 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1350 << "-mno-vsx";
1351 return false;
1352 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001353
1354 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1355 FeaturesVec.end()) {
1356 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1357 << "-mno-vsx";
1358 return false;
1359 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001360 }
1361
1362 return true;
1363}
1364
Eric Christopher8c47b422015-10-09 18:39:55 +00001365bool PPCTargetInfo::initFeatureMap(
1366 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1367 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001368 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1369 .Case("7400", true)
1370 .Case("g4", true)
1371 .Case("7450", true)
1372 .Case("g4+", true)
1373 .Case("970", true)
1374 .Case("g5", true)
1375 .Case("pwr6", true)
1376 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001377 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001378 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001379 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001380 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001381 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001382
1383 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001384 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1385 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001386 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001387 .Case("pwr8", true)
1388 .Default(false);
1389 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1390 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001391 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001392 .Case("pwr8", true)
1393 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001394 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1395 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001396 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001397 .Case("pwr8", true)
1398 .Case("pwr7", true)
1399 .Default(false);
1400 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1401 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001402 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001403 .Case("pwr8", true)
1404 .Case("pwr7", true)
1405 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001406 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1407 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001408 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001409 .Case("pwr8", true)
1410 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001411 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1412 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001413 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001414 .Case("pwr8", true)
1415 .Case("pwr7", true)
1416 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001417
Eric Christophera8a14c32015-08-31 18:39:16 +00001418 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1419 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001420
Eric Christopher007b0a02015-08-28 22:32:01 +00001421 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001422}
1423
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001424bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001425 return llvm::StringSwitch<bool>(Feature)
1426 .Case("powerpc", true)
1427 .Case("vsx", HasVSX)
1428 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001429 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001430 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001431 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001432 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001433 .Case("bpermd", HasBPERMD)
1434 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001435 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001436 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001437}
Chris Lattner17df24e2008-04-21 18:56:49 +00001438
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001439void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1440 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001441 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1442 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1443 // incompatible options.
1444 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001445 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001446 Features[Name] = Features["vsx"] = true;
1447 } else if (Name == "power8-vector") {
1448 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001449 } else if (Name == "float128") {
1450 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001451 } else {
1452 Features[Name] = true;
1453 }
1454 } else {
1455 if (Name == "vsx") {
1456 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001457 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001458 } else {
1459 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001460 }
1461 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001462}
1463
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001464const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001465 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1466 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1467 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1468 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1469 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1470 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1471 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1472 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001473 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001474 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001475 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001476 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1477 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1478 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1479 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001480 "vrsave", "vscr",
1481 "spe_acc", "spefscr",
1482 "sfp"
1483};
Chris Lattner10a5b382007-01-29 05:24:35 +00001484
Craig Topperf054e3a2015-10-19 03:52:27 +00001485ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1486 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001487}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001488
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001489const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1490 // While some of these aliases do map to different registers
1491 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001492 { { "0" }, "r0" },
1493 { { "1"}, "r1" },
1494 { { "2" }, "r2" },
1495 { { "3" }, "r3" },
1496 { { "4" }, "r4" },
1497 { { "5" }, "r5" },
1498 { { "6" }, "r6" },
1499 { { "7" }, "r7" },
1500 { { "8" }, "r8" },
1501 { { "9" }, "r9" },
1502 { { "10" }, "r10" },
1503 { { "11" }, "r11" },
1504 { { "12" }, "r12" },
1505 { { "13" }, "r13" },
1506 { { "14" }, "r14" },
1507 { { "15" }, "r15" },
1508 { { "16" }, "r16" },
1509 { { "17" }, "r17" },
1510 { { "18" }, "r18" },
1511 { { "19" }, "r19" },
1512 { { "20" }, "r20" },
1513 { { "21" }, "r21" },
1514 { { "22" }, "r22" },
1515 { { "23" }, "r23" },
1516 { { "24" }, "r24" },
1517 { { "25" }, "r25" },
1518 { { "26" }, "r26" },
1519 { { "27" }, "r27" },
1520 { { "28" }, "r28" },
1521 { { "29" }, "r29" },
1522 { { "30" }, "r30" },
1523 { { "31" }, "r31" },
1524 { { "fr0" }, "f0" },
1525 { { "fr1" }, "f1" },
1526 { { "fr2" }, "f2" },
1527 { { "fr3" }, "f3" },
1528 { { "fr4" }, "f4" },
1529 { { "fr5" }, "f5" },
1530 { { "fr6" }, "f6" },
1531 { { "fr7" }, "f7" },
1532 { { "fr8" }, "f8" },
1533 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001534 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001535 { { "fr11" }, "f11" },
1536 { { "fr12" }, "f12" },
1537 { { "fr13" }, "f13" },
1538 { { "fr14" }, "f14" },
1539 { { "fr15" }, "f15" },
1540 { { "fr16" }, "f16" },
1541 { { "fr17" }, "f17" },
1542 { { "fr18" }, "f18" },
1543 { { "fr19" }, "f19" },
1544 { { "fr20" }, "f20" },
1545 { { "fr21" }, "f21" },
1546 { { "fr22" }, "f22" },
1547 { { "fr23" }, "f23" },
1548 { { "fr24" }, "f24" },
1549 { { "fr25" }, "f25" },
1550 { { "fr26" }, "f26" },
1551 { { "fr27" }, "f27" },
1552 { { "fr28" }, "f28" },
1553 { { "fr29" }, "f29" },
1554 { { "fr30" }, "f30" },
1555 { { "fr31" }, "f31" },
1556 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557};
1558
Craig Topperf054e3a2015-10-19 03:52:27 +00001559ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1560 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001561}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001562
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001563class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001564public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001565 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1566 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001567 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001568
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001569 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001570 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001571 case llvm::Triple::FreeBSD:
1572 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001573 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001574 PtrDiffType = SignedInt;
1575 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001576 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001577 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001578 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001579 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001580
Roman Divacky3ffe7462012-03-13 19:20:17 +00001581 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1582 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001583 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001584 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001585
1586 // PPC32 supports atomics up to 4 bytes.
1587 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001588 }
1589
Craig Topper3164f332014-03-11 03:39:26 +00001590 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001591 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001592 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001593 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001594};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001595
Bill Schmidt778d3872013-07-26 01:36:11 +00001596// Note: ABI differences may eventually require us to have a separate
1597// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001598class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001599public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001600 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1601 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001602 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001603 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001604 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001605
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001606 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001607 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001608 ABI = "elfv2";
1609 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001610 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001611 ABI = "elfv1";
1612 }
1613
1614 switch (getTriple().getOS()) {
1615 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001616 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001617 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001618 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001619 case llvm::Triple::NetBSD:
1620 IntMaxType = SignedLongLong;
1621 Int64Type = SignedLongLong;
1622 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001623 default:
1624 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001625 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001626
1627 // PPC64 supports atomics up to 8 bytes.
1628 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001629 }
Craig Topper3164f332014-03-11 03:39:26 +00001630 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001631 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001632 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001633 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001634 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001635 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001636 ABI = Name;
1637 return true;
1638 }
1639 return false;
1640 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001641};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001642
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001643class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001644public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001645 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1646 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001647 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001648 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001649 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001650 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001651 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001652 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001653 }
Craig Topper3164f332014-03-11 03:39:26 +00001654 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001655 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001656 }
1657};
1658
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001659class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001660public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001661 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1662 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001663 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001664 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001665 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001666 }
1667};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001668
Eric Christopherc48497a2015-09-18 21:26:24 +00001669static const unsigned NVPTXAddrSpaceMap[] = {
1670 1, // opencl_global
1671 3, // opencl_local
1672 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001673 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001674 0, // opencl_generic
1675 1, // cuda_device
1676 4, // cuda_constant
1677 3, // cuda_shared
1678};
1679
1680class NVPTXTargetInfo : public TargetInfo {
1681 static const char *const GCCRegNames[];
1682 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001683
1684 // The GPU profiles supported by the NVPTX backend
1685 enum GPUKind {
1686 GK_NONE,
1687 GK_SM20,
1688 GK_SM21,
1689 GK_SM30,
1690 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001691 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001692 } GPU;
1693
Eric Christopherc48497a2015-09-18 21:26:24 +00001694public:
Justin Lebar76945b22016-04-29 23:05:19 +00001695 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001696 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001697 BigEndian = false;
1698 TLSSupported = false;
1699 LongWidth = LongAlign = 64;
1700 AddrSpaceMap = &NVPTXAddrSpaceMap;
1701 UseAddrSpaceMapMangling = true;
1702 // Define available target features
1703 // These must be defined in sorted order!
1704 NoAsmVariants = true;
1705 // Set the default GPU to sm20
1706 GPU = GK_SM20;
Justin Lebar76945b22016-04-29 23:05:19 +00001707
1708 // If possible, get a TargetInfo for our host triple, so we can match its
1709 // types.
1710 llvm::Triple HostTriple(Opts.HostTriple);
1711 if (HostTriple.isNVPTX())
1712 return;
1713 std::unique_ptr<TargetInfo> HostTarget(
1714 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1715 if (!HostTarget) {
1716 return;
1717 }
1718
1719 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1720 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1721 BoolWidth = HostTarget->getBoolWidth();
1722 BoolAlign = HostTarget->getBoolAlign();
1723 IntWidth = HostTarget->getIntWidth();
1724 IntAlign = HostTarget->getIntAlign();
1725 HalfWidth = HostTarget->getHalfWidth();
1726 HalfAlign = HostTarget->getHalfAlign();
1727 FloatWidth = HostTarget->getFloatWidth();
1728 FloatAlign = HostTarget->getFloatAlign();
1729 DoubleWidth = HostTarget->getDoubleWidth();
1730 DoubleAlign = HostTarget->getDoubleAlign();
1731 LongWidth = HostTarget->getLongWidth();
1732 LongAlign = HostTarget->getLongAlign();
1733 LongLongWidth = HostTarget->getLongLongWidth();
1734 LongLongAlign = HostTarget->getLongLongAlign();
1735 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1736 DefaultAlignForAttributeAligned =
1737 HostTarget->getDefaultAlignForAttributeAligned();
1738 SizeType = HostTarget->getSizeType();
1739 IntMaxType = HostTarget->getIntMaxType();
1740 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1741 IntPtrType = HostTarget->getIntPtrType();
1742 WCharType = HostTarget->getWCharType();
1743 WIntType = HostTarget->getWIntType();
1744 Char16Type = HostTarget->getChar16Type();
1745 Char32Type = HostTarget->getChar32Type();
1746 Int64Type = HostTarget->getInt64Type();
1747 SigAtomicType = HostTarget->getSigAtomicType();
1748 ProcessIDType = HostTarget->getProcessIDType();
1749
1750 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1751 UseZeroLengthBitfieldAlignment =
1752 HostTarget->useZeroLengthBitfieldAlignment();
1753 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1754 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1755
1756 // Properties intentionally not copied from host:
1757 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1758 // host/device boundary.
1759 // - SuitableAlign: Not visible across the host/device boundary, and may
1760 // correctly be different on host/device, e.g. if host has wider vector
1761 // types than device.
1762 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1763 // as its double type, but that's not necessarily true on the host.
1764 // TODO: nvcc emits a warning when using long double on device; we should
1765 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001766 }
1767 void getTargetDefines(const LangOptions &Opts,
1768 MacroBuilder &Builder) const override {
1769 Builder.defineMacro("__PTX__");
1770 Builder.defineMacro("__NVPTX__");
1771 if (Opts.CUDAIsDevice) {
1772 // Set __CUDA_ARCH__ for the GPU specified.
1773 std::string CUDAArchCode;
1774 switch (GPU) {
1775 case GK_SM20:
1776 CUDAArchCode = "200";
1777 break;
1778 case GK_SM21:
1779 CUDAArchCode = "210";
1780 break;
1781 case GK_SM30:
1782 CUDAArchCode = "300";
1783 break;
1784 case GK_SM35:
1785 CUDAArchCode = "350";
1786 break;
1787 case GK_SM37:
1788 CUDAArchCode = "370";
1789 break;
1790 default:
1791 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001792 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001793 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001794 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001795 }
Craig Topper6c03a542015-10-19 04:51:35 +00001796 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1797 return llvm::makeArrayRef(BuiltinInfo,
1798 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001799 }
1800 bool hasFeature(StringRef Feature) const override {
1801 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001802 }
1803
Craig Topperf054e3a2015-10-19 03:52:27 +00001804 ArrayRef<const char *> getGCCRegNames() const override;
1805 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001806 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001807 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001808 }
1809 bool validateAsmConstraint(const char *&Name,
1810 TargetInfo::ConstraintInfo &Info) const override {
1811 switch (*Name) {
1812 default:
1813 return false;
1814 case 'c':
1815 case 'h':
1816 case 'r':
1817 case 'l':
1818 case 'f':
1819 case 'd':
1820 Info.setAllowsRegister();
1821 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001822 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001823 }
1824 const char *getClobbers() const override {
1825 // FIXME: Is this really right?
1826 return "";
1827 }
1828 BuiltinVaListKind getBuiltinVaListKind() const override {
1829 // FIXME: implement
1830 return TargetInfo::CharPtrBuiltinVaList;
1831 }
1832 bool setCPU(const std::string &Name) override {
1833 GPU = llvm::StringSwitch<GPUKind>(Name)
1834 .Case("sm_20", GK_SM20)
1835 .Case("sm_21", GK_SM21)
1836 .Case("sm_30", GK_SM30)
1837 .Case("sm_35", GK_SM35)
1838 .Case("sm_37", GK_SM37)
1839 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001840
Eric Christopherc48497a2015-09-18 21:26:24 +00001841 return GPU != GK_NONE;
1842 }
1843};
1844
1845const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1846#define BUILTIN(ID, TYPE, ATTRS) \
1847 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1848#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1849 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1850#include "clang/Basic/BuiltinsNVPTX.def"
1851};
1852
1853const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1854
Craig Topperf054e3a2015-10-19 03:52:27 +00001855ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1856 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001857}
1858
1859class NVPTX32TargetInfo : public NVPTXTargetInfo {
1860public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001861 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1862 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001863 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001864 PointerWidth = PointerAlign = 32;
1865 SizeType = TargetInfo::UnsignedInt;
1866 PtrDiffType = TargetInfo::SignedInt;
1867 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001868 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001869 }
1870};
1871
1872class NVPTX64TargetInfo : public NVPTXTargetInfo {
1873public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001874 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1875 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001876 PointerWidth = PointerAlign = 64;
1877 SizeType = TargetInfo::UnsignedLong;
1878 PtrDiffType = TargetInfo::SignedLong;
1879 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001880 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001881 }
1882};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001883
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001884static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001885 1, // opencl_global
1886 3, // opencl_local
1887 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001888 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001889 1, // cuda_device
1890 2, // cuda_constant
1891 3 // cuda_shared
1892};
1893
Tom Stellarda96344b2014-08-21 13:58:40 +00001894// If you edit the description strings, make sure you update
1895// getPointerWidthV().
1896
Craig Topper273dbc62015-10-18 05:29:26 +00001897static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001898 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1899 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001900
Craig Topper273dbc62015-10-18 05:29:26 +00001901static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001902 "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 +00001903 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1904 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001905
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001906class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001907 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001908 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001909
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001910 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001911 enum GPUKind {
1912 GK_NONE,
1913 GK_R600,
1914 GK_R600_DOUBLE_OPS,
1915 GK_R700,
1916 GK_R700_DOUBLE_OPS,
1917 GK_EVERGREEN,
1918 GK_EVERGREEN_DOUBLE_OPS,
1919 GK_NORTHERN_ISLANDS,
1920 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001921 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001922 GK_SEA_ISLANDS,
1923 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001924 } GPU;
1925
Jan Veselyeebeaea2015-05-04 19:53:36 +00001926 bool hasFP64:1;
1927 bool hasFMAF:1;
1928 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001929
Eli Friedmand13b41e2012-10-12 23:32:00 +00001930public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001931 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
1932 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001933 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001934 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001935 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001936 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001937 hasFMAF = true;
1938 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001939 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001940 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001941 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001942 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001943 hasFMAF = false;
1944 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001945 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001946 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001947 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001948 }
1949
Tom Stellarda96344b2014-08-21 13:58:40 +00001950 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1951 if (GPU <= GK_CAYMAN)
1952 return 32;
1953
1954 switch(AddrSpace) {
1955 default:
1956 return 64;
1957 case 0:
1958 case 3:
1959 case 5:
1960 return 32;
1961 }
1962 }
1963
Craig Topper3164f332014-03-11 03:39:26 +00001964 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001965 return "";
1966 }
1967
Craig Topperf054e3a2015-10-19 03:52:27 +00001968 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001969
Craig Topperf054e3a2015-10-19 03:52:27 +00001970 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1971 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001972 }
1973
Craig Topper3164f332014-03-11 03:39:26 +00001974 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001975 TargetInfo::ConstraintInfo &Info) const override {
1976 switch (*Name) {
1977 default: break;
1978 case 'v': // vgpr
1979 case 's': // sgpr
1980 Info.setAllowsRegister();
1981 return true;
1982 }
1983 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001984 }
1985
Craig Topper6c03a542015-10-19 04:51:35 +00001986 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1987 return llvm::makeArrayRef(BuiltinInfo,
1988 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001989 }
1990
Craig Topper3164f332014-03-11 03:39:26 +00001991 void getTargetDefines(const LangOptions &Opts,
1992 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001993 if (getTriple().getArch() == llvm::Triple::amdgcn)
1994 Builder.defineMacro("__AMDGCN__");
1995 else
1996 Builder.defineMacro("__R600__");
1997
Jan Veselyeebeaea2015-05-04 19:53:36 +00001998 if (hasFMAF)
1999 Builder.defineMacro("__HAS_FMAF__");
2000 if (hasLDEXPF)
2001 Builder.defineMacro("__HAS_LDEXPF__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002002 }
2003
Craig Topper3164f332014-03-11 03:39:26 +00002004 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002005 return TargetInfo::CharPtrBuiltinVaList;
2006 }
2007
Craig Topper3164f332014-03-11 03:39:26 +00002008 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00002009 GPU = llvm::StringSwitch<GPUKind>(Name)
2010 .Case("r600" , GK_R600)
2011 .Case("rv610", GK_R600)
2012 .Case("rv620", GK_R600)
2013 .Case("rv630", GK_R600)
2014 .Case("rv635", GK_R600)
2015 .Case("rs780", GK_R600)
2016 .Case("rs880", GK_R600)
2017 .Case("rv670", GK_R600_DOUBLE_OPS)
2018 .Case("rv710", GK_R700)
2019 .Case("rv730", GK_R700)
2020 .Case("rv740", GK_R700_DOUBLE_OPS)
2021 .Case("rv770", GK_R700_DOUBLE_OPS)
2022 .Case("palm", GK_EVERGREEN)
2023 .Case("cedar", GK_EVERGREEN)
2024 .Case("sumo", GK_EVERGREEN)
2025 .Case("sumo2", GK_EVERGREEN)
2026 .Case("redwood", GK_EVERGREEN)
2027 .Case("juniper", GK_EVERGREEN)
2028 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2029 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2030 .Case("barts", GK_NORTHERN_ISLANDS)
2031 .Case("turks", GK_NORTHERN_ISLANDS)
2032 .Case("caicos", GK_NORTHERN_ISLANDS)
2033 .Case("cayman", GK_CAYMAN)
2034 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00002035 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002036 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2037 .Case("verde", GK_SOUTHERN_ISLANDS)
2038 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002039 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002040 .Case("bonaire", GK_SEA_ISLANDS)
2041 .Case("kabini", GK_SEA_ISLANDS)
2042 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002043 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002044 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002045 .Case("tonga", GK_VOLCANIC_ISLANDS)
2046 .Case("iceland", GK_VOLCANIC_ISLANDS)
2047 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002048 .Case("fiji", GK_VOLCANIC_ISLANDS)
2049 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002050 .Default(GK_NONE);
2051
2052 if (GPU == GK_NONE) {
2053 return false;
2054 }
2055
2056 // Set the correct data layout
2057 switch (GPU) {
2058 case GK_NONE:
2059 case GK_R600:
2060 case GK_R700:
2061 case GK_EVERGREEN:
2062 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002063 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002064 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002065 hasFMAF = false;
2066 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002067 break;
2068 case GK_R600_DOUBLE_OPS:
2069 case GK_R700_DOUBLE_OPS:
2070 case GK_EVERGREEN_DOUBLE_OPS:
2071 case GK_CAYMAN:
Matt Arsenaultedc7c6b2016-03-30 21:32:37 +00002072 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002073 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002074 hasFMAF = true;
2075 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002076 break;
2077 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00002078 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00002079 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002080 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002081 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002082 hasFMAF = true;
2083 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002084 break;
2085 }
2086
2087 return true;
2088 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002089
2090 void setSupportedOpenCLOpts() override {
2091 auto &Opts = getSupportedOpenCLOpts();
2092 Opts.cl_clang_storage_class_specifiers = 1;
2093 Opts.cl_khr_gl_sharing = 1;
2094 Opts.cl_khr_gl_event = 1;
2095 Opts.cl_khr_d3d10_sharing = 1;
2096 Opts.cl_khr_subgroups = 1;
2097
2098 if (hasFP64)
2099 Opts.cl_khr_fp64 = 1;
2100 if (GPU >= GK_NORTHERN_ISLANDS) {
2101 Opts.cl_khr_byte_addressable_store = 1;
2102 Opts.cl_khr_global_int32_base_atomics = 1;
2103 Opts.cl_khr_global_int32_extended_atomics = 1;
2104 Opts.cl_khr_local_int32_base_atomics = 1;
2105 Opts.cl_khr_local_int32_extended_atomics = 1;
2106 }
2107 if (GPU >= GK_SOUTHERN_ISLANDS)
2108 Opts.cl_khr_fp16 = 1;
2109 Opts.cl_khr_int64_base_atomics = 1;
2110 Opts.cl_khr_int64_extended_atomics = 1;
2111 Opts.cl_khr_3d_image_writes = 1;
2112 Opts.cl_khr_gl_msaa_sharing = 1;
2113 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002114};
2115
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002116const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002117#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002118 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002119#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002120};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002121const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002122 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2123 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2124 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2125 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2126 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2127 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2128 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2129 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2130 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2131 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2132 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2133 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2134 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2135 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2136 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2137 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2138 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2139 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2140 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2141 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2142 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2143 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2144 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2145 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2146 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2147 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2148 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2149 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2150 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2151 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2152 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2153 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2154 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2155 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2156 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2157 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2158 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2159 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2160 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2161 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2162 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2163 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2164 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2165 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2166 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2167 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2168 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002169 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002170 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2171 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002172};
2173
Craig Topperf054e3a2015-10-19 03:52:27 +00002174ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2175 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002176}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002177
Eli Friedman3fd920a2008-08-20 02:34:37 +00002178// Namespace for x86 abstract base class
2179const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002180#define BUILTIN(ID, TYPE, ATTRS) \
2181 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002182#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002183 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002184#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002185 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002186#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002187};
Eli Friedmanb5366062008-05-20 14:21:01 +00002188
Nuno Lopescfca1f02009-12-23 17:49:57 +00002189static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002190 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2191 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002192 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002193 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2194 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2195 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002196 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002197 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2198 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002199 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2200 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2201 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2202 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2203 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2204 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2205 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2206 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002207};
2208
Eric Christophercdd36352011-06-21 00:05:20 +00002209const TargetInfo::AddlRegName AddlRegNames[] = {
2210 { { "al", "ah", "eax", "rax" }, 0 },
2211 { { "bl", "bh", "ebx", "rbx" }, 3 },
2212 { { "cl", "ch", "ecx", "rcx" }, 2 },
2213 { { "dl", "dh", "edx", "rdx" }, 1 },
2214 { { "esi", "rsi" }, 4 },
2215 { { "edi", "rdi" }, 5 },
2216 { { "esp", "rsp" }, 7 },
2217 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002218 { { "r8d", "r8w", "r8b" }, 38 },
2219 { { "r9d", "r9w", "r9b" }, 39 },
2220 { { "r10d", "r10w", "r10b" }, 40 },
2221 { { "r11d", "r11w", "r11b" }, 41 },
2222 { { "r12d", "r12w", "r12b" }, 42 },
2223 { { "r13d", "r13w", "r13b" }, 43 },
2224 { { "r14d", "r14w", "r14b" }, 44 },
2225 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002226};
2227
2228// X86 target abstract base class; x86-32 and x86-64 are very close, so
2229// most of the implementation can be shared.
2230class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002231 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002232 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002233 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002234 enum MMX3DNowEnum {
2235 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002236 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002237 enum XOPEnum {
2238 NoXOP,
2239 SSE4A,
2240 FMA4,
2241 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002242 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002243
Craig Topper543f3bd2015-10-14 23:47:57 +00002244 bool HasAES = false;
2245 bool HasPCLMUL = false;
2246 bool HasLZCNT = false;
2247 bool HasRDRND = false;
2248 bool HasFSGSBASE = false;
2249 bool HasBMI = false;
2250 bool HasBMI2 = false;
2251 bool HasPOPCNT = false;
2252 bool HasRTM = false;
2253 bool HasPRFCHW = false;
2254 bool HasRDSEED = false;
2255 bool HasADX = false;
2256 bool HasTBM = false;
2257 bool HasFMA = false;
2258 bool HasF16C = false;
2259 bool HasAVX512CD = false;
2260 bool HasAVX512ER = false;
2261 bool HasAVX512PF = false;
2262 bool HasAVX512DQ = false;
2263 bool HasAVX512BW = false;
2264 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002265 bool HasAVX512VBMI = false;
2266 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002267 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002268 bool HasMPX = false;
2269 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002270 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002271 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002272 bool HasXSAVE = false;
2273 bool HasXSAVEOPT = false;
2274 bool HasXSAVEC = false;
2275 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002276 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002277 bool HasCLFLUSHOPT = false;
2278 bool HasPCOMMIT = false;
2279 bool HasCLWB = false;
2280 bool HasUMIP = false;
2281 bool HasMOVBE = false;
2282 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002283
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002284 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2285 ///
2286 /// Each enumeration represents a particular CPU supported by Clang. These
2287 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2288 enum CPUKind {
2289 CK_Generic,
2290
2291 /// \name i386
2292 /// i386-generation processors.
2293 //@{
2294 CK_i386,
2295 //@}
2296
2297 /// \name i486
2298 /// i486-generation processors.
2299 //@{
2300 CK_i486,
2301 CK_WinChipC6,
2302 CK_WinChip2,
2303 CK_C3,
2304 //@}
2305
2306 /// \name i586
2307 /// i586-generation processors, P5 microarchitecture based.
2308 //@{
2309 CK_i586,
2310 CK_Pentium,
2311 CK_PentiumMMX,
2312 //@}
2313
2314 /// \name i686
2315 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2316 //@{
2317 CK_i686,
2318 CK_PentiumPro,
2319 CK_Pentium2,
2320 CK_Pentium3,
2321 CK_Pentium3M,
2322 CK_PentiumM,
2323 CK_C3_2,
2324
2325 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2326 /// Clang however has some logic to suport this.
2327 // FIXME: Warn, deprecate, and potentially remove this.
2328 CK_Yonah,
2329 //@}
2330
2331 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002332 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002333 //@{
2334 CK_Pentium4,
2335 CK_Pentium4M,
2336 CK_Prescott,
2337 CK_Nocona,
2338 //@}
2339
2340 /// \name Core
2341 /// Core microarchitecture based processors.
2342 //@{
2343 CK_Core2,
2344
2345 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2346 /// codename which GCC no longer accepts as an option to -march, but Clang
2347 /// has some logic for recognizing it.
2348 // FIXME: Warn, deprecate, and potentially remove this.
2349 CK_Penryn,
2350 //@}
2351
2352 /// \name Atom
2353 /// Atom processors
2354 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002355 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002356 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002357 //@}
2358
2359 /// \name Nehalem
2360 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002361 CK_Nehalem,
2362
2363 /// \name Westmere
2364 /// Westmere microarchitecture based processors.
2365 CK_Westmere,
2366
2367 /// \name Sandy Bridge
2368 /// Sandy Bridge microarchitecture based processors.
2369 CK_SandyBridge,
2370
2371 /// \name Ivy Bridge
2372 /// Ivy Bridge microarchitecture based processors.
2373 CK_IvyBridge,
2374
2375 /// \name Haswell
2376 /// Haswell microarchitecture based processors.
2377 CK_Haswell,
2378
2379 /// \name Broadwell
2380 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002381 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002382
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002383 /// \name Skylake Client
2384 /// Skylake client microarchitecture based processors.
2385 CK_SkylakeClient,
2386
2387 /// \name Skylake Server
2388 /// Skylake server microarchitecture based processors.
2389 CK_SkylakeServer,
2390
2391 /// \name Cannonlake Client
2392 /// Cannonlake client microarchitecture based processors.
2393 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002394
Craig Topper449314e2013-08-20 07:09:39 +00002395 /// \name Knights Landing
2396 /// Knights Landing processor.
2397 CK_KNL,
2398
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002399 /// \name Lakemont
2400 /// Lakemont microarchitecture based processors.
2401 CK_Lakemont,
2402
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002403 /// \name K6
2404 /// K6 architecture processors.
2405 //@{
2406 CK_K6,
2407 CK_K6_2,
2408 CK_K6_3,
2409 //@}
2410
2411 /// \name K7
2412 /// K7 architecture processors.
2413 //@{
2414 CK_Athlon,
2415 CK_AthlonThunderbird,
2416 CK_Athlon4,
2417 CK_AthlonXP,
2418 CK_AthlonMP,
2419 //@}
2420
2421 /// \name K8
2422 /// K8 architecture processors.
2423 //@{
2424 CK_Athlon64,
2425 CK_Athlon64SSE3,
2426 CK_AthlonFX,
2427 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002428 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002429 CK_Opteron,
2430 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002431 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002432 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002433
Benjamin Kramer569f2152012-01-10 11:50:18 +00002434 /// \name Bobcat
2435 /// Bobcat architecture processors.
2436 //@{
2437 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002438 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002439 //@}
2440
2441 /// \name Bulldozer
2442 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002443 //@{
2444 CK_BDVER1,
2445 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002446 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002447 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002448 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002449
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002450 /// This specification is deprecated and will be removed in the future.
2451 /// Users should prefer \see CK_K8.
2452 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002453 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002454 CK_x86_64,
2455 //@}
2456
2457 /// \name Geode
2458 /// Geode processors.
2459 //@{
2460 CK_Geode
2461 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002462 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002463
Eric Christopherc50738f2015-08-27 00:05:50 +00002464 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002465 return llvm::StringSwitch<CPUKind>(CPU)
2466 .Case("i386", CK_i386)
2467 .Case("i486", CK_i486)
2468 .Case("winchip-c6", CK_WinChipC6)
2469 .Case("winchip2", CK_WinChip2)
2470 .Case("c3", CK_C3)
2471 .Case("i586", CK_i586)
2472 .Case("pentium", CK_Pentium)
2473 .Case("pentium-mmx", CK_PentiumMMX)
2474 .Case("i686", CK_i686)
2475 .Case("pentiumpro", CK_PentiumPro)
2476 .Case("pentium2", CK_Pentium2)
2477 .Case("pentium3", CK_Pentium3)
2478 .Case("pentium3m", CK_Pentium3M)
2479 .Case("pentium-m", CK_PentiumM)
2480 .Case("c3-2", CK_C3_2)
2481 .Case("yonah", CK_Yonah)
2482 .Case("pentium4", CK_Pentium4)
2483 .Case("pentium4m", CK_Pentium4M)
2484 .Case("prescott", CK_Prescott)
2485 .Case("nocona", CK_Nocona)
2486 .Case("core2", CK_Core2)
2487 .Case("penryn", CK_Penryn)
2488 .Case("bonnell", CK_Bonnell)
2489 .Case("atom", CK_Bonnell) // Legacy name.
2490 .Case("silvermont", CK_Silvermont)
2491 .Case("slm", CK_Silvermont) // Legacy name.
2492 .Case("nehalem", CK_Nehalem)
2493 .Case("corei7", CK_Nehalem) // Legacy name.
2494 .Case("westmere", CK_Westmere)
2495 .Case("sandybridge", CK_SandyBridge)
2496 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2497 .Case("ivybridge", CK_IvyBridge)
2498 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2499 .Case("haswell", CK_Haswell)
2500 .Case("core-avx2", CK_Haswell) // Legacy name.
2501 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002502 .Case("skylake", CK_SkylakeClient)
2503 .Case("skylake-avx512", CK_SkylakeServer)
2504 .Case("skx", CK_SkylakeServer) // Legacy name.
2505 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002506 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002507 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002508 .Case("k6", CK_K6)
2509 .Case("k6-2", CK_K6_2)
2510 .Case("k6-3", CK_K6_3)
2511 .Case("athlon", CK_Athlon)
2512 .Case("athlon-tbird", CK_AthlonThunderbird)
2513 .Case("athlon-4", CK_Athlon4)
2514 .Case("athlon-xp", CK_AthlonXP)
2515 .Case("athlon-mp", CK_AthlonMP)
2516 .Case("athlon64", CK_Athlon64)
2517 .Case("athlon64-sse3", CK_Athlon64SSE3)
2518 .Case("athlon-fx", CK_AthlonFX)
2519 .Case("k8", CK_K8)
2520 .Case("k8-sse3", CK_K8SSE3)
2521 .Case("opteron", CK_Opteron)
2522 .Case("opteron-sse3", CK_OpteronSSE3)
2523 .Case("barcelona", CK_AMDFAM10)
2524 .Case("amdfam10", CK_AMDFAM10)
2525 .Case("btver1", CK_BTVER1)
2526 .Case("btver2", CK_BTVER2)
2527 .Case("bdver1", CK_BDVER1)
2528 .Case("bdver2", CK_BDVER2)
2529 .Case("bdver3", CK_BDVER3)
2530 .Case("bdver4", CK_BDVER4)
2531 .Case("x86-64", CK_x86_64)
2532 .Case("geode", CK_Geode)
2533 .Default(CK_Generic);
2534 }
2535
Rafael Espindolaeb265472013-08-21 21:59:03 +00002536 enum FPMathKind {
2537 FP_Default,
2538 FP_SSE,
2539 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002540 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002541
Eli Friedman3fd920a2008-08-20 02:34:37 +00002542public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002543 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2544 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002545 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002546 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002547 }
Craig Topper3164f332014-03-11 03:39:26 +00002548 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002549 // X87 evaluates with 80 bits "long double" precision.
2550 return SSELevel == NoSSE ? 2 : 0;
2551 }
Craig Topper6c03a542015-10-19 04:51:35 +00002552 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2553 return llvm::makeArrayRef(BuiltinInfo,
2554 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002555 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002556 ArrayRef<const char *> getGCCRegNames() const override {
2557 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002558 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002559 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2560 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002561 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002562 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2563 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002564 }
Eric Christopherd9832702015-06-29 21:00:05 +00002565 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002566 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002567 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002568
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002569 bool validateGlobalRegisterVariable(StringRef RegName,
2570 unsigned RegSize,
2571 bool &HasSizeMismatch) const override {
2572 // esp and ebp are the only 32-bit registers the x86 backend can currently
2573 // handle.
2574 if (RegName.equals("esp") || RegName.equals("ebp")) {
2575 // Check that the register size is 32-bit.
2576 HasSizeMismatch = RegSize != 32;
2577 return true;
2578 }
2579
2580 return false;
2581 }
2582
Akira Hatanaka974131e2014-09-18 18:17:18 +00002583 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2584
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002585 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2586
Akira Hatanaka974131e2014-09-18 18:17:18 +00002587 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2588
Craig Topper3164f332014-03-11 03:39:26 +00002589 std::string convertConstraint(const char *&Constraint) const override;
2590 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002591 return "~{dirflag},~{fpsr},~{flags}";
2592 }
Craig Topper3164f332014-03-11 03:39:26 +00002593 void getTargetDefines(const LangOptions &Opts,
2594 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002595 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2596 bool Enabled);
2597 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2598 bool Enabled);
2599 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2600 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002601 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2602 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002603 setFeatureEnabledImpl(Features, Name, Enabled);
2604 }
2605 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002606 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002607 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2608 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002609 bool
2610 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2611 StringRef CPU,
2612 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002613 bool hasFeature(StringRef Feature) const override;
2614 bool handleTargetFeatures(std::vector<std::string> &Features,
2615 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002616 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002617 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2618 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002619 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002620 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002621 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002622 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002623 return "no-mmx";
2624 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002625 }
Craig Topper3164f332014-03-11 03:39:26 +00002626 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002627 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002628
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002629 // Perform any per-CPU checks necessary to determine if this CPU is
2630 // acceptable.
2631 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2632 // invalid without explaining *why*.
2633 switch (CPU) {
2634 case CK_Generic:
2635 // No processor selected!
2636 return false;
2637
2638 case CK_i386:
2639 case CK_i486:
2640 case CK_WinChipC6:
2641 case CK_WinChip2:
2642 case CK_C3:
2643 case CK_i586:
2644 case CK_Pentium:
2645 case CK_PentiumMMX:
2646 case CK_i686:
2647 case CK_PentiumPro:
2648 case CK_Pentium2:
2649 case CK_Pentium3:
2650 case CK_Pentium3M:
2651 case CK_PentiumM:
2652 case CK_Yonah:
2653 case CK_C3_2:
2654 case CK_Pentium4:
2655 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002656 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002657 case CK_Prescott:
2658 case CK_K6:
2659 case CK_K6_2:
2660 case CK_K6_3:
2661 case CK_Athlon:
2662 case CK_AthlonThunderbird:
2663 case CK_Athlon4:
2664 case CK_AthlonXP:
2665 case CK_AthlonMP:
2666 case CK_Geode:
2667 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002668 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002669 return false;
2670
2671 // Fallthrough
2672 case CK_Nocona:
2673 case CK_Core2:
2674 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002675 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002676 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002677 case CK_Nehalem:
2678 case CK_Westmere:
2679 case CK_SandyBridge:
2680 case CK_IvyBridge:
2681 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002682 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002683 case CK_SkylakeClient:
2684 case CK_SkylakeServer:
2685 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002686 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002687 case CK_Athlon64:
2688 case CK_Athlon64SSE3:
2689 case CK_AthlonFX:
2690 case CK_K8:
2691 case CK_K8SSE3:
2692 case CK_Opteron:
2693 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002694 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002695 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002696 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002697 case CK_BDVER1:
2698 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002699 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002700 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002701 case CK_x86_64:
2702 return true;
2703 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002704 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002705 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002706
Craig Topper3164f332014-03-11 03:39:26 +00002707 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002708
Craig Topper3164f332014-03-11 03:39:26 +00002709 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002710 // Most of the non-ARM calling conventions are i386 conventions.
2711 switch (CC) {
2712 case CC_X86ThisCall:
2713 case CC_X86FastCall:
2714 case CC_X86StdCall:
2715 case CC_X86VectorCall:
2716 case CC_C:
2717 case CC_Swift:
2718 case CC_X86Pascal:
2719 case CC_IntelOclBicc:
2720 return CCCR_OK;
2721 default:
2722 return CCCR_Warning;
2723 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002724 }
2725
Craig Topper3164f332014-03-11 03:39:26 +00002726 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002727 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002728 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002729
2730 bool hasSjLjLowering() const override {
2731 return true;
2732 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002733
2734 void setSupportedOpenCLOpts() override {
2735 getSupportedOpenCLOpts().setAll();
2736 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002737};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002738
Rafael Espindolaeb265472013-08-21 21:59:03 +00002739bool X86TargetInfo::setFPMath(StringRef Name) {
2740 if (Name == "387") {
2741 FPMath = FP_387;
2742 return true;
2743 }
2744 if (Name == "sse") {
2745 FPMath = FP_SSE;
2746 return true;
2747 }
2748 return false;
2749}
2750
Eric Christopher007b0a02015-08-28 22:32:01 +00002751bool X86TargetInfo::initFeatureMap(
2752 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002753 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002754 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002755 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002756 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002757 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002758
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002759 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002760
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002761 // Enable X87 for all X86 processors but Lakemont.
2762 if (Kind != CK_Lakemont)
2763 setFeatureEnabledImpl(Features, "x87", true);
2764
2765 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002766 case CK_Generic:
2767 case CK_i386:
2768 case CK_i486:
2769 case CK_i586:
2770 case CK_Pentium:
2771 case CK_i686:
2772 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002773 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002774 break;
2775 case CK_PentiumMMX:
2776 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002777 case CK_K6:
2778 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002779 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002780 break;
2781 case CK_Pentium3:
2782 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002783 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002784 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002785 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002786 break;
2787 case CK_PentiumM:
2788 case CK_Pentium4:
2789 case CK_Pentium4M:
2790 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002791 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002792 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002793 break;
2794 case CK_Yonah:
2795 case CK_Prescott:
2796 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002797 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002798 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002799 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002800 break;
2801 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002802 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002803 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002804 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002805 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002806 break;
2807 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002808 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002809 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002810 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002811 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002812 case CK_Cannonlake:
2813 setFeatureEnabledImpl(Features, "avx512ifma", true);
2814 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2815 setFeatureEnabledImpl(Features, "sha", true);
2816 setFeatureEnabledImpl(Features, "umip", true);
2817 // FALLTHROUGH
2818 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002819 setFeatureEnabledImpl(Features, "avx512f", true);
2820 setFeatureEnabledImpl(Features, "avx512cd", true);
2821 setFeatureEnabledImpl(Features, "avx512dq", true);
2822 setFeatureEnabledImpl(Features, "avx512bw", true);
2823 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002824 setFeatureEnabledImpl(Features, "pku", true);
2825 setFeatureEnabledImpl(Features, "pcommit", true);
2826 setFeatureEnabledImpl(Features, "clwb", true);
2827 // FALLTHROUGH
2828 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002829 setFeatureEnabledImpl(Features, "xsavec", true);
2830 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002831 setFeatureEnabledImpl(Features, "mpx", true);
2832 setFeatureEnabledImpl(Features, "sgx", true);
2833 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002834 // FALLTHROUGH
2835 case CK_Broadwell:
2836 setFeatureEnabledImpl(Features, "rdseed", true);
2837 setFeatureEnabledImpl(Features, "adx", true);
2838 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002839 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002840 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002841 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002842 setFeatureEnabledImpl(Features, "bmi", true);
2843 setFeatureEnabledImpl(Features, "bmi2", true);
2844 setFeatureEnabledImpl(Features, "rtm", true);
2845 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002846 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002847 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002848 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002849 setFeatureEnabledImpl(Features, "rdrnd", true);
2850 setFeatureEnabledImpl(Features, "f16c", true);
2851 setFeatureEnabledImpl(Features, "fsgsbase", true);
2852 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002853 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002854 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002855 setFeatureEnabledImpl(Features, "xsave", true);
2856 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002857 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002858 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002859 case CK_Silvermont:
2860 setFeatureEnabledImpl(Features, "aes", true);
2861 setFeatureEnabledImpl(Features, "pclmul", true);
2862 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002863 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002864 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002865 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002866 setFeatureEnabledImpl(Features, "cx16", true);
2867 break;
2868 case CK_KNL:
2869 setFeatureEnabledImpl(Features, "avx512f", true);
2870 setFeatureEnabledImpl(Features, "avx512cd", true);
2871 setFeatureEnabledImpl(Features, "avx512er", true);
2872 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002873 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002874 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002875 setFeatureEnabledImpl(Features, "rdseed", true);
2876 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002877 setFeatureEnabledImpl(Features, "lzcnt", true);
2878 setFeatureEnabledImpl(Features, "bmi", true);
2879 setFeatureEnabledImpl(Features, "bmi2", true);
2880 setFeatureEnabledImpl(Features, "rtm", true);
2881 setFeatureEnabledImpl(Features, "fma", true);
2882 setFeatureEnabledImpl(Features, "rdrnd", true);
2883 setFeatureEnabledImpl(Features, "f16c", true);
2884 setFeatureEnabledImpl(Features, "fsgsbase", true);
2885 setFeatureEnabledImpl(Features, "aes", true);
2886 setFeatureEnabledImpl(Features, "pclmul", true);
2887 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002888 setFeatureEnabledImpl(Features, "xsaveopt", true);
2889 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002890 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002891 break;
2892 case CK_K6_2:
2893 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002894 case CK_WinChip2:
2895 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002896 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002897 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002898 case CK_Athlon:
2899 case CK_AthlonThunderbird:
2900 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002901 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002902 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002903 case CK_Athlon4:
2904 case CK_AthlonXP:
2905 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002906 setFeatureEnabledImpl(Features, "sse", true);
2907 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002908 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002909 break;
2910 case CK_K8:
2911 case CK_Opteron:
2912 case CK_Athlon64:
2913 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002914 setFeatureEnabledImpl(Features, "sse2", true);
2915 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002916 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002917 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002918 case CK_AMDFAM10:
2919 setFeatureEnabledImpl(Features, "sse4a", true);
2920 setFeatureEnabledImpl(Features, "lzcnt", true);
2921 setFeatureEnabledImpl(Features, "popcnt", true);
2922 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002923 case CK_K8SSE3:
2924 case CK_OpteronSSE3:
2925 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002926 setFeatureEnabledImpl(Features, "sse3", true);
2927 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002928 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002929 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002930 case CK_BTVER2:
2931 setFeatureEnabledImpl(Features, "avx", true);
2932 setFeatureEnabledImpl(Features, "aes", true);
2933 setFeatureEnabledImpl(Features, "pclmul", true);
2934 setFeatureEnabledImpl(Features, "bmi", true);
2935 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002936 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002937 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002938 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002939 setFeatureEnabledImpl(Features, "ssse3", true);
2940 setFeatureEnabledImpl(Features, "sse4a", true);
2941 setFeatureEnabledImpl(Features, "lzcnt", true);
2942 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002943 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002944 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002945 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002946 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002947 case CK_BDVER4:
2948 setFeatureEnabledImpl(Features, "avx2", true);
2949 setFeatureEnabledImpl(Features, "bmi2", true);
2950 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002951 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002952 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002953 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002954 // FALLTHROUGH
2955 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002956 setFeatureEnabledImpl(Features, "bmi", true);
2957 setFeatureEnabledImpl(Features, "fma", true);
2958 setFeatureEnabledImpl(Features, "f16c", true);
2959 setFeatureEnabledImpl(Features, "tbm", true);
2960 // FALLTHROUGH
2961 case CK_BDVER1:
2962 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002963 setFeatureEnabledImpl(Features, "xop", true);
2964 setFeatureEnabledImpl(Features, "lzcnt", true);
2965 setFeatureEnabledImpl(Features, "aes", true);
2966 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002967 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002968 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002969 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002970 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002971 break;
Eli Friedman33465822011-07-08 23:31:17 +00002972 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002973 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2974 return false;
2975
2976 // Can't do this earlier because we need to be able to explicitly enable
2977 // or disable these features and the things that they depend upon.
2978
2979 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2980 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002981 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002982 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2983 FeaturesVec.end())
2984 Features["popcnt"] = true;
2985
2986 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2987 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002988 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002989 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2990 FeaturesVec.end())
2991 Features["prfchw"] = true;
2992
Eric Christophera7260af2015-10-08 20:10:18 +00002993 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2994 // then enable MMX.
2995 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002996 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002997 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2998 FeaturesVec.end())
2999 Features["mmx"] = true;
3000
Eric Christopherbbd746d2015-10-08 20:10:14 +00003001 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003002}
3003
Rafael Espindolae62e2792013-08-20 13:44:29 +00003004void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003005 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003006 if (Enabled) {
3007 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003008 case AVX512F:
3009 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003010 case AVX2:
3011 Features["avx2"] = true;
3012 case AVX:
3013 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003014 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003015 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003016 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003017 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003018 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003019 case SSSE3:
3020 Features["ssse3"] = true;
3021 case SSE3:
3022 Features["sse3"] = true;
3023 case SSE2:
3024 Features["sse2"] = true;
3025 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003026 Features["sse"] = true;
3027 case NoSSE:
3028 break;
3029 }
3030 return;
3031 }
3032
3033 switch (Level) {
3034 case NoSSE:
3035 case SSE1:
3036 Features["sse"] = false;
3037 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003038 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3039 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003040 case SSE3:
3041 Features["sse3"] = false;
3042 setXOPLevel(Features, NoXOP, false);
3043 case SSSE3:
3044 Features["ssse3"] = false;
3045 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003046 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003047 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003048 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003049 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003050 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3051 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003052 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003053 case AVX2:
3054 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003055 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003056 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003057 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003058 Features["avx512vl"] = Features["avx512vbmi"] =
3059 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003060 }
3061}
3062
3063void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003064 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003065 if (Enabled) {
3066 switch (Level) {
3067 case AMD3DNowAthlon:
3068 Features["3dnowa"] = true;
3069 case AMD3DNow:
3070 Features["3dnow"] = true;
3071 case MMX:
3072 Features["mmx"] = true;
3073 case NoMMX3DNow:
3074 break;
3075 }
3076 return;
3077 }
3078
3079 switch (Level) {
3080 case NoMMX3DNow:
3081 case MMX:
3082 Features["mmx"] = false;
3083 case AMD3DNow:
3084 Features["3dnow"] = false;
3085 case AMD3DNowAthlon:
3086 Features["3dnowa"] = false;
3087 }
3088}
3089
3090void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003091 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003092 if (Enabled) {
3093 switch (Level) {
3094 case XOP:
3095 Features["xop"] = true;
3096 case FMA4:
3097 Features["fma4"] = true;
3098 setSSELevel(Features, AVX, true);
3099 case SSE4A:
3100 Features["sse4a"] = true;
3101 setSSELevel(Features, SSE3, true);
3102 case NoXOP:
3103 break;
3104 }
3105 return;
3106 }
3107
3108 switch (Level) {
3109 case NoXOP:
3110 case SSE4A:
3111 Features["sse4a"] = false;
3112 case FMA4:
3113 Features["fma4"] = false;
3114 case XOP:
3115 Features["xop"] = false;
3116 }
3117}
3118
Craig Topper86d79ef2013-09-17 04:51:29 +00003119void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3120 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003121 // This is a bit of a hack to deal with the sse4 target feature when used
3122 // as part of the target attribute. We handle sse4 correctly everywhere
3123 // else. See below for more information on how we handle the sse4 options.
3124 if (Name != "sse4")
3125 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003126
Craig Topper29561122013-09-19 01:13:07 +00003127 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003128 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003129 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003130 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003131 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003132 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003133 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003134 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003135 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003136 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003137 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003138 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003139 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003140 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003141 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003142 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003143 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003144 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003145 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003146 if (Enabled)
3147 setSSELevel(Features, SSE2, Enabled);
3148 } else if (Name == "pclmul") {
3149 if (Enabled)
3150 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003151 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003152 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003153 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003154 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003155 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003156 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003157 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3158 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3159 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003160 if (Enabled)
3161 setSSELevel(Features, AVX512F, Enabled);
3162 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003163 if (Enabled)
3164 setSSELevel(Features, AVX, Enabled);
3165 } else if (Name == "fma4") {
3166 setXOPLevel(Features, FMA4, Enabled);
3167 } else if (Name == "xop") {
3168 setXOPLevel(Features, XOP, Enabled);
3169 } else if (Name == "sse4a") {
3170 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003171 } else if (Name == "f16c") {
3172 if (Enabled)
3173 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003174 } else if (Name == "sha") {
3175 if (Enabled)
3176 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003177 } else if (Name == "sse4") {
3178 // We can get here via the __target__ attribute since that's not controlled
3179 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3180 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3181 // disabled.
3182 if (Enabled)
3183 setSSELevel(Features, SSE42, Enabled);
3184 else
3185 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003186 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003187 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003188 Features["xsaveopt"] = false;
3189 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003190 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003191 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003192 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003193}
3194
Eric Christopher3ff21b32013-10-16 21:26:26 +00003195/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003196/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003197bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003198 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003199 for (const auto &Feature : Features) {
3200 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003201 continue;
3202
Eric Christopher610fe112015-08-26 08:21:55 +00003203 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003204 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003205 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003206 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003207 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003208 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003209 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003210 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003211 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003212 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003213 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003214 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003215 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003216 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003217 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003218 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003219 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003220 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003221 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003222 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003223 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003224 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003225 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003226 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003227 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003228 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003229 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003230 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003231 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003232 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003233 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003234 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003235 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003236 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003237 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003238 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003239 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003240 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003241 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003242 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003243 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003244 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003245 } else if (Feature == "+avx512vbmi") {
3246 HasAVX512VBMI = true;
3247 } else if (Feature == "+avx512ifma") {
3248 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003249 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003250 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003251 } else if (Feature == "+mpx") {
3252 HasMPX = true;
3253 } else if (Feature == "+movbe") {
3254 HasMOVBE = true;
3255 } else if (Feature == "+sgx") {
3256 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003257 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003258 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003259 } else if (Feature == "+fxsr") {
3260 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003261 } else if (Feature == "+xsave") {
3262 HasXSAVE = true;
3263 } else if (Feature == "+xsaveopt") {
3264 HasXSAVEOPT = true;
3265 } else if (Feature == "+xsavec") {
3266 HasXSAVEC = true;
3267 } else if (Feature == "+xsaves") {
3268 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003269 } else if (Feature == "+pku") {
3270 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003271 } else if (Feature == "+clflushopt") {
3272 HasCLFLUSHOPT = true;
3273 } else if (Feature == "+pcommit") {
3274 HasPCOMMIT = true;
3275 } else if (Feature == "+clwb") {
3276 HasCLWB = true;
3277 } else if (Feature == "+umip") {
3278 HasUMIP = true;
3279 } else if (Feature == "+prefetchwt1") {
3280 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003281 }
3282
Benjamin Kramer27402c62012-03-05 15:10:44 +00003283 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003284 .Case("+avx512f", AVX512F)
3285 .Case("+avx2", AVX2)
3286 .Case("+avx", AVX)
3287 .Case("+sse4.2", SSE42)
3288 .Case("+sse4.1", SSE41)
3289 .Case("+ssse3", SSSE3)
3290 .Case("+sse3", SSE3)
3291 .Case("+sse2", SSE2)
3292 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003293 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003294 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003295
Eli Friedman33465822011-07-08 23:31:17 +00003296 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003297 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003298 .Case("+3dnowa", AMD3DNowAthlon)
3299 .Case("+3dnow", AMD3DNow)
3300 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003301 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003302 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003303
3304 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003305 .Case("+xop", XOP)
3306 .Case("+fma4", FMA4)
3307 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003308 .Default(NoXOP);
3309 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003310 }
Eli Friedman33465822011-07-08 23:31:17 +00003311
Rafael Espindolaeb265472013-08-21 21:59:03 +00003312 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3313 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003314 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3315 (FPMath == FP_387 && SSELevel >= SSE1)) {
3316 Diags.Report(diag::err_target_unsupported_fpmath) <<
3317 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003318 return false;
3319 }
3320
Alexey Bataev00396512015-07-02 03:40:19 +00003321 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003322 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003323 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003324}
Chris Lattnerecd49032009-03-02 22:27:17 +00003325
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003326/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3327/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003328void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003329 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003330 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003331 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003332 Builder.defineMacro("__amd64__");
3333 Builder.defineMacro("__amd64");
3334 Builder.defineMacro("__x86_64");
3335 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003336 if (getTriple().getArchName() == "x86_64h") {
3337 Builder.defineMacro("__x86_64h");
3338 Builder.defineMacro("__x86_64h__");
3339 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003340 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003341 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003342 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003343
Chris Lattnerecd49032009-03-02 22:27:17 +00003344 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003345 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3346 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003347 switch (CPU) {
3348 case CK_Generic:
3349 break;
3350 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003351 // The rest are coming from the i386 define above.
3352 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003353 break;
3354 case CK_i486:
3355 case CK_WinChipC6:
3356 case CK_WinChip2:
3357 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003358 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003359 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003360 case CK_PentiumMMX:
3361 Builder.defineMacro("__pentium_mmx__");
3362 Builder.defineMacro("__tune_pentium_mmx__");
3363 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003364 case CK_i586:
3365 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003366 defineCPUMacros(Builder, "i586");
3367 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003368 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003369 case CK_Pentium3:
3370 case CK_Pentium3M:
3371 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003372 Builder.defineMacro("__tune_pentium3__");
3373 // Fallthrough
3374 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003375 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003376 Builder.defineMacro("__tune_pentium2__");
3377 // Fallthrough
3378 case CK_PentiumPro:
3379 Builder.defineMacro("__tune_i686__");
3380 Builder.defineMacro("__tune_pentiumpro__");
3381 // Fallthrough
3382 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003383 Builder.defineMacro("__i686");
3384 Builder.defineMacro("__i686__");
3385 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3386 Builder.defineMacro("__pentiumpro");
3387 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003388 break;
3389 case CK_Pentium4:
3390 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003391 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003392 break;
3393 case CK_Yonah:
3394 case CK_Prescott:
3395 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003396 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003397 break;
3398 case CK_Core2:
3399 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003400 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003401 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003402 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003403 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003404 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003405 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003406 defineCPUMacros(Builder, "slm");
3407 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003408 case CK_Nehalem:
3409 case CK_Westmere:
3410 case CK_SandyBridge:
3411 case CK_IvyBridge:
3412 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003413 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003414 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003415 // FIXME: Historically, we defined this legacy name, it would be nice to
3416 // remove it at some point. We've never exposed fine-grained names for
3417 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003418 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003419 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003420 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003421 defineCPUMacros(Builder, "skx");
3422 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003423 case CK_Cannonlake:
3424 break;
Craig Topper449314e2013-08-20 07:09:39 +00003425 case CK_KNL:
3426 defineCPUMacros(Builder, "knl");
3427 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003428 case CK_Lakemont:
3429 Builder.defineMacro("__tune_lakemont__");
3430 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003431 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003432 Builder.defineMacro("__k6_2__");
3433 Builder.defineMacro("__tune_k6_2__");
3434 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003435 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003436 if (CPU != CK_K6_2) { // In case of fallthrough
3437 // FIXME: GCC may be enabling these in cases where some other k6
3438 // architecture is specified but -m3dnow is explicitly provided. The
3439 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003440 Builder.defineMacro("__k6_3__");
3441 Builder.defineMacro("__tune_k6_3__");
3442 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003443 // Fallthrough
3444 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003445 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003446 break;
3447 case CK_Athlon:
3448 case CK_AthlonThunderbird:
3449 case CK_Athlon4:
3450 case CK_AthlonXP:
3451 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003452 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003453 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003454 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003455 Builder.defineMacro("__tune_athlon_sse__");
3456 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003457 break;
3458 case CK_K8:
3459 case CK_K8SSE3:
3460 case CK_x86_64:
3461 case CK_Opteron:
3462 case CK_OpteronSSE3:
3463 case CK_Athlon64:
3464 case CK_Athlon64SSE3:
3465 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003466 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003467 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003468 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003469 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003470 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003471 case CK_BTVER1:
3472 defineCPUMacros(Builder, "btver1");
3473 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003474 case CK_BTVER2:
3475 defineCPUMacros(Builder, "btver2");
3476 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003477 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003478 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003479 break;
3480 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003481 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003482 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003483 case CK_BDVER3:
3484 defineCPUMacros(Builder, "bdver3");
3485 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003486 case CK_BDVER4:
3487 defineCPUMacros(Builder, "bdver4");
3488 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003489 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003490 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003491 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003492 }
Chris Lattner96e43572009-03-02 22:40:39 +00003493
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003494 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003495 Builder.defineMacro("__REGISTER_PREFIX__", "");
3496
Chris Lattner6df41af2009-04-19 17:32:33 +00003497 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3498 // functions in glibc header files that use FP Stack inline asm which the
3499 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003500 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003501
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003502 if (HasAES)
3503 Builder.defineMacro("__AES__");
3504
Craig Topper3f122a72012-05-31 05:18:48 +00003505 if (HasPCLMUL)
3506 Builder.defineMacro("__PCLMUL__");
3507
Craig Topper22967d42011-12-25 05:06:45 +00003508 if (HasLZCNT)
3509 Builder.defineMacro("__LZCNT__");
3510
Benjamin Kramer1e250392012-07-07 09:39:18 +00003511 if (HasRDRND)
3512 Builder.defineMacro("__RDRND__");
3513
Craig Topper8c7f2512014-11-03 06:51:41 +00003514 if (HasFSGSBASE)
3515 Builder.defineMacro("__FSGSBASE__");
3516
Craig Topper22967d42011-12-25 05:06:45 +00003517 if (HasBMI)
3518 Builder.defineMacro("__BMI__");
3519
3520 if (HasBMI2)
3521 Builder.defineMacro("__BMI2__");
3522
Craig Topper1de83482011-12-29 16:10:46 +00003523 if (HasPOPCNT)
3524 Builder.defineMacro("__POPCNT__");
3525
Michael Liao625a8752012-11-10 05:17:46 +00003526 if (HasRTM)
3527 Builder.defineMacro("__RTM__");
3528
Michael Liao74f4eaf2013-03-26 17:52:08 +00003529 if (HasPRFCHW)
3530 Builder.defineMacro("__PRFCHW__");
3531
Michael Liaoffaae352013-03-29 05:17:55 +00003532 if (HasRDSEED)
3533 Builder.defineMacro("__RDSEED__");
3534
Robert Khasanov50e6f582014-09-19 09:53:48 +00003535 if (HasADX)
3536 Builder.defineMacro("__ADX__");
3537
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003538 if (HasTBM)
3539 Builder.defineMacro("__TBM__");
3540
Rafael Espindolae62e2792013-08-20 13:44:29 +00003541 switch (XOPLevel) {
3542 case XOP:
3543 Builder.defineMacro("__XOP__");
3544 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003545 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003546 case SSE4A:
3547 Builder.defineMacro("__SSE4A__");
3548 case NoXOP:
3549 break;
3550 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003551
Craig Topperbba778b2012-06-03 21:46:30 +00003552 if (HasFMA)
3553 Builder.defineMacro("__FMA__");
3554
Manman Rena45358c2012-10-11 00:59:55 +00003555 if (HasF16C)
3556 Builder.defineMacro("__F16C__");
3557
Craig Topper679b53a2013-08-21 05:29:10 +00003558 if (HasAVX512CD)
3559 Builder.defineMacro("__AVX512CD__");
3560 if (HasAVX512ER)
3561 Builder.defineMacro("__AVX512ER__");
3562 if (HasAVX512PF)
3563 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003564 if (HasAVX512DQ)
3565 Builder.defineMacro("__AVX512DQ__");
3566 if (HasAVX512BW)
3567 Builder.defineMacro("__AVX512BW__");
3568 if (HasAVX512VL)
3569 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003570 if (HasAVX512VBMI)
3571 Builder.defineMacro("__AVX512VBMI__");
3572 if (HasAVX512IFMA)
3573 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003574
Ben Langmuir58078d02013-09-19 13:22:04 +00003575 if (HasSHA)
3576 Builder.defineMacro("__SHA__");
3577
Craig Toppere33f51f2015-10-16 06:22:36 +00003578 if (HasFXSR)
3579 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003580 if (HasXSAVE)
3581 Builder.defineMacro("__XSAVE__");
3582 if (HasXSAVEOPT)
3583 Builder.defineMacro("__XSAVEOPT__");
3584 if (HasXSAVEC)
3585 Builder.defineMacro("__XSAVEC__");
3586 if (HasXSAVES)
3587 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003588 if (HasPKU)
3589 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003590 if (HasCX16)
3591 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3592
Chris Lattner96e43572009-03-02 22:40:39 +00003593 // Each case falls through to the previous one here.
3594 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003595 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003596 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003597 case AVX2:
3598 Builder.defineMacro("__AVX2__");
3599 case AVX:
3600 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003601 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003602 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003603 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003604 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003605 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003606 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003607 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003608 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003609 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003610 Builder.defineMacro("__SSE2__");
3611 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003612 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003613 Builder.defineMacro("__SSE__");
3614 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003615 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003616 break;
3617 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003618
Derek Schuffc7dd7222012-10-11 15:52:22 +00003619 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003620 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003621 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003622 case AVX2:
3623 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003624 case SSE42:
3625 case SSE41:
3626 case SSSE3:
3627 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003628 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003629 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003630 break;
3631 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003632 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003633 break;
3634 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003635 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003636 }
3637 }
3638
Anders Carlssone437c682010-01-27 03:47:49 +00003639 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003640 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003641 case AMD3DNowAthlon:
3642 Builder.defineMacro("__3dNOW_A__");
3643 case AMD3DNow:
3644 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003645 case MMX:
3646 Builder.defineMacro("__MMX__");
3647 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003648 break;
3649 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003650
3651 if (CPU >= CK_i486) {
3652 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3653 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3654 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3655 }
3656 if (CPU >= CK_i586)
3657 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003658}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003659
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003660bool X86TargetInfo::hasFeature(StringRef Feature) const {
3661 return llvm::StringSwitch<bool>(Feature)
3662 .Case("aes", HasAES)
3663 .Case("avx", SSELevel >= AVX)
3664 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003665 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003666 .Case("avx512cd", HasAVX512CD)
3667 .Case("avx512er", HasAVX512ER)
3668 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003669 .Case("avx512dq", HasAVX512DQ)
3670 .Case("avx512bw", HasAVX512BW)
3671 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003672 .Case("avx512vbmi", HasAVX512VBMI)
3673 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003674 .Case("bmi", HasBMI)
3675 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003676 .Case("clflushopt", HasCLFLUSHOPT)
3677 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003678 .Case("cx16", HasCX16)
3679 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003680 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003681 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003682 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003683 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003684 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003685 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3686 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3687 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003688 .Case("movbe", HasMOVBE)
3689 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003690 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003691 .Case("pcommit", HasPCOMMIT)
3692 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003693 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003694 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003695 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003696 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003697 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003698 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003699 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003700 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003701 .Case("sse", SSELevel >= SSE1)
3702 .Case("sse2", SSELevel >= SSE2)
3703 .Case("sse3", SSELevel >= SSE3)
3704 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003705 .Case("sse4.1", SSELevel >= SSE41)
3706 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003707 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003708 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003709 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003710 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003711 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3712 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003713 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003714 .Case("xsave", HasXSAVE)
3715 .Case("xsavec", HasXSAVEC)
3716 .Case("xsaves", HasXSAVES)
3717 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003718 .Default(false);
3719}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003720
Eric Christopherd9832702015-06-29 21:00:05 +00003721// We can't use a generic validation scheme for the features accepted here
3722// versus subtarget features accepted in the target attribute because the
3723// bitfield structure that's initialized in the runtime only supports the
3724// below currently rather than the full range of subtarget features. (See
3725// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3726bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3727 return llvm::StringSwitch<bool>(FeatureStr)
3728 .Case("cmov", true)
3729 .Case("mmx", true)
3730 .Case("popcnt", true)
3731 .Case("sse", true)
3732 .Case("sse2", true)
3733 .Case("sse3", true)
3734 .Case("sse4.1", true)
3735 .Case("sse4.2", true)
3736 .Case("avx", true)
3737 .Case("avx2", true)
3738 .Case("sse4a", true)
3739 .Case("fma4", true)
3740 .Case("xop", true)
3741 .Case("fma", true)
3742 .Case("avx512f", true)
3743 .Case("bmi", true)
3744 .Case("bmi2", true)
3745 .Default(false);
3746}
3747
Eli Friedman3fd920a2008-08-20 02:34:37 +00003748bool
Anders Carlsson58436352009-02-28 17:11:49 +00003749X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003750 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003751 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003752 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003753 // Constant constraints.
3754 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3755 // instructions.
3756 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3757 // x86_64 instructions.
3758 case 's':
3759 Info.setRequiresImmediate();
3760 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003761 case 'I':
3762 Info.setRequiresImmediate(0, 31);
3763 return true;
3764 case 'J':
3765 Info.setRequiresImmediate(0, 63);
3766 return true;
3767 case 'K':
3768 Info.setRequiresImmediate(-128, 127);
3769 return true;
3770 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003771 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003772 return true;
3773 case 'M':
3774 Info.setRequiresImmediate(0, 3);
3775 return true;
3776 case 'N':
3777 Info.setRequiresImmediate(0, 255);
3778 return true;
3779 case 'O':
3780 Info.setRequiresImmediate(0, 127);
3781 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003782 // Register constraints.
3783 case 'Y': // 'Y' is the first character for several 2-character constraints.
3784 // Shift the pointer to the second character of the constraint.
3785 Name++;
3786 switch (*Name) {
3787 default:
3788 return false;
3789 case '0': // First SSE register.
3790 case 't': // Any SSE register, when SSE2 is enabled.
3791 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3792 case 'm': // Any MMX register, when inter-unit moves enabled.
3793 Info.setAllowsRegister();
3794 return true;
3795 }
3796 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003797 // Constraint 'f' cannot be used for output operands.
3798 if (Info.ConstraintStr[0] == '=')
3799 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003800 Info.setAllowsRegister();
3801 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003802 case 'a': // eax.
3803 case 'b': // ebx.
3804 case 'c': // ecx.
3805 case 'd': // edx.
3806 case 'S': // esi.
3807 case 'D': // edi.
3808 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003809 case 't': // Top of floating point stack.
3810 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003811 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003812 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003813 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003814 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003815 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3816 case 'l': // "Index" registers: any general register that can be used as an
3817 // index in a base+index memory access.
3818 Info.setAllowsRegister();
3819 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003820 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003821 case 'C': // SSE floating point constant.
3822 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003823 return true;
3824 }
3825}
3826
Akira Hatanaka974131e2014-09-18 18:17:18 +00003827bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3828 unsigned Size) const {
3829 // Strip off constraint modifiers.
3830 while (Constraint[0] == '=' ||
3831 Constraint[0] == '+' ||
3832 Constraint[0] == '&')
3833 Constraint = Constraint.substr(1);
3834
3835 return validateOperandSize(Constraint, Size);
3836}
3837
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003838bool X86TargetInfo::validateInputSize(StringRef Constraint,
3839 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003840 return validateOperandSize(Constraint, Size);
3841}
3842
3843bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3844 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003845 switch (Constraint[0]) {
3846 default: break;
3847 case 'y':
3848 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003849 case 'f':
3850 case 't':
3851 case 'u':
3852 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003853 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003854 if (SSELevel >= AVX512F)
3855 // 512-bit zmm registers can be used if target supports AVX512F.
3856 return Size <= 512U;
3857 else if (SSELevel >= AVX)
3858 // 256-bit ymm registers can be used if target supports AVX.
3859 return Size <= 256U;
3860 return Size <= 128U;
3861 case 'Y':
3862 // 'Y' is the first character for several 2-character constraints.
3863 switch (Constraint[1]) {
3864 default: break;
3865 case 'm':
3866 // 'Ym' is synonymous with 'y'.
3867 return Size <= 64;
3868 case 'i':
3869 case 't':
3870 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3871 if (SSELevel >= AVX512F)
3872 return Size <= 512U;
3873 else if (SSELevel >= AVX)
3874 return Size <= 256U;
3875 return SSELevel >= SSE2 && Size <= 128U;
3876 }
3877
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003878 }
3879
3880 return true;
3881}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003882
Eli Friedman3fd920a2008-08-20 02:34:37 +00003883std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003884X86TargetInfo::convertConstraint(const char *&Constraint) const {
3885 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003886 case 'a': return std::string("{ax}");
3887 case 'b': return std::string("{bx}");
3888 case 'c': return std::string("{cx}");
3889 case 'd': return std::string("{dx}");
3890 case 'S': return std::string("{si}");
3891 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003892 case 'p': // address
3893 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003894 case 't': // top of floating point stack.
3895 return std::string("{st}");
3896 case 'u': // second from top of floating point stack.
3897 return std::string("{st(1)}"); // second from top of floating point stack.
3898 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003899 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003900 }
3901}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003902
Eli Friedman3fd920a2008-08-20 02:34:37 +00003903// X86-32 generic target
3904class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003905public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003906 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3907 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003908 DoubleAlign = LongLongAlign = 32;
3909 LongDoubleWidth = 96;
3910 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003911 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003912 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003913 SizeType = UnsignedInt;
3914 PtrDiffType = SignedInt;
3915 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003916 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003917
3918 // Use fpret for all types.
3919 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3920 (1 << TargetInfo::Double) |
3921 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003922
3923 // x86-32 has atomics up to 8 bytes
3924 // FIXME: Check that we actually have cmpxchg8b before setting
3925 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3926 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003927 }
Craig Topper3164f332014-03-11 03:39:26 +00003928 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003929 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003930 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003931
Craig Topper3164f332014-03-11 03:39:26 +00003932 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003933 if (RegNo == 0) return 0;
3934 if (RegNo == 1) return 2;
3935 return -1;
3936 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003937 bool validateOperandSize(StringRef Constraint,
3938 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003939 switch (Constraint[0]) {
3940 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003941 case 'R':
3942 case 'q':
3943 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003944 case 'a':
3945 case 'b':
3946 case 'c':
3947 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003948 case 'S':
3949 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003950 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003951 case 'A':
3952 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003953 }
3954
Akira Hatanaka974131e2014-09-18 18:17:18 +00003955 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003956 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003957};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003958
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003959class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3960public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003961 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3962 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003963
Craig Topper3164f332014-03-11 03:39:26 +00003964 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003965 unsigned Major, Minor, Micro;
3966 getTriple().getOSVersion(Major, Minor, Micro);
3967 // New NetBSD uses the default rounding mode.
3968 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3969 return X86_32TargetInfo::getFloatEvalMethod();
3970 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003971 return 1;
3972 }
3973};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003974
Eli Friedmane3aa4542009-07-05 18:47:56 +00003975class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3976public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003977 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3978 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003979 SizeType = UnsignedLong;
3980 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003981 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003982 }
3983};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003984
Eli Friedman9fa28852012-08-08 23:57:20 +00003985class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3986public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003987 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3988 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003989 SizeType = UnsignedLong;
3990 IntPtrType = SignedLong;
3991 PtrDiffType = SignedLong;
3992 }
3993};
Eli Friedman9fa28852012-08-08 23:57:20 +00003994
Torok Edwinb2b37c62009-06-30 17:10:35 +00003995class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003996public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003997 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3998 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003999 LongDoubleWidth = 128;
4000 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004001 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004002 MaxVectorAlign = 256;
4003 // The watchOS simulator uses the builtin bool type for Objective-C.
4004 llvm::Triple T = llvm::Triple(Triple);
4005 if (T.isWatchOS())
4006 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004007 SizeType = UnsignedLong;
4008 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004009 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004010 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004011 }
4012
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004013 bool handleTargetFeatures(std::vector<std::string> &Features,
4014 DiagnosticsEngine &Diags) override {
4015 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4016 Diags))
4017 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004018 // We now know the features we have: we can decide how to align vectors.
4019 MaxVectorAlign =
4020 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004021 return true;
4022 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004023};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004024
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004025// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004026class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004027public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004028 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4029 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004030 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004031 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004032 bool IsWinCOFF =
4033 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004034 resetDataLayout(IsWinCOFF
4035 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4036 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004037 }
Craig Topper3164f332014-03-11 03:39:26 +00004038 void getTargetDefines(const LangOptions &Opts,
4039 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004040 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4041 }
4042};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004043
4044// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004045class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004046public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004047 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4048 const TargetOptions &Opts)
4049 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004050 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004051 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4052 }
Craig Topper3164f332014-03-11 03:39:26 +00004053 void getTargetDefines(const LangOptions &Opts,
4054 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004055 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4056 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4057 // The value of the following reflects processor type.
4058 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4059 // We lost the original triple, so we use the default.
4060 Builder.defineMacro("_M_IX86", "600");
4061 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004062};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004063
David Majnemerae1ed0e2015-05-28 04:36:18 +00004064static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004065 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4066 // supports __declspec natively under -fms-extensions, but we define a no-op
4067 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004068 if (Opts.MicrosoftExt)
4069 Builder.defineMacro("__declspec", "__declspec");
4070 else
4071 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4072
4073 if (!Opts.MicrosoftExt) {
4074 // Provide macros for all the calling convention keywords. Provide both
4075 // single and double underscore prefixed variants. These are available on
4076 // x64 as well as x86, even though they have no effect.
4077 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4078 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004079 std::string GCCSpelling = "__attribute__((__";
4080 GCCSpelling += CC;
4081 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004082 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4083 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4084 }
4085 }
4086}
4087
David Majnemerae1ed0e2015-05-28 04:36:18 +00004088static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4089 Builder.defineMacro("__MSVCRT__");
4090 Builder.defineMacro("__MINGW32__");
4091 addCygMingDefines(Opts, Builder);
4092}
4093
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004094// x86-32 MinGW target
4095class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4096public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004097 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4098 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004099 void getTargetDefines(const LangOptions &Opts,
4100 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004101 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004102 DefineStd(Builder, "WIN32", Opts);
4103 DefineStd(Builder, "WINNT", Opts);
4104 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004105 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004106 }
4107};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004108
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004109// x86-32 Cygwin target
4110class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4111public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004112 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4113 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004114 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004115 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004116 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 +00004117 }
Craig Topper3164f332014-03-11 03:39:26 +00004118 void getTargetDefines(const LangOptions &Opts,
4119 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004120 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004121 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004122 Builder.defineMacro("__CYGWIN__");
4123 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004124 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004125 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004126 if (Opts.CPlusPlus)
4127 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004128 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004129};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004130
Chris Lattnerb986aba2010-04-11 19:29:39 +00004131// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004132class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004133public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004134 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004135 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004136 }
Craig Topper3164f332014-03-11 03:39:26 +00004137 void getTargetDefines(const LangOptions &Opts,
4138 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004139 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004140 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004141 }
4142};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004143
Alexey Bataevc99b0492015-11-25 09:24:26 +00004144// X86-32 MCU target
4145class MCUX86_32TargetInfo : public X86_32TargetInfo {
4146public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004147 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4148 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004149 LongDoubleWidth = 64;
4150 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004151 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 +00004152 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004153 }
4154
4155 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4156 // On MCU we support only C calling convention.
4157 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4158 }
4159
4160 void getTargetDefines(const LangOptions &Opts,
4161 MacroBuilder &Builder) const override {
4162 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4163 Builder.defineMacro("__iamcu");
4164 Builder.defineMacro("__iamcu__");
4165 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004166
4167 bool allowsLargerPreferedTypeAlignment() const override {
4168 return false;
4169 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004170};
4171
Douglas Gregor9fabd852011-07-01 22:41:14 +00004172// RTEMS Target
4173template<typename Target>
4174class RTEMSTargetInfo : public OSTargetInfo<Target> {
4175protected:
Craig Topper3164f332014-03-11 03:39:26 +00004176 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4177 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004178 // RTEMS defines; list based off of gcc output
4179
Douglas Gregor9fabd852011-07-01 22:41:14 +00004180 Builder.defineMacro("__rtems__");
4181 Builder.defineMacro("__ELF__");
4182 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004183
Douglas Gregor9fabd852011-07-01 22:41:14 +00004184public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004185 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4186 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004187 switch (Triple.getArch()) {
4188 default:
4189 case llvm::Triple::x86:
4190 // this->MCountName = ".mcount";
4191 break;
4192 case llvm::Triple::mips:
4193 case llvm::Triple::mipsel:
4194 case llvm::Triple::ppc:
4195 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004196 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004197 // this->MCountName = "_mcount";
4198 break;
4199 case llvm::Triple::arm:
4200 // this->MCountName = "__mcount";
4201 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004202 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004203 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004204};
4205
Douglas Gregor9fabd852011-07-01 22:41:14 +00004206// x86-32 RTEMS target
4207class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4208public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004209 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4210 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004211 SizeType = UnsignedLong;
4212 IntPtrType = SignedLong;
4213 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004214 }
Craig Topper3164f332014-03-11 03:39:26 +00004215 void getTargetDefines(const LangOptions &Opts,
4216 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004217 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4218 Builder.defineMacro("__INTEL__");
4219 Builder.defineMacro("__rtems__");
4220 }
4221};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004222
Eli Friedman3fd920a2008-08-20 02:34:37 +00004223// x86-64 generic target
4224class X86_64TargetInfo : public X86TargetInfo {
4225public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004226 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4227 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004228 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004229 bool IsWinCOFF =
4230 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004231 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004232 LongDoubleWidth = 128;
4233 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004234 LargeArrayMinWidth = 128;
4235 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004236 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004237 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4238 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4239 IntPtrType = IsX32 ? SignedInt : SignedLong;
4240 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004241 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004242 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004243
Eric Christopher917e9522014-11-18 22:36:15 +00004244 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004245 resetDataLayout(IsX32
4246 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4247 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4248 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004249
4250 // Use fpret only for long double.
4251 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004252
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004253 // Use fp2ret for _Complex long double.
4254 ComplexLongDoubleUsesFP2Ret = true;
4255
Charles Davisc7d5c942015-09-17 20:55:33 +00004256 // Make __builtin_ms_va_list available.
4257 HasBuiltinMSVaList = true;
4258
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004259 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004260 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004261 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004262 }
Craig Topper3164f332014-03-11 03:39:26 +00004263 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004264 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004265 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004266
Craig Topper3164f332014-03-11 03:39:26 +00004267 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004268 if (RegNo == 0) return 0;
4269 if (RegNo == 1) return 1;
4270 return -1;
4271 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004272
Craig Topper3164f332014-03-11 03:39:26 +00004273 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004274 switch (CC) {
4275 case CC_C:
4276 case CC_Swift:
4277 case CC_X86VectorCall:
4278 case CC_IntelOclBicc:
4279 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004280 case CC_PreserveMost:
4281 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004282 return CCCR_OK;
4283 default:
4284 return CCCR_Warning;
4285 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004286 }
4287
Craig Topper3164f332014-03-11 03:39:26 +00004288 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004289 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004290 }
4291
Pavel Chupinfd223e12014-08-04 12:39:43 +00004292 // for x32 we need it here explicitly
4293 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004294 unsigned getUnwindWordWidth() const override { return 64; }
4295 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004296
4297 bool validateGlobalRegisterVariable(StringRef RegName,
4298 unsigned RegSize,
4299 bool &HasSizeMismatch) const override {
4300 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4301 // handle.
4302 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4303 // Check that the register size is 64-bit.
4304 HasSizeMismatch = RegSize != 64;
4305 return true;
4306 }
4307
4308 // Check if the register is a 32-bit register the backend can handle.
4309 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4310 HasSizeMismatch);
4311 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004312};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004313
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004314// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004315class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004316public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004317 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4318 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004319 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004320 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004321 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004322 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004323 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004324 SizeType = UnsignedLongLong;
4325 PtrDiffType = SignedLongLong;
4326 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004327 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004328
Craig Topper3164f332014-03-11 03:39:26 +00004329 void getTargetDefines(const LangOptions &Opts,
4330 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004331 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004332 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004333 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004334
Craig Topper3164f332014-03-11 03:39:26 +00004335 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004336 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004337 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004338
Craig Topper3164f332014-03-11 03:39:26 +00004339 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004340 switch (CC) {
4341 case CC_X86StdCall:
4342 case CC_X86ThisCall:
4343 case CC_X86FastCall:
4344 return CCCR_Ignore;
4345 case CC_C:
4346 case CC_X86VectorCall:
4347 case CC_IntelOclBicc:
4348 case CC_X86_64SysV:
4349 return CCCR_OK;
4350 default:
4351 return CCCR_Warning;
4352 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004353 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004354};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004355
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004356// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004357class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004358public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004359 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4360 const TargetOptions &Opts)
4361 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004362 LongDoubleWidth = LongDoubleAlign = 64;
4363 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004364 }
Craig Topper3164f332014-03-11 03:39:26 +00004365 void getTargetDefines(const LangOptions &Opts,
4366 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004367 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4368 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004369 Builder.defineMacro("_M_X64", "100");
4370 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004371 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004372};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004373
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004374// x86-64 MinGW target
4375class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4376public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004377 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4378 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004379 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4380 // with x86 FP ops. Weird.
4381 LongDoubleWidth = LongDoubleAlign = 128;
4382 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4383 }
4384
Craig Topper3164f332014-03-11 03:39:26 +00004385 void getTargetDefines(const LangOptions &Opts,
4386 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004387 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004388 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004389 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004390 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004391
4392 // GCC defines this macro when it is using __gxx_personality_seh0.
4393 if (!Opts.SjLjExceptions)
4394 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004395 }
4396};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004397
Yaron Kerend030d112015-07-22 17:38:19 +00004398// x86-64 Cygwin target
4399class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004401 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4402 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004403 TLSSupported = false;
4404 WCharType = UnsignedShort;
4405 }
4406 void getTargetDefines(const LangOptions &Opts,
4407 MacroBuilder &Builder) const override {
4408 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4409 Builder.defineMacro("__x86_64__");
4410 Builder.defineMacro("__CYGWIN__");
4411 Builder.defineMacro("__CYGWIN64__");
4412 addCygMingDefines(Opts, Builder);
4413 DefineStd(Builder, "unix", Opts);
4414 if (Opts.CPlusPlus)
4415 Builder.defineMacro("_GNU_SOURCE");
4416
4417 // GCC defines this macro when it is using __gxx_personality_seh0.
4418 if (!Opts.SjLjExceptions)
4419 Builder.defineMacro("__SEH__");
4420 }
4421};
4422
Eli Friedman2857ccb2009-07-01 03:36:11 +00004423class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4424public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004425 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4426 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004427 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004428 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4429 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004430 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004431 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004432 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004433 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004434
4435 bool handleTargetFeatures(std::vector<std::string> &Features,
4436 DiagnosticsEngine &Diags) override {
4437 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4438 Diags))
4439 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004440 // We now know the features we have: we can decide how to align vectors.
4441 MaxVectorAlign =
4442 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004443 return true;
4444 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004445};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004446
Eli Friedman245f2292009-07-05 22:31:18 +00004447class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4448public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004449 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4450 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004451 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004452 Int64Type = SignedLongLong;
4453 }
4454};
Eli Friedman245f2292009-07-05 22:31:18 +00004455
Eli Friedman9fa28852012-08-08 23:57:20 +00004456class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4457public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004458 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4459 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004460 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004461 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004462 }
4463};
Tim Northover9bb857a2013-01-31 12:13:10 +00004464
Eli Friedmanf05b7722008-08-20 07:44:10 +00004465class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004466 // Possible FPU choices.
4467 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004468 VFP2FPU = (1 << 0),
4469 VFP3FPU = (1 << 1),
4470 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004471 NeonFPU = (1 << 3),
4472 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004473 };
4474
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004475 // Possible HWDiv features.
4476 enum HWDivMode {
4477 HWDivThumb = (1 << 0),
4478 HWDivARM = (1 << 1)
4479 };
4480
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004481 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004482 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004483 }
4484
4485 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4486 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004487
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004488 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004489
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004490 StringRef CPUProfile;
4491 StringRef CPUAttr;
4492
Rafael Espindolaeb265472013-08-21 21:59:03 +00004493 enum {
4494 FP_Default,
4495 FP_VFP,
4496 FP_Neon
4497 } FPMath;
4498
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004499 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004500 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004501 unsigned ArchProfile;
4502 unsigned ArchVersion;
4503
Bernard Ogdenda13af32013-10-24 18:32:51 +00004504 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004505
Logan Chien57086ce2012-10-10 06:56:20 +00004506 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004507 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004508
4509 // Initialized via features.
4510 unsigned SoftFloat : 1;
4511 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004512
Bernard Ogden18b57012013-10-29 09:47:51 +00004513 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004514 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004515 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004516 unsigned Unaligned : 1;
4517
4518 enum {
4519 LDREX_B = (1 << 0), /// byte (8-bit)
4520 LDREX_H = (1 << 1), /// half (16-bit)
4521 LDREX_W = (1 << 2), /// word (32-bit)
4522 LDREX_D = (1 << 3), /// double (64-bit)
4523 };
4524
4525 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004526
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004527 // ACLE 6.5.1 Hardware floating point
4528 enum {
4529 HW_FP_HP = (1 << 1), /// half (16-bit)
4530 HW_FP_SP = (1 << 2), /// single (32-bit)
4531 HW_FP_DP = (1 << 3), /// double (64-bit)
4532 };
4533 uint32_t HW_FP;
4534
Chris Lattner5cc15e02010-03-03 19:03:45 +00004535 static const Builtin::Info BuiltinInfo[];
4536
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004537 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004538 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004539
4540 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004541 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004542
Renato Golin9ba39232015-02-27 16:35:48 +00004543 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4544 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4545 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004546 SizeType = UnsignedLong;
4547 else
4548 SizeType = UnsignedInt;
4549
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004550 switch (T.getOS()) {
4551 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004552 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004553 break;
4554 case llvm::Triple::Win32:
4555 WCharType = UnsignedShort;
4556 break;
4557 case llvm::Triple::Linux:
4558 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004559 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4560 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004561 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004562 }
4563
4564 UseBitFieldTypeAlignment = true;
4565
4566 ZeroLengthBitfieldBoundary = 0;
4567
Tim Northover147cd2f2014-10-14 22:12:21 +00004568 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4569 // so set preferred for small types to 32.
4570 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004571 resetDataLayout(BigEndian
4572 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4573 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004574 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004575 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004576 resetDataLayout("e"
4577 "-m:w"
4578 "-p:32:32"
4579 "-i64:64"
4580 "-v128:64:128"
4581 "-a:0:32"
4582 "-n32"
4583 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004584 } else if (T.isOSNaCl()) {
4585 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004586 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004587 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004588 resetDataLayout(BigEndian
4589 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4590 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004591 }
4592
4593 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004594 }
4595
Tim Northover5627d392015-10-30 16:30:45 +00004596 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004597 const llvm::Triple &T = getTriple();
4598
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004599 IsAAPCS = false;
4600
Tim Northover5627d392015-10-30 16:30:45 +00004601 if (IsAAPCS16)
4602 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4603 else
4604 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004605
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004606 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004607 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004608 SizeType = UnsignedInt;
4609 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004610 SizeType = UnsignedLong;
4611
4612 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4613 WCharType = SignedInt;
4614
4615 // Do not respect the alignment of bit-field types when laying out
4616 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4617 UseBitFieldTypeAlignment = false;
4618
4619 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4620 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4621 /// gcc.
4622 ZeroLengthBitfieldBoundary = 32;
4623
Tim Northover5627d392015-10-30 16:30:45 +00004624 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4625 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004626 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004627 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004628 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004629 BigEndian
4630 ? "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 +00004631 : "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 +00004632 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004633 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004634 BigEndian
4635 ? "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 +00004636 : "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 +00004637
4638 // FIXME: Override "preferred align" for double and long long.
4639 }
4640
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004641 void setArchInfo() {
4642 StringRef ArchName = getTriple().getArchName();
4643
Renato Goline84b0002015-10-08 16:43:26 +00004644 ArchISA = llvm::ARM::parseArchISA(ArchName);
4645 CPU = llvm::ARM::getDefaultCPU(ArchName);
4646 unsigned AK = llvm::ARM::parseArch(ArchName);
4647 if (AK != llvm::ARM::AK_INVALID)
4648 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004649 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004650 }
4651
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004652 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004653 StringRef SubArch;
4654
4655 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004656 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004657 SubArch = llvm::ARM::getSubArch(ArchKind);
4658 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4659 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004660
4661 // cache CPU related strings
4662 CPUAttr = getCPUAttr();
4663 CPUProfile = getCPUProfile();
4664 }
4665
4666 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004667 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004668 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004669 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004670 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4671 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004672 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004673 if (ArchProfile == llvm::ARM::PK_M) {
4674 MaxAtomicPromoteWidth = 32;
4675 if (ShouldUseInlineAtomic)
4676 MaxAtomicInlineWidth = 32;
4677 }
4678 else {
4679 MaxAtomicPromoteWidth = 64;
4680 if (ShouldUseInlineAtomic)
4681 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004682 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004683 }
4684
4685 bool isThumb() const {
4686 return (ArchISA == llvm::ARM::IK_THUMB);
4687 }
4688
4689 bool supportsThumb() const {
4690 return CPUAttr.count('T') || ArchVersion >= 6;
4691 }
4692
4693 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004694 return CPUAttr.equals("6T2") ||
4695 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004696 }
4697
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004698 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004699 // For most sub-arches, the build attribute CPU name is enough.
4700 // For Cortex variants, it's slightly different.
4701 switch(ArchKind) {
4702 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004703 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004704 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004705 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004706 case llvm::ARM::AK_ARMV7S:
4707 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004708 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004709 return "7A";
4710 case llvm::ARM::AK_ARMV7R:
4711 return "7R";
4712 case llvm::ARM::AK_ARMV7M:
4713 return "7M";
4714 case llvm::ARM::AK_ARMV7EM:
4715 return "7EM";
4716 case llvm::ARM::AK_ARMV8A:
4717 return "8A";
4718 case llvm::ARM::AK_ARMV8_1A:
4719 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004720 case llvm::ARM::AK_ARMV8_2A:
4721 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004722 case llvm::ARM::AK_ARMV8MBaseline:
4723 return "8M_BASE";
4724 case llvm::ARM::AK_ARMV8MMainline:
4725 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004726 }
4727 }
4728
4729 StringRef getCPUProfile() const {
4730 switch(ArchProfile) {
4731 case llvm::ARM::PK_A:
4732 return "A";
4733 case llvm::ARM::PK_R:
4734 return "R";
4735 case llvm::ARM::PK_M:
4736 return "M";
4737 default:
4738 return "";
4739 }
4740 }
4741
Chris Lattner17df24e2008-04-21 18:56:49 +00004742public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004743 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4744 bool IsBigEndian)
4745 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4746 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004747 BigEndian = IsBigEndian;
4748
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004749 switch (getTriple().getOS()) {
4750 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004751 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004752 break;
4753 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004754 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004755 break;
4756 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004757
Renato Goline84b0002015-10-08 16:43:26 +00004758 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004759 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004760
Chris Lattner1a8f3942010-04-23 16:29:58 +00004761 // {} in inline assembly are neon specifiers, not assembly variant
4762 // specifiers.
4763 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004764
Eric Christopher0e261882014-12-05 01:06:59 +00004765 // FIXME: This duplicates code from the driver that sets the -target-abi
4766 // option - this code is used if -target-abi isn't passed and should
4767 // be unified in some way.
4768 if (Triple.isOSBinFormatMachO()) {
4769 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4770 // the frontend matches that.
4771 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4772 Triple.getOS() == llvm::Triple::UnknownOS ||
4773 StringRef(CPU).startswith("cortex-m")) {
4774 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004775 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004776 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004777 } else {
4778 setABI("apcs-gnu");
4779 }
4780 } else if (Triple.isOSWindows()) {
4781 // FIXME: this is invalid for WindowsCE
4782 setABI("aapcs");
4783 } else {
4784 // Select the default based on the platform.
4785 switch (Triple.getEnvironment()) {
4786 case llvm::Triple::Android:
4787 case llvm::Triple::GNUEABI:
4788 case llvm::Triple::GNUEABIHF:
4789 setABI("aapcs-linux");
4790 break;
4791 case llvm::Triple::EABIHF:
4792 case llvm::Triple::EABI:
4793 setABI("aapcs");
4794 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004795 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004796 setABI("apcs-gnu");
4797 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004798 default:
4799 if (Triple.getOS() == llvm::Triple::NetBSD)
4800 setABI("apcs-gnu");
4801 else
4802 setABI("aapcs");
4803 break;
4804 }
4805 }
John McCall86353412010-08-21 22:46:04 +00004806
4807 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004808 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004809
Renato Golin15b86152015-07-03 16:41:13 +00004810 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004811 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004812
James Molloya7139222012-03-12 09:14:10 +00004813 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004814 // the alignment of the zero-length bitfield is greater than the member
4815 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004816 // zero length bitfield.
4817 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004818
4819 if (Triple.getOS() == llvm::Triple::Linux ||
4820 Triple.getOS() == llvm::Triple::UnknownOS)
4821 this->MCountName =
4822 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004823 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004824
Alp Toker4925ba72014-06-07 23:30:42 +00004825 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004826
Craig Topper3164f332014-03-11 03:39:26 +00004827 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004828 ABI = Name;
4829
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004830 // The defaults (above) are for AAPCS, check if we need to change them.
4831 //
4832 // FIXME: We need support for -meabi... we could just mangle it into the
4833 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004834 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004835 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004836 return true;
4837 }
4838 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4839 setABIAAPCS();
4840 return true;
4841 }
4842 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004843 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004844
Renato Golinf5c4dec2015-05-27 13:33:00 +00004845 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004846 bool
4847 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4848 StringRef CPU,
4849 const std::vector<std::string> &FeaturesVec) const override {
4850
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004851 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004852 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004853
4854 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004855 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004856 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4857
4858 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004859 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004860 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4861
4862 for (const char *Feature : TargetFeatures)
4863 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004864 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004865
Eric Christopher007b0a02015-08-28 22:32:01 +00004866 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004867 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004868
Craig Topper3164f332014-03-11 03:39:26 +00004869 bool handleTargetFeatures(std::vector<std::string> &Features,
4870 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004871 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004872 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004873 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004874 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004875 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004876 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004877 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004878
Ranjeet Singhac08e532015-06-24 23:39:25 +00004879 // This does not diagnose illegal cases like having both
4880 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4881 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004882 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004883 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004884 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004885 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004886 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004887 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004888 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004889 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004890 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004891 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004892 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004893 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004894 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004895 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004896 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004897 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004898 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004899 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004900 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004901 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004902 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004903 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004904 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004905 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004906 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004907 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004908 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004909 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004910 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004911 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004912 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004913 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004914 } else if (Feature == "+strict-align") {
4915 Unaligned = 0;
4916 } else if (Feature == "+fp16") {
4917 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004918 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004919 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004920 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004921
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004922 switch (ArchVersion) {
4923 case 6:
4924 if (ArchProfile == llvm::ARM::PK_M)
4925 LDREX = 0;
4926 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4927 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4928 else
4929 LDREX = LDREX_W;
4930 break;
4931 case 7:
4932 if (ArchProfile == llvm::ARM::PK_M)
4933 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4934 else
4935 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4936 break;
4937 case 8:
4938 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4939 }
4940
Rafael Espindolaeb265472013-08-21 21:59:03 +00004941 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4942 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4943 return false;
4944 }
4945
4946 if (FPMath == FP_Neon)
4947 Features.push_back("+neonfp");
4948 else if (FPMath == FP_VFP)
4949 Features.push_back("-neonfp");
4950
Daniel Dunbar893d4752009-12-19 04:15:38 +00004951 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004952 auto Feature =
4953 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4954 if (Feature != Features.end())
4955 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004956
Rafael Espindolaeb265472013-08-21 21:59:03 +00004957 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004958 }
4959
Craig Topper3164f332014-03-11 03:39:26 +00004960 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004961 return llvm::StringSwitch<bool>(Feature)
4962 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004963 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004964 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004965 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004966 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004967 .Case("hwdiv", HWDiv & HWDivThumb)
4968 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004969 .Default(false);
4970 }
Renato Golin15b86152015-07-03 16:41:13 +00004971
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004972 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004973 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004974 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004975
Renato Golin15b86152015-07-03 16:41:13 +00004976 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004977 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004978 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004979 CPU = Name;
4980 return true;
4981 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004982
Craig Topper3164f332014-03-11 03:39:26 +00004983 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004984
Craig Topper3164f332014-03-11 03:39:26 +00004985 void getTargetDefines(const LangOptions &Opts,
4986 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004987 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004988 Builder.defineMacro("__arm");
4989 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00004990 // For bare-metal none-eabi.
4991 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
4992 getTriple().getEnvironment() == llvm::Triple::EABI)
4993 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004994
Chris Lattnerecd49032009-03-02 22:27:17 +00004995 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004996 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004997
4998 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4999 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005000 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005001 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5002
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005003 if (!CPUAttr.empty())
5004 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005005
5006 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005007 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005008 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005009
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005010 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005011 // ACLE 6.5.7 Crypto Extension
5012 if (Crypto)
5013 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5014 // ACLE 6.5.8 CRC32 Extension
5015 if (CRC)
5016 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5017 // ACLE 6.5.10 Numeric Maximum and Minimum
5018 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5019 // ACLE 6.5.9 Directed Rounding
5020 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005021 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005022
5023 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5024 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005025 // NOTE that the default profile is assumed to be 'A'
5026 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005027 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5028
Bradley Smithf4affc12016-03-03 13:52:22 +00005029 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5030 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5031 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5032 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005033 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005034 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005035 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005036 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5037
5038 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5039 // instruction set such as ARM or Thumb.
5040 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5041
5042 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5043
5044 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005045 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005046 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005047
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005048 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005049 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005050 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005051
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005052 // ACLE 6.4.4 LDREX/STREX
5053 if (LDREX)
5054 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5055
5056 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005057 if (ArchVersion == 5 ||
5058 (ArchVersion == 6 && CPUProfile != "M") ||
5059 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005060 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5061
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005062 // ACLE 6.5.1 Hardware Floating Point
5063 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005064 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005065
Yi Konga44c4d72014-06-27 21:25:42 +00005066 // ACLE predefines.
5067 Builder.defineMacro("__ARM_ACLE", "200");
5068
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005069 // FP16 support (we currently only support IEEE format).
5070 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5071 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5072
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005073 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005074 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005075 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5076
Mike Stump9d54bd72009-04-08 02:07:04 +00005077 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005078
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005079 // FIXME: It's more complicated than this and we don't really support
5080 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005081 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005082 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005083 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005084
David Tweed8f676532012-10-25 13:33:01 +00005085 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005086 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005087 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005088 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005089 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005090 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005091 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005092
Tim Northover28fc0e12016-04-28 13:59:55 +00005093 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5094 ABI == "aapcs16")
5095 Builder.defineMacro("__ARM_PCS_VFP", "1");
5096
Daniel Dunbar893d4752009-12-19 04:15:38 +00005097 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005098 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005099
5100 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005101 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005102
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005103 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005104 Builder.defineMacro("__THUMBEL__");
5105 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005106 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005107 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005108 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005109
5110 // ACLE 6.4.9 32-bit SIMD instructions
5111 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5112 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5113
5114 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005115 if (((HWDiv & HWDivThumb) && isThumb()) ||
5116 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005117 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005118 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005119 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005120
5121 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005122 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005123
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005124 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005125 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005126 if (FPU & VFP2FPU)
5127 Builder.defineMacro("__ARM_VFPV2__");
5128 if (FPU & VFP3FPU)
5129 Builder.defineMacro("__ARM_VFPV3__");
5130 if (FPU & VFP4FPU)
5131 Builder.defineMacro("__ARM_VFPV4__");
5132 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005133
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005134 // This only gets set when Neon instructions are actually available, unlike
5135 // the VFP define, hence the soft float and arch check. This is subtly
5136 // different from gcc, we follow the intent which was that it should be set
5137 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005138 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005139 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005140 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005141 // current AArch32 NEON implementations do not support double-precision
5142 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005143 Builder.defineMacro("__ARM_NEON_FP",
5144 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005145 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005146
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005147 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5148 Opts.ShortWChar ? "2" : "4");
5149
5150 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5151 Opts.ShortEnums ? "1" : "4");
5152
Bradley Smithf4affc12016-03-03 13:52:22 +00005153 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005154 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5155 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5156 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5157 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5158 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005159
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005160 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005161 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005162 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005163 }
5164
5165 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005166 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005167 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5168 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005169 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005170 }
5171
5172 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005173 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005174 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005175
5176 if (Opts.UnsafeFPMath)
5177 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005178
5179 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5180 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005181 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005182
Craig Topper6c03a542015-10-19 04:51:35 +00005183 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5184 return llvm::makeArrayRef(BuiltinInfo,
5185 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005186 }
Craig Topper3164f332014-03-11 03:39:26 +00005187 bool isCLZForZeroUndef() const override { return false; }
5188 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005189 return IsAAPCS
5190 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005191 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5192 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005193 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005194 ArrayRef<const char *> getGCCRegNames() const override;
5195 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005196 bool validateAsmConstraint(const char *&Name,
5197 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005198 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005199 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005200 case 'l': // r0-r7
5201 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005202 case 't': // VFP Floating point register single precision
5203 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005204 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005205 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005206 case 'I':
5207 case 'J':
5208 case 'K':
5209 case 'L':
5210 case 'M':
5211 // FIXME
5212 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005213 case 'Q': // A memory address that is a single base register.
5214 Info.setAllowsMemory();
5215 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005216 case 'U': // a memory reference...
5217 switch (Name[1]) {
5218 case 'q': // ...ARMV4 ldrsb
5219 case 'v': // ...VFP load/store (reg+constant offset)
5220 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005221 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005222 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005223 case 'n': // valid address for Neon doubleword vector load/store
5224 case 'm': // valid address for Neon element and structure load/store
5225 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005226 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005227 Info.setAllowsMemory();
5228 Name++;
5229 return true;
5230 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005231 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005232 return false;
5233 }
Craig Topper3164f332014-03-11 03:39:26 +00005234 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005235 std::string R;
5236 switch (*Constraint) {
5237 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005238 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005239 Constraint++;
5240 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005241 case 'p': // 'p' should be translated to 'r' by default.
5242 R = std::string("r");
5243 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005244 default:
5245 return std::string(1, *Constraint);
5246 }
5247 return R;
5248 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005249 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005250 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005251 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005252 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005253 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005254
Bill Wendling9d1ee112012-10-25 23:28:48 +00005255 // Strip off constraint modifiers.
5256 while (Constraint[0] == '=' ||
5257 Constraint[0] == '+' ||
5258 Constraint[0] == '&')
5259 Constraint = Constraint.substr(1);
5260
5261 switch (Constraint[0]) {
5262 default: break;
5263 case 'r': {
5264 switch (Modifier) {
5265 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005266 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005267 case 'q':
5268 // A register of size 32 cannot fit a vector type.
5269 return false;
5270 }
5271 }
5272 }
5273
5274 return true;
5275 }
Craig Topper3164f332014-03-11 03:39:26 +00005276 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005277 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005278 return "";
5279 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005280
Craig Topper3164f332014-03-11 03:39:26 +00005281 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005282 switch (CC) {
5283 case CC_AAPCS:
5284 case CC_AAPCS_VFP:
5285 case CC_Swift:
5286 return CCCR_OK;
5287 default:
5288 return CCCR_Warning;
5289 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005290 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005291
Craig Topper3164f332014-03-11 03:39:26 +00005292 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005293 if (RegNo == 0) return 0;
5294 if (RegNo == 1) return 1;
5295 return -1;
5296 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005297
5298 bool hasSjLjLowering() const override {
5299 return true;
5300 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005301};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005302
Rafael Espindolaeb265472013-08-21 21:59:03 +00005303bool ARMTargetInfo::setFPMath(StringRef Name) {
5304 if (Name == "neon") {
5305 FPMath = FP_Neon;
5306 return true;
5307 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5308 Name == "vfp4") {
5309 FPMath = FP_VFP;
5310 return true;
5311 }
5312 return false;
5313}
5314
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005315const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005316 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005317 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005318 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5319
5320 // Float registers
5321 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5322 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5323 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005324 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005325
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005326 // Double registers
5327 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5328 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005329 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5330 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005331
5332 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005333 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5334 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005335};
5336
Craig Topperf054e3a2015-10-19 03:52:27 +00005337ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5338 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005339}
5340
5341const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005342 { { "a1" }, "r0" },
5343 { { "a2" }, "r1" },
5344 { { "a3" }, "r2" },
5345 { { "a4" }, "r3" },
5346 { { "v1" }, "r4" },
5347 { { "v2" }, "r5" },
5348 { { "v3" }, "r6" },
5349 { { "v4" }, "r7" },
5350 { { "v5" }, "r8" },
5351 { { "v6", "rfp" }, "r9" },
5352 { { "sl" }, "r10" },
5353 { { "fp" }, "r11" },
5354 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005355 { { "r13" }, "sp" },
5356 { { "r14" }, "lr" },
5357 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005358 // The S, D and Q registers overlap, but aren't really aliases; we
5359 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005360};
5361
Craig Topperf054e3a2015-10-19 03:52:27 +00005362ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5363 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005364}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005365
5366const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005367#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005368 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005369#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5370 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005371#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005372
Craig Topper07d3b622015-08-07 05:14:44 +00005373#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005374 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005375#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005376 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005377#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5378 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005379#include "clang/Basic/BuiltinsARM.def"
5380};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005381
5382class ARMleTargetInfo : public ARMTargetInfo {
5383public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005384 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5385 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005386 void getTargetDefines(const LangOptions &Opts,
5387 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005388 Builder.defineMacro("__ARMEL__");
5389 ARMTargetInfo::getTargetDefines(Opts, Builder);
5390 }
5391};
5392
5393class ARMbeTargetInfo : public ARMTargetInfo {
5394public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005395 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5396 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005397 void getTargetDefines(const LangOptions &Opts,
5398 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005399 Builder.defineMacro("__ARMEB__");
5400 Builder.defineMacro("__ARM_BIG_ENDIAN");
5401 ARMTargetInfo::getTargetDefines(Opts, Builder);
5402 }
5403};
Chris Lattner17df24e2008-04-21 18:56:49 +00005404
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005405class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5406 const llvm::Triple Triple;
5407public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005408 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5409 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005410 WCharType = UnsignedShort;
5411 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005412 }
5413 void getVisualStudioDefines(const LangOptions &Opts,
5414 MacroBuilder &Builder) const {
5415 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5416
5417 // FIXME: this is invalid for WindowsCE
5418 Builder.defineMacro("_M_ARM_NT", "1");
5419 Builder.defineMacro("_M_ARMT", "_M_ARM");
5420 Builder.defineMacro("_M_THUMB", "_M_ARM");
5421
5422 assert((Triple.getArch() == llvm::Triple::arm ||
5423 Triple.getArch() == llvm::Triple::thumb) &&
5424 "invalid architecture for Windows ARM target info");
5425 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5426 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5427
5428 // TODO map the complete set of values
5429 // 31: VFPv3 40: VFPv4
5430 Builder.defineMacro("_M_ARM_FP", "31");
5431 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005432 BuiltinVaListKind getBuiltinVaListKind() const override {
5433 return TargetInfo::CharPtrBuiltinVaList;
5434 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005435 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5436 switch (CC) {
5437 case CC_X86StdCall:
5438 case CC_X86ThisCall:
5439 case CC_X86FastCall:
5440 case CC_X86VectorCall:
5441 return CCCR_Ignore;
5442 case CC_C:
5443 return CCCR_OK;
5444 default:
5445 return CCCR_Warning;
5446 }
5447 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005448};
5449
5450// Windows ARM + Itanium C++ ABI Target
5451class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5452public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005453 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5454 const TargetOptions &Opts)
5455 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005456 TheCXXABI.set(TargetCXXABI::GenericARM);
5457 }
5458
5459 void getTargetDefines(const LangOptions &Opts,
5460 MacroBuilder &Builder) const override {
5461 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5462
5463 if (Opts.MSVCCompat)
5464 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5465 }
5466};
5467
5468// Windows ARM, MS (C++) ABI
5469class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5470public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005471 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5472 const TargetOptions &Opts)
5473 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005474 TheCXXABI.set(TargetCXXABI::Microsoft);
5475 }
5476
5477 void getTargetDefines(const LangOptions &Opts,
5478 MacroBuilder &Builder) const override {
5479 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5480 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5481 }
5482};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005483
Yaron Keren321249c2015-07-15 13:32:23 +00005484// ARM MinGW target
5485class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5486public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005487 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5488 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005489 TheCXXABI.set(TargetCXXABI::GenericARM);
5490 }
5491
5492 void getTargetDefines(const LangOptions &Opts,
5493 MacroBuilder &Builder) const override {
5494 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5495 DefineStd(Builder, "WIN32", Opts);
5496 DefineStd(Builder, "WINNT", Opts);
5497 Builder.defineMacro("_ARM_");
5498 addMinGWDefines(Opts, Builder);
5499 }
5500};
5501
5502// ARM Cygwin target
5503class CygwinARMTargetInfo : public ARMleTargetInfo {
5504public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005505 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5506 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005507 TLSSupported = false;
5508 WCharType = UnsignedShort;
5509 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005510 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005511 }
5512 void getTargetDefines(const LangOptions &Opts,
5513 MacroBuilder &Builder) const override {
5514 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5515 Builder.defineMacro("_ARM_");
5516 Builder.defineMacro("__CYGWIN__");
5517 Builder.defineMacro("__CYGWIN32__");
5518 DefineStd(Builder, "unix", Opts);
5519 if (Opts.CPlusPlus)
5520 Builder.defineMacro("_GNU_SOURCE");
5521 }
5522};
5523
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005524class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005525protected:
Craig Topper3164f332014-03-11 03:39:26 +00005526 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5527 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005528 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005529 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005530
Torok Edwinb2b37c62009-06-30 17:10:35 +00005531public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005532 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5533 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005534 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005535 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005536 // FIXME: This should be based off of the target features in
5537 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005538 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005539
Tim Northoverd88ecb32016-01-27 19:32:40 +00005540 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005541 // Darwin on iOS uses a variant of the ARM C++ ABI.
5542 TheCXXABI.set(TargetCXXABI::WatchOS);
5543
5544 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5545 // size_t is long, it's a bit weird for it to be int.
5546 PtrDiffType = SignedLong;
5547
5548 // BOOL should be a real boolean on the new ABI
5549 UseSignedCharForObjCBool = false;
5550 } else
5551 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005552 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005553};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005554
Tim Northover573cbee2014-05-24 12:52:07 +00005555class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005556 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005557 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5558 static const char *const GCCRegNames[];
5559
James Molloy75f5f9e2014-04-16 15:33:48 +00005560 enum FPUModeEnum {
5561 FPUMode,
5562 NeonMode
5563 };
5564
5565 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005566 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005567 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005568 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005569 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005570
Tim Northovera2ee4332014-03-29 15:09:45 +00005571 static const Builtin::Info BuiltinInfo[];
5572
5573 std::string ABI;
5574
5575public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005576 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005577 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005578 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5579 WCharType = SignedInt;
5580
5581 // NetBSD apparently prefers consistency across ARM targets to consistency
5582 // across 64-bit targets.
5583 Int64Type = SignedLongLong;
5584 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005585 } else {
5586 WCharType = UnsignedInt;
5587 Int64Type = SignedLong;
5588 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005589 }
5590
Tim Northovera2ee4332014-03-29 15:09:45 +00005591 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005592 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005593 MaxAtomicInlineWidth = 128;
5594 MaxAtomicPromoteWidth = 128;
5595
Tim Northovera6a19f12015-02-06 01:25:07 +00005596 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005597 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5598
Tim Northovera2ee4332014-03-29 15:09:45 +00005599 // {} in inline assembly are neon specifiers, not assembly variant
5600 // specifiers.
5601 NoAsmVariants = true;
5602
Tim Northover7ad87af2015-01-16 18:44:04 +00005603 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5604 // contributes to the alignment of the containing aggregate in the same way
5605 // a plain (non bit-field) member of that type would, without exception for
5606 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005607 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005608 UseZeroLengthBitfieldAlignment = true;
5609
Tim Northover573cbee2014-05-24 12:52:07 +00005610 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005611 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005612
5613 if (Triple.getOS() == llvm::Triple::Linux ||
5614 Triple.getOS() == llvm::Triple::UnknownOS)
5615 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005616 }
5617
Alp Toker4925ba72014-06-07 23:30:42 +00005618 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005619 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005620 if (Name != "aapcs" && Name != "darwinpcs")
5621 return false;
5622
5623 ABI = Name;
5624 return true;
5625 }
5626
David Blaikie1cbb9712014-11-14 19:09:44 +00005627 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005628 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005629 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005630 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5631 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005632 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005633 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005634 .Default(false);
5635 return CPUKnown;
5636 }
5637
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005638 void getTargetDefines(const LangOptions &Opts,
5639 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005640 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005641 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005642
5643 // Target properties.
5644 Builder.defineMacro("_LP64");
5645 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005646
5647 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5648 Builder.defineMacro("__ARM_ACLE", "200");
5649 Builder.defineMacro("__ARM_ARCH", "8");
5650 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5651
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005652 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005653 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005654 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005655
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005656 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5657 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5658 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5659 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005660 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005661 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5662 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005663
5664 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5665
5666 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005667 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005668
5669 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5670 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005671 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5672 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005673
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005674 if (Opts.UnsafeFPMath)
5675 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005676
5677 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5678
5679 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5680 Opts.ShortEnums ? "1" : "4");
5681
James Molloy75f5f9e2014-04-16 15:33:48 +00005682 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005683 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005684 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005685 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005686 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005687
Bradley Smith418c5932014-05-02 15:17:51 +00005688 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005689 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005690
James Molloy75f5f9e2014-04-16 15:33:48 +00005691 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005692 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5693
5694 if (Unaligned)
5695 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005696
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005697 if (V8_1A)
5698 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5699
Reid Klecknerd167d422015-05-06 15:31:46 +00005700 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5701 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5702 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5703 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5704 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005705 }
5706
Craig Topper6c03a542015-10-19 04:51:35 +00005707 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5708 return llvm::makeArrayRef(BuiltinInfo,
5709 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005710 }
5711
David Blaikie1cbb9712014-11-14 19:09:44 +00005712 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005713 return Feature == "aarch64" ||
5714 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005715 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005716 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005717 }
5718
James Molloy5e73df52014-04-16 15:06:20 +00005719 bool handleTargetFeatures(std::vector<std::string> &Features,
5720 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005721 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005722 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005723 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005724 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005725 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005726
Eric Christopher610fe112015-08-26 08:21:55 +00005727 for (const auto &Feature : Features) {
5728 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005729 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005730 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005731 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005732 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005733 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005734 if (Feature == "+strict-align")
5735 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005736 if (Feature == "+v8.1a")
5737 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005738 }
5739
James Y Knightb214cbc2016-03-04 19:00:41 +00005740 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005741
5742 return true;
5743 }
5744
John McCall477f2bb2016-03-03 06:39:32 +00005745 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5746 switch (CC) {
5747 case CC_C:
5748 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005749 case CC_PreserveMost:
5750 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005751 return CCCR_OK;
5752 default:
5753 return CCCR_Warning;
5754 }
5755 }
5756
David Blaikie1cbb9712014-11-14 19:09:44 +00005757 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005758
David Blaikie1cbb9712014-11-14 19:09:44 +00005759 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005760 return TargetInfo::AArch64ABIBuiltinVaList;
5761 }
5762
Craig Topperf054e3a2015-10-19 03:52:27 +00005763 ArrayRef<const char *> getGCCRegNames() const override;
5764 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005765
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005766 bool validateAsmConstraint(const char *&Name,
5767 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005768 switch (*Name) {
5769 default:
5770 return false;
5771 case 'w': // Floating point and SIMD registers (V0-V31)
5772 Info.setAllowsRegister();
5773 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005774 case 'I': // Constant that can be used with an ADD instruction
5775 case 'J': // Constant that can be used with a SUB instruction
5776 case 'K': // Constant that can be used with a 32-bit logical instruction
5777 case 'L': // Constant that can be used with a 64-bit logical instruction
5778 case 'M': // Constant that can be used as a 32-bit MOV immediate
5779 case 'N': // Constant that can be used as a 64-bit MOV immediate
5780 case 'Y': // Floating point constant zero
5781 case 'Z': // Integer constant zero
5782 return true;
5783 case 'Q': // A memory reference with base register and no offset
5784 Info.setAllowsMemory();
5785 return true;
5786 case 'S': // A symbolic address
5787 Info.setAllowsRegister();
5788 return true;
5789 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005790 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5791 // Utf: A memory address suitable for ldp/stp in TF mode.
5792 // Usa: An absolute symbolic address.
5793 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5794 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005795 case 'z': // Zero register, wzr or xzr
5796 Info.setAllowsRegister();
5797 return true;
5798 case 'x': // Floating point and SIMD registers (V0-V15)
5799 Info.setAllowsRegister();
5800 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005801 }
5802 return false;
5803 }
5804
Akira Hatanaka987f1862014-08-22 06:05:21 +00005805 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005806 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005807 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005808 // Strip off constraint modifiers.
5809 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5810 Constraint = Constraint.substr(1);
5811
5812 switch (Constraint[0]) {
5813 default:
5814 return true;
5815 case 'z':
5816 case 'r': {
5817 switch (Modifier) {
5818 case 'x':
5819 case 'w':
5820 // For now assume that the person knows what they're
5821 // doing with the modifier.
5822 return true;
5823 default:
5824 // By default an 'r' constraint will be in the 'x'
5825 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005826 if (Size == 64)
5827 return true;
5828
5829 SuggestedModifier = "w";
5830 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005831 }
5832 }
5833 }
5834 }
5835
David Blaikie1cbb9712014-11-14 19:09:44 +00005836 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005837
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005838 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005839 if (RegNo == 0)
5840 return 0;
5841 if (RegNo == 1)
5842 return 1;
5843 return -1;
5844 }
5845};
5846
Tim Northover573cbee2014-05-24 12:52:07 +00005847const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005848 // 32-bit Integer registers
5849 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5850 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5851 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5852
5853 // 64-bit Integer registers
5854 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5855 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5856 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5857
5858 // 32-bit floating point regsisters
5859 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5860 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5861 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5862
5863 // 64-bit floating point regsisters
5864 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5865 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5866 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5867
5868 // Vector registers
5869 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5870 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5871 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5872};
5873
Craig Topperf054e3a2015-10-19 03:52:27 +00005874ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5875 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005876}
5877
Tim Northover573cbee2014-05-24 12:52:07 +00005878const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005879 { { "w31" }, "wsp" },
5880 { { "x29" }, "fp" },
5881 { { "x30" }, "lr" },
5882 { { "x31" }, "sp" },
5883 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5884 // don't want to substitute one of these for a different-sized one.
5885};
5886
Craig Topperf054e3a2015-10-19 03:52:27 +00005887ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5888 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005889}
5890
Tim Northover573cbee2014-05-24 12:52:07 +00005891const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005892#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005893 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005894#include "clang/Basic/BuiltinsNEON.def"
5895
5896#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005897 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005898#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005899};
James Molloy5e73df52014-04-16 15:06:20 +00005900
Tim Northover573cbee2014-05-24 12:52:07 +00005901class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005902 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005903 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005904 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005905 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005906 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005907 }
5908
5909public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005910 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5911 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00005912 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005913 }
James Molloy5e73df52014-04-16 15:06:20 +00005914 void getTargetDefines(const LangOptions &Opts,
5915 MacroBuilder &Builder) const override {
5916 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005917 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005918 }
5919};
5920
Tim Northover573cbee2014-05-24 12:52:07 +00005921class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005922 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005923 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005924 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005925 }
5926
5927public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005928 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5929 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00005930 void getTargetDefines(const LangOptions &Opts,
5931 MacroBuilder &Builder) const override {
5932 Builder.defineMacro("__AARCH64EB__");
5933 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5934 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005935 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005936 }
5937};
Tim Northovera2ee4332014-03-29 15:09:45 +00005938
Tim Northover573cbee2014-05-24 12:52:07 +00005939class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005940protected:
5941 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5942 MacroBuilder &Builder) const override {
5943 Builder.defineMacro("__AARCH64_SIMD__");
5944 Builder.defineMacro("__ARM64_ARCH_8__");
5945 Builder.defineMacro("__ARM_NEON__");
5946 Builder.defineMacro("__LITTLE_ENDIAN__");
5947 Builder.defineMacro("__REGISTER_PREFIX__", "");
5948 Builder.defineMacro("__arm64", "1");
5949 Builder.defineMacro("__arm64__", "1");
5950
5951 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5952 }
5953
Tim Northovera2ee4332014-03-29 15:09:45 +00005954public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005955 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5956 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005957 Int64Type = SignedLongLong;
5958 WCharType = SignedInt;
5959 UseSignedCharForObjCBool = false;
5960
Tim Northovera6a19f12015-02-06 01:25:07 +00005961 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005962 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5963
5964 TheCXXABI.set(TargetCXXABI::iOS64);
5965 }
5966
David Blaikie1cbb9712014-11-14 19:09:44 +00005967 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005968 return TargetInfo::CharPtrBuiltinVaList;
5969 }
5970};
Tim Northovera2ee4332014-03-29 15:09:45 +00005971
Tony Linthicum76329bf2011-12-12 21:14:55 +00005972// Hexagon abstract base class
5973class HexagonTargetInfo : public TargetInfo {
5974 static const Builtin::Info BuiltinInfo[];
5975 static const char * const GCCRegNames[];
5976 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5977 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005978 bool HasHVX, HasHVXDouble;
5979
Tony Linthicum76329bf2011-12-12 21:14:55 +00005980public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005981 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
5982 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005983 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005984 // Specify the vector alignment explicitly. For v512x1, the calculated
5985 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5986 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00005987 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005988 "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 +00005989 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005990 SizeType = UnsignedInt;
5991 PtrDiffType = SignedInt;
5992 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005993
5994 // {} in inline assembly are packet specifiers, not assembly variant
5995 // specifiers.
5996 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005997
5998 LargeArrayMinWidth = 64;
5999 LargeArrayAlign = 64;
6000 UseBitFieldTypeAlignment = true;
6001 ZeroLengthBitfieldBoundary = 32;
6002 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006003 }
6004
Craig Topper6c03a542015-10-19 04:51:35 +00006005 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6006 return llvm::makeArrayRef(BuiltinInfo,
6007 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006008 }
6009
Craig Topper3164f332014-03-11 03:39:26 +00006010 bool validateAsmConstraint(const char *&Name,
6011 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006012 return true;
6013 }
6014
Craig Topper3164f332014-03-11 03:39:26 +00006015 void getTargetDefines(const LangOptions &Opts,
6016 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006017
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006018 bool isCLZForZeroUndef() const override { return false; }
6019
Craig Topper3164f332014-03-11 03:39:26 +00006020 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006021 return llvm::StringSwitch<bool>(Feature)
6022 .Case("hexagon", true)
6023 .Case("hvx", HasHVX)
6024 .Case("hvx-double", HasHVXDouble)
6025 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006026 }
Craig Topper3164f332014-03-11 03:39:26 +00006027
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006028 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6029 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6030 const override;
6031
6032 bool handleTargetFeatures(std::vector<std::string> &Features,
6033 DiagnosticsEngine &Diags) override;
6034
Craig Topper3164f332014-03-11 03:39:26 +00006035 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006036 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006037 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006038 ArrayRef<const char *> getGCCRegNames() const override;
6039 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006040 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006041 return "";
6042 }
Sebastian Pop86500282012-01-13 20:37:10 +00006043
6044 static const char *getHexagonCPUSuffix(StringRef Name) {
6045 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006046 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006047 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006048 .Case("hexagonv55", "55")
6049 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006050 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006051 }
6052
Craig Topper3164f332014-03-11 03:39:26 +00006053 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006054 if (!getHexagonCPUSuffix(Name))
6055 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006056 CPU = Name;
6057 return true;
6058 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006059
6060 int getEHDataRegisterNumber(unsigned RegNo) const override {
6061 return RegNo < 2 ? RegNo : -1;
6062 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006063};
6064
6065void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006066 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006067 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006068 Builder.defineMacro("__hexagon__", "1");
6069
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006070 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006071 Builder.defineMacro("__HEXAGON_V4__");
6072 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006073 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006074 Builder.defineMacro("__QDSP6_V4__");
6075 Builder.defineMacro("__QDSP6_ARCH__", "4");
6076 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006077 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006078 Builder.defineMacro("__HEXAGON_V5__");
6079 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6080 if(Opts.HexagonQdsp6Compat) {
6081 Builder.defineMacro("__QDSP6_V5__");
6082 Builder.defineMacro("__QDSP6_ARCH__", "5");
6083 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006084 } else if (CPU == "hexagonv55") {
6085 Builder.defineMacro("__HEXAGON_V55__");
6086 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6087 Builder.defineMacro("__QDSP6_V55__");
6088 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006089 } else if (CPU == "hexagonv60") {
6090 Builder.defineMacro("__HEXAGON_V60__");
6091 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6092 Builder.defineMacro("__QDSP6_V60__");
6093 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006094 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006095
6096 if (hasFeature("hvx")) {
6097 Builder.defineMacro("__HVX__");
6098 if (hasFeature("hvx-double"))
6099 Builder.defineMacro("__HVXDBL__");
6100 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006101}
6102
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006103bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6104 DiagnosticsEngine &Diags) {
6105 for (auto &F : Features) {
6106 if (F == "+hvx")
6107 HasHVX = true;
6108 else if (F == "-hvx")
6109 HasHVX = HasHVXDouble = false;
6110 else if (F == "+hvx-double")
6111 HasHVX = HasHVXDouble = true;
6112 else if (F == "-hvx-double")
6113 HasHVXDouble = false;
6114 }
6115 return true;
6116}
6117
6118bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6119 DiagnosticsEngine &Diags, StringRef CPU,
6120 const std::vector<std::string> &FeaturesVec) const {
6121 // Default for v60: -hvx, -hvx-double.
6122 Features["hvx"] = false;
6123 Features["hvx-double"] = false;
6124
6125 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6126}
6127
6128
6129const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006130 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6131 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6132 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6133 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6134 "p0", "p1", "p2", "p3",
6135 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6136};
6137
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006138ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006139 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006140}
6141
Tony Linthicum76329bf2011-12-12 21:14:55 +00006142const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6143 { { "sp" }, "r29" },
6144 { { "fp" }, "r30" },
6145 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006146};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006147
Craig Topperf054e3a2015-10-19 03:52:27 +00006148ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6149 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006150}
6151
6152
6153const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006154#define BUILTIN(ID, TYPE, ATTRS) \
6155 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6156#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6157 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006158#include "clang/Basic/BuiltinsHexagon.def"
6159};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006160
Jacques Pienaard964cc22016-03-28 21:02:54 +00006161class LanaiTargetInfo : public TargetInfo {
6162 // Class for Lanai (32-bit).
6163 // The CPU profiles supported by the Lanai backend
6164 enum CPUKind {
6165 CK_NONE,
6166 CK_V11,
6167 } CPU;
6168
6169 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6170 static const char *const GCCRegNames[];
6171
6172public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006173 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6174 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006175 // Description string has to be kept in sync with backend.
6176 resetDataLayout("E" // Big endian
6177 "-m:e" // ELF name manging
6178 "-p:32:32" // 32 bit pointers, 32 bit aligned
6179 "-i64:64" // 64 bit integers, 64 bit aligned
6180 "-a:0:32" // 32 bit alignment of objects of aggregate type
6181 "-n32" // 32 bit native integer width
6182 "-S64" // 64 bit natural stack alignment
6183 );
6184
6185 // Setting RegParmMax equal to what mregparm was set to in the old
6186 // toolchain
6187 RegParmMax = 4;
6188
6189 // Set the default CPU to V11
6190 CPU = CK_V11;
6191
6192 // Temporary approach to make everything at least word-aligned and allow for
6193 // safely casting between pointers with different alignment requirements.
6194 // TODO: Remove this when there are no more cast align warnings on the
6195 // firmware.
6196 MinGlobalAlign = 32;
6197 }
6198
6199 void getTargetDefines(const LangOptions &Opts,
6200 MacroBuilder &Builder) const override {
6201 // Define __lanai__ when building for target lanai.
6202 Builder.defineMacro("__lanai__");
6203
6204 // Set define for the CPU specified.
6205 switch (CPU) {
6206 case CK_V11:
6207 Builder.defineMacro("__LANAI_V11__");
6208 break;
6209 case CK_NONE:
6210 llvm_unreachable("Unhandled target CPU");
6211 }
6212 }
6213
6214 bool setCPU(const std::string &Name) override {
6215 CPU = llvm::StringSwitch<CPUKind>(Name)
6216 .Case("v11", CK_V11)
6217 .Default(CK_NONE);
6218
6219 return CPU != CK_NONE;
6220 }
6221
6222 bool hasFeature(StringRef Feature) const override {
6223 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6224 }
6225
6226 ArrayRef<const char *> getGCCRegNames() const override;
6227
6228 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6229
6230 BuiltinVaListKind getBuiltinVaListKind() const override {
6231 return TargetInfo::VoidPtrBuiltinVaList;
6232 }
6233
6234 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6235
6236 bool validateAsmConstraint(const char *&Name,
6237 TargetInfo::ConstraintInfo &info) const override {
6238 return false;
6239 }
6240
6241 const char *getClobbers() const override { return ""; }
6242};
6243
6244const char *const LanaiTargetInfo::GCCRegNames[] = {
6245 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6246 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6247 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6248
6249ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6250 return llvm::makeArrayRef(GCCRegNames);
6251}
6252
6253const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6254 {{"pc"}, "r2"},
6255 {{"sp"}, "r4"},
6256 {{"fp"}, "r5"},
6257 {{"rv"}, "r8"},
6258 {{"rr1"}, "r10"},
6259 {{"rr2"}, "r11"},
6260 {{"rca"}, "r15"},
6261};
6262
6263ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6264 return llvm::makeArrayRef(GCCRegAliases);
6265}
6266
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006267// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6268class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006269 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6270 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006271 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006272public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006273 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006274 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006275
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006276 int getEHDataRegisterNumber(unsigned RegNo) const override {
6277 if (RegNo == 0) return 24;
6278 if (RegNo == 1) return 25;
6279 return -1;
6280 }
6281
Craig Topper3164f332014-03-11 03:39:26 +00006282 bool handleTargetFeatures(std::vector<std::string> &Features,
6283 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00006284 // The backend doesn't actually handle soft float yet, but in case someone
6285 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00006286 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6287 if (Feature != Features.end()) {
6288 SoftFloat = true;
6289 Features.erase(Feature);
6290 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006291 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006292 }
Craig Topper3164f332014-03-11 03:39:26 +00006293 void getTargetDefines(const LangOptions &Opts,
6294 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006295 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006296 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006297
6298 if (SoftFloat)
6299 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006300 }
Craig Topper3164f332014-03-11 03:39:26 +00006301
6302 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006303 return llvm::StringSwitch<bool>(Feature)
6304 .Case("softfloat", SoftFloat)
6305 .Case("sparc", true)
6306 .Default(false);
6307 }
Craig Topper3164f332014-03-11 03:39:26 +00006308
Craig Topper6c03a542015-10-19 04:51:35 +00006309 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006310 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006311 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006312 }
Craig Topper3164f332014-03-11 03:39:26 +00006313 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006314 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006315 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006316 ArrayRef<const char *> getGCCRegNames() const override;
6317 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006318 bool validateAsmConstraint(const char *&Name,
6319 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006320 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006321 switch (*Name) {
6322 case 'I': // Signed 13-bit constant
6323 case 'J': // Zero
6324 case 'K': // 32-bit constant with the low 12 bits clear
6325 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6326 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6327 case 'N': // Same as 'K' but zext (required for SIMode)
6328 case 'O': // The constant 4096
6329 return true;
6330 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006331 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006332 }
Craig Topper3164f332014-03-11 03:39:26 +00006333 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006334 // FIXME: Implement!
6335 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006336 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006337
6338 // No Sparc V7 for now, the backend doesn't support it anyway.
6339 enum CPUKind {
6340 CK_GENERIC,
6341 CK_V8,
6342 CK_SUPERSPARC,
6343 CK_SPARCLITE,
6344 CK_F934,
6345 CK_HYPERSPARC,
6346 CK_SPARCLITE86X,
6347 CK_SPARCLET,
6348 CK_TSC701,
6349 CK_V9,
6350 CK_ULTRASPARC,
6351 CK_ULTRASPARC3,
6352 CK_NIAGARA,
6353 CK_NIAGARA2,
6354 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006355 CK_NIAGARA4,
6356 CK_MYRIAD2_1,
6357 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006358 } CPU = CK_GENERIC;
6359
6360 enum CPUGeneration {
6361 CG_V8,
6362 CG_V9,
6363 };
6364
6365 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6366 switch (Kind) {
6367 case CK_GENERIC:
6368 case CK_V8:
6369 case CK_SUPERSPARC:
6370 case CK_SPARCLITE:
6371 case CK_F934:
6372 case CK_HYPERSPARC:
6373 case CK_SPARCLITE86X:
6374 case CK_SPARCLET:
6375 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006376 case CK_MYRIAD2_1:
6377 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006378 return CG_V8;
6379 case CK_V9:
6380 case CK_ULTRASPARC:
6381 case CK_ULTRASPARC3:
6382 case CK_NIAGARA:
6383 case CK_NIAGARA2:
6384 case CK_NIAGARA3:
6385 case CK_NIAGARA4:
6386 return CG_V9;
6387 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006388 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006389 }
6390
6391 CPUKind getCPUKind(StringRef Name) const {
6392 return llvm::StringSwitch<CPUKind>(Name)
6393 .Case("v8", CK_V8)
6394 .Case("supersparc", CK_SUPERSPARC)
6395 .Case("sparclite", CK_SPARCLITE)
6396 .Case("f934", CK_F934)
6397 .Case("hypersparc", CK_HYPERSPARC)
6398 .Case("sparclite86x", CK_SPARCLITE86X)
6399 .Case("sparclet", CK_SPARCLET)
6400 .Case("tsc701", CK_TSC701)
6401 .Case("v9", CK_V9)
6402 .Case("ultrasparc", CK_ULTRASPARC)
6403 .Case("ultrasparc3", CK_ULTRASPARC3)
6404 .Case("niagara", CK_NIAGARA)
6405 .Case("niagara2", CK_NIAGARA2)
6406 .Case("niagara3", CK_NIAGARA3)
6407 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006408 .Case("myriad2", CK_MYRIAD2_1)
6409 .Case("myriad2.1", CK_MYRIAD2_1)
6410 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006411 .Default(CK_GENERIC);
6412 }
6413
6414 bool setCPU(const std::string &Name) override {
6415 CPU = getCPUKind(Name);
6416 return CPU != CK_GENERIC;
6417 }
Gabor Greif49991682008-02-21 16:29:08 +00006418};
6419
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006420const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006421 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6422 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6423 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6424 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6425};
6426
Craig Topperf054e3a2015-10-19 03:52:27 +00006427ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6428 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006429}
6430
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006431const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006432 { { "g0" }, "r0" },
6433 { { "g1" }, "r1" },
6434 { { "g2" }, "r2" },
6435 { { "g3" }, "r3" },
6436 { { "g4" }, "r4" },
6437 { { "g5" }, "r5" },
6438 { { "g6" }, "r6" },
6439 { { "g7" }, "r7" },
6440 { { "o0" }, "r8" },
6441 { { "o1" }, "r9" },
6442 { { "o2" }, "r10" },
6443 { { "o3" }, "r11" },
6444 { { "o4" }, "r12" },
6445 { { "o5" }, "r13" },
6446 { { "o6", "sp" }, "r14" },
6447 { { "o7" }, "r15" },
6448 { { "l0" }, "r16" },
6449 { { "l1" }, "r17" },
6450 { { "l2" }, "r18" },
6451 { { "l3" }, "r19" },
6452 { { "l4" }, "r20" },
6453 { { "l5" }, "r21" },
6454 { { "l6" }, "r22" },
6455 { { "l7" }, "r23" },
6456 { { "i0" }, "r24" },
6457 { { "i1" }, "r25" },
6458 { { "i2" }, "r26" },
6459 { { "i3" }, "r27" },
6460 { { "i4" }, "r28" },
6461 { { "i5" }, "r29" },
6462 { { "i6", "fp" }, "r30" },
6463 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006464};
6465
Craig Topperf054e3a2015-10-19 03:52:27 +00006466ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6467 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006468}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006469
6470// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6471class SparcV8TargetInfo : public SparcTargetInfo {
6472public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006473 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6474 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006475 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006476 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6477 switch (getTriple().getOS()) {
6478 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006479 SizeType = UnsignedInt;
6480 IntPtrType = SignedInt;
6481 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006482 break;
6483 case llvm::Triple::NetBSD:
6484 case llvm::Triple::OpenBSD:
6485 SizeType = UnsignedLong;
6486 IntPtrType = SignedLong;
6487 PtrDiffType = SignedLong;
6488 break;
Brad Smith56495d52015-08-13 22:00:53 +00006489 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006490 }
6491
Craig Topper3164f332014-03-11 03:39:26 +00006492 void getTargetDefines(const LangOptions &Opts,
6493 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006494 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006495 switch (getCPUGeneration(CPU)) {
6496 case CG_V8:
6497 Builder.defineMacro("__sparcv8");
6498 if (getTriple().getOS() != llvm::Triple::Solaris)
6499 Builder.defineMacro("__sparcv8__");
6500 break;
6501 case CG_V9:
6502 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006503 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006504 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006505 Builder.defineMacro("__sparc_v9__");
6506 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006507 break;
6508 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006509 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6510 switch (CPU) {
6511 case CK_MYRIAD2_1:
6512 Builder.defineMacro("__myriad2", "1");
6513 Builder.defineMacro("__myriad2__", "1");
6514 break;
6515 case CK_MYRIAD2_2:
6516 Builder.defineMacro("__myriad2", "2");
6517 Builder.defineMacro("__myriad2__", "2");
6518 break;
6519 default:
6520 break;
6521 }
6522 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006523 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006524
6525 bool hasSjLjLowering() const override {
6526 return true;
6527 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006528};
6529
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006530// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6531class SparcV8elTargetInfo : public SparcV8TargetInfo {
6532 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006533 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6534 : SparcV8TargetInfo(Triple, Opts) {
6535 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6536 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006537 }
6538};
6539
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006540// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6541class SparcV9TargetInfo : public SparcTargetInfo {
6542public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006543 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6544 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006545 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006546 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006547 // This is an LP64 platform.
6548 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006549
6550 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006551 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006552 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006553 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006554 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006555 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006556
6557 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6558 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6559 LongDoubleWidth = 128;
6560 LongDoubleAlign = 128;
6561 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006562 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006563 }
6564
Craig Topper3164f332014-03-11 03:39:26 +00006565 void getTargetDefines(const LangOptions &Opts,
6566 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006567 SparcTargetInfo::getTargetDefines(Opts, Builder);
6568 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006569 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006570 // Solaris doesn't need these variants, but the BSDs do.
6571 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006572 Builder.defineMacro("__sparc64__");
6573 Builder.defineMacro("__sparc_v9__");
6574 Builder.defineMacro("__sparcv9__");
6575 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006576 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006577
Craig Topper3164f332014-03-11 03:39:26 +00006578 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006579 if (!SparcTargetInfo::setCPU(Name))
6580 return false;
6581 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006582 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006583};
6584
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006585class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006586 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006587 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006588 std::string CPU;
6589 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006590 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006591
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006592public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006593 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006594 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6595 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006596 IntMaxType = SignedLong;
6597 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006598 TLSSupported = true;
6599 IntWidth = IntAlign = 32;
6600 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6601 PointerWidth = PointerAlign = 64;
6602 LongDoubleWidth = 128;
6603 LongDoubleAlign = 64;
6604 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006605 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006606 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006607 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 +00006608 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6609 }
6610 void getTargetDefines(const LangOptions &Opts,
6611 MacroBuilder &Builder) const override {
6612 Builder.defineMacro("__s390__");
6613 Builder.defineMacro("__s390x__");
6614 Builder.defineMacro("__zarch__");
6615 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006616
6617 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6618 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6619 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6620 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6621
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006622 if (HasTransactionalExecution)
6623 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006624 if (Opts.ZVector)
6625 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006626 }
Craig Topper6c03a542015-10-19 04:51:35 +00006627 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6628 return llvm::makeArrayRef(BuiltinInfo,
6629 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006630 }
6631
Craig Topperf054e3a2015-10-19 03:52:27 +00006632 ArrayRef<const char *> getGCCRegNames() const override;
6633 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006634 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006635 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006636 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006637 bool validateAsmConstraint(const char *&Name,
6638 TargetInfo::ConstraintInfo &info) const override;
6639 const char *getClobbers() const override {
6640 // FIXME: Is this really right?
6641 return "";
6642 }
6643 BuiltinVaListKind getBuiltinVaListKind() const override {
6644 return TargetInfo::SystemZBuiltinVaList;
6645 }
6646 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006647 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006648 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6649 .Case("z10", true)
6650 .Case("z196", true)
6651 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006652 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006653 .Default(false);
6654
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006655 return CPUKnown;
6656 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006657 bool
6658 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6659 StringRef CPU,
6660 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006661 if (CPU == "zEC12")
6662 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006663 if (CPU == "z13") {
6664 Features["transactional-execution"] = true;
6665 Features["vector"] = true;
6666 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006667 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006668 }
6669
6670 bool handleTargetFeatures(std::vector<std::string> &Features,
6671 DiagnosticsEngine &Diags) override {
6672 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006673 for (const auto &Feature : Features) {
6674 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006675 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006676 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006677 HasVector = true;
6678 }
6679 // If we use the vector ABI, vector types are 64-bit aligned.
6680 if (HasVector) {
6681 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006682 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6683 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006684 }
6685 return true;
6686 }
6687
6688 bool hasFeature(StringRef Feature) const override {
6689 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006690 .Case("systemz", true)
6691 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006692 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006693 .Default(false);
6694 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006695
Bryan Chane3f1ed52016-04-28 13:56:43 +00006696 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6697 switch (CC) {
6698 case CC_C:
6699 case CC_Swift:
6700 return CCCR_OK;
6701 default:
6702 return CCCR_Warning;
6703 }
6704 }
6705
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006706 StringRef getABI() const override {
6707 if (HasVector)
6708 return "vector";
6709 return "";
6710 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006711
6712 bool useFloat128ManglingForLongDouble() const override {
6713 return true;
6714 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006715};
6716
6717const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6718#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006719 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006720#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6721 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006722#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006723};
6724
6725const char *const SystemZTargetInfo::GCCRegNames[] = {
6726 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6727 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6728 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6729 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6730};
6731
Craig Topperf054e3a2015-10-19 03:52:27 +00006732ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6733 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006734}
6735
6736bool SystemZTargetInfo::
6737validateAsmConstraint(const char *&Name,
6738 TargetInfo::ConstraintInfo &Info) const {
6739 switch (*Name) {
6740 default:
6741 return false;
6742
6743 case 'a': // Address register
6744 case 'd': // Data register (equivalent to 'r')
6745 case 'f': // Floating-point register
6746 Info.setAllowsRegister();
6747 return true;
6748
6749 case 'I': // Unsigned 8-bit constant
6750 case 'J': // Unsigned 12-bit constant
6751 case 'K': // Signed 16-bit constant
6752 case 'L': // Signed 20-bit displacement (on all targets we support)
6753 case 'M': // 0x7fffffff
6754 return true;
6755
6756 case 'Q': // Memory with base and unsigned 12-bit displacement
6757 case 'R': // Likewise, plus an index
6758 case 'S': // Memory with base and signed 20-bit displacement
6759 case 'T': // Likewise, plus an index
6760 Info.setAllowsMemory();
6761 return true;
6762 }
6763}
Ulrich Weigand47445072013-05-06 16:26:41 +00006764
Eric Christopherc48497a2015-09-18 21:26:24 +00006765class MSP430TargetInfo : public TargetInfo {
6766 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006767
Eric Christopherc48497a2015-09-18 21:26:24 +00006768public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006769 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6770 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006771 BigEndian = false;
6772 TLSSupported = false;
6773 IntWidth = 16;
6774 IntAlign = 16;
6775 LongWidth = 32;
6776 LongLongWidth = 64;
6777 LongAlign = LongLongAlign = 16;
6778 PointerWidth = 16;
6779 PointerAlign = 16;
6780 SuitableAlign = 16;
6781 SizeType = UnsignedInt;
6782 IntMaxType = SignedLongLong;
6783 IntPtrType = SignedInt;
6784 PtrDiffType = SignedInt;
6785 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006786 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006787 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006788 void getTargetDefines(const LangOptions &Opts,
6789 MacroBuilder &Builder) const override {
6790 Builder.defineMacro("MSP430");
6791 Builder.defineMacro("__MSP430__");
6792 // FIXME: defines for different 'flavours' of MCU
6793 }
Craig Topper6c03a542015-10-19 04:51:35 +00006794 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006795 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006796 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006797 }
6798 bool hasFeature(StringRef Feature) const override {
6799 return Feature == "msp430";
6800 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006801 ArrayRef<const char *> getGCCRegNames() const override;
6802 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006803 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006804 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006805 }
6806 bool validateAsmConstraint(const char *&Name,
6807 TargetInfo::ConstraintInfo &info) const override {
6808 // FIXME: implement
6809 switch (*Name) {
6810 case 'K': // the constant 1
6811 case 'L': // constant -1^20 .. 1^19
6812 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006813 return true;
6814 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006815 // No target constraints for now.
6816 return false;
6817 }
6818 const char *getClobbers() const override {
6819 // FIXME: Is this really right?
6820 return "";
6821 }
6822 BuiltinVaListKind getBuiltinVaListKind() const override {
6823 // FIXME: implement
6824 return TargetInfo::CharPtrBuiltinVaList;
6825 }
6826};
6827
6828const char *const MSP430TargetInfo::GCCRegNames[] = {
6829 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6830 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6831
Craig Topperf054e3a2015-10-19 03:52:27 +00006832ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6833 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006834}
6835
6836// LLVM and Clang cannot be used directly to output native binaries for
6837// target, but is used to compile C code to llvm bitcode with correct
6838// type and alignment information.
6839//
6840// TCE uses the llvm bitcode as input and uses it for generating customized
6841// target processor and program binary. TCE co-design environment is
6842// publicly available in http://tce.cs.tut.fi
6843
6844static const unsigned TCEOpenCLAddrSpaceMap[] = {
6845 3, // opencl_global
6846 4, // opencl_local
6847 5, // opencl_constant
6848 // FIXME: generic has to be added to the target
6849 0, // opencl_generic
6850 0, // cuda_device
6851 0, // cuda_constant
6852 0 // cuda_shared
6853};
6854
6855class TCETargetInfo : public TargetInfo {
6856public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006857 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6858 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006859 TLSSupported = false;
6860 IntWidth = 32;
6861 LongWidth = LongLongWidth = 32;
6862 PointerWidth = 32;
6863 IntAlign = 32;
6864 LongAlign = LongLongAlign = 32;
6865 PointerAlign = 32;
6866 SuitableAlign = 32;
6867 SizeType = UnsignedInt;
6868 IntMaxType = SignedLong;
6869 IntPtrType = SignedInt;
6870 PtrDiffType = SignedInt;
6871 FloatWidth = 32;
6872 FloatAlign = 32;
6873 DoubleWidth = 32;
6874 DoubleAlign = 32;
6875 LongDoubleWidth = 32;
6876 LongDoubleAlign = 32;
6877 FloatFormat = &llvm::APFloat::IEEEsingle;
6878 DoubleFormat = &llvm::APFloat::IEEEsingle;
6879 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006880 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6881 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006882 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6883 UseAddrSpaceMapMangling = true;
6884 }
6885
6886 void getTargetDefines(const LangOptions &Opts,
6887 MacroBuilder &Builder) const override {
6888 DefineStd(Builder, "tce", Opts);
6889 Builder.defineMacro("__TCE__");
6890 Builder.defineMacro("__TCE_V1__");
6891 }
6892 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6893
Craig Topper6c03a542015-10-19 04:51:35 +00006894 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006895 const char *getClobbers() const override { return ""; }
6896 BuiltinVaListKind getBuiltinVaListKind() const override {
6897 return TargetInfo::VoidPtrBuiltinVaList;
6898 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006899 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006900 bool validateAsmConstraint(const char *&Name,
6901 TargetInfo::ConstraintInfo &info) const override {
6902 return true;
6903 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006904 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6905 return None;
6906 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006907};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006908
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006909class BPFTargetInfo : public TargetInfo {
6910public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006911 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6912 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006913 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6914 SizeType = UnsignedLong;
6915 PtrDiffType = SignedLong;
6916 IntPtrType = SignedLong;
6917 IntMaxType = SignedLong;
6918 Int64Type = SignedLong;
6919 RegParmMax = 5;
6920 if (Triple.getArch() == llvm::Triple::bpfeb) {
6921 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006922 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006923 } else {
6924 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006925 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006926 }
6927 MaxAtomicPromoteWidth = 64;
6928 MaxAtomicInlineWidth = 64;
6929 TLSSupported = false;
6930 }
6931 void getTargetDefines(const LangOptions &Opts,
6932 MacroBuilder &Builder) const override {
6933 DefineStd(Builder, "bpf", Opts);
6934 Builder.defineMacro("__BPF__");
6935 }
6936 bool hasFeature(StringRef Feature) const override {
6937 return Feature == "bpf";
6938 }
6939
Craig Topper6c03a542015-10-19 04:51:35 +00006940 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006941 const char *getClobbers() const override {
6942 return "";
6943 }
6944 BuiltinVaListKind getBuiltinVaListKind() const override {
6945 return TargetInfo::VoidPtrBuiltinVaList;
6946 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006947 ArrayRef<const char *> getGCCRegNames() const override {
6948 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006949 }
6950 bool validateAsmConstraint(const char *&Name,
6951 TargetInfo::ConstraintInfo &info) const override {
6952 return true;
6953 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006954 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6955 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006956 }
6957};
6958
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006959class MipsTargetInfoBase : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006960 virtual void setDataLayout() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006961
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006962 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006963 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006964 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006965 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006966 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006967 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006968 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006969 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006970 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006971 enum DspRevEnum {
6972 NoDSP, DSP1, DSP2
6973 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006974 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006975
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006976protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006977 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006978 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006979
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006980public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006981 MipsTargetInfoBase(const llvm::Triple &Triple, const TargetOptions &,
6982 const std::string &ABIStr, const std::string &CPUStr)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006983 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006984 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006985 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6986 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6987 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006988
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006989 bool isNaN2008Default() const {
6990 return CPU == "mips32r6" || CPU == "mips64r6";
6991 }
6992
6993 bool isFP64Default() const {
6994 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6995 }
6996
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006997 bool isNan2008() const override {
6998 return IsNan2008;
6999 }
7000
Alp Toker4925ba72014-06-07 23:30:42 +00007001 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00007002 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007003 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
7004 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00007005 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007006 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007007 .Case("mips1", IsMips32)
7008 .Case("mips2", IsMips32)
7009 .Case("mips3", true)
7010 .Case("mips4", true)
7011 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007012 .Case("mips32", IsMips32)
7013 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007014 .Case("mips32r3", IsMips32)
7015 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007016 .Case("mips32r6", IsMips32)
7017 .Case("mips64", true)
7018 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007019 .Case("mips64r3", true)
7020 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007021 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007022 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00007023 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007024 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007025 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007026 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007027 bool
7028 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7029 StringRef CPU,
7030 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007031 if (CPU.empty())
7032 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007033 if (CPU == "octeon")
7034 Features["mips64r2"] = Features["cnmips"] = true;
7035 else
7036 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007037 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007038 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007039
Craig Topper3164f332014-03-11 03:39:26 +00007040 void getTargetDefines(const LangOptions &Opts,
7041 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007042 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007043 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007044 if (Opts.GNUMode)
7045 Builder.defineMacro("mips");
7046
Simon Atanasyan683535b2012-08-29 19:14:58 +00007047 Builder.defineMacro("__REGISTER_PREFIX__", "");
7048
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007049 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007050 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007051 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007052 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007053 case SoftFloat:
7054 Builder.defineMacro("__mips_soft_float", Twine(1));
7055 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007056 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007057
Simon Atanasyan16071912013-04-14 14:07:30 +00007058 if (IsSingleFloat)
7059 Builder.defineMacro("__mips_single_float", Twine(1));
7060
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007061 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7062 Builder.defineMacro("_MIPS_FPSET",
7063 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7064
Simon Atanasyan72244b62012-07-05 16:06:06 +00007065 if (IsMips16)
7066 Builder.defineMacro("__mips16", Twine(1));
7067
Simon Atanasyan60777612013-04-14 14:07:51 +00007068 if (IsMicromips)
7069 Builder.defineMacro("__mips_micromips", Twine(1));
7070
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007071 if (IsNan2008)
7072 Builder.defineMacro("__mips_nan2008", Twine(1));
7073
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007074 switch (DspRev) {
7075 default:
7076 break;
7077 case DSP1:
7078 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7079 Builder.defineMacro("__mips_dsp", Twine(1));
7080 break;
7081 case DSP2:
7082 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7083 Builder.defineMacro("__mips_dspr2", Twine(1));
7084 Builder.defineMacro("__mips_dsp", Twine(1));
7085 break;
7086 }
7087
Jack Carter44ff1e52013-08-12 17:20:29 +00007088 if (HasMSA)
7089 Builder.defineMacro("__mips_msa", Twine(1));
7090
Simon Atanasyan26f19672012-04-05 19:28:31 +00007091 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7092 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7093 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007094
7095 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7096 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007097
7098 // These shouldn't be defined for MIPS-I but there's no need to check
7099 // for that since MIPS-I isn't supported.
7100 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7101 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7102 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007103 }
7104
Craig Topper6c03a542015-10-19 04:51:35 +00007105 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7106 return llvm::makeArrayRef(BuiltinInfo,
7107 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007108 }
Craig Topper3164f332014-03-11 03:39:26 +00007109 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007110 return llvm::StringSwitch<bool>(Feature)
7111 .Case("mips", true)
7112 .Case("fp64", HasFP64)
7113 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007114 }
Craig Topper3164f332014-03-11 03:39:26 +00007115 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007116 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007117 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007118 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007119 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007120 // CPU register names
7121 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007122 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7123 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7124 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007125 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7126 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007127 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7128 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7129 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7130 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007131 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007132 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007133 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7134 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007135 // MSA register names
7136 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7137 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7138 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7139 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7140 // MSA control register names
7141 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7142 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007143 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007144 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007145 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007146 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00007147 bool validateAsmConstraint(const char *&Name,
7148 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007149 switch (*Name) {
7150 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007151 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007152 case 'r': // CPU registers.
7153 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007154 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007155 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007156 case 'c': // $25 for indirect jumps
7157 case 'l': // lo register
7158 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007159 Info.setAllowsRegister();
7160 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007161 case 'I': // Signed 16-bit constant
7162 case 'J': // Integer 0
7163 case 'K': // Unsigned 16-bit constant
7164 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7165 case 'M': // Constants not loadable via lui, addiu, or ori
7166 case 'N': // Constant -1 to -65535
7167 case 'O': // A signed 15-bit constant
7168 case 'P': // A constant between 1 go 65535
7169 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007170 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007171 Info.setAllowsMemory();
7172 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007173 case 'Z':
7174 if (Name[1] == 'C') { // An address usable by ll, and sc.
7175 Info.setAllowsMemory();
7176 Name++; // Skip over 'Z'.
7177 return true;
7178 }
7179 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007180 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007181 }
7182
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007183 std::string convertConstraint(const char *&Constraint) const override {
7184 std::string R;
7185 switch (*Constraint) {
7186 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7187 if (Constraint[1] == 'C') {
7188 R = std::string("^") + std::string(Constraint, 2);
7189 Constraint++;
7190 return R;
7191 }
7192 break;
7193 }
7194 return TargetInfo::convertConstraint(Constraint);
7195 }
7196
Craig Topper3164f332014-03-11 03:39:26 +00007197 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007198 // In GCC, $1 is not widely used in generated code (it's used only in a few
7199 // specific situations), so there is no real need for users to add it to
7200 // the clobbers list if they want to use it in their inline assembly code.
7201 //
7202 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7203 // code generation, so using it in inline assembly without adding it to the
7204 // clobbers list can cause conflicts between the inline assembly code and
7205 // the surrounding generated code.
7206 //
7207 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7208 // operands, which will conflict with the ".set at" assembler option (which
7209 // we use only for inline assembly, in order to maintain compatibility with
7210 // GCC) and will also conflict with the user's usage of $1.
7211 //
7212 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7213 // register for generated code is to automatically clobber $1 for all inline
7214 // assembly code.
7215 //
7216 // FIXME: We should automatically clobber $1 only for inline assembly code
7217 // which actually uses it. This would allow LLVM to use $1 for inline
7218 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007219 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007220 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007221
Craig Topper3164f332014-03-11 03:39:26 +00007222 bool handleTargetFeatures(std::vector<std::string> &Features,
7223 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007224 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007225 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007226 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007227 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007228 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007229 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007230 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007231
Eric Christopher610fe112015-08-26 08:21:55 +00007232 for (const auto &Feature : Features) {
7233 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007234 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007235 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007236 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007237 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007238 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007239 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007240 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007241 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007242 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007243 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007244 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007245 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007246 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007247 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007248 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007249 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007250 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007251 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007252 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007253 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007254 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007255 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007256
James Y Knightb214cbc2016-03-04 19:00:41 +00007257 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007258
Rafael Espindolaeb265472013-08-21 21:59:03 +00007259 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007260 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007261
Craig Topper3164f332014-03-11 03:39:26 +00007262 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007263 if (RegNo == 0) return 4;
7264 if (RegNo == 1) return 5;
7265 return -1;
7266 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007267
7268 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007269};
7270
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007271const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007272#define BUILTIN(ID, TYPE, ATTRS) \
7273 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7274#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7275 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007276#include "clang/Basic/BuiltinsMips.def"
7277};
7278
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007279class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007280public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007281 Mips32TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7282 : MipsTargetInfoBase(Triple, Opts, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007283 SizeType = UnsignedInt;
7284 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007285 Int64Type = SignedLongLong;
7286 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007287 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00007288 }
Craig Topper3164f332014-03-11 03:39:26 +00007289 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00007290 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007291 ABI = Name;
7292 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007293 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007294 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007295 }
Craig Topper3164f332014-03-11 03:39:26 +00007296 void getTargetDefines(const LangOptions &Opts,
7297 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007298 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007299
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007300 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007301 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7302
7303 const std::string& CPUStr = getCPU();
7304 if (CPUStr == "mips32")
7305 Builder.defineMacro("__mips_isa_rev", "1");
7306 else if (CPUStr == "mips32r2")
7307 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007308 else if (CPUStr == "mips32r3")
7309 Builder.defineMacro("__mips_isa_rev", "3");
7310 else if (CPUStr == "mips32r5")
7311 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007312 else if (CPUStr == "mips32r6")
7313 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007314
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007315 if (ABI == "o32") {
7316 Builder.defineMacro("__mips_o32");
7317 Builder.defineMacro("_ABIO32", "1");
7318 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7319 }
7320 else if (ABI == "eabi")
7321 Builder.defineMacro("__mips_eabi");
7322 else
David Blaikie83d382b2011-09-23 05:06:16 +00007323 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007324 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007325 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007326 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7327 { { "at" }, "$1" },
7328 { { "v0" }, "$2" },
7329 { { "v1" }, "$3" },
7330 { { "a0" }, "$4" },
7331 { { "a1" }, "$5" },
7332 { { "a2" }, "$6" },
7333 { { "a3" }, "$7" },
7334 { { "t0" }, "$8" },
7335 { { "t1" }, "$9" },
7336 { { "t2" }, "$10" },
7337 { { "t3" }, "$11" },
7338 { { "t4" }, "$12" },
7339 { { "t5" }, "$13" },
7340 { { "t6" }, "$14" },
7341 { { "t7" }, "$15" },
7342 { { "s0" }, "$16" },
7343 { { "s1" }, "$17" },
7344 { { "s2" }, "$18" },
7345 { { "s3" }, "$19" },
7346 { { "s4" }, "$20" },
7347 { { "s5" }, "$21" },
7348 { { "s6" }, "$22" },
7349 { { "s7" }, "$23" },
7350 { { "t8" }, "$24" },
7351 { { "t9" }, "$25" },
7352 { { "k0" }, "$26" },
7353 { { "k1" }, "$27" },
7354 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007355 { { "sp","$sp" }, "$29" },
7356 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007357 { { "ra" }, "$31" }
7358 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007359 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007360 }
7361};
7362
7363class Mips32EBTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007364 void setDataLayout() override {
7365 resetDataLayout("E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007366 }
7367
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007368public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007369 Mips32EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7370 : Mips32TargetInfoBase(Triple, Opts) {
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00007371 }
Craig Topper3164f332014-03-11 03:39:26 +00007372 void getTargetDefines(const LangOptions &Opts,
7373 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007374 DefineStd(Builder, "MIPSEB", Opts);
7375 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007376 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007377 }
7378};
7379
7380class Mips32ELTargetInfo : public Mips32TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007381 void setDataLayout() override {
7382 resetDataLayout("e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
Akira Hatanaka9064e362013-10-29 18:30:33 +00007383 }
7384
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007385public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007386 Mips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7387 : Mips32TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007388 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007389 }
Craig Topper3164f332014-03-11 03:39:26 +00007390 void getTargetDefines(const LangOptions &Opts,
7391 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007392 DefineStd(Builder, "MIPSEL", Opts);
7393 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007394 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007395 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007396};
Akira Hatanakabef17452011-09-20 19:21:49 +00007397
7398class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007399public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007400 Mips64TargetInfoBase(const llvm::Triple &Triple, const TargetOptions &Opts)
7401 : MipsTargetInfoBase(Triple, Opts, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007402 LongDoubleWidth = LongDoubleAlign = 128;
7403 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007404 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7405 LongDoubleWidth = LongDoubleAlign = 64;
7406 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7407 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007408 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007409 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007410 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007411 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007412
7413 void setN64ABITypes() {
7414 LongWidth = LongAlign = 64;
7415 PointerWidth = PointerAlign = 64;
7416 SizeType = UnsignedLong;
7417 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007418 Int64Type = SignedLong;
7419 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007420 }
7421
7422 void setN32ABITypes() {
7423 LongWidth = LongAlign = 32;
7424 PointerWidth = PointerAlign = 32;
7425 SizeType = UnsignedInt;
7426 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007427 Int64Type = SignedLongLong;
7428 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007429 }
7430
Craig Topper3164f332014-03-11 03:39:26 +00007431 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007432 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007433 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007434 ABI = Name;
7435 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007436 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007437 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007438 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007439 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007440 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007441 }
7442 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007443 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007444
Craig Topper3164f332014-03-11 03:39:26 +00007445 void getTargetDefines(const LangOptions &Opts,
7446 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007447 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007448
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007449 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007450 Builder.defineMacro("__mips64");
7451 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007452 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7453
7454 const std::string& CPUStr = getCPU();
7455 if (CPUStr == "mips64")
7456 Builder.defineMacro("__mips_isa_rev", "1");
7457 else if (CPUStr == "mips64r2")
7458 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007459 else if (CPUStr == "mips64r3")
7460 Builder.defineMacro("__mips_isa_rev", "3");
7461 else if (CPUStr == "mips64r5")
7462 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007463 else if (CPUStr == "mips64r6")
7464 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007465
Akira Hatanakabef17452011-09-20 19:21:49 +00007466 if (ABI == "n32") {
7467 Builder.defineMacro("__mips_n32");
7468 Builder.defineMacro("_ABIN32", "2");
7469 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7470 }
7471 else if (ABI == "n64") {
7472 Builder.defineMacro("__mips_n64");
7473 Builder.defineMacro("_ABI64", "3");
7474 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7475 }
7476 else
David Blaikie83d382b2011-09-23 05:06:16 +00007477 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007478
7479 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007480 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007481 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007482 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7483 { { "at" }, "$1" },
7484 { { "v0" }, "$2" },
7485 { { "v1" }, "$3" },
7486 { { "a0" }, "$4" },
7487 { { "a1" }, "$5" },
7488 { { "a2" }, "$6" },
7489 { { "a3" }, "$7" },
7490 { { "a4" }, "$8" },
7491 { { "a5" }, "$9" },
7492 { { "a6" }, "$10" },
7493 { { "a7" }, "$11" },
7494 { { "t0" }, "$12" },
7495 { { "t1" }, "$13" },
7496 { { "t2" }, "$14" },
7497 { { "t3" }, "$15" },
7498 { { "s0" }, "$16" },
7499 { { "s1" }, "$17" },
7500 { { "s2" }, "$18" },
7501 { { "s3" }, "$19" },
7502 { { "s4" }, "$20" },
7503 { { "s5" }, "$21" },
7504 { { "s6" }, "$22" },
7505 { { "s7" }, "$23" },
7506 { { "t8" }, "$24" },
7507 { { "t9" }, "$25" },
7508 { { "k0" }, "$26" },
7509 { { "k1" }, "$27" },
7510 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007511 { { "sp","$sp" }, "$29" },
7512 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007513 { { "ra" }, "$31" }
7514 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007515 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007516 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007517
7518 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007519};
7520
7521class Mips64EBTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007522 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007523 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007524 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 +00007525 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007526 resetDataLayout("E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007527 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007528
Akira Hatanakabef17452011-09-20 19:21:49 +00007529public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007530 Mips64EBTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7531 : Mips64TargetInfoBase(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00007532 void getTargetDefines(const LangOptions &Opts,
7533 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007534 DefineStd(Builder, "MIPSEB", Opts);
7535 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007536 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007537 }
7538};
7539
7540class Mips64ELTargetInfo : public Mips64TargetInfoBase {
James Y Knightb214cbc2016-03-04 19:00:41 +00007541 void setDataLayout() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007542 if (ABI == "n32")
James Y Knightb214cbc2016-03-04 19:00:41 +00007543 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 +00007544 else
James Y Knightb214cbc2016-03-04 19:00:41 +00007545 resetDataLayout("e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128");
Akira Hatanakabef17452011-09-20 19:21:49 +00007546 }
7547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007548 Mips64ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7549 : Mips64TargetInfoBase(Triple, Opts) {
Eli Friedman803acb32011-12-22 03:51:45 +00007550 // Default ABI is n64.
7551 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007552 }
Craig Topper3164f332014-03-11 03:39:26 +00007553 void getTargetDefines(const LangOptions &Opts,
7554 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007555 DefineStd(Builder, "MIPSEL", Opts);
7556 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007557 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007558 }
7559};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007560
Ivan Krasindd7403e2011-08-24 20:22:22 +00007561class PNaClTargetInfo : public TargetInfo {
7562public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007563 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7564 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007565 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007566 this->LongAlign = 32;
7567 this->LongWidth = 32;
7568 this->PointerAlign = 32;
7569 this->PointerWidth = 32;
7570 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007571 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007572 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007573 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007574 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007575 this->SizeType = TargetInfo::UnsignedInt;
7576 this->PtrDiffType = TargetInfo::SignedInt;
7577 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007578 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007579 }
7580
Craig Toppere6f17d02014-03-11 04:07:52 +00007581 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007582 Builder.defineMacro("__le32__");
7583 Builder.defineMacro("__pnacl__");
7584 }
Craig Topper3164f332014-03-11 03:39:26 +00007585 void getTargetDefines(const LangOptions &Opts,
7586 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007587 getArchDefines(Opts, Builder);
7588 }
Craig Topper3164f332014-03-11 03:39:26 +00007589 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007590 return Feature == "pnacl";
7591 }
Craig Topper6c03a542015-10-19 04:51:35 +00007592 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007593 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007594 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007595 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007596 ArrayRef<const char *> getGCCRegNames() const override;
7597 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007598 bool validateAsmConstraint(const char *&Name,
7599 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007600 return false;
7601 }
7602
Craig Topper3164f332014-03-11 03:39:26 +00007603 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007604 return "";
7605 }
7606};
7607
Craig Topperf054e3a2015-10-19 03:52:27 +00007608ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7609 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007610}
7611
Craig Topperf054e3a2015-10-19 03:52:27 +00007612ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7613 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007614}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007615
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007616// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7617class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7618public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007619 NaClMips32ELTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7620 : Mips32ELTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007621
7622 BuiltinVaListKind getBuiltinVaListKind() const override {
7623 return TargetInfo::PNaClABIBuiltinVaList;
7624 }
7625};
7626
JF Bastien643817d2014-09-12 17:52:47 +00007627class Le64TargetInfo : public TargetInfo {
7628 static const Builtin::Info BuiltinInfo[];
7629
7630public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007631 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7632 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007633 BigEndian = false;
7634 NoAsmVariants = true;
7635 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7636 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007637 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007638 }
7639
7640 void getTargetDefines(const LangOptions &Opts,
7641 MacroBuilder &Builder) const override {
7642 DefineStd(Builder, "unix", Opts);
7643 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7644 Builder.defineMacro("__ELF__");
7645 }
Craig Topper6c03a542015-10-19 04:51:35 +00007646 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7647 return llvm::makeArrayRef(BuiltinInfo,
7648 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007649 }
7650 BuiltinVaListKind getBuiltinVaListKind() const override {
7651 return TargetInfo::PNaClABIBuiltinVaList;
7652 }
7653 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007654 ArrayRef<const char *> getGCCRegNames() const override {
7655 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007656 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007657 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7658 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007659 }
7660 bool validateAsmConstraint(const char *&Name,
7661 TargetInfo::ConstraintInfo &Info) const override {
7662 return false;
7663 }
7664
7665 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007666};
Dan Gohmanc2853072015-09-03 22:51:53 +00007667
7668class WebAssemblyTargetInfo : public TargetInfo {
7669 static const Builtin::Info BuiltinInfo[];
7670
7671 enum SIMDEnum {
7672 NoSIMD,
7673 SIMD128,
7674 } SIMDLevel;
7675
7676public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007677 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007678 : TargetInfo(T), SIMDLevel(NoSIMD) {
7679 BigEndian = false;
7680 NoAsmVariants = true;
7681 SuitableAlign = 128;
7682 LargeArrayMinWidth = 128;
7683 LargeArrayAlign = 128;
7684 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007685 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007686 LongDoubleWidth = LongDoubleAlign = 128;
7687 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007688 }
7689
7690protected:
7691 void getTargetDefines(const LangOptions &Opts,
7692 MacroBuilder &Builder) const override {
7693 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7694 if (SIMDLevel >= SIMD128)
7695 Builder.defineMacro("__wasm_simd128__");
7696 }
7697
7698private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007699 bool
7700 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7701 StringRef CPU,
7702 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007703 if (CPU == "bleeding-edge")
7704 Features["simd128"] = true;
7705 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7706 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007707 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007708 return llvm::StringSwitch<bool>(Feature)
7709 .Case("simd128", SIMDLevel >= SIMD128)
7710 .Default(false);
7711 }
7712 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007713 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007714 for (const auto &Feature : Features) {
7715 if (Feature == "+simd128") {
7716 SIMDLevel = std::max(SIMDLevel, SIMD128);
7717 continue;
7718 }
7719 if (Feature == "-simd128") {
7720 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7721 continue;
7722 }
7723
7724 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7725 << "-target-feature";
7726 return false;
7727 }
7728 return true;
7729 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007730 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007731 return llvm::StringSwitch<bool>(Name)
7732 .Case("mvp", true)
7733 .Case("bleeding-edge", true)
7734 .Case("generic", true)
7735 .Default(false);
7736 }
Craig Topper6c03a542015-10-19 04:51:35 +00007737 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7738 return llvm::makeArrayRef(BuiltinInfo,
7739 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007740 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007741 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007742 return VoidPtrBuiltinVaList;
7743 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007744 ArrayRef<const char *> getGCCRegNames() const final {
7745 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007746 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007747 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7748 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007749 }
7750 bool
7751 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007752 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007753 return false;
7754 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007755 const char *getClobbers() const final { return ""; }
7756 bool isCLZForZeroUndef() const final { return false; }
7757 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007758 IntType getIntTypeByWidth(unsigned BitWidth,
7759 bool IsSigned) const final {
7760 // WebAssembly prefers long long for explicitly 64-bit integers.
7761 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7762 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7763 }
7764 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7765 bool IsSigned) const final {
7766 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7767 return BitWidth == 64
7768 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7769 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7770 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007771};
7772
7773const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7774#define BUILTIN(ID, TYPE, ATTRS) \
7775 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7776#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7777 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7778#include "clang/Basic/BuiltinsWebAssembly.def"
7779};
7780
7781class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7782public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007783 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7784 const TargetOptions &Opts)
7785 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007786 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007787 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007788 }
7789
7790protected:
7791 void getTargetDefines(const LangOptions &Opts,
7792 MacroBuilder &Builder) const override {
7793 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7794 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7795 }
7796};
7797
7798class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7799public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007800 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7801 const TargetOptions &Opts)
7802 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007803 LongAlign = LongWidth = 64;
7804 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007805 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007806 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007807 }
7808
7809protected:
7810 void getTargetDefines(const LangOptions &Opts,
7811 MacroBuilder &Builder) const override {
7812 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7813 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7814 }
7815};
7816
JF Bastien643817d2014-09-12 17:52:47 +00007817const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7818#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007819 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007820#include "clang/Basic/BuiltinsLe64.def"
7821};
7822
Eric Christopherc48497a2015-09-18 21:26:24 +00007823static const unsigned SPIRAddrSpaceMap[] = {
7824 1, // opencl_global
7825 3, // opencl_local
7826 2, // opencl_constant
7827 4, // opencl_generic
7828 0, // cuda_device
7829 0, // cuda_constant
7830 0 // cuda_shared
7831};
7832class SPIRTargetInfo : public TargetInfo {
7833public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007834 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7835 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007836 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7837 "SPIR target must use unknown OS");
7838 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7839 "SPIR target must use unknown environment type");
7840 BigEndian = false;
7841 TLSSupported = false;
7842 LongWidth = LongAlign = 64;
7843 AddrSpaceMap = &SPIRAddrSpaceMap;
7844 UseAddrSpaceMapMangling = true;
7845 // Define available target features
7846 // These must be defined in sorted order!
7847 NoAsmVariants = true;
7848 }
7849 void getTargetDefines(const LangOptions &Opts,
7850 MacroBuilder &Builder) const override {
7851 DefineStd(Builder, "SPIR", Opts);
7852 }
7853 bool hasFeature(StringRef Feature) const override {
7854 return Feature == "spir";
7855 }
Craig Topper3164f332014-03-11 03:39:26 +00007856
Craig Topper6c03a542015-10-19 04:51:35 +00007857 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007858 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007859 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007860 bool validateAsmConstraint(const char *&Name,
7861 TargetInfo::ConstraintInfo &info) const override {
7862 return true;
7863 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007864 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7865 return None;
7866 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007867 BuiltinVaListKind getBuiltinVaListKind() const override {
7868 return TargetInfo::VoidPtrBuiltinVaList;
7869 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007870
Eric Christopherc48497a2015-09-18 21:26:24 +00007871 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7872 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7873 : CCCR_Warning;
7874 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007875
Eric Christopherc48497a2015-09-18 21:26:24 +00007876 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7877 return CC_SpirFunction;
7878 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007879
7880 void setSupportedOpenCLOpts() override {
7881 // Assume all OpenCL extensions and optional core features are supported
7882 // for SPIR since it is a generic target.
7883 getSupportedOpenCLOpts().setAll();
7884 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007885};
Guy Benyeib798fc92012-12-11 21:38:14 +00007886
Eric Christopherc48497a2015-09-18 21:26:24 +00007887class SPIR32TargetInfo : public SPIRTargetInfo {
7888public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007889 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7890 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007891 PointerWidth = PointerAlign = 32;
7892 SizeType = TargetInfo::UnsignedInt;
7893 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007894 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7895 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007896 }
7897 void getTargetDefines(const LangOptions &Opts,
7898 MacroBuilder &Builder) const override {
7899 DefineStd(Builder, "SPIR32", Opts);
7900 }
7901};
Guy Benyeib798fc92012-12-11 21:38:14 +00007902
Eric Christopherc48497a2015-09-18 21:26:24 +00007903class SPIR64TargetInfo : public SPIRTargetInfo {
7904public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007905 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7906 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007907 PointerWidth = PointerAlign = 64;
7908 SizeType = TargetInfo::UnsignedLong;
7909 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007910 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7911 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007912 }
7913 void getTargetDefines(const LangOptions &Opts,
7914 MacroBuilder &Builder) const override {
7915 DefineStd(Builder, "SPIR64", Opts);
7916 }
7917};
Guy Benyeib798fc92012-12-11 21:38:14 +00007918
Robert Lytton0e076492013-08-13 09:43:10 +00007919class XCoreTargetInfo : public TargetInfo {
7920 static const Builtin::Info BuiltinInfo[];
7921public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007922 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7923 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007924 BigEndian = false;
7925 NoAsmVariants = true;
7926 LongLongAlign = 32;
7927 SuitableAlign = 32;
7928 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007929 SizeType = UnsignedInt;
7930 PtrDiffType = SignedInt;
7931 IntPtrType = SignedInt;
7932 WCharType = UnsignedChar;
7933 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007934 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007935 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7936 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007937 }
Craig Topper3164f332014-03-11 03:39:26 +00007938 void getTargetDefines(const LangOptions &Opts,
7939 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007940 Builder.defineMacro("__XS1B__");
7941 }
Craig Topper6c03a542015-10-19 04:51:35 +00007942 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7943 return llvm::makeArrayRef(BuiltinInfo,
7944 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007945 }
Craig Topper3164f332014-03-11 03:39:26 +00007946 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007947 return TargetInfo::VoidPtrBuiltinVaList;
7948 }
Craig Topper3164f332014-03-11 03:39:26 +00007949 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007950 return "";
7951 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007952 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007953 static const char * const GCCRegNames[] = {
7954 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7955 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7956 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007957 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007958 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007959 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7960 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007961 }
Craig Topper3164f332014-03-11 03:39:26 +00007962 bool validateAsmConstraint(const char *&Name,
7963 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007964 return false;
7965 }
Craig Topper3164f332014-03-11 03:39:26 +00007966 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007967 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7968 return (RegNo < 2)? RegNo : -1;
7969 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007970 bool allowsLargerPreferedTypeAlignment() const override {
7971 return false;
7972 }
Robert Lytton0e076492013-08-13 09:43:10 +00007973};
7974
7975const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007976#define BUILTIN(ID, TYPE, ATTRS) \
7977 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7978#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7979 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007980#include "clang/Basic/BuiltinsXCore.def"
7981};
Robert Lytton0e076492013-08-13 09:43:10 +00007982
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007983// x86_32 Android target
7984class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7985public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007986 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7987 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007988 SuitableAlign = 32;
7989 LongDoubleWidth = 64;
7990 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7991 }
7992};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007993
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007994// x86_64 Android target
7995class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7996public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007997 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7998 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007999 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8000 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008001
8002 bool useFloat128ManglingForLongDouble() const override {
8003 return true;
8004 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008005};
8006} // end anonymous namespace
8007
Chris Lattner5ba61f02006-10-14 07:39:34 +00008008//===----------------------------------------------------------------------===//
8009// Driver code
8010//===----------------------------------------------------------------------===//
8011
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008012static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8013 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008014 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008015
Daniel Dunbar52322032009-08-18 05:47:58 +00008016 switch (Triple.getArch()) {
8017 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008018 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008019
Tim Northover2a0783d2014-05-30 14:14:07 +00008020 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008021 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008022
8023 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008024 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008025
Jacques Pienaard964cc22016-03-28 21:02:54 +00008026 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008027 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008028
Tim Northover2a0783d2014-05-30 14:14:07 +00008029 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008030 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008031 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008032
8033 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008034 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008035 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008036 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008037 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008038 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008039 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008040 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008041 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008042 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008043 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008044 }
8045
Christian Pirker9b019ae2014-02-25 13:51:00 +00008046 case llvm::Triple::aarch64_be:
8047 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008048 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008049 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008050 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008051 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008052 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008053 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008054 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008055 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008056 }
8057
Daniel Dunbar52322032009-08-18 05:47:58 +00008058 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008059 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008060 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008061 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008062
Daniel Dunbar52322032009-08-18 05:47:58 +00008063 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008064 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008065 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008066 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008067 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008068 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008069 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008070 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008071 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008072 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008073 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008074 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008075 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008076 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008077 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008078 case llvm::Triple::Win32:
8079 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008080 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008081 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008082 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008083 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008084 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008085 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008086 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008087 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008088 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008089 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008090 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008091 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008092 }
8093
8094 case llvm::Triple::armeb:
8095 case llvm::Triple::thumbeb:
8096 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008097 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008098
8099 switch (os) {
8100 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008101 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008102 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008103 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008104 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008105 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008106 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008107 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008108 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008109 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008110 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008111 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008112 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008113 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008114 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008115 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008116 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008117
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008118 case llvm::Triple::bpfeb:
8119 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008120 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008121
Daniel Dunbar52322032009-08-18 05:47:58 +00008122 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008123 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008124
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008125 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008126 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008127 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008128 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008129 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008130 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008131 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008132 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008133 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008134 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008135 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008136 return new Mips32EBTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008137 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008138
8139 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008140 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008141 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008142 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008143 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008144 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008145 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008146 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008147 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008148 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008149 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008150 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008151 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008152 return new Mips32ELTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008153 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008154
Akira Hatanakabef17452011-09-20 19:21:49 +00008155 case llvm::Triple::mips64:
8156 switch (os) {
8157 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008158 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008159 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008160 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008161 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008162 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008163 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008164 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008165 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008166 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008167 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008168 return new Mips64EBTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008169 }
8170
8171 case llvm::Triple::mips64el:
8172 switch (os) {
8173 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008174 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008175 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008176 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008177 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008178 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008179 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008180 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008181 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008182 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008183 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008184 return new Mips64ELTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008185 }
8186
Ivan Krasindd7403e2011-08-24 20:22:22 +00008187 case llvm::Triple::le32:
8188 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008189 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008190 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008191 default:
8192 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008193 }
8194
JF Bastien643817d2014-09-12 17:52:47 +00008195 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008196 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008197
Daniel Dunbar52322032009-08-18 05:47:58 +00008198 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008199 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008200 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008201 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008202 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008203 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008204 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008205 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008206 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008207 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008208 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008209 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008210 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008211 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008212 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008213 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008214 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008215
8216 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008217 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008218 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008219 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008220 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008222 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008224 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008226 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008228 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008230 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008231
Bill Schmidt778d3872013-07-26 01:36:11 +00008232 case llvm::Triple::ppc64le:
8233 switch (os) {
8234 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008236 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008238 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008240 }
8241
Peter Collingbournec947aae2012-05-20 23:28:41 +00008242 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008244 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008246
Tom Stellardd8e38a32015-01-06 20:34:47 +00008247 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008248 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008249 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008250
Daniel Dunbar52322032009-08-18 05:47:58 +00008251 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008252 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008253 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008254 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008255 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008256 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008257 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008258 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008259 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008260 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008261 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008262 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008263 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008264 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008265 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008266
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008267 // The 'sparcel' architecture copies all the above cases except for Solaris.
8268 case llvm::Triple::sparcel:
8269 switch (os) {
8270 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008272 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008274 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008275 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008276 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008277 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008278 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008279 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008280 }
8281
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008282 case llvm::Triple::sparcv9:
8283 switch (os) {
8284 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008285 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008286 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008287 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008288 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008289 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008290 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008291 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008292 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008294 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008295 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008296 }
8297
Ulrich Weigand47445072013-05-06 16:26:41 +00008298 case llvm::Triple::systemz:
8299 switch (os) {
8300 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008302 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008304 }
8305
Eli Friedmana9c3d712009-08-19 20:47:07 +00008306 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008308
Daniel Dunbar52322032009-08-18 05:47:58 +00008309 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008310 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008312
Daniel Dunbar52322032009-08-18 05:47:58 +00008313 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008314 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008315 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008316 case llvm::Triple::Linux: {
8317 switch (Triple.getEnvironment()) {
8318 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008319 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008320 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008321 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008322 }
8323 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008324 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008325 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008326 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008328 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008330 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008332 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008334 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008336 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008337 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008338 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008339 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008340 case llvm::Triple::Win32: {
8341 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008342 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008343 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008344 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008345 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008346 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008347 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008348 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008350 }
8351 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008352 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008353 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008354 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008356 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008357 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008358 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008359 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008360 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008361 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008362 }
8363
8364 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008365 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008366 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008367
Daniel Dunbar52322032009-08-18 05:47:58 +00008368 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008369 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008370 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008371 case llvm::Triple::Linux: {
8372 switch (Triple.getEnvironment()) {
8373 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008374 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008375 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008376 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008377 }
8378 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008379 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008381 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008383 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008384 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008385 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008386 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008387 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008388 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008389 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008391 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008392 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008393 case llvm::Triple::Win32: {
8394 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008395 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008396 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008397 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008398 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008399 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008400 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008401 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008402 }
8403 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008404 case llvm::Triple::Haiku:
8405 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008406 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008407 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008408 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008409 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008410 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008411 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008412 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008413
Douglas Katzman78d7c542015-05-12 21:18:10 +00008414 case llvm::Triple::spir: {
8415 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8416 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8417 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008418 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008419 }
8420 case llvm::Triple::spir64: {
8421 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8422 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8423 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008424 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008425 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008426 case llvm::Triple::wasm32:
8427 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8428 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008430 case llvm::Triple::wasm64:
8431 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8432 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008433 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008434 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008435}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008436
8437/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008438/// options.
Alp Toker80758082014-07-06 05:26:44 +00008439TargetInfo *
8440TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008441 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008442 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008443
8444 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008445 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008446 if (!Target) {
8447 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008448 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008449 }
Alp Toker80758082014-07-06 05:26:44 +00008450 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008451
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008452 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008453 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8454 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008455 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008456 }
8457
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008458 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008459 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8460 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008461 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008462 }
8463
Rafael Espindolaeb265472013-08-21 21:59:03 +00008464 // Set the fp math unit.
8465 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8466 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008467 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008468 }
8469
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008470 // Compute the default target features, we need the target to handle this
8471 // because features may have dependencies on one another.
8472 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008473 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8474 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008475 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008476
8477 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008478 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008479 for (const auto &F : Features)
8480 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8481
Eric Christopher3ff21b32013-10-16 21:26:26 +00008482 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008483 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008484
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008485 Target->setSupportedOpenCLOpts();
8486
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008487 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008488}