blob: 87203f5598ca2e443d760620374caf9d2b05f29d [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);
Manman Renccf25bb2016-06-28 20:55:30 +0000144 PlatformName = "macos";
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
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000311#ifndef FREEBSD_CC_VERSION
312#define FREEBSD_CC_VERSION 0U
313#endif
314
Torok Edwinb2b37c62009-06-30 17:10:35 +0000315// FreeBSD Target
316template<typename Target>
317class FreeBSDTargetInfo : public OSTargetInfo<Target> {
318protected:
Craig Topper3164f332014-03-11 03:39:26 +0000319 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
320 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000321 // FreeBSD defines; list based off of gcc output
322
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000323 unsigned Release = Triple.getOSMajorVersion();
324 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000325 Release = 8U;
326 unsigned CCVersion = FREEBSD_CC_VERSION;
327 if (CCVersion == 0U)
328 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000329
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000330 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000331 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000332 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
333 DefineStd(Builder, "unix", Opts);
334 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000335
336 // On FreeBSD, wchar_t contains the number of the code point as
337 // used by the character set of the locale. These character sets are
338 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000339 //
340 // FIXME: This is wrong; the macro refers to the numerical values
341 // of wchar_t *literals*, which are not locale-dependent. However,
342 // FreeBSD systems apparently depend on us getting this wrong, and
343 // setting this to 1 is conforming even if all the basic source
344 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000345 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000346 }
347public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000348 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
349 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000350 switch (Triple.getArch()) {
351 default:
352 case llvm::Triple::x86:
353 case llvm::Triple::x86_64:
354 this->MCountName = ".mcount";
355 break;
356 case llvm::Triple::mips:
357 case llvm::Triple::mipsel:
358 case llvm::Triple::ppc:
359 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000360 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000361 this->MCountName = "_mcount";
362 break;
363 case llvm::Triple::arm:
364 this->MCountName = "__mcount";
365 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000366 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000367 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368};
369
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000370// GNU/kFreeBSD Target
371template<typename Target>
372class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
373protected:
Craig Topper3164f332014-03-11 03:39:26 +0000374 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
375 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000376 // GNU/kFreeBSD defines; list based off of gcc output
377
378 DefineStd(Builder, "unix", Opts);
379 Builder.defineMacro("__FreeBSD_kernel__");
380 Builder.defineMacro("__GLIBC__");
381 Builder.defineMacro("__ELF__");
382 if (Opts.POSIXThreads)
383 Builder.defineMacro("_REENTRANT");
384 if (Opts.CPlusPlus)
385 Builder.defineMacro("_GNU_SOURCE");
386 }
387public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000388 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
389 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000390};
391
Reid Kleckner330fb172016-05-11 16:19:05 +0000392// Haiku Target
393template<typename Target>
394class HaikuTargetInfo : public OSTargetInfo<Target> {
395protected:
396 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
397 MacroBuilder &Builder) const override {
398 // Haiku defines; list based off of gcc output
399 Builder.defineMacro("__HAIKU__");
400 Builder.defineMacro("__ELF__");
401 DefineStd(Builder, "unix", Opts);
402 }
403public:
404 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
405 : OSTargetInfo<Target>(Triple, Opts) {
406 this->SizeType = TargetInfo::UnsignedLong;
407 this->IntPtrType = TargetInfo::SignedLong;
408 this->PtrDiffType = TargetInfo::SignedLong;
409 this->ProcessIDType = TargetInfo::SignedLong;
410 this->TLSSupported = false;
411
412 }
413};
414
Chris Lattner3e2ee142010-07-07 16:01:42 +0000415// Minix Target
416template<typename Target>
417class MinixTargetInfo : public OSTargetInfo<Target> {
418protected:
Craig Topper3164f332014-03-11 03:39:26 +0000419 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
420 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000421 // Minix defines
422
423 Builder.defineMacro("__minix", "3");
424 Builder.defineMacro("_EM_WSIZE", "4");
425 Builder.defineMacro("_EM_PSIZE", "4");
426 Builder.defineMacro("_EM_SSIZE", "2");
427 Builder.defineMacro("_EM_LSIZE", "4");
428 Builder.defineMacro("_EM_FSIZE", "4");
429 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000430 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000431 DefineStd(Builder, "unix", Opts);
432 }
433public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000434 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
435 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000436};
437
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438// Linux target
439template<typename Target>
440class LinuxTargetInfo : public OSTargetInfo<Target> {
441protected:
Craig Topper3164f332014-03-11 03:39:26 +0000442 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
443 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000444 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000445 DefineStd(Builder, "unix", Opts);
446 DefineStd(Builder, "linux", Opts);
447 Builder.defineMacro("__gnu_linux__");
448 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000449 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000450 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000451 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000452 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000453 this->PlatformName = "android";
454 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
455 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000456 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000457 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000458 if (Opts.CPlusPlus)
459 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000460 if (this->HasFloat128)
461 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000462 }
463public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000464 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
465 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000466 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000467
468 switch (Triple.getArch()) {
469 default:
470 break;
471 case llvm::Triple::ppc:
472 case llvm::Triple::ppc64:
473 case llvm::Triple::ppc64le:
474 this->MCountName = "_mcount";
475 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000476 case llvm::Triple::x86:
477 case llvm::Triple::x86_64:
478 case llvm::Triple::systemz:
479 this->HasFloat128 = true;
480 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000481 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000482 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000483
Craig Topper3164f332014-03-11 03:39:26 +0000484 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000485 return ".text.startup";
486 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000487};
488
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000489// NetBSD Target
490template<typename Target>
491class NetBSDTargetInfo : public OSTargetInfo<Target> {
492protected:
Craig Topper3164f332014-03-11 03:39:26 +0000493 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
494 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000495 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000496 Builder.defineMacro("__NetBSD__");
497 Builder.defineMacro("__unix__");
498 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000499 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000500 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000501
502 switch (Triple.getArch()) {
503 default:
504 break;
505 case llvm::Triple::arm:
506 case llvm::Triple::armeb:
507 case llvm::Triple::thumb:
508 case llvm::Triple::thumbeb:
509 Builder.defineMacro("__ARM_DWARF_EH__");
510 break;
511 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000512 }
513public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000514 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
515 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000516 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000518};
519
Torok Edwinb2b37c62009-06-30 17:10:35 +0000520// OpenBSD Target
521template<typename Target>
522class OpenBSDTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000526 // OpenBSD defines; list based off of gcc output
527
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000528 Builder.defineMacro("__OpenBSD__");
529 DefineStd(Builder, "unix", Opts);
530 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000531 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000532 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533 }
534public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000535 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
536 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000537 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000538
Eli Friedman3715d1f2011-12-15 02:15:56 +0000539 switch (Triple.getArch()) {
540 default:
541 case llvm::Triple::x86:
542 case llvm::Triple::x86_64:
543 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000544 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000545 this->MCountName = "__mcount";
546 break;
547 case llvm::Triple::mips64:
548 case llvm::Triple::mips64el:
549 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000550 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551 this->MCountName = "_mcount";
552 break;
553 }
554 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000555};
556
Eli Friedman9fa28852012-08-08 23:57:20 +0000557// Bitrig Target
558template<typename Target>
559class BitrigTargetInfo : public OSTargetInfo<Target> {
560protected:
Craig Topper3164f332014-03-11 03:39:26 +0000561 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
562 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000563 // Bitrig defines; list based off of gcc output
564
565 Builder.defineMacro("__Bitrig__");
566 DefineStd(Builder, "unix", Opts);
567 Builder.defineMacro("__ELF__");
568 if (Opts.POSIXThreads)
569 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000570
571 switch (Triple.getArch()) {
572 default:
573 break;
574 case llvm::Triple::arm:
575 case llvm::Triple::armeb:
576 case llvm::Triple::thumb:
577 case llvm::Triple::thumbeb:
578 Builder.defineMacro("__ARM_DWARF_EH__");
579 break;
580 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000581 }
582public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000583 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
584 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000585 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000586 }
587};
588
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000589// PSP Target
590template<typename Target>
591class PSPTargetInfo : public OSTargetInfo<Target> {
592protected:
Craig Topper3164f332014-03-11 03:39:26 +0000593 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
594 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000595 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000596 Builder.defineMacro("PSP");
597 Builder.defineMacro("_PSP");
598 Builder.defineMacro("__psp__");
599 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000600 }
601public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000602 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000603};
604
John Thompsone467e192009-11-19 17:18:50 +0000605// PS3 PPU Target
606template<typename Target>
607class PS3PPUTargetInfo : public OSTargetInfo<Target> {
608protected:
Craig Topper3164f332014-03-11 03:39:26 +0000609 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
610 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000611 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000612 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000613 Builder.defineMacro("__PPU__");
614 Builder.defineMacro("__CELLOS_LV2__");
615 Builder.defineMacro("__ELF__");
616 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000617 Builder.defineMacro("_ARCH_PPC64");
618 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000619 }
620public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000621 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
622 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000623 this->LongWidth = this->LongAlign = 32;
624 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000625 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000626 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000627 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000628 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000629 }
630};
631
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000632template <typename Target>
633class PS4OSTargetInfo : public OSTargetInfo<Target> {
634protected:
635 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
636 MacroBuilder &Builder) const override {
637 Builder.defineMacro("__FreeBSD__", "9");
638 Builder.defineMacro("__FreeBSD_cc_version", "900001");
639 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
640 DefineStd(Builder, "unix", Opts);
641 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000642 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000643 }
644public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000645 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
646 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000647 this->WCharType = this->UnsignedShort;
648
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000649 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
650 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000651
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000652 // On PS4, do not honor explicit bit field alignment,
653 // as in "__attribute__((aligned(2))) int b : 1;".
654 this->UseExplicitBitFieldAlignment = false;
655
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 switch (Triple.getArch()) {
657 default:
658 case llvm::Triple::x86_64:
659 this->MCountName = ".mcount";
660 break;
661 }
662 }
663};
664
Torok Edwinb2b37c62009-06-30 17:10:35 +0000665// Solaris target
666template<typename Target>
667class SolarisTargetInfo : public OSTargetInfo<Target> {
668protected:
Craig Topper3164f332014-03-11 03:39:26 +0000669 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
670 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000671 DefineStd(Builder, "sun", Opts);
672 DefineStd(Builder, "unix", Opts);
673 Builder.defineMacro("__ELF__");
674 Builder.defineMacro("__svr4__");
675 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000676 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
677 // newer, but to 500 for everything else. feature_test.h has a check to
678 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000679 // with a new version.
680 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000681 Builder.defineMacro("_XOPEN_SOURCE", "600");
682 else
683 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000684 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000685 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000686 Builder.defineMacro("_LARGEFILE_SOURCE");
687 Builder.defineMacro("_LARGEFILE64_SOURCE");
688 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000690 }
691public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000692 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
693 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000694 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000695 // FIXME: WIntType should be SignedLong
696 }
697};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000698
699// Windows target
700template<typename Target>
701class WindowsTargetInfo : public OSTargetInfo<Target> {
702protected:
Craig Topper3164f332014-03-11 03:39:26 +0000703 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
704 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000705 Builder.defineMacro("_WIN32");
706 }
707 void getVisualStudioDefines(const LangOptions &Opts,
708 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000709 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000710 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711 Builder.defineMacro("_CPPRTTI");
712
Reid Kleckner16514352015-01-30 21:42:55 +0000713 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000714 Builder.defineMacro("_CPPUNWIND");
715 }
716
David Majnemer6a658902015-07-22 22:36:26 +0000717 if (Opts.Bool)
718 Builder.defineMacro("__BOOL_DEFINED");
719
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000720 if (!Opts.CharIsSigned)
721 Builder.defineMacro("_CHAR_UNSIGNED");
722
723 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
724 // but it works for now.
725 if (Opts.POSIXThreads)
726 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000727
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000728 if (Opts.MSCompatibilityVersion) {
729 Builder.defineMacro("_MSC_VER",
730 Twine(Opts.MSCompatibilityVersion / 100000));
731 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000732 // FIXME We cannot encode the revision information into 32-bits
733 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000734
David Majnemerb710a932015-05-11 03:57:49 +0000735 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000736 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000737
738 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
739 if (Opts.CPlusPlus1z)
740 Builder.defineMacro("_MSVC_LANG", "201403L");
741 else if (Opts.CPlusPlus14)
742 Builder.defineMacro("_MSVC_LANG", "201402L");
743 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000744 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000745
746 if (Opts.MicrosoftExt) {
747 Builder.defineMacro("_MSC_EXTENSIONS");
748
749 if (Opts.CPlusPlus11) {
750 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
751 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
752 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
753 }
754 }
755
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000756 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000757 }
758
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000759public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000760 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
761 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000762};
763
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000764template <typename Target>
765class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000766protected:
Craig Topper3164f332014-03-11 03:39:26 +0000767 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
768 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000769 if (Opts.POSIXThreads)
770 Builder.defineMacro("_REENTRANT");
771 if (Opts.CPlusPlus)
772 Builder.defineMacro("_GNU_SOURCE");
773
774 DefineStd(Builder, "unix", Opts);
775 Builder.defineMacro("__ELF__");
776 Builder.defineMacro("__native_client__");
777 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000778
779public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000780 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
781 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 this->LongAlign = 32;
783 this->LongWidth = 32;
784 this->PointerAlign = 32;
785 this->PointerWidth = 32;
786 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000787 this->Int64Type = TargetInfo::SignedLongLong;
788 this->DoubleAlign = 64;
789 this->LongDoubleWidth = 64;
790 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000791 this->LongLongWidth = 64;
792 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000793 this->SizeType = TargetInfo::UnsignedInt;
794 this->PtrDiffType = TargetInfo::SignedInt;
795 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000796 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000797 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000798 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000799 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000800 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000801 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000802 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000803 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000804 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000805 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000806 } else {
807 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000808 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000809 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 }
811};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000812
Dan Gohmanc2853072015-09-03 22:51:53 +0000813// WebAssembly target
814template <typename Target>
815class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
816 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000817 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000818 // A common platform macro.
819 if (Opts.POSIXThreads)
820 Builder.defineMacro("_REENTRANT");
821 // Follow g++ convention and predefine _GNU_SOURCE for C++.
822 if (Opts.CPlusPlus)
823 Builder.defineMacro("_GNU_SOURCE");
824 }
825
826 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000827 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000828 return ".text.__startup";
829 }
830
831public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000832 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
833 const TargetOptions &Opts)
834 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000835 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000836 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
837 }
838};
Dan Gohmanc2853072015-09-03 22:51:53 +0000839
Chris Lattner09d98f52008-10-05 21:50:58 +0000840//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000841// Specific target implementations.
842//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000843
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000844// PPC abstract base class
845class PPCTargetInfo : public TargetInfo {
846 static const Builtin::Info BuiltinInfo[];
847 static const char * const GCCRegNames[];
848 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000849 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000850
851 // Target cpu features.
852 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000853 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000854 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000855 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000856 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000857 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000858 bool HasBPERMD;
859 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000860
Ulrich Weigand8afad612014-07-28 13:17:52 +0000861protected:
862 std::string ABI;
863
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000864public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000865 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000866 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
867 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000868 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000869 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000870 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000871 LongDoubleWidth = LongDoubleAlign = 128;
872 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
873 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000874
Hal Finkel6b984f02012-07-03 16:51:04 +0000875 /// \brief Flags for architecture specific defines.
876 typedef enum {
877 ArchDefineNone = 0,
878 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
879 ArchDefinePpcgr = 1 << 1,
880 ArchDefinePpcsq = 1 << 2,
881 ArchDefine440 = 1 << 3,
882 ArchDefine603 = 1 << 4,
883 ArchDefine604 = 1 << 5,
884 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000885 ArchDefinePwr5 = 1 << 7,
886 ArchDefinePwr5x = 1 << 8,
887 ArchDefinePwr6 = 1 << 9,
888 ArchDefinePwr6x = 1 << 10,
889 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000890 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000891 ArchDefinePwr9 = 1 << 13,
892 ArchDefineA2 = 1 << 14,
893 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000894 } ArchDefineTypes;
895
Bill Schmidt38378a02013-02-01 20:23:10 +0000896 // Note: GCC recognizes the following additional cpus:
897 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
898 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
899 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000900 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000901 bool CPUKnown = llvm::StringSwitch<bool>(Name)
902 .Case("generic", true)
903 .Case("440", true)
904 .Case("450", true)
905 .Case("601", true)
906 .Case("602", true)
907 .Case("603", true)
908 .Case("603e", true)
909 .Case("603ev", true)
910 .Case("604", true)
911 .Case("604e", true)
912 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000913 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000914 .Case("g3", true)
915 .Case("7400", true)
916 .Case("g4", true)
917 .Case("7450", true)
918 .Case("g4+", true)
919 .Case("750", true)
920 .Case("970", true)
921 .Case("g5", true)
922 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000923 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000924 .Case("e500mc", true)
925 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 .Case("power3", true)
927 .Case("pwr3", true)
928 .Case("power4", true)
929 .Case("pwr4", true)
930 .Case("power5", true)
931 .Case("pwr5", true)
932 .Case("power5x", true)
933 .Case("pwr5x", true)
934 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000935 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000936 .Case("power6x", true)
937 .Case("pwr6x", true)
938 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000939 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000940 .Case("power8", true)
941 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000942 .Case("power9", true)
943 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000944 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000945 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000946 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000947 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000948 .Case("powerpc64le", true)
949 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000950 .Default(false);
951
952 if (CPUKnown)
953 CPU = Name;
954
955 return CPUKnown;
956 }
957
Ulrich Weigand8afad612014-07-28 13:17:52 +0000958
959 StringRef getABI() const override { return ABI; }
960
Craig Topper6c03a542015-10-19 04:51:35 +0000961 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
962 return llvm::makeArrayRef(BuiltinInfo,
963 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000964 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000965
Craig Topper3164f332014-03-11 03:39:26 +0000966 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000967
Craig Topper3164f332014-03-11 03:39:26 +0000968 void getTargetDefines(const LangOptions &Opts,
969 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000970
Eric Christopher8c47b422015-10-09 18:39:55 +0000971 bool
972 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
973 StringRef CPU,
974 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000975
Craig Topper3164f332014-03-11 03:39:26 +0000976 bool handleTargetFeatures(std::vector<std::string> &Features,
977 DiagnosticsEngine &Diags) override;
978 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000979 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
980 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000981
Craig Topperf054e3a2015-10-19 03:52:27 +0000982 ArrayRef<const char *> getGCCRegNames() const override;
983 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000984 bool validateAsmConstraint(const char *&Name,
985 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000986 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000987 default: return false;
988 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000989 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000990 case 'b': // Base register
991 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000992 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000993 break;
994 // FIXME: The following are added to allow parsing.
995 // I just took a guess at what the actions should be.
996 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000997 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000998 case 'v': // Altivec vector register
999 Info.setAllowsRegister();
1000 break;
1001 case 'w':
1002 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001003 case 'd':// VSX vector register to hold vector double data
1004 case 'f':// VSX vector register to hold vector float data
1005 case 's':// VSX vector register to hold scalar float data
1006 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001007 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001008 break;
1009 default:
1010 return false;
1011 }
1012 Info.setAllowsRegister();
1013 Name++; // Skip over 'w'.
1014 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001015 case 'h': // `MQ', `CTR', or `LINK' register
1016 case 'q': // `MQ' register
1017 case 'c': // `CTR' register
1018 case 'l': // `LINK' register
1019 case 'x': // `CR' register (condition register) number 0
1020 case 'y': // `CR' register (condition register)
1021 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001022 Info.setAllowsRegister();
1023 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001024 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001025 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001026 // (use `L' instead for SImode constants)
1027 case 'K': // Unsigned 16-bit constant
1028 case 'L': // Signed 16-bit constant shifted left 16 bits
1029 case 'M': // Constant larger than 31
1030 case 'N': // Exact power of 2
1031 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001032 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001033 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001034 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001035 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001036 break;
1037 case 'm': // Memory operand. Note that on PowerPC targets, m can
1038 // include addresses that update the base register. It
1039 // is therefore only safe to use `m' in an asm statement
1040 // if that asm statement accesses the operand exactly once.
1041 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001042 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001043 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001044 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001045 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001046 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1047 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001048 // register to be updated.
1049 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001050 if (Name[1] != 's')
1051 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001052 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001053 // include any automodification of the base register. Unlike
1054 // `m', this constraint can be used in asm statements that
1055 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001056 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001057 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001058 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001059 break;
1060 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'Z': // Memory operand that is an indexed or indirect from a
1063 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001064 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001065 Info.setAllowsMemory();
1066 Info.setAllowsRegister();
1067 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001068 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001069 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070 // register (`p' is preferable for asm statements)
1071 case 'S': // Constant suitable as a 64-bit mask operand
1072 case 'T': // Constant suitable as a 32-bit mask operand
1073 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001074 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001075 // instructions
1076 case 'W': // Vector constant that does not require memory
1077 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001078 break;
1079 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001080 }
John Thompson07a61a42010-06-24 22:44:13 +00001081 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001082 }
Craig Topper3164f332014-03-11 03:39:26 +00001083 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001084 std::string R;
1085 switch (*Constraint) {
1086 case 'e':
1087 case 'w':
1088 // Two-character constraint; add "^" hint for later parsing.
1089 R = std::string("^") + std::string(Constraint, 2);
1090 Constraint++;
1091 break;
1092 default:
1093 return TargetInfo::convertConstraint(Constraint);
1094 }
1095 return R;
1096 }
Craig Topper3164f332014-03-11 03:39:26 +00001097 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001098 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001099 }
Craig Topper3164f332014-03-11 03:39:26 +00001100 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001101 if (RegNo == 0) return 3;
1102 if (RegNo == 1) return 4;
1103 return -1;
1104 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001105
1106 bool hasSjLjLowering() const override {
1107 return true;
1108 }
David Majnemer2617ea62015-06-09 18:05:33 +00001109
1110 bool useFloat128ManglingForLongDouble() const override {
1111 return LongDoubleWidth == 128 &&
1112 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1113 getTriple().isOSBinFormatELF();
1114 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001115};
Anders Carlssonf511f642007-11-27 04:11:28 +00001116
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001117const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001118#define BUILTIN(ID, TYPE, ATTRS) \
1119 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1120#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1121 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001122#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001123};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001124
Eric Christopher917e9522014-11-18 22:36:15 +00001125/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001126/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001127bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001128 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001129 for (const auto &Feature : Features) {
1130 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001131 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001132 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001133 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001134 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001135 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001136 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001137 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001138 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001139 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001140 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001141 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001142 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001143 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001144 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001145 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001146 } else if (Feature == "+float128") {
1147 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001148 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001149 // TODO: Finish this list and add an assert that we've handled them
1150 // all.
1151 }
Eric Christopher02c33352015-08-25 00:59:11 +00001152
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001153 return true;
1154}
1155
Chris Lattnerecd49032009-03-02 22:27:17 +00001156/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1157/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001158void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001159 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001160 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001161 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001162 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001163 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001164 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001165 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001166 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001167 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001168 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001169 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001170 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001171 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001172
Chris Lattnerecd49032009-03-02 22:27:17 +00001173 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001174 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1175 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001176 } else {
1177 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1178 getTriple().getOS() != llvm::Triple::OpenBSD)
1179 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001180 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001181
Ulrich Weigand8afad612014-07-28 13:17:52 +00001182 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001183 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001184 Builder.defineMacro("_CALL_ELF", "1");
1185 if (ABI == "elfv2")
1186 Builder.defineMacro("_CALL_ELF", "2");
1187
Chris Lattnerecd49032009-03-02 22:27:17 +00001188 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001189 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1190 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001191
Chris Lattnerecd49032009-03-02 22:27:17 +00001192 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001193 if (LongDoubleWidth == 128)
1194 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001195
John Thompsone467e192009-11-19 17:18:50 +00001196 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001197 Builder.defineMacro("__VEC__", "10206");
1198 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001199 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001200
1201 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001202 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1203 .Case("440", ArchDefineName)
1204 .Case("450", ArchDefineName | ArchDefine440)
1205 .Case("601", ArchDefineName)
1206 .Case("602", ArchDefineName | ArchDefinePpcgr)
1207 .Case("603", ArchDefineName | ArchDefinePpcgr)
1208 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1209 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1210 .Case("604", ArchDefineName | ArchDefinePpcgr)
1211 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1212 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001213 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001214 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1215 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1216 .Case("750", ArchDefineName | ArchDefinePpcgr)
1217 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1218 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001219 .Case("a2", ArchDefineA2)
1220 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001221 .Case("pwr3", ArchDefinePpcgr)
1222 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1223 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1224 | ArchDefinePpcsq)
1225 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1226 | ArchDefinePpcgr | ArchDefinePpcsq)
1227 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1228 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1229 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1230 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1231 | ArchDefinePpcsq)
1232 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1233 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001234 | ArchDefinePpcgr | ArchDefinePpcsq)
1235 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1236 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1237 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001238 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1239 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1240 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1241 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001242 .Case("power3", ArchDefinePpcgr)
1243 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1244 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1245 | ArchDefinePpcsq)
1246 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1247 | ArchDefinePpcgr | ArchDefinePpcsq)
1248 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1249 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1250 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1251 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1252 | ArchDefinePpcsq)
1253 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1254 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001255 | ArchDefinePpcgr | ArchDefinePpcsq)
1256 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1257 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1258 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001259 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1260 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1261 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1262 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001263 .Default(ArchDefineNone);
1264
1265 if (defs & ArchDefineName)
1266 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1267 if (defs & ArchDefinePpcgr)
1268 Builder.defineMacro("_ARCH_PPCGR");
1269 if (defs & ArchDefinePpcsq)
1270 Builder.defineMacro("_ARCH_PPCSQ");
1271 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001272 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001273 if (defs & ArchDefine603)
1274 Builder.defineMacro("_ARCH_603");
1275 if (defs & ArchDefine604)
1276 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001277 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001278 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001279 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001280 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001281 if (defs & ArchDefinePwr5x)
1282 Builder.defineMacro("_ARCH_PWR5X");
1283 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001284 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001285 if (defs & ArchDefinePwr6x)
1286 Builder.defineMacro("_ARCH_PWR6X");
1287 if (defs & ArchDefinePwr7)
1288 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001289 if (defs & ArchDefinePwr8)
1290 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001291 if (defs & ArchDefinePwr9)
1292 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001293 if (defs & ArchDefineA2)
1294 Builder.defineMacro("_ARCH_A2");
1295 if (defs & ArchDefineA2q) {
1296 Builder.defineMacro("_ARCH_A2Q");
1297 Builder.defineMacro("_ARCH_QP");
1298 }
1299
1300 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1301 Builder.defineMacro("__bg__");
1302 Builder.defineMacro("__THW_BLUEGENE__");
1303 Builder.defineMacro("__bgq__");
1304 Builder.defineMacro("__TOS_BGQ__");
1305 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001306
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001307 if (HasVSX)
1308 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001309 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001310 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001311 if (HasP8Crypto)
1312 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001313 if (HasHTM)
1314 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001315 if (HasFloat128)
1316 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001317
1318 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1319 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1320 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1321 if (PointerWidth == 64)
1322 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001323
Bill Schmidt38378a02013-02-01 20:23:10 +00001324 // FIXME: The following are not yet generated here by Clang, but are
1325 // generated by GCC:
1326 //
1327 // _SOFT_FLOAT_
1328 // __RECIP_PRECISION__
1329 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001330 // __RECIP__
1331 // __RECIPF__
1332 // __RSQRTE__
1333 // __RSQRTEF__
1334 // _SOFT_DOUBLE_
1335 // __NO_LWSYNC__
1336 // __HAVE_BSWAP__
1337 // __LONGDOUBLE128
1338 // __CMODEL_MEDIUM__
1339 // __CMODEL_LARGE__
1340 // _CALL_SYSV
1341 // _CALL_DARWIN
1342 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001343}
1344
Eric Christophera8a14c32015-08-31 18:39:16 +00001345// Handle explicit options being passed to the compiler here: if we've
1346// explicitly turned off vsx and turned on power8-vector or direct-move then
1347// go ahead and error since the customer has expressed a somewhat incompatible
1348// set of options.
1349static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001350 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001351
1352 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1353 FeaturesVec.end()) {
1354 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1355 FeaturesVec.end()) {
1356 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1357 << "-mno-vsx";
1358 return false;
1359 }
1360
1361 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1362 FeaturesVec.end()) {
1363 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1364 << "-mno-vsx";
1365 return false;
1366 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001367
1368 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1369 FeaturesVec.end()) {
1370 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1371 << "-mno-vsx";
1372 return false;
1373 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001374 }
1375
1376 return true;
1377}
1378
Eric Christopher8c47b422015-10-09 18:39:55 +00001379bool PPCTargetInfo::initFeatureMap(
1380 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1381 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001382 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1383 .Case("7400", true)
1384 .Case("g4", true)
1385 .Case("7450", true)
1386 .Case("g4+", true)
1387 .Case("970", true)
1388 .Case("g5", true)
1389 .Case("pwr6", true)
1390 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001391 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001392 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001393 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001394 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001395 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001396
1397 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001398 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1399 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001400 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001401 .Case("pwr8", true)
1402 .Default(false);
1403 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1404 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001405 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001406 .Case("pwr8", true)
1407 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001408 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1409 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001410 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001411 .Case("pwr8", true)
1412 .Case("pwr7", true)
1413 .Default(false);
1414 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1415 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001416 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001417 .Case("pwr8", true)
1418 .Case("pwr7", true)
1419 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001420 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1421 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001422 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001423 .Case("pwr8", true)
1424 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001425 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1426 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001427 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001428 .Case("pwr8", true)
1429 .Case("pwr7", true)
1430 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001431
Eric Christophera8a14c32015-08-31 18:39:16 +00001432 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1433 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001434
Eric Christopher007b0a02015-08-28 22:32:01 +00001435 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001436}
1437
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001438bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001439 return llvm::StringSwitch<bool>(Feature)
1440 .Case("powerpc", true)
1441 .Case("vsx", HasVSX)
1442 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001443 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001444 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001445 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001446 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001447 .Case("bpermd", HasBPERMD)
1448 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001449 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001450 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001451}
Chris Lattner17df24e2008-04-21 18:56:49 +00001452
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001453void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1454 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001455 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1456 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1457 // incompatible options.
1458 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001459 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001460 Features[Name] = Features["vsx"] = true;
1461 } else if (Name == "power8-vector") {
1462 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001463 } else if (Name == "float128") {
1464 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001465 } else {
1466 Features[Name] = true;
1467 }
1468 } else {
1469 if (Name == "vsx") {
1470 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001471 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001472 } else {
1473 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001474 }
1475 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001476}
1477
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001478const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001479 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1480 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1481 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1482 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1483 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1484 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1485 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1486 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001487 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001488 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001489 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001490 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1491 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1492 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1493 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001494 "vrsave", "vscr",
1495 "spe_acc", "spefscr",
1496 "sfp"
1497};
Chris Lattner10a5b382007-01-29 05:24:35 +00001498
Craig Topperf054e3a2015-10-19 03:52:27 +00001499ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1500 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001501}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001502
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001503const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1504 // While some of these aliases do map to different registers
1505 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001506 { { "0" }, "r0" },
1507 { { "1"}, "r1" },
1508 { { "2" }, "r2" },
1509 { { "3" }, "r3" },
1510 { { "4" }, "r4" },
1511 { { "5" }, "r5" },
1512 { { "6" }, "r6" },
1513 { { "7" }, "r7" },
1514 { { "8" }, "r8" },
1515 { { "9" }, "r9" },
1516 { { "10" }, "r10" },
1517 { { "11" }, "r11" },
1518 { { "12" }, "r12" },
1519 { { "13" }, "r13" },
1520 { { "14" }, "r14" },
1521 { { "15" }, "r15" },
1522 { { "16" }, "r16" },
1523 { { "17" }, "r17" },
1524 { { "18" }, "r18" },
1525 { { "19" }, "r19" },
1526 { { "20" }, "r20" },
1527 { { "21" }, "r21" },
1528 { { "22" }, "r22" },
1529 { { "23" }, "r23" },
1530 { { "24" }, "r24" },
1531 { { "25" }, "r25" },
1532 { { "26" }, "r26" },
1533 { { "27" }, "r27" },
1534 { { "28" }, "r28" },
1535 { { "29" }, "r29" },
1536 { { "30" }, "r30" },
1537 { { "31" }, "r31" },
1538 { { "fr0" }, "f0" },
1539 { { "fr1" }, "f1" },
1540 { { "fr2" }, "f2" },
1541 { { "fr3" }, "f3" },
1542 { { "fr4" }, "f4" },
1543 { { "fr5" }, "f5" },
1544 { { "fr6" }, "f6" },
1545 { { "fr7" }, "f7" },
1546 { { "fr8" }, "f8" },
1547 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001548 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001549 { { "fr11" }, "f11" },
1550 { { "fr12" }, "f12" },
1551 { { "fr13" }, "f13" },
1552 { { "fr14" }, "f14" },
1553 { { "fr15" }, "f15" },
1554 { { "fr16" }, "f16" },
1555 { { "fr17" }, "f17" },
1556 { { "fr18" }, "f18" },
1557 { { "fr19" }, "f19" },
1558 { { "fr20" }, "f20" },
1559 { { "fr21" }, "f21" },
1560 { { "fr22" }, "f22" },
1561 { { "fr23" }, "f23" },
1562 { { "fr24" }, "f24" },
1563 { { "fr25" }, "f25" },
1564 { { "fr26" }, "f26" },
1565 { { "fr27" }, "f27" },
1566 { { "fr28" }, "f28" },
1567 { { "fr29" }, "f29" },
1568 { { "fr30" }, "f30" },
1569 { { "fr31" }, "f31" },
1570 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001571};
1572
Craig Topperf054e3a2015-10-19 03:52:27 +00001573ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1574 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001575}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001576
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001577class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001578public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001579 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1580 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001581 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001582
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001583 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001584 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001585 case llvm::Triple::FreeBSD:
1586 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001587 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001588 PtrDiffType = SignedInt;
1589 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001590 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001591 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001592 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001593 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001594
Roman Divacky3ffe7462012-03-13 19:20:17 +00001595 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1596 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001597 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001598 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001599
1600 // PPC32 supports atomics up to 4 bytes.
1601 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001602 }
1603
Craig Topper3164f332014-03-11 03:39:26 +00001604 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001605 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001606 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001607 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001608};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001609
Bill Schmidt778d3872013-07-26 01:36:11 +00001610// Note: ABI differences may eventually require us to have a separate
1611// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001612class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001614 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1615 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001616 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001617 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001618 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001619
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001620 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001621 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001622 ABI = "elfv2";
1623 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001624 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001625 ABI = "elfv1";
1626 }
1627
1628 switch (getTriple().getOS()) {
1629 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001630 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001631 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001632 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001633 case llvm::Triple::NetBSD:
1634 IntMaxType = SignedLongLong;
1635 Int64Type = SignedLongLong;
1636 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001637 default:
1638 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001639 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001640
1641 // PPC64 supports atomics up to 8 bytes.
1642 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001643 }
Craig Topper3164f332014-03-11 03:39:26 +00001644 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001645 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001646 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001647 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001648 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001649 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001650 ABI = Name;
1651 return true;
1652 }
1653 return false;
1654 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001655};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001656
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001657class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001658public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001659 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1660 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001661 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001662 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001663 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001664 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001665 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001666 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001667 }
Craig Topper3164f332014-03-11 03:39:26 +00001668 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001669 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001670 }
1671};
1672
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001673class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001674public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001675 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1676 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001677 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001678 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001679 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001680 }
1681};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001682
Eric Christopherc48497a2015-09-18 21:26:24 +00001683static const unsigned NVPTXAddrSpaceMap[] = {
1684 1, // opencl_global
1685 3, // opencl_local
1686 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001687 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001688 0, // opencl_generic
1689 1, // cuda_device
1690 4, // cuda_constant
1691 3, // cuda_shared
1692};
1693
1694class NVPTXTargetInfo : public TargetInfo {
1695 static const char *const GCCRegNames[];
1696 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001697
1698 // The GPU profiles supported by the NVPTX backend
1699 enum GPUKind {
1700 GK_NONE,
1701 GK_SM20,
1702 GK_SM21,
1703 GK_SM30,
1704 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001705 GK_SM37,
Artem Belevichffa5fc52016-05-19 17:47:47 +00001706 GK_SM50,
1707 GK_SM52,
1708 GK_SM53,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001709 } GPU;
1710
Eric Christopherc48497a2015-09-18 21:26:24 +00001711public:
Justin Lebar76945b22016-04-29 23:05:19 +00001712 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001714 BigEndian = false;
1715 TLSSupported = false;
1716 LongWidth = LongAlign = 64;
1717 AddrSpaceMap = &NVPTXAddrSpaceMap;
1718 UseAddrSpaceMapMangling = true;
1719 // Define available target features
1720 // These must be defined in sorted order!
1721 NoAsmVariants = true;
1722 // Set the default GPU to sm20
1723 GPU = GK_SM20;
Justin Lebar76945b22016-04-29 23:05:19 +00001724
1725 // If possible, get a TargetInfo for our host triple, so we can match its
1726 // types.
1727 llvm::Triple HostTriple(Opts.HostTriple);
1728 if (HostTriple.isNVPTX())
1729 return;
1730 std::unique_ptr<TargetInfo> HostTarget(
1731 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1732 if (!HostTarget) {
1733 return;
1734 }
1735
1736 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1737 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1738 BoolWidth = HostTarget->getBoolWidth();
1739 BoolAlign = HostTarget->getBoolAlign();
1740 IntWidth = HostTarget->getIntWidth();
1741 IntAlign = HostTarget->getIntAlign();
1742 HalfWidth = HostTarget->getHalfWidth();
1743 HalfAlign = HostTarget->getHalfAlign();
1744 FloatWidth = HostTarget->getFloatWidth();
1745 FloatAlign = HostTarget->getFloatAlign();
1746 DoubleWidth = HostTarget->getDoubleWidth();
1747 DoubleAlign = HostTarget->getDoubleAlign();
1748 LongWidth = HostTarget->getLongWidth();
1749 LongAlign = HostTarget->getLongAlign();
1750 LongLongWidth = HostTarget->getLongLongWidth();
1751 LongLongAlign = HostTarget->getLongLongAlign();
1752 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1753 DefaultAlignForAttributeAligned =
1754 HostTarget->getDefaultAlignForAttributeAligned();
1755 SizeType = HostTarget->getSizeType();
1756 IntMaxType = HostTarget->getIntMaxType();
1757 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1758 IntPtrType = HostTarget->getIntPtrType();
1759 WCharType = HostTarget->getWCharType();
1760 WIntType = HostTarget->getWIntType();
1761 Char16Type = HostTarget->getChar16Type();
1762 Char32Type = HostTarget->getChar32Type();
1763 Int64Type = HostTarget->getInt64Type();
1764 SigAtomicType = HostTarget->getSigAtomicType();
1765 ProcessIDType = HostTarget->getProcessIDType();
1766
1767 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1768 UseZeroLengthBitfieldAlignment =
1769 HostTarget->useZeroLengthBitfieldAlignment();
1770 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1771 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1772
1773 // Properties intentionally not copied from host:
1774 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1775 // host/device boundary.
1776 // - SuitableAlign: Not visible across the host/device boundary, and may
1777 // correctly be different on host/device, e.g. if host has wider vector
1778 // types than device.
1779 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1780 // as its double type, but that's not necessarily true on the host.
1781 // TODO: nvcc emits a warning when using long double on device; we should
1782 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001783 }
1784 void getTargetDefines(const LangOptions &Opts,
1785 MacroBuilder &Builder) const override {
1786 Builder.defineMacro("__PTX__");
1787 Builder.defineMacro("__NVPTX__");
1788 if (Opts.CUDAIsDevice) {
1789 // Set __CUDA_ARCH__ for the GPU specified.
1790 std::string CUDAArchCode;
1791 switch (GPU) {
1792 case GK_SM20:
1793 CUDAArchCode = "200";
1794 break;
1795 case GK_SM21:
1796 CUDAArchCode = "210";
1797 break;
1798 case GK_SM30:
1799 CUDAArchCode = "300";
1800 break;
1801 case GK_SM35:
1802 CUDAArchCode = "350";
1803 break;
1804 case GK_SM37:
1805 CUDAArchCode = "370";
1806 break;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001807 case GK_SM50:
1808 CUDAArchCode = "500";
1809 break;
1810 case GK_SM52:
1811 CUDAArchCode = "520";
1812 break;
1813 case GK_SM53:
1814 CUDAArchCode = "530";
1815 break;
Eric Christopherc48497a2015-09-18 21:26:24 +00001816 default:
1817 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001818 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001819 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001820 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001821 }
Craig Topper6c03a542015-10-19 04:51:35 +00001822 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1823 return llvm::makeArrayRef(BuiltinInfo,
1824 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001825 }
1826 bool hasFeature(StringRef Feature) const override {
1827 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001828 }
1829
Craig Topperf054e3a2015-10-19 03:52:27 +00001830 ArrayRef<const char *> getGCCRegNames() const override;
1831 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001832 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001833 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001834 }
1835 bool validateAsmConstraint(const char *&Name,
1836 TargetInfo::ConstraintInfo &Info) const override {
1837 switch (*Name) {
1838 default:
1839 return false;
1840 case 'c':
1841 case 'h':
1842 case 'r':
1843 case 'l':
1844 case 'f':
1845 case 'd':
1846 Info.setAllowsRegister();
1847 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001848 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001849 }
1850 const char *getClobbers() const override {
1851 // FIXME: Is this really right?
1852 return "";
1853 }
1854 BuiltinVaListKind getBuiltinVaListKind() const override {
1855 // FIXME: implement
1856 return TargetInfo::CharPtrBuiltinVaList;
1857 }
1858 bool setCPU(const std::string &Name) override {
1859 GPU = llvm::StringSwitch<GPUKind>(Name)
1860 .Case("sm_20", GK_SM20)
1861 .Case("sm_21", GK_SM21)
1862 .Case("sm_30", GK_SM30)
1863 .Case("sm_35", GK_SM35)
1864 .Case("sm_37", GK_SM37)
Artem Belevichffa5fc52016-05-19 17:47:47 +00001865 .Case("sm_50", GK_SM50)
1866 .Case("sm_52", GK_SM52)
1867 .Case("sm_53", GK_SM53)
Eric Christopherc48497a2015-09-18 21:26:24 +00001868 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001869
Eric Christopherc48497a2015-09-18 21:26:24 +00001870 return GPU != GK_NONE;
1871 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001872 void setSupportedOpenCLOpts() override {
1873 auto &Opts = getSupportedOpenCLOpts();
1874 Opts.cl_clang_storage_class_specifiers = 1;
1875 Opts.cl_khr_gl_sharing = 1;
1876 Opts.cl_khr_icd = 1;
1877
1878 Opts.cl_khr_fp64 = 1;
1879 Opts.cl_khr_byte_addressable_store = 1;
1880 Opts.cl_khr_global_int32_base_atomics = 1;
1881 Opts.cl_khr_global_int32_extended_atomics = 1;
1882 Opts.cl_khr_local_int32_base_atomics = 1;
1883 Opts.cl_khr_local_int32_extended_atomics = 1;
1884 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001885};
1886
1887const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1888#define BUILTIN(ID, TYPE, ATTRS) \
1889 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1890#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1891 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1892#include "clang/Basic/BuiltinsNVPTX.def"
1893};
1894
1895const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1896
Craig Topperf054e3a2015-10-19 03:52:27 +00001897ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1898 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001899}
1900
1901class NVPTX32TargetInfo : public NVPTXTargetInfo {
1902public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001903 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1904 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001905 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001906 PointerWidth = PointerAlign = 32;
1907 SizeType = TargetInfo::UnsignedInt;
1908 PtrDiffType = TargetInfo::SignedInt;
1909 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001910 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001911 }
1912};
1913
1914class NVPTX64TargetInfo : public NVPTXTargetInfo {
1915public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001916 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1917 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001918 PointerWidth = PointerAlign = 64;
1919 SizeType = TargetInfo::UnsignedLong;
1920 PtrDiffType = TargetInfo::SignedLong;
1921 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001922 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001923 }
1924};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001925
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001926static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001927 1, // opencl_global
1928 3, // opencl_local
1929 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001930 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001931 1, // cuda_device
1932 2, // cuda_constant
1933 3 // cuda_shared
1934};
1935
Tom Stellarda96344b2014-08-21 13:58:40 +00001936// If you edit the description strings, make sure you update
1937// getPointerWidthV().
1938
Craig Topper273dbc62015-10-18 05:29:26 +00001939static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001940 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1941 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001942
Craig Topper273dbc62015-10-18 05:29:26 +00001943static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001944 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001945 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1946 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001947
Matt Arsenault250024f2016-06-08 01:56:42 +00001948class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001949 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001950 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001951
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001952 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001953 enum GPUKind {
1954 GK_NONE,
1955 GK_R600,
1956 GK_R600_DOUBLE_OPS,
1957 GK_R700,
1958 GK_R700_DOUBLE_OPS,
1959 GK_EVERGREEN,
1960 GK_EVERGREEN_DOUBLE_OPS,
1961 GK_NORTHERN_ISLANDS,
1962 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001963 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001964 GK_SEA_ISLANDS,
1965 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001966 } GPU;
1967
Jan Veselyeebeaea2015-05-04 19:53:36 +00001968 bool hasFP64:1;
1969 bool hasFMAF:1;
1970 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001971
Matt Arsenault250024f2016-06-08 01:56:42 +00001972 static bool isAMDGCN(const llvm::Triple &TT) {
1973 return TT.getArch() == llvm::Triple::amdgcn;
1974 }
1975
Eli Friedmand13b41e2012-10-12 23:32:00 +00001976public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001977 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Matt Arsenault250024f2016-06-08 01:56:42 +00001978 : TargetInfo(Triple) ,
1979 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1980 hasFP64(false),
1981 hasFMAF(false),
1982 hasLDEXPF(false) {
1983 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001984 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001985 hasFMAF = true;
1986 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001987 }
Matt Arsenault250024f2016-06-08 01:56:42 +00001988
1989 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1990 DataLayoutStringSI : DataLayoutStringR600);
1991
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001992 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001993 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001994 }
1995
Tom Stellarda96344b2014-08-21 13:58:40 +00001996 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1997 if (GPU <= GK_CAYMAN)
1998 return 32;
1999
2000 switch(AddrSpace) {
2001 default:
2002 return 64;
2003 case 0:
2004 case 3:
2005 case 5:
2006 return 32;
2007 }
2008 }
2009
Craig Topper3164f332014-03-11 03:39:26 +00002010 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002011 return "";
2012 }
2013
Craig Topperf054e3a2015-10-19 03:52:27 +00002014 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002015
Craig Topperf054e3a2015-10-19 03:52:27 +00002016 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2017 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002018 }
2019
Craig Topper3164f332014-03-11 03:39:26 +00002020 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002021 TargetInfo::ConstraintInfo &Info) const override {
2022 switch (*Name) {
2023 default: break;
2024 case 'v': // vgpr
2025 case 's': // sgpr
2026 Info.setAllowsRegister();
2027 return true;
2028 }
2029 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002030 }
2031
Matt Arsenault250024f2016-06-08 01:56:42 +00002032 bool initFeatureMap(llvm::StringMap<bool> &Features,
2033 DiagnosticsEngine &Diags, StringRef CPU,
2034 const std::vector<std::string> &FeatureVec) const override;
2035
Craig Topper6c03a542015-10-19 04:51:35 +00002036 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2037 return llvm::makeArrayRef(BuiltinInfo,
2038 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002039 }
2040
Craig Topper3164f332014-03-11 03:39:26 +00002041 void getTargetDefines(const LangOptions &Opts,
2042 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002043 if (getTriple().getArch() == llvm::Triple::amdgcn)
2044 Builder.defineMacro("__AMDGCN__");
2045 else
2046 Builder.defineMacro("__R600__");
2047
Jan Veselyeebeaea2015-05-04 19:53:36 +00002048 if (hasFMAF)
2049 Builder.defineMacro("__HAS_FMAF__");
2050 if (hasLDEXPF)
2051 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002052 if (hasFP64)
2053 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002054 }
2055
Craig Topper3164f332014-03-11 03:39:26 +00002056 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002057 return TargetInfo::CharPtrBuiltinVaList;
2058 }
2059
Matt Arsenault250024f2016-06-08 01:56:42 +00002060 static GPUKind parseR600Name(StringRef Name) {
2061 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002062 .Case("r600" , GK_R600)
2063 .Case("rv610", GK_R600)
2064 .Case("rv620", GK_R600)
2065 .Case("rv630", GK_R600)
2066 .Case("rv635", GK_R600)
2067 .Case("rs780", GK_R600)
2068 .Case("rs880", GK_R600)
2069 .Case("rv670", GK_R600_DOUBLE_OPS)
2070 .Case("rv710", GK_R700)
2071 .Case("rv730", GK_R700)
2072 .Case("rv740", GK_R700_DOUBLE_OPS)
2073 .Case("rv770", GK_R700_DOUBLE_OPS)
2074 .Case("palm", GK_EVERGREEN)
2075 .Case("cedar", GK_EVERGREEN)
2076 .Case("sumo", GK_EVERGREEN)
2077 .Case("sumo2", GK_EVERGREEN)
2078 .Case("redwood", GK_EVERGREEN)
2079 .Case("juniper", GK_EVERGREEN)
2080 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2081 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2082 .Case("barts", GK_NORTHERN_ISLANDS)
2083 .Case("turks", GK_NORTHERN_ISLANDS)
2084 .Case("caicos", GK_NORTHERN_ISLANDS)
2085 .Case("cayman", GK_CAYMAN)
2086 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002087 .Default(GK_NONE);
2088 }
2089
2090 static GPUKind parseAMDGCNName(StringRef Name) {
2091 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellard785699322013-04-01 20:56:49 +00002092 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002093 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2094 .Case("verde", GK_SOUTHERN_ISLANDS)
2095 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002096 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002097 .Case("bonaire", GK_SEA_ISLANDS)
2098 .Case("kabini", GK_SEA_ISLANDS)
2099 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002100 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002101 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002102 .Case("tonga", GK_VOLCANIC_ISLANDS)
2103 .Case("iceland", GK_VOLCANIC_ISLANDS)
2104 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002105 .Case("fiji", GK_VOLCANIC_ISLANDS)
2106 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002107 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002108 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002109
Matt Arsenault250024f2016-06-08 01:56:42 +00002110 bool setCPU(const std::string &Name) override {
2111 if (getTriple().getArch() == llvm::Triple::amdgcn)
2112 GPU = parseAMDGCNName(Name);
2113 else
2114 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002115
Matt Arsenault250024f2016-06-08 01:56:42 +00002116 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002117 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002118
Jan Vesely211ba782016-06-17 02:25:03 +00002119 void setSupportedOpenCLOpts() override {
2120 auto &Opts = getSupportedOpenCLOpts();
2121 Opts.cl_clang_storage_class_specifiers = 1;
2122 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002123
Jan Vesely211ba782016-06-17 02:25:03 +00002124 if (hasFP64)
2125 Opts.cl_khr_fp64 = 1;
2126 if (GPU >= GK_EVERGREEN) {
2127 Opts.cl_khr_byte_addressable_store = 1;
2128 Opts.cl_khr_global_int32_base_atomics = 1;
2129 Opts.cl_khr_global_int32_extended_atomics = 1;
2130 Opts.cl_khr_local_int32_base_atomics = 1;
2131 Opts.cl_khr_local_int32_extended_atomics = 1;
2132 }
2133 if (GPU >= GK_SOUTHERN_ISLANDS) {
2134 Opts.cl_khr_fp16 = 1;
2135 Opts.cl_khr_int64_base_atomics = 1;
2136 Opts.cl_khr_int64_extended_atomics = 1;
2137 Opts.cl_khr_3d_image_writes = 1;
2138 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002139 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002140};
2141
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002142const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002143#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002144 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002145#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2146 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002147#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002148};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002149const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002150 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2151 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2152 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2153 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2154 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2155 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2156 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2157 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2158 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2159 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2160 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2161 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2162 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2163 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2164 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2165 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2166 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2167 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2168 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2169 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2170 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2171 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2172 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2173 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2174 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2175 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2176 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2177 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2178 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2179 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2180 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2181 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2182 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2183 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2184 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2185 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2186 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2187 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2188 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2189 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2190 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2191 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2192 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2193 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2194 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2195 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2196 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002197 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002198 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2199 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002200};
2201
Craig Topperf054e3a2015-10-19 03:52:27 +00002202ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2203 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002204}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002205
Matt Arsenault250024f2016-06-08 01:56:42 +00002206bool AMDGPUTargetInfo::initFeatureMap(
2207 llvm::StringMap<bool> &Features,
2208 DiagnosticsEngine &Diags, StringRef CPU,
2209 const std::vector<std::string> &FeatureVec) const {
2210
2211 // XXX - What does the member GPU mean if device name string passed here?
2212 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2213 if (CPU.empty())
2214 CPU = "tahiti";
2215
2216 switch (parseAMDGCNName(CPU)) {
2217 case GK_SOUTHERN_ISLANDS:
2218 case GK_SEA_ISLANDS:
2219 break;
2220
2221 case GK_VOLCANIC_ISLANDS:
2222 Features["s-memrealtime"] = true;
2223 Features["16-bit-insts"] = true;
2224 break;
2225
2226 case GK_NONE:
2227 return false;
2228 default:
2229 llvm_unreachable("unhandled subtarget");
2230 }
2231 } else {
2232 if (CPU.empty())
2233 CPU = "r600";
2234
2235 switch (parseR600Name(CPU)) {
2236 case GK_R600:
2237 case GK_R700:
2238 case GK_EVERGREEN:
2239 case GK_NORTHERN_ISLANDS:
2240 break;
2241 case GK_R600_DOUBLE_OPS:
2242 case GK_R700_DOUBLE_OPS:
2243 case GK_EVERGREEN_DOUBLE_OPS:
2244 case GK_CAYMAN:
2245 Features["fp64"] = true;
2246 break;
2247 case GK_NONE:
2248 return false;
2249 default:
2250 llvm_unreachable("unhandled subtarget");
2251 }
2252 }
2253
2254 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2255}
2256
Eli Friedman3fd920a2008-08-20 02:34:37 +00002257// Namespace for x86 abstract base class
2258const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002259#define BUILTIN(ID, TYPE, ATTRS) \
2260 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002261#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002262 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002263#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002264 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002265#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002266};
Eli Friedmanb5366062008-05-20 14:21:01 +00002267
Nuno Lopescfca1f02009-12-23 17:49:57 +00002268static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002269 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2270 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002271 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002272 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2273 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2274 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002275 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002276 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2277 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002278 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2279 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2280 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2281 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2282 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2283 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2284 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2285 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002286};
2287
Eric Christophercdd36352011-06-21 00:05:20 +00002288const TargetInfo::AddlRegName AddlRegNames[] = {
2289 { { "al", "ah", "eax", "rax" }, 0 },
2290 { { "bl", "bh", "ebx", "rbx" }, 3 },
2291 { { "cl", "ch", "ecx", "rcx" }, 2 },
2292 { { "dl", "dh", "edx", "rdx" }, 1 },
2293 { { "esi", "rsi" }, 4 },
2294 { { "edi", "rdi" }, 5 },
2295 { { "esp", "rsp" }, 7 },
2296 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002297 { { "r8d", "r8w", "r8b" }, 38 },
2298 { { "r9d", "r9w", "r9b" }, 39 },
2299 { { "r10d", "r10w", "r10b" }, 40 },
2300 { { "r11d", "r11w", "r11b" }, 41 },
2301 { { "r12d", "r12w", "r12b" }, 42 },
2302 { { "r13d", "r13w", "r13b" }, 43 },
2303 { { "r14d", "r14w", "r14b" }, 44 },
2304 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002305};
2306
2307// X86 target abstract base class; x86-32 and x86-64 are very close, so
2308// most of the implementation can be shared.
2309class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002310 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002311 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002312 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002313 enum MMX3DNowEnum {
2314 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002315 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002316 enum XOPEnum {
2317 NoXOP,
2318 SSE4A,
2319 FMA4,
2320 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002321 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002322
Craig Topper543f3bd2015-10-14 23:47:57 +00002323 bool HasAES = false;
2324 bool HasPCLMUL = false;
2325 bool HasLZCNT = false;
2326 bool HasRDRND = false;
2327 bool HasFSGSBASE = false;
2328 bool HasBMI = false;
2329 bool HasBMI2 = false;
2330 bool HasPOPCNT = false;
2331 bool HasRTM = false;
2332 bool HasPRFCHW = false;
2333 bool HasRDSEED = false;
2334 bool HasADX = false;
2335 bool HasTBM = false;
2336 bool HasFMA = false;
2337 bool HasF16C = false;
2338 bool HasAVX512CD = false;
2339 bool HasAVX512ER = false;
2340 bool HasAVX512PF = false;
2341 bool HasAVX512DQ = false;
2342 bool HasAVX512BW = false;
2343 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002344 bool HasAVX512VBMI = false;
2345 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002346 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002347 bool HasMPX = false;
2348 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002349 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002350 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002351 bool HasXSAVE = false;
2352 bool HasXSAVEOPT = false;
2353 bool HasXSAVEC = false;
2354 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002355 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002356 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002357 bool HasCLFLUSHOPT = false;
2358 bool HasPCOMMIT = false;
2359 bool HasCLWB = false;
2360 bool HasUMIP = false;
2361 bool HasMOVBE = false;
2362 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002363
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002364 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2365 ///
2366 /// Each enumeration represents a particular CPU supported by Clang. These
2367 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2368 enum CPUKind {
2369 CK_Generic,
2370
2371 /// \name i386
2372 /// i386-generation processors.
2373 //@{
2374 CK_i386,
2375 //@}
2376
2377 /// \name i486
2378 /// i486-generation processors.
2379 //@{
2380 CK_i486,
2381 CK_WinChipC6,
2382 CK_WinChip2,
2383 CK_C3,
2384 //@}
2385
2386 /// \name i586
2387 /// i586-generation processors, P5 microarchitecture based.
2388 //@{
2389 CK_i586,
2390 CK_Pentium,
2391 CK_PentiumMMX,
2392 //@}
2393
2394 /// \name i686
2395 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2396 //@{
2397 CK_i686,
2398 CK_PentiumPro,
2399 CK_Pentium2,
2400 CK_Pentium3,
2401 CK_Pentium3M,
2402 CK_PentiumM,
2403 CK_C3_2,
2404
2405 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2406 /// Clang however has some logic to suport this.
2407 // FIXME: Warn, deprecate, and potentially remove this.
2408 CK_Yonah,
2409 //@}
2410
2411 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002412 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002413 //@{
2414 CK_Pentium4,
2415 CK_Pentium4M,
2416 CK_Prescott,
2417 CK_Nocona,
2418 //@}
2419
2420 /// \name Core
2421 /// Core microarchitecture based processors.
2422 //@{
2423 CK_Core2,
2424
2425 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2426 /// codename which GCC no longer accepts as an option to -march, but Clang
2427 /// has some logic for recognizing it.
2428 // FIXME: Warn, deprecate, and potentially remove this.
2429 CK_Penryn,
2430 //@}
2431
2432 /// \name Atom
2433 /// Atom processors
2434 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002435 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002436 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002437 //@}
2438
2439 /// \name Nehalem
2440 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002441 CK_Nehalem,
2442
2443 /// \name Westmere
2444 /// Westmere microarchitecture based processors.
2445 CK_Westmere,
2446
2447 /// \name Sandy Bridge
2448 /// Sandy Bridge microarchitecture based processors.
2449 CK_SandyBridge,
2450
2451 /// \name Ivy Bridge
2452 /// Ivy Bridge microarchitecture based processors.
2453 CK_IvyBridge,
2454
2455 /// \name Haswell
2456 /// Haswell microarchitecture based processors.
2457 CK_Haswell,
2458
2459 /// \name Broadwell
2460 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002461 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002462
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002463 /// \name Skylake Client
2464 /// Skylake client microarchitecture based processors.
2465 CK_SkylakeClient,
2466
2467 /// \name Skylake Server
2468 /// Skylake server microarchitecture based processors.
2469 CK_SkylakeServer,
2470
2471 /// \name Cannonlake Client
2472 /// Cannonlake client microarchitecture based processors.
2473 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002474
Craig Topper449314e2013-08-20 07:09:39 +00002475 /// \name Knights Landing
2476 /// Knights Landing processor.
2477 CK_KNL,
2478
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002479 /// \name Lakemont
2480 /// Lakemont microarchitecture based processors.
2481 CK_Lakemont,
2482
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002483 /// \name K6
2484 /// K6 architecture processors.
2485 //@{
2486 CK_K6,
2487 CK_K6_2,
2488 CK_K6_3,
2489 //@}
2490
2491 /// \name K7
2492 /// K7 architecture processors.
2493 //@{
2494 CK_Athlon,
2495 CK_AthlonThunderbird,
2496 CK_Athlon4,
2497 CK_AthlonXP,
2498 CK_AthlonMP,
2499 //@}
2500
2501 /// \name K8
2502 /// K8 architecture processors.
2503 //@{
2504 CK_Athlon64,
2505 CK_Athlon64SSE3,
2506 CK_AthlonFX,
2507 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002508 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002509 CK_Opteron,
2510 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002511 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002512 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002513
Benjamin Kramer569f2152012-01-10 11:50:18 +00002514 /// \name Bobcat
2515 /// Bobcat architecture processors.
2516 //@{
2517 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002518 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002519 //@}
2520
2521 /// \name Bulldozer
2522 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002523 //@{
2524 CK_BDVER1,
2525 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002526 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002527 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002528 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002529
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002530 /// This specification is deprecated and will be removed in the future.
2531 /// Users should prefer \see CK_K8.
2532 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002533 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002534 CK_x86_64,
2535 //@}
2536
2537 /// \name Geode
2538 /// Geode processors.
2539 //@{
2540 CK_Geode
2541 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002542 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002543
Eric Christopherc50738f2015-08-27 00:05:50 +00002544 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002545 return llvm::StringSwitch<CPUKind>(CPU)
2546 .Case("i386", CK_i386)
2547 .Case("i486", CK_i486)
2548 .Case("winchip-c6", CK_WinChipC6)
2549 .Case("winchip2", CK_WinChip2)
2550 .Case("c3", CK_C3)
2551 .Case("i586", CK_i586)
2552 .Case("pentium", CK_Pentium)
2553 .Case("pentium-mmx", CK_PentiumMMX)
2554 .Case("i686", CK_i686)
2555 .Case("pentiumpro", CK_PentiumPro)
2556 .Case("pentium2", CK_Pentium2)
2557 .Case("pentium3", CK_Pentium3)
2558 .Case("pentium3m", CK_Pentium3M)
2559 .Case("pentium-m", CK_PentiumM)
2560 .Case("c3-2", CK_C3_2)
2561 .Case("yonah", CK_Yonah)
2562 .Case("pentium4", CK_Pentium4)
2563 .Case("pentium4m", CK_Pentium4M)
2564 .Case("prescott", CK_Prescott)
2565 .Case("nocona", CK_Nocona)
2566 .Case("core2", CK_Core2)
2567 .Case("penryn", CK_Penryn)
2568 .Case("bonnell", CK_Bonnell)
2569 .Case("atom", CK_Bonnell) // Legacy name.
2570 .Case("silvermont", CK_Silvermont)
2571 .Case("slm", CK_Silvermont) // Legacy name.
2572 .Case("nehalem", CK_Nehalem)
2573 .Case("corei7", CK_Nehalem) // Legacy name.
2574 .Case("westmere", CK_Westmere)
2575 .Case("sandybridge", CK_SandyBridge)
2576 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2577 .Case("ivybridge", CK_IvyBridge)
2578 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2579 .Case("haswell", CK_Haswell)
2580 .Case("core-avx2", CK_Haswell) // Legacy name.
2581 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002582 .Case("skylake", CK_SkylakeClient)
2583 .Case("skylake-avx512", CK_SkylakeServer)
2584 .Case("skx", CK_SkylakeServer) // Legacy name.
2585 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002586 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002587 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002588 .Case("k6", CK_K6)
2589 .Case("k6-2", CK_K6_2)
2590 .Case("k6-3", CK_K6_3)
2591 .Case("athlon", CK_Athlon)
2592 .Case("athlon-tbird", CK_AthlonThunderbird)
2593 .Case("athlon-4", CK_Athlon4)
2594 .Case("athlon-xp", CK_AthlonXP)
2595 .Case("athlon-mp", CK_AthlonMP)
2596 .Case("athlon64", CK_Athlon64)
2597 .Case("athlon64-sse3", CK_Athlon64SSE3)
2598 .Case("athlon-fx", CK_AthlonFX)
2599 .Case("k8", CK_K8)
2600 .Case("k8-sse3", CK_K8SSE3)
2601 .Case("opteron", CK_Opteron)
2602 .Case("opteron-sse3", CK_OpteronSSE3)
2603 .Case("barcelona", CK_AMDFAM10)
2604 .Case("amdfam10", CK_AMDFAM10)
2605 .Case("btver1", CK_BTVER1)
2606 .Case("btver2", CK_BTVER2)
2607 .Case("bdver1", CK_BDVER1)
2608 .Case("bdver2", CK_BDVER2)
2609 .Case("bdver3", CK_BDVER3)
2610 .Case("bdver4", CK_BDVER4)
2611 .Case("x86-64", CK_x86_64)
2612 .Case("geode", CK_Geode)
2613 .Default(CK_Generic);
2614 }
2615
Rafael Espindolaeb265472013-08-21 21:59:03 +00002616 enum FPMathKind {
2617 FP_Default,
2618 FP_SSE,
2619 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002620 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002621
Eli Friedman3fd920a2008-08-20 02:34:37 +00002622public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002623 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2624 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002625 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002626 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002627 }
Craig Topper3164f332014-03-11 03:39:26 +00002628 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002629 // X87 evaluates with 80 bits "long double" precision.
2630 return SSELevel == NoSSE ? 2 : 0;
2631 }
Craig Topper6c03a542015-10-19 04:51:35 +00002632 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2633 return llvm::makeArrayRef(BuiltinInfo,
2634 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002635 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002636 ArrayRef<const char *> getGCCRegNames() const override {
2637 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002638 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002639 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2640 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002641 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002642 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2643 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002644 }
Eric Christopherd9832702015-06-29 21:00:05 +00002645 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002646 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002647 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002648
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002649 bool validateGlobalRegisterVariable(StringRef RegName,
2650 unsigned RegSize,
2651 bool &HasSizeMismatch) const override {
2652 // esp and ebp are the only 32-bit registers the x86 backend can currently
2653 // handle.
2654 if (RegName.equals("esp") || RegName.equals("ebp")) {
2655 // Check that the register size is 32-bit.
2656 HasSizeMismatch = RegSize != 32;
2657 return true;
2658 }
2659
2660 return false;
2661 }
2662
Akira Hatanaka974131e2014-09-18 18:17:18 +00002663 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2664
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002665 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2666
Akira Hatanaka974131e2014-09-18 18:17:18 +00002667 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2668
Craig Topper3164f332014-03-11 03:39:26 +00002669 std::string convertConstraint(const char *&Constraint) const override;
2670 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002671 return "~{dirflag},~{fpsr},~{flags}";
2672 }
Craig Topper3164f332014-03-11 03:39:26 +00002673 void getTargetDefines(const LangOptions &Opts,
2674 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002675 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2676 bool Enabled);
2677 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2678 bool Enabled);
2679 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2680 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002681 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2682 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002683 setFeatureEnabledImpl(Features, Name, Enabled);
2684 }
2685 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002686 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002687 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2688 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002689 bool
2690 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2691 StringRef CPU,
2692 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002693 bool hasFeature(StringRef Feature) const override;
2694 bool handleTargetFeatures(std::vector<std::string> &Features,
2695 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002696 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002697 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2698 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002699 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002700 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002701 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002702 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002703 return "no-mmx";
2704 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002705 }
Craig Topper3164f332014-03-11 03:39:26 +00002706 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002707 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002708
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002709 // Perform any per-CPU checks necessary to determine if this CPU is
2710 // acceptable.
2711 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2712 // invalid without explaining *why*.
2713 switch (CPU) {
2714 case CK_Generic:
2715 // No processor selected!
2716 return false;
2717
2718 case CK_i386:
2719 case CK_i486:
2720 case CK_WinChipC6:
2721 case CK_WinChip2:
2722 case CK_C3:
2723 case CK_i586:
2724 case CK_Pentium:
2725 case CK_PentiumMMX:
2726 case CK_i686:
2727 case CK_PentiumPro:
2728 case CK_Pentium2:
2729 case CK_Pentium3:
2730 case CK_Pentium3M:
2731 case CK_PentiumM:
2732 case CK_Yonah:
2733 case CK_C3_2:
2734 case CK_Pentium4:
2735 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002736 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002737 case CK_Prescott:
2738 case CK_K6:
2739 case CK_K6_2:
2740 case CK_K6_3:
2741 case CK_Athlon:
2742 case CK_AthlonThunderbird:
2743 case CK_Athlon4:
2744 case CK_AthlonXP:
2745 case CK_AthlonMP:
2746 case CK_Geode:
2747 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002748 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002749 return false;
2750
2751 // Fallthrough
2752 case CK_Nocona:
2753 case CK_Core2:
2754 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002755 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002756 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002757 case CK_Nehalem:
2758 case CK_Westmere:
2759 case CK_SandyBridge:
2760 case CK_IvyBridge:
2761 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002762 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002763 case CK_SkylakeClient:
2764 case CK_SkylakeServer:
2765 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002766 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002767 case CK_Athlon64:
2768 case CK_Athlon64SSE3:
2769 case CK_AthlonFX:
2770 case CK_K8:
2771 case CK_K8SSE3:
2772 case CK_Opteron:
2773 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002774 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002775 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002776 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002777 case CK_BDVER1:
2778 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002779 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002780 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002781 case CK_x86_64:
2782 return true;
2783 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002784 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002785 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002786
Craig Topper3164f332014-03-11 03:39:26 +00002787 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002788
Craig Topper3164f332014-03-11 03:39:26 +00002789 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002790 // Most of the non-ARM calling conventions are i386 conventions.
2791 switch (CC) {
2792 case CC_X86ThisCall:
2793 case CC_X86FastCall:
2794 case CC_X86StdCall:
2795 case CC_X86VectorCall:
2796 case CC_C:
2797 case CC_Swift:
2798 case CC_X86Pascal:
2799 case CC_IntelOclBicc:
2800 return CCCR_OK;
2801 default:
2802 return CCCR_Warning;
2803 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002804 }
2805
Craig Topper3164f332014-03-11 03:39:26 +00002806 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002807 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002808 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002809
2810 bool hasSjLjLowering() const override {
2811 return true;
2812 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002813
2814 void setSupportedOpenCLOpts() override {
2815 getSupportedOpenCLOpts().setAll();
2816 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002817};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002818
Rafael Espindolaeb265472013-08-21 21:59:03 +00002819bool X86TargetInfo::setFPMath(StringRef Name) {
2820 if (Name == "387") {
2821 FPMath = FP_387;
2822 return true;
2823 }
2824 if (Name == "sse") {
2825 FPMath = FP_SSE;
2826 return true;
2827 }
2828 return false;
2829}
2830
Eric Christopher007b0a02015-08-28 22:32:01 +00002831bool X86TargetInfo::initFeatureMap(
2832 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002833 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002834 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002835 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002836 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002837 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002838
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002839 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002840
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002841 // Enable X87 for all X86 processors but Lakemont.
2842 if (Kind != CK_Lakemont)
2843 setFeatureEnabledImpl(Features, "x87", true);
2844
2845 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002846 case CK_Generic:
2847 case CK_i386:
2848 case CK_i486:
2849 case CK_i586:
2850 case CK_Pentium:
2851 case CK_i686:
2852 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002853 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002854 break;
2855 case CK_PentiumMMX:
2856 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002857 case CK_K6:
2858 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002859 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002860 break;
2861 case CK_Pentium3:
2862 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002863 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002864 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002865 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002866 break;
2867 case CK_PentiumM:
2868 case CK_Pentium4:
2869 case CK_Pentium4M:
2870 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002871 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002872 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002873 break;
2874 case CK_Yonah:
2875 case CK_Prescott:
2876 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002877 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002878 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002879 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002880 break;
2881 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002882 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002883 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002884 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002885 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002886 break;
2887 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002888 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002889 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002890 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002891 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002892 case CK_Cannonlake:
2893 setFeatureEnabledImpl(Features, "avx512ifma", true);
2894 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2895 setFeatureEnabledImpl(Features, "sha", true);
2896 setFeatureEnabledImpl(Features, "umip", true);
2897 // FALLTHROUGH
2898 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002899 setFeatureEnabledImpl(Features, "avx512f", true);
2900 setFeatureEnabledImpl(Features, "avx512cd", true);
2901 setFeatureEnabledImpl(Features, "avx512dq", true);
2902 setFeatureEnabledImpl(Features, "avx512bw", true);
2903 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002904 setFeatureEnabledImpl(Features, "pku", true);
2905 setFeatureEnabledImpl(Features, "pcommit", true);
2906 setFeatureEnabledImpl(Features, "clwb", true);
2907 // FALLTHROUGH
2908 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002909 setFeatureEnabledImpl(Features, "xsavec", true);
2910 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002911 setFeatureEnabledImpl(Features, "mpx", true);
2912 setFeatureEnabledImpl(Features, "sgx", true);
2913 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002914 // FALLTHROUGH
2915 case CK_Broadwell:
2916 setFeatureEnabledImpl(Features, "rdseed", true);
2917 setFeatureEnabledImpl(Features, "adx", true);
2918 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002919 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002920 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002921 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002922 setFeatureEnabledImpl(Features, "bmi", true);
2923 setFeatureEnabledImpl(Features, "bmi2", true);
2924 setFeatureEnabledImpl(Features, "rtm", true);
2925 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002926 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002927 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002928 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002929 setFeatureEnabledImpl(Features, "rdrnd", true);
2930 setFeatureEnabledImpl(Features, "f16c", true);
2931 setFeatureEnabledImpl(Features, "fsgsbase", true);
2932 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002933 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002934 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002935 setFeatureEnabledImpl(Features, "xsave", true);
2936 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002937 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002938 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002939 case CK_Silvermont:
2940 setFeatureEnabledImpl(Features, "aes", true);
2941 setFeatureEnabledImpl(Features, "pclmul", true);
2942 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002943 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002944 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002945 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002946 setFeatureEnabledImpl(Features, "cx16", true);
2947 break;
2948 case CK_KNL:
2949 setFeatureEnabledImpl(Features, "avx512f", true);
2950 setFeatureEnabledImpl(Features, "avx512cd", true);
2951 setFeatureEnabledImpl(Features, "avx512er", true);
2952 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002953 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002954 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002955 setFeatureEnabledImpl(Features, "rdseed", true);
2956 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002957 setFeatureEnabledImpl(Features, "lzcnt", true);
2958 setFeatureEnabledImpl(Features, "bmi", true);
2959 setFeatureEnabledImpl(Features, "bmi2", true);
2960 setFeatureEnabledImpl(Features, "rtm", true);
2961 setFeatureEnabledImpl(Features, "fma", true);
2962 setFeatureEnabledImpl(Features, "rdrnd", true);
2963 setFeatureEnabledImpl(Features, "f16c", true);
2964 setFeatureEnabledImpl(Features, "fsgsbase", true);
2965 setFeatureEnabledImpl(Features, "aes", true);
2966 setFeatureEnabledImpl(Features, "pclmul", true);
2967 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002968 setFeatureEnabledImpl(Features, "xsaveopt", true);
2969 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002970 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002971 break;
2972 case CK_K6_2:
2973 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002974 case CK_WinChip2:
2975 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002976 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002977 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002978 case CK_Athlon:
2979 case CK_AthlonThunderbird:
2980 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002981 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002982 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002983 case CK_Athlon4:
2984 case CK_AthlonXP:
2985 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002986 setFeatureEnabledImpl(Features, "sse", true);
2987 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002988 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002989 break;
2990 case CK_K8:
2991 case CK_Opteron:
2992 case CK_Athlon64:
2993 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002994 setFeatureEnabledImpl(Features, "sse2", true);
2995 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002996 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002997 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002998 case CK_AMDFAM10:
2999 setFeatureEnabledImpl(Features, "sse4a", true);
3000 setFeatureEnabledImpl(Features, "lzcnt", true);
3001 setFeatureEnabledImpl(Features, "popcnt", true);
3002 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003003 case CK_K8SSE3:
3004 case CK_OpteronSSE3:
3005 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003006 setFeatureEnabledImpl(Features, "sse3", true);
3007 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003008 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003009 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003010 case CK_BTVER2:
3011 setFeatureEnabledImpl(Features, "avx", true);
3012 setFeatureEnabledImpl(Features, "aes", true);
3013 setFeatureEnabledImpl(Features, "pclmul", true);
3014 setFeatureEnabledImpl(Features, "bmi", true);
3015 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003016 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003017 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003018 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003019 setFeatureEnabledImpl(Features, "ssse3", true);
3020 setFeatureEnabledImpl(Features, "sse4a", true);
3021 setFeatureEnabledImpl(Features, "lzcnt", true);
3022 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003023 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003024 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003025 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003026 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003027 case CK_BDVER4:
3028 setFeatureEnabledImpl(Features, "avx2", true);
3029 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003030 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003031 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003032 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003033 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003034 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003035 // FALLTHROUGH
3036 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003037 setFeatureEnabledImpl(Features, "bmi", true);
3038 setFeatureEnabledImpl(Features, "fma", true);
3039 setFeatureEnabledImpl(Features, "f16c", true);
3040 setFeatureEnabledImpl(Features, "tbm", true);
3041 // FALLTHROUGH
3042 case CK_BDVER1:
3043 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003044 setFeatureEnabledImpl(Features, "xop", true);
3045 setFeatureEnabledImpl(Features, "lzcnt", true);
3046 setFeatureEnabledImpl(Features, "aes", true);
3047 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003048 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003049 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003050 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003051 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003052 break;
Eli Friedman33465822011-07-08 23:31:17 +00003053 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003054 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3055 return false;
3056
3057 // Can't do this earlier because we need to be able to explicitly enable
3058 // or disable these features and the things that they depend upon.
3059
3060 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3061 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003062 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003063 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3064 FeaturesVec.end())
3065 Features["popcnt"] = true;
3066
3067 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3068 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003069 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003070 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3071 FeaturesVec.end())
3072 Features["prfchw"] = true;
3073
Eric Christophera7260af2015-10-08 20:10:18 +00003074 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3075 // then enable MMX.
3076 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003077 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003078 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3079 FeaturesVec.end())
3080 Features["mmx"] = true;
3081
Eric Christopherbbd746d2015-10-08 20:10:14 +00003082 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003083}
3084
Rafael Espindolae62e2792013-08-20 13:44:29 +00003085void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003086 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003087 if (Enabled) {
3088 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003089 case AVX512F:
3090 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003091 case AVX2:
3092 Features["avx2"] = true;
3093 case AVX:
3094 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003095 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003096 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003097 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003098 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003099 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003100 case SSSE3:
3101 Features["ssse3"] = true;
3102 case SSE3:
3103 Features["sse3"] = true;
3104 case SSE2:
3105 Features["sse2"] = true;
3106 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003107 Features["sse"] = true;
3108 case NoSSE:
3109 break;
3110 }
3111 return;
3112 }
3113
3114 switch (Level) {
3115 case NoSSE:
3116 case SSE1:
3117 Features["sse"] = false;
3118 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003119 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3120 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003121 case SSE3:
3122 Features["sse3"] = false;
3123 setXOPLevel(Features, NoXOP, false);
3124 case SSSE3:
3125 Features["ssse3"] = false;
3126 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003127 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003128 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003129 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003130 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003131 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3132 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003133 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003134 case AVX2:
3135 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003136 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003137 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003138 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003139 Features["avx512vl"] = Features["avx512vbmi"] =
3140 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003141 }
3142}
3143
3144void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003145 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003146 if (Enabled) {
3147 switch (Level) {
3148 case AMD3DNowAthlon:
3149 Features["3dnowa"] = true;
3150 case AMD3DNow:
3151 Features["3dnow"] = true;
3152 case MMX:
3153 Features["mmx"] = true;
3154 case NoMMX3DNow:
3155 break;
3156 }
3157 return;
3158 }
3159
3160 switch (Level) {
3161 case NoMMX3DNow:
3162 case MMX:
3163 Features["mmx"] = false;
3164 case AMD3DNow:
3165 Features["3dnow"] = false;
3166 case AMD3DNowAthlon:
3167 Features["3dnowa"] = false;
3168 }
3169}
3170
3171void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003172 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003173 if (Enabled) {
3174 switch (Level) {
3175 case XOP:
3176 Features["xop"] = true;
3177 case FMA4:
3178 Features["fma4"] = true;
3179 setSSELevel(Features, AVX, true);
3180 case SSE4A:
3181 Features["sse4a"] = true;
3182 setSSELevel(Features, SSE3, true);
3183 case NoXOP:
3184 break;
3185 }
3186 return;
3187 }
3188
3189 switch (Level) {
3190 case NoXOP:
3191 case SSE4A:
3192 Features["sse4a"] = false;
3193 case FMA4:
3194 Features["fma4"] = false;
3195 case XOP:
3196 Features["xop"] = false;
3197 }
3198}
3199
Craig Topper86d79ef2013-09-17 04:51:29 +00003200void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3201 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003202 // This is a bit of a hack to deal with the sse4 target feature when used
3203 // as part of the target attribute. We handle sse4 correctly everywhere
3204 // else. See below for more information on how we handle the sse4 options.
3205 if (Name != "sse4")
3206 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003207
Craig Topper29561122013-09-19 01:13:07 +00003208 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003209 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003210 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003211 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003212 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003213 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003214 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003215 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003216 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003217 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003218 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003219 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003220 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003221 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003222 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003223 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003224 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003225 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003226 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003227 if (Enabled)
3228 setSSELevel(Features, SSE2, Enabled);
3229 } else if (Name == "pclmul") {
3230 if (Enabled)
3231 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003232 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003233 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003234 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003235 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003236 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003237 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003238 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3239 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3240 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003241 if (Enabled)
3242 setSSELevel(Features, AVX512F, Enabled);
3243 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003244 if (Enabled)
3245 setSSELevel(Features, AVX, Enabled);
3246 } else if (Name == "fma4") {
3247 setXOPLevel(Features, FMA4, Enabled);
3248 } else if (Name == "xop") {
3249 setXOPLevel(Features, XOP, Enabled);
3250 } else if (Name == "sse4a") {
3251 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003252 } else if (Name == "f16c") {
3253 if (Enabled)
3254 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003255 } else if (Name == "sha") {
3256 if (Enabled)
3257 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003258 } else if (Name == "sse4") {
3259 // We can get here via the __target__ attribute since that's not controlled
3260 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3261 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3262 // disabled.
3263 if (Enabled)
3264 setSSELevel(Features, SSE42, Enabled);
3265 else
3266 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003267 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003268 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003269 Features["xsaveopt"] = false;
3270 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003271 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003272 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003273 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003274}
3275
Eric Christopher3ff21b32013-10-16 21:26:26 +00003276/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003277/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003278bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003279 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003280 for (const auto &Feature : Features) {
3281 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003282 continue;
3283
Eric Christopher610fe112015-08-26 08:21:55 +00003284 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003285 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003286 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003287 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003288 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003289 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003290 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003291 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003292 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003293 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003294 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003295 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003296 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003297 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003298 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003299 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003300 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003301 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003302 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003303 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003304 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003305 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003306 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003307 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003308 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003309 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003310 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003311 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003312 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003313 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003314 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003315 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003316 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003317 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003318 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003319 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003320 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003321 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003322 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003323 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003324 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003325 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003326 } else if (Feature == "+avx512vbmi") {
3327 HasAVX512VBMI = true;
3328 } else if (Feature == "+avx512ifma") {
3329 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003330 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003331 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003332 } else if (Feature == "+mpx") {
3333 HasMPX = true;
3334 } else if (Feature == "+movbe") {
3335 HasMOVBE = true;
3336 } else if (Feature == "+sgx") {
3337 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003338 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003339 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003340 } else if (Feature == "+fxsr") {
3341 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003342 } else if (Feature == "+xsave") {
3343 HasXSAVE = true;
3344 } else if (Feature == "+xsaveopt") {
3345 HasXSAVEOPT = true;
3346 } else if (Feature == "+xsavec") {
3347 HasXSAVEC = true;
3348 } else if (Feature == "+xsaves") {
3349 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003350 } else if (Feature == "+mwaitx") {
3351 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003352 } else if (Feature == "+pku") {
3353 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003354 } else if (Feature == "+clflushopt") {
3355 HasCLFLUSHOPT = true;
3356 } else if (Feature == "+pcommit") {
3357 HasPCOMMIT = true;
3358 } else if (Feature == "+clwb") {
3359 HasCLWB = true;
3360 } else if (Feature == "+umip") {
3361 HasUMIP = true;
3362 } else if (Feature == "+prefetchwt1") {
3363 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003364 }
3365
Benjamin Kramer27402c62012-03-05 15:10:44 +00003366 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003367 .Case("+avx512f", AVX512F)
3368 .Case("+avx2", AVX2)
3369 .Case("+avx", AVX)
3370 .Case("+sse4.2", SSE42)
3371 .Case("+sse4.1", SSE41)
3372 .Case("+ssse3", SSSE3)
3373 .Case("+sse3", SSE3)
3374 .Case("+sse2", SSE2)
3375 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003376 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003377 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003378
Eli Friedman33465822011-07-08 23:31:17 +00003379 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003380 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003381 .Case("+3dnowa", AMD3DNowAthlon)
3382 .Case("+3dnow", AMD3DNow)
3383 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003384 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003385 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003386
3387 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003388 .Case("+xop", XOP)
3389 .Case("+fma4", FMA4)
3390 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003391 .Default(NoXOP);
3392 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003393 }
Eli Friedman33465822011-07-08 23:31:17 +00003394
Rafael Espindolaeb265472013-08-21 21:59:03 +00003395 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3396 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003397 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3398 (FPMath == FP_387 && SSELevel >= SSE1)) {
3399 Diags.Report(diag::err_target_unsupported_fpmath) <<
3400 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003401 return false;
3402 }
3403
Alexey Bataev00396512015-07-02 03:40:19 +00003404 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003405 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003406 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003407}
Chris Lattnerecd49032009-03-02 22:27:17 +00003408
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003409/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3410/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003411void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003412 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003413 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003414 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003415 Builder.defineMacro("__amd64__");
3416 Builder.defineMacro("__amd64");
3417 Builder.defineMacro("__x86_64");
3418 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003419 if (getTriple().getArchName() == "x86_64h") {
3420 Builder.defineMacro("__x86_64h");
3421 Builder.defineMacro("__x86_64h__");
3422 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003423 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003424 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003425 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003426
Chris Lattnerecd49032009-03-02 22:27:17 +00003427 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003428 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3429 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003430 switch (CPU) {
3431 case CK_Generic:
3432 break;
3433 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003434 // The rest are coming from the i386 define above.
3435 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003436 break;
3437 case CK_i486:
3438 case CK_WinChipC6:
3439 case CK_WinChip2:
3440 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003441 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003442 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003443 case CK_PentiumMMX:
3444 Builder.defineMacro("__pentium_mmx__");
3445 Builder.defineMacro("__tune_pentium_mmx__");
3446 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003447 case CK_i586:
3448 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003449 defineCPUMacros(Builder, "i586");
3450 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003451 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003452 case CK_Pentium3:
3453 case CK_Pentium3M:
3454 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003455 Builder.defineMacro("__tune_pentium3__");
3456 // Fallthrough
3457 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003458 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003459 Builder.defineMacro("__tune_pentium2__");
3460 // Fallthrough
3461 case CK_PentiumPro:
3462 Builder.defineMacro("__tune_i686__");
3463 Builder.defineMacro("__tune_pentiumpro__");
3464 // Fallthrough
3465 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003466 Builder.defineMacro("__i686");
3467 Builder.defineMacro("__i686__");
3468 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3469 Builder.defineMacro("__pentiumpro");
3470 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003471 break;
3472 case CK_Pentium4:
3473 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003474 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003475 break;
3476 case CK_Yonah:
3477 case CK_Prescott:
3478 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003479 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003480 break;
3481 case CK_Core2:
3482 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003483 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003484 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003485 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003486 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003487 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003488 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003489 defineCPUMacros(Builder, "slm");
3490 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003491 case CK_Nehalem:
3492 case CK_Westmere:
3493 case CK_SandyBridge:
3494 case CK_IvyBridge:
3495 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003496 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003497 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003498 // FIXME: Historically, we defined this legacy name, it would be nice to
3499 // remove it at some point. We've never exposed fine-grained names for
3500 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003501 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003502 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003503 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003504 defineCPUMacros(Builder, "skx");
3505 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003506 case CK_Cannonlake:
3507 break;
Craig Topper449314e2013-08-20 07:09:39 +00003508 case CK_KNL:
3509 defineCPUMacros(Builder, "knl");
3510 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003511 case CK_Lakemont:
3512 Builder.defineMacro("__tune_lakemont__");
3513 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003514 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003515 Builder.defineMacro("__k6_2__");
3516 Builder.defineMacro("__tune_k6_2__");
3517 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003518 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003519 if (CPU != CK_K6_2) { // In case of fallthrough
3520 // FIXME: GCC may be enabling these in cases where some other k6
3521 // architecture is specified but -m3dnow is explicitly provided. The
3522 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003523 Builder.defineMacro("__k6_3__");
3524 Builder.defineMacro("__tune_k6_3__");
3525 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003526 // Fallthrough
3527 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003528 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003529 break;
3530 case CK_Athlon:
3531 case CK_AthlonThunderbird:
3532 case CK_Athlon4:
3533 case CK_AthlonXP:
3534 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003535 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003536 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003537 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003538 Builder.defineMacro("__tune_athlon_sse__");
3539 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003540 break;
3541 case CK_K8:
3542 case CK_K8SSE3:
3543 case CK_x86_64:
3544 case CK_Opteron:
3545 case CK_OpteronSSE3:
3546 case CK_Athlon64:
3547 case CK_Athlon64SSE3:
3548 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003549 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003550 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003551 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003552 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003553 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003554 case CK_BTVER1:
3555 defineCPUMacros(Builder, "btver1");
3556 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003557 case CK_BTVER2:
3558 defineCPUMacros(Builder, "btver2");
3559 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003560 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003561 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003562 break;
3563 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003564 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003565 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003566 case CK_BDVER3:
3567 defineCPUMacros(Builder, "bdver3");
3568 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003569 case CK_BDVER4:
3570 defineCPUMacros(Builder, "bdver4");
3571 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003572 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003573 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003574 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003575 }
Chris Lattner96e43572009-03-02 22:40:39 +00003576
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003577 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003578 Builder.defineMacro("__REGISTER_PREFIX__", "");
3579
Chris Lattner6df41af2009-04-19 17:32:33 +00003580 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3581 // functions in glibc header files that use FP Stack inline asm which the
3582 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003583 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003584
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003585 if (HasAES)
3586 Builder.defineMacro("__AES__");
3587
Craig Topper3f122a72012-05-31 05:18:48 +00003588 if (HasPCLMUL)
3589 Builder.defineMacro("__PCLMUL__");
3590
Craig Topper22967d42011-12-25 05:06:45 +00003591 if (HasLZCNT)
3592 Builder.defineMacro("__LZCNT__");
3593
Benjamin Kramer1e250392012-07-07 09:39:18 +00003594 if (HasRDRND)
3595 Builder.defineMacro("__RDRND__");
3596
Craig Topper8c7f2512014-11-03 06:51:41 +00003597 if (HasFSGSBASE)
3598 Builder.defineMacro("__FSGSBASE__");
3599
Craig Topper22967d42011-12-25 05:06:45 +00003600 if (HasBMI)
3601 Builder.defineMacro("__BMI__");
3602
3603 if (HasBMI2)
3604 Builder.defineMacro("__BMI2__");
3605
Craig Topper1de83482011-12-29 16:10:46 +00003606 if (HasPOPCNT)
3607 Builder.defineMacro("__POPCNT__");
3608
Michael Liao625a8752012-11-10 05:17:46 +00003609 if (HasRTM)
3610 Builder.defineMacro("__RTM__");
3611
Michael Liao74f4eaf2013-03-26 17:52:08 +00003612 if (HasPRFCHW)
3613 Builder.defineMacro("__PRFCHW__");
3614
Michael Liaoffaae352013-03-29 05:17:55 +00003615 if (HasRDSEED)
3616 Builder.defineMacro("__RDSEED__");
3617
Robert Khasanov50e6f582014-09-19 09:53:48 +00003618 if (HasADX)
3619 Builder.defineMacro("__ADX__");
3620
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003621 if (HasTBM)
3622 Builder.defineMacro("__TBM__");
3623
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003624 if (HasMWAITX)
3625 Builder.defineMacro("__MWAITX__");
3626
Rafael Espindolae62e2792013-08-20 13:44:29 +00003627 switch (XOPLevel) {
3628 case XOP:
3629 Builder.defineMacro("__XOP__");
3630 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003631 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003632 case SSE4A:
3633 Builder.defineMacro("__SSE4A__");
3634 case NoXOP:
3635 break;
3636 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003637
Craig Topperbba778b2012-06-03 21:46:30 +00003638 if (HasFMA)
3639 Builder.defineMacro("__FMA__");
3640
Manman Rena45358c2012-10-11 00:59:55 +00003641 if (HasF16C)
3642 Builder.defineMacro("__F16C__");
3643
Craig Topper679b53a2013-08-21 05:29:10 +00003644 if (HasAVX512CD)
3645 Builder.defineMacro("__AVX512CD__");
3646 if (HasAVX512ER)
3647 Builder.defineMacro("__AVX512ER__");
3648 if (HasAVX512PF)
3649 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003650 if (HasAVX512DQ)
3651 Builder.defineMacro("__AVX512DQ__");
3652 if (HasAVX512BW)
3653 Builder.defineMacro("__AVX512BW__");
3654 if (HasAVX512VL)
3655 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003656 if (HasAVX512VBMI)
3657 Builder.defineMacro("__AVX512VBMI__");
3658 if (HasAVX512IFMA)
3659 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003660
Ben Langmuir58078d02013-09-19 13:22:04 +00003661 if (HasSHA)
3662 Builder.defineMacro("__SHA__");
3663
Craig Toppere33f51f2015-10-16 06:22:36 +00003664 if (HasFXSR)
3665 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003666 if (HasXSAVE)
3667 Builder.defineMacro("__XSAVE__");
3668 if (HasXSAVEOPT)
3669 Builder.defineMacro("__XSAVEOPT__");
3670 if (HasXSAVEC)
3671 Builder.defineMacro("__XSAVEC__");
3672 if (HasXSAVES)
3673 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003674 if (HasPKU)
3675 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003676 if (HasCX16)
3677 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3678
Chris Lattner96e43572009-03-02 22:40:39 +00003679 // Each case falls through to the previous one here.
3680 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003681 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003682 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003683 case AVX2:
3684 Builder.defineMacro("__AVX2__");
3685 case AVX:
3686 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003687 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003688 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003689 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003690 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003691 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003692 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003693 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003694 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003695 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003696 Builder.defineMacro("__SSE2__");
3697 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003698 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003699 Builder.defineMacro("__SSE__");
3700 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003701 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003702 break;
3703 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003704
Derek Schuffc7dd7222012-10-11 15:52:22 +00003705 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003706 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003707 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003708 case AVX2:
3709 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003710 case SSE42:
3711 case SSE41:
3712 case SSSE3:
3713 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003714 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003715 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003716 break;
3717 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003718 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003719 break;
3720 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003721 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003722 }
3723 }
3724
Anders Carlssone437c682010-01-27 03:47:49 +00003725 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003726 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003727 case AMD3DNowAthlon:
3728 Builder.defineMacro("__3dNOW_A__");
3729 case AMD3DNow:
3730 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003731 case MMX:
3732 Builder.defineMacro("__MMX__");
3733 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003734 break;
3735 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003736
3737 if (CPU >= CK_i486) {
3738 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3739 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3740 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3741 }
3742 if (CPU >= CK_i586)
3743 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003744}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003745
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003746bool X86TargetInfo::hasFeature(StringRef Feature) const {
3747 return llvm::StringSwitch<bool>(Feature)
3748 .Case("aes", HasAES)
3749 .Case("avx", SSELevel >= AVX)
3750 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003751 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003752 .Case("avx512cd", HasAVX512CD)
3753 .Case("avx512er", HasAVX512ER)
3754 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003755 .Case("avx512dq", HasAVX512DQ)
3756 .Case("avx512bw", HasAVX512BW)
3757 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003758 .Case("avx512vbmi", HasAVX512VBMI)
3759 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003760 .Case("bmi", HasBMI)
3761 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003762 .Case("clflushopt", HasCLFLUSHOPT)
3763 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003764 .Case("cx16", HasCX16)
3765 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003766 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003767 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003768 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003769 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003770 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003771 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3772 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3773 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003774 .Case("movbe", HasMOVBE)
3775 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003776 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003777 .Case("pcommit", HasPCOMMIT)
3778 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003779 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003780 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003781 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003782 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003783 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003784 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003785 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003786 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003787 .Case("sse", SSELevel >= SSE1)
3788 .Case("sse2", SSELevel >= SSE2)
3789 .Case("sse3", SSELevel >= SSE3)
3790 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003791 .Case("sse4.1", SSELevel >= SSE41)
3792 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003793 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003794 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003795 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003796 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003797 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3798 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003799 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003800 .Case("xsave", HasXSAVE)
3801 .Case("xsavec", HasXSAVEC)
3802 .Case("xsaves", HasXSAVES)
3803 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003804 .Default(false);
3805}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003806
Eric Christopherd9832702015-06-29 21:00:05 +00003807// We can't use a generic validation scheme for the features accepted here
3808// versus subtarget features accepted in the target attribute because the
3809// bitfield structure that's initialized in the runtime only supports the
3810// below currently rather than the full range of subtarget features. (See
3811// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3812bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3813 return llvm::StringSwitch<bool>(FeatureStr)
3814 .Case("cmov", true)
3815 .Case("mmx", true)
3816 .Case("popcnt", true)
3817 .Case("sse", true)
3818 .Case("sse2", true)
3819 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003820 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003821 .Case("sse4.1", true)
3822 .Case("sse4.2", true)
3823 .Case("avx", true)
3824 .Case("avx2", true)
3825 .Case("sse4a", true)
3826 .Case("fma4", true)
3827 .Case("xop", true)
3828 .Case("fma", true)
3829 .Case("avx512f", true)
3830 .Case("bmi", true)
3831 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003832 .Case("aes", true)
3833 .Case("pclmul", true)
3834 .Case("avx512vl", true)
3835 .Case("avx512bw", true)
3836 .Case("avx512dq", true)
3837 .Case("avx512cd", true)
3838 .Case("avx512er", true)
3839 .Case("avx512pf", true)
3840 .Case("avx512vbmi", true)
3841 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003842 .Default(false);
3843}
3844
Eli Friedman3fd920a2008-08-20 02:34:37 +00003845bool
Anders Carlsson58436352009-02-28 17:11:49 +00003846X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003847 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003848 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003849 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003850 // Constant constraints.
3851 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3852 // instructions.
3853 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3854 // x86_64 instructions.
3855 case 's':
3856 Info.setRequiresImmediate();
3857 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003858 case 'I':
3859 Info.setRequiresImmediate(0, 31);
3860 return true;
3861 case 'J':
3862 Info.setRequiresImmediate(0, 63);
3863 return true;
3864 case 'K':
3865 Info.setRequiresImmediate(-128, 127);
3866 return true;
3867 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003868 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003869 return true;
3870 case 'M':
3871 Info.setRequiresImmediate(0, 3);
3872 return true;
3873 case 'N':
3874 Info.setRequiresImmediate(0, 255);
3875 return true;
3876 case 'O':
3877 Info.setRequiresImmediate(0, 127);
3878 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003879 // Register constraints.
3880 case 'Y': // 'Y' is the first character for several 2-character constraints.
3881 // Shift the pointer to the second character of the constraint.
3882 Name++;
3883 switch (*Name) {
3884 default:
3885 return false;
3886 case '0': // First SSE register.
3887 case 't': // Any SSE register, when SSE2 is enabled.
3888 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3889 case 'm': // Any MMX register, when inter-unit moves enabled.
3890 Info.setAllowsRegister();
3891 return true;
3892 }
3893 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003894 // Constraint 'f' cannot be used for output operands.
3895 if (Info.ConstraintStr[0] == '=')
3896 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003897 Info.setAllowsRegister();
3898 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003899 case 'a': // eax.
3900 case 'b': // ebx.
3901 case 'c': // ecx.
3902 case 'd': // edx.
3903 case 'S': // esi.
3904 case 'D': // edi.
3905 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003906 case 't': // Top of floating point stack.
3907 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003908 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003909 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003910 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003911 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003912 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3913 case 'l': // "Index" registers: any general register that can be used as an
3914 // index in a base+index memory access.
3915 Info.setAllowsRegister();
3916 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003917 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003918 case 'C': // SSE floating point constant.
3919 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003920 return true;
3921 }
3922}
3923
Akira Hatanaka974131e2014-09-18 18:17:18 +00003924bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3925 unsigned Size) const {
3926 // Strip off constraint modifiers.
3927 while (Constraint[0] == '=' ||
3928 Constraint[0] == '+' ||
3929 Constraint[0] == '&')
3930 Constraint = Constraint.substr(1);
3931
3932 return validateOperandSize(Constraint, Size);
3933}
3934
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003935bool X86TargetInfo::validateInputSize(StringRef Constraint,
3936 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003937 return validateOperandSize(Constraint, Size);
3938}
3939
3940bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3941 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003942 switch (Constraint[0]) {
3943 default: break;
3944 case 'y':
3945 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003946 case 'f':
3947 case 't':
3948 case 'u':
3949 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003950 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003951 if (SSELevel >= AVX512F)
3952 // 512-bit zmm registers can be used if target supports AVX512F.
3953 return Size <= 512U;
3954 else if (SSELevel >= AVX)
3955 // 256-bit ymm registers can be used if target supports AVX.
3956 return Size <= 256U;
3957 return Size <= 128U;
3958 case 'Y':
3959 // 'Y' is the first character for several 2-character constraints.
3960 switch (Constraint[1]) {
3961 default: break;
3962 case 'm':
3963 // 'Ym' is synonymous with 'y'.
3964 return Size <= 64;
3965 case 'i':
3966 case 't':
3967 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3968 if (SSELevel >= AVX512F)
3969 return Size <= 512U;
3970 else if (SSELevel >= AVX)
3971 return Size <= 256U;
3972 return SSELevel >= SSE2 && Size <= 128U;
3973 }
3974
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003975 }
3976
3977 return true;
3978}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003979
Eli Friedman3fd920a2008-08-20 02:34:37 +00003980std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003981X86TargetInfo::convertConstraint(const char *&Constraint) const {
3982 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003983 case 'a': return std::string("{ax}");
3984 case 'b': return std::string("{bx}");
3985 case 'c': return std::string("{cx}");
3986 case 'd': return std::string("{dx}");
3987 case 'S': return std::string("{si}");
3988 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003989 case 'p': // address
3990 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003991 case 't': // top of floating point stack.
3992 return std::string("{st}");
3993 case 'u': // second from top of floating point stack.
3994 return std::string("{st(1)}"); // second from top of floating point stack.
3995 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003996 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003997 }
3998}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003999
Eli Friedman3fd920a2008-08-20 02:34:37 +00004000// X86-32 generic target
4001class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004002public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004003 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4004 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004005 DoubleAlign = LongLongAlign = 32;
4006 LongDoubleWidth = 96;
4007 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004008 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004009 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004010 SizeType = UnsignedInt;
4011 PtrDiffType = SignedInt;
4012 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004013 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004014
4015 // Use fpret for all types.
4016 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4017 (1 << TargetInfo::Double) |
4018 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004019
4020 // x86-32 has atomics up to 8 bytes
4021 // FIXME: Check that we actually have cmpxchg8b before setting
4022 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4023 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004024 }
Craig Topper3164f332014-03-11 03:39:26 +00004025 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004026 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004027 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004028
Craig Topper3164f332014-03-11 03:39:26 +00004029 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004030 if (RegNo == 0) return 0;
4031 if (RegNo == 1) return 2;
4032 return -1;
4033 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004034 bool validateOperandSize(StringRef Constraint,
4035 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004036 switch (Constraint[0]) {
4037 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004038 case 'R':
4039 case 'q':
4040 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004041 case 'a':
4042 case 'b':
4043 case 'c':
4044 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004045 case 'S':
4046 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004047 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004048 case 'A':
4049 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004050 }
4051
Akira Hatanaka974131e2014-09-18 18:17:18 +00004052 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004053 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004054};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004055
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004056class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4057public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004058 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4059 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004060
Craig Topper3164f332014-03-11 03:39:26 +00004061 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004062 unsigned Major, Minor, Micro;
4063 getTriple().getOSVersion(Major, Minor, Micro);
4064 // New NetBSD uses the default rounding mode.
4065 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4066 return X86_32TargetInfo::getFloatEvalMethod();
4067 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004068 return 1;
4069 }
4070};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004071
Eli Friedmane3aa4542009-07-05 18:47:56 +00004072class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4073public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004074 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4075 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004076 SizeType = UnsignedLong;
4077 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004078 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004079 }
4080};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004081
Eli Friedman9fa28852012-08-08 23:57:20 +00004082class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004084 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4085 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004086 SizeType = UnsignedLong;
4087 IntPtrType = SignedLong;
4088 PtrDiffType = SignedLong;
4089 }
4090};
Eli Friedman9fa28852012-08-08 23:57:20 +00004091
Torok Edwinb2b37c62009-06-30 17:10:35 +00004092class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004093public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004094 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4095 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004096 LongDoubleWidth = 128;
4097 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004098 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004099 MaxVectorAlign = 256;
4100 // The watchOS simulator uses the builtin bool type for Objective-C.
4101 llvm::Triple T = llvm::Triple(Triple);
4102 if (T.isWatchOS())
4103 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004104 SizeType = UnsignedLong;
4105 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004106 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004107 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004108 }
4109
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004110 bool handleTargetFeatures(std::vector<std::string> &Features,
4111 DiagnosticsEngine &Diags) override {
4112 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4113 Diags))
4114 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004115 // We now know the features we have: we can decide how to align vectors.
4116 MaxVectorAlign =
4117 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004118 return true;
4119 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004120};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004121
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004122// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004123class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004124public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004125 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4126 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004127 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004128 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004129 bool IsWinCOFF =
4130 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004131 resetDataLayout(IsWinCOFF
4132 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4133 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004134 }
Craig Topper3164f332014-03-11 03:39:26 +00004135 void getTargetDefines(const LangOptions &Opts,
4136 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004137 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4138 }
4139};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004140
4141// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004142class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004143public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004144 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4145 const TargetOptions &Opts)
4146 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004147 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004148 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4149 }
Craig Topper3164f332014-03-11 03:39:26 +00004150 void getTargetDefines(const LangOptions &Opts,
4151 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004152 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4153 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4154 // The value of the following reflects processor type.
4155 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4156 // We lost the original triple, so we use the default.
4157 Builder.defineMacro("_M_IX86", "600");
4158 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004159};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004160
David Majnemerae1ed0e2015-05-28 04:36:18 +00004161static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004162 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4163 // supports __declspec natively under -fms-extensions, but we define a no-op
4164 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004165 if (Opts.MicrosoftExt)
4166 Builder.defineMacro("__declspec", "__declspec");
4167 else
4168 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4169
4170 if (!Opts.MicrosoftExt) {
4171 // Provide macros for all the calling convention keywords. Provide both
4172 // single and double underscore prefixed variants. These are available on
4173 // x64 as well as x86, even though they have no effect.
4174 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4175 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004176 std::string GCCSpelling = "__attribute__((__";
4177 GCCSpelling += CC;
4178 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004179 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4180 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4181 }
4182 }
4183}
4184
David Majnemerae1ed0e2015-05-28 04:36:18 +00004185static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4186 Builder.defineMacro("__MSVCRT__");
4187 Builder.defineMacro("__MINGW32__");
4188 addCygMingDefines(Opts, Builder);
4189}
4190
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004191// x86-32 MinGW target
4192class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4193public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004194 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4195 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004196 void getTargetDefines(const LangOptions &Opts,
4197 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004198 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004199 DefineStd(Builder, "WIN32", Opts);
4200 DefineStd(Builder, "WINNT", Opts);
4201 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004202 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004203 }
4204};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004205
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004206// x86-32 Cygwin target
4207class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4208public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004209 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4210 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004211 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004212 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004213 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 +00004214 }
Craig Topper3164f332014-03-11 03:39:26 +00004215 void getTargetDefines(const LangOptions &Opts,
4216 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004217 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004218 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004219 Builder.defineMacro("__CYGWIN__");
4220 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004221 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004222 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004223 if (Opts.CPlusPlus)
4224 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004225 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004226};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004227
Chris Lattnerb986aba2010-04-11 19:29:39 +00004228// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004229class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004231 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004232 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004233 }
Craig Topper3164f332014-03-11 03:39:26 +00004234 void getTargetDefines(const LangOptions &Opts,
4235 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004236 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004237 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004238 }
4239};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004240
Alexey Bataevc99b0492015-11-25 09:24:26 +00004241// X86-32 MCU target
4242class MCUX86_32TargetInfo : public X86_32TargetInfo {
4243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004244 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4245 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004246 LongDoubleWidth = 64;
4247 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004248 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 +00004249 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004250 }
4251
4252 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4253 // On MCU we support only C calling convention.
4254 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4255 }
4256
4257 void getTargetDefines(const LangOptions &Opts,
4258 MacroBuilder &Builder) const override {
4259 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4260 Builder.defineMacro("__iamcu");
4261 Builder.defineMacro("__iamcu__");
4262 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004263
4264 bool allowsLargerPreferedTypeAlignment() const override {
4265 return false;
4266 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004267};
4268
Douglas Gregor9fabd852011-07-01 22:41:14 +00004269// RTEMS Target
4270template<typename Target>
4271class RTEMSTargetInfo : public OSTargetInfo<Target> {
4272protected:
Craig Topper3164f332014-03-11 03:39:26 +00004273 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4274 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004275 // RTEMS defines; list based off of gcc output
4276
Douglas Gregor9fabd852011-07-01 22:41:14 +00004277 Builder.defineMacro("__rtems__");
4278 Builder.defineMacro("__ELF__");
4279 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004280
Douglas Gregor9fabd852011-07-01 22:41:14 +00004281public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004282 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4283 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004284 switch (Triple.getArch()) {
4285 default:
4286 case llvm::Triple::x86:
4287 // this->MCountName = ".mcount";
4288 break;
4289 case llvm::Triple::mips:
4290 case llvm::Triple::mipsel:
4291 case llvm::Triple::ppc:
4292 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004293 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004294 // this->MCountName = "_mcount";
4295 break;
4296 case llvm::Triple::arm:
4297 // this->MCountName = "__mcount";
4298 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004299 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004300 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004301};
4302
Douglas Gregor9fabd852011-07-01 22:41:14 +00004303// x86-32 RTEMS target
4304class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4305public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004306 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4307 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004308 SizeType = UnsignedLong;
4309 IntPtrType = SignedLong;
4310 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004311 }
Craig Topper3164f332014-03-11 03:39:26 +00004312 void getTargetDefines(const LangOptions &Opts,
4313 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004314 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4315 Builder.defineMacro("__INTEL__");
4316 Builder.defineMacro("__rtems__");
4317 }
4318};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004319
Eli Friedman3fd920a2008-08-20 02:34:37 +00004320// x86-64 generic target
4321class X86_64TargetInfo : public X86TargetInfo {
4322public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004323 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4324 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004325 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004326 bool IsWinCOFF =
4327 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004328 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004329 LongDoubleWidth = 128;
4330 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004331 LargeArrayMinWidth = 128;
4332 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004333 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004334 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4335 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4336 IntPtrType = IsX32 ? SignedInt : SignedLong;
4337 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004338 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004339 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004340
Eric Christopher917e9522014-11-18 22:36:15 +00004341 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004342 resetDataLayout(IsX32
4343 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4344 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4345 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004346
4347 // Use fpret only for long double.
4348 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004349
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004350 // Use fp2ret for _Complex long double.
4351 ComplexLongDoubleUsesFP2Ret = true;
4352
Charles Davisc7d5c942015-09-17 20:55:33 +00004353 // Make __builtin_ms_va_list available.
4354 HasBuiltinMSVaList = true;
4355
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004356 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004357 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004358 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004359 }
Craig Topper3164f332014-03-11 03:39:26 +00004360 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004361 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004362 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004363
Craig Topper3164f332014-03-11 03:39:26 +00004364 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004365 if (RegNo == 0) return 0;
4366 if (RegNo == 1) return 1;
4367 return -1;
4368 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004369
Craig Topper3164f332014-03-11 03:39:26 +00004370 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004371 switch (CC) {
4372 case CC_C:
4373 case CC_Swift:
4374 case CC_X86VectorCall:
4375 case CC_IntelOclBicc:
4376 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004377 case CC_PreserveMost:
4378 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004379 return CCCR_OK;
4380 default:
4381 return CCCR_Warning;
4382 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004383 }
4384
Craig Topper3164f332014-03-11 03:39:26 +00004385 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004386 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004387 }
4388
Pavel Chupinfd223e12014-08-04 12:39:43 +00004389 // for x32 we need it here explicitly
4390 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004391 unsigned getUnwindWordWidth() const override { return 64; }
4392 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004393
4394 bool validateGlobalRegisterVariable(StringRef RegName,
4395 unsigned RegSize,
4396 bool &HasSizeMismatch) const override {
4397 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4398 // handle.
4399 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4400 // Check that the register size is 64-bit.
4401 HasSizeMismatch = RegSize != 64;
4402 return true;
4403 }
4404
4405 // Check if the register is a 32-bit register the backend can handle.
4406 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4407 HasSizeMismatch);
4408 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004409};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004410
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004411// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004412class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004413public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004414 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4415 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004416 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004417 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004418 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004419 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004420 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004421 SizeType = UnsignedLongLong;
4422 PtrDiffType = SignedLongLong;
4423 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004424 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004425
Craig Topper3164f332014-03-11 03:39:26 +00004426 void getTargetDefines(const LangOptions &Opts,
4427 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004428 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004429 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004430 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004431
Craig Topper3164f332014-03-11 03:39:26 +00004432 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004433 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004434 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004435
Craig Topper3164f332014-03-11 03:39:26 +00004436 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004437 switch (CC) {
4438 case CC_X86StdCall:
4439 case CC_X86ThisCall:
4440 case CC_X86FastCall:
4441 return CCCR_Ignore;
4442 case CC_C:
4443 case CC_X86VectorCall:
4444 case CC_IntelOclBicc:
4445 case CC_X86_64SysV:
4446 return CCCR_OK;
4447 default:
4448 return CCCR_Warning;
4449 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004450 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004451};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004452
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004453// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004454class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004455public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004456 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4457 const TargetOptions &Opts)
4458 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004459 LongDoubleWidth = LongDoubleAlign = 64;
4460 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004461 }
Craig Topper3164f332014-03-11 03:39:26 +00004462 void getTargetDefines(const LangOptions &Opts,
4463 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004464 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4465 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004466 Builder.defineMacro("_M_X64", "100");
4467 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004468 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004469};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004470
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004471// x86-64 MinGW target
4472class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4473public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004474 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4475 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004476 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4477 // with x86 FP ops. Weird.
4478 LongDoubleWidth = LongDoubleAlign = 128;
4479 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4480 }
4481
Craig Topper3164f332014-03-11 03:39:26 +00004482 void getTargetDefines(const LangOptions &Opts,
4483 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004484 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004485 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004486 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004487 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004488
4489 // GCC defines this macro when it is using __gxx_personality_seh0.
4490 if (!Opts.SjLjExceptions)
4491 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004492 }
4493};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004494
Yaron Kerend030d112015-07-22 17:38:19 +00004495// x86-64 Cygwin target
4496class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4497public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004498 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4499 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004500 TLSSupported = false;
4501 WCharType = UnsignedShort;
4502 }
4503 void getTargetDefines(const LangOptions &Opts,
4504 MacroBuilder &Builder) const override {
4505 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4506 Builder.defineMacro("__x86_64__");
4507 Builder.defineMacro("__CYGWIN__");
4508 Builder.defineMacro("__CYGWIN64__");
4509 addCygMingDefines(Opts, Builder);
4510 DefineStd(Builder, "unix", Opts);
4511 if (Opts.CPlusPlus)
4512 Builder.defineMacro("_GNU_SOURCE");
4513
4514 // GCC defines this macro when it is using __gxx_personality_seh0.
4515 if (!Opts.SjLjExceptions)
4516 Builder.defineMacro("__SEH__");
4517 }
4518};
4519
Eli Friedman2857ccb2009-07-01 03:36:11 +00004520class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4521public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004522 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4523 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004524 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004525 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4526 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004527 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004528 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004529 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004530 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004531
4532 bool handleTargetFeatures(std::vector<std::string> &Features,
4533 DiagnosticsEngine &Diags) override {
4534 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4535 Diags))
4536 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004537 // We now know the features we have: we can decide how to align vectors.
4538 MaxVectorAlign =
4539 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004540 return true;
4541 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004542};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004543
Eli Friedman245f2292009-07-05 22:31:18 +00004544class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4545public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004546 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4547 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004548 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004549 Int64Type = SignedLongLong;
4550 }
4551};
Eli Friedman245f2292009-07-05 22:31:18 +00004552
Eli Friedman9fa28852012-08-08 23:57:20 +00004553class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4554public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004555 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4556 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004557 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004558 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004559 }
4560};
Tim Northover9bb857a2013-01-31 12:13:10 +00004561
Eli Friedmanf05b7722008-08-20 07:44:10 +00004562class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004563 // Possible FPU choices.
4564 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004565 VFP2FPU = (1 << 0),
4566 VFP3FPU = (1 << 1),
4567 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004568 NeonFPU = (1 << 3),
4569 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004570 };
4571
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004572 // Possible HWDiv features.
4573 enum HWDivMode {
4574 HWDivThumb = (1 << 0),
4575 HWDivARM = (1 << 1)
4576 };
4577
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004578 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004579 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004580 }
4581
4582 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4583 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004584
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004585 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004586
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004587 StringRef CPUProfile;
4588 StringRef CPUAttr;
4589
Rafael Espindolaeb265472013-08-21 21:59:03 +00004590 enum {
4591 FP_Default,
4592 FP_VFP,
4593 FP_Neon
4594 } FPMath;
4595
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004596 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004597 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004598 unsigned ArchProfile;
4599 unsigned ArchVersion;
4600
Bernard Ogdenda13af32013-10-24 18:32:51 +00004601 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004602
Logan Chien57086ce2012-10-10 06:56:20 +00004603 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004604 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004605
4606 // Initialized via features.
4607 unsigned SoftFloat : 1;
4608 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004609
Bernard Ogden18b57012013-10-29 09:47:51 +00004610 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004611 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004612 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004613 unsigned Unaligned : 1;
4614
4615 enum {
4616 LDREX_B = (1 << 0), /// byte (8-bit)
4617 LDREX_H = (1 << 1), /// half (16-bit)
4618 LDREX_W = (1 << 2), /// word (32-bit)
4619 LDREX_D = (1 << 3), /// double (64-bit)
4620 };
4621
4622 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004623
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004624 // ACLE 6.5.1 Hardware floating point
4625 enum {
4626 HW_FP_HP = (1 << 1), /// half (16-bit)
4627 HW_FP_SP = (1 << 2), /// single (32-bit)
4628 HW_FP_DP = (1 << 3), /// double (64-bit)
4629 };
4630 uint32_t HW_FP;
4631
Chris Lattner5cc15e02010-03-03 19:03:45 +00004632 static const Builtin::Info BuiltinInfo[];
4633
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004634 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004635 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004636
4637 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004638 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004639
Renato Golin9ba39232015-02-27 16:35:48 +00004640 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4641 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4642 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004643 SizeType = UnsignedLong;
4644 else
4645 SizeType = UnsignedInt;
4646
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004647 switch (T.getOS()) {
4648 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004649 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004650 break;
4651 case llvm::Triple::Win32:
4652 WCharType = UnsignedShort;
4653 break;
4654 case llvm::Triple::Linux:
4655 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004656 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4657 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004658 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004659 }
4660
4661 UseBitFieldTypeAlignment = true;
4662
4663 ZeroLengthBitfieldBoundary = 0;
4664
Tim Northover147cd2f2014-10-14 22:12:21 +00004665 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4666 // so set preferred for small types to 32.
4667 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004668 resetDataLayout(BigEndian
4669 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4670 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004671 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004672 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004673 resetDataLayout("e"
4674 "-m:w"
4675 "-p:32:32"
4676 "-i64:64"
4677 "-v128:64:128"
4678 "-a:0:32"
4679 "-n32"
4680 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004681 } else if (T.isOSNaCl()) {
4682 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004683 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004684 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004685 resetDataLayout(BigEndian
4686 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4687 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004688 }
4689
4690 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004691 }
4692
Tim Northover5627d392015-10-30 16:30:45 +00004693 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004694 const llvm::Triple &T = getTriple();
4695
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004696 IsAAPCS = false;
4697
Tim Northover5627d392015-10-30 16:30:45 +00004698 if (IsAAPCS16)
4699 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4700 else
4701 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004702
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004703 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004704 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004705 SizeType = UnsignedInt;
4706 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004707 SizeType = UnsignedLong;
4708
4709 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4710 WCharType = SignedInt;
4711
4712 // Do not respect the alignment of bit-field types when laying out
4713 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4714 UseBitFieldTypeAlignment = false;
4715
4716 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4717 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4718 /// gcc.
4719 ZeroLengthBitfieldBoundary = 32;
4720
Tim Northover5627d392015-10-30 16:30:45 +00004721 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4722 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004723 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004724 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004725 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004726 BigEndian
4727 ? "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 +00004728 : "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 +00004729 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004730 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004731 BigEndian
4732 ? "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 +00004733 : "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 +00004734
4735 // FIXME: Override "preferred align" for double and long long.
4736 }
4737
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004738 void setArchInfo() {
4739 StringRef ArchName = getTriple().getArchName();
4740
Renato Goline84b0002015-10-08 16:43:26 +00004741 ArchISA = llvm::ARM::parseArchISA(ArchName);
4742 CPU = llvm::ARM::getDefaultCPU(ArchName);
4743 unsigned AK = llvm::ARM::parseArch(ArchName);
4744 if (AK != llvm::ARM::AK_INVALID)
4745 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004746 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004747 }
4748
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004749 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004750 StringRef SubArch;
4751
4752 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004753 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004754 SubArch = llvm::ARM::getSubArch(ArchKind);
4755 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4756 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004757
4758 // cache CPU related strings
4759 CPUAttr = getCPUAttr();
4760 CPUProfile = getCPUProfile();
4761 }
4762
4763 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004764 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004765 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004766 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004767 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4768 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004769 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004770 if (ArchProfile == llvm::ARM::PK_M) {
4771 MaxAtomicPromoteWidth = 32;
4772 if (ShouldUseInlineAtomic)
4773 MaxAtomicInlineWidth = 32;
4774 }
4775 else {
4776 MaxAtomicPromoteWidth = 64;
4777 if (ShouldUseInlineAtomic)
4778 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004779 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004780 }
4781
4782 bool isThumb() const {
4783 return (ArchISA == llvm::ARM::IK_THUMB);
4784 }
4785
4786 bool supportsThumb() const {
4787 return CPUAttr.count('T') || ArchVersion >= 6;
4788 }
4789
4790 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004791 return CPUAttr.equals("6T2") ||
4792 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004793 }
4794
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004795 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004796 // For most sub-arches, the build attribute CPU name is enough.
4797 // For Cortex variants, it's slightly different.
4798 switch(ArchKind) {
4799 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004800 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004801 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004802 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004803 case llvm::ARM::AK_ARMV7S:
4804 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004805 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004806 return "7A";
4807 case llvm::ARM::AK_ARMV7R:
4808 return "7R";
4809 case llvm::ARM::AK_ARMV7M:
4810 return "7M";
4811 case llvm::ARM::AK_ARMV7EM:
4812 return "7EM";
4813 case llvm::ARM::AK_ARMV8A:
4814 return "8A";
4815 case llvm::ARM::AK_ARMV8_1A:
4816 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004817 case llvm::ARM::AK_ARMV8_2A:
4818 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004819 case llvm::ARM::AK_ARMV8MBaseline:
4820 return "8M_BASE";
4821 case llvm::ARM::AK_ARMV8MMainline:
4822 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004823 }
4824 }
4825
4826 StringRef getCPUProfile() const {
4827 switch(ArchProfile) {
4828 case llvm::ARM::PK_A:
4829 return "A";
4830 case llvm::ARM::PK_R:
4831 return "R";
4832 case llvm::ARM::PK_M:
4833 return "M";
4834 default:
4835 return "";
4836 }
4837 }
4838
Chris Lattner17df24e2008-04-21 18:56:49 +00004839public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004840 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4841 bool IsBigEndian)
4842 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4843 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004844 BigEndian = IsBigEndian;
4845
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004846 switch (getTriple().getOS()) {
4847 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004848 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004849 break;
4850 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004851 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004852 break;
4853 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004854
Renato Goline84b0002015-10-08 16:43:26 +00004855 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004856 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004857
Chris Lattner1a8f3942010-04-23 16:29:58 +00004858 // {} in inline assembly are neon specifiers, not assembly variant
4859 // specifiers.
4860 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004861
Eric Christopher0e261882014-12-05 01:06:59 +00004862 // FIXME: This duplicates code from the driver that sets the -target-abi
4863 // option - this code is used if -target-abi isn't passed and should
4864 // be unified in some way.
4865 if (Triple.isOSBinFormatMachO()) {
4866 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4867 // the frontend matches that.
4868 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4869 Triple.getOS() == llvm::Triple::UnknownOS ||
4870 StringRef(CPU).startswith("cortex-m")) {
4871 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004872 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004873 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004874 } else {
4875 setABI("apcs-gnu");
4876 }
4877 } else if (Triple.isOSWindows()) {
4878 // FIXME: this is invalid for WindowsCE
4879 setABI("aapcs");
4880 } else {
4881 // Select the default based on the platform.
4882 switch (Triple.getEnvironment()) {
4883 case llvm::Triple::Android:
4884 case llvm::Triple::GNUEABI:
4885 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004886 case llvm::Triple::MuslEABI:
4887 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004888 setABI("aapcs-linux");
4889 break;
4890 case llvm::Triple::EABIHF:
4891 case llvm::Triple::EABI:
4892 setABI("aapcs");
4893 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004894 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004895 setABI("apcs-gnu");
4896 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004897 default:
4898 if (Triple.getOS() == llvm::Triple::NetBSD)
4899 setABI("apcs-gnu");
4900 else
4901 setABI("aapcs");
4902 break;
4903 }
4904 }
John McCall86353412010-08-21 22:46:04 +00004905
4906 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004907 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004908
Renato Golin15b86152015-07-03 16:41:13 +00004909 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004910 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004911
James Molloya7139222012-03-12 09:14:10 +00004912 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004913 // the alignment of the zero-length bitfield is greater than the member
4914 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004915 // zero length bitfield.
4916 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004917
4918 if (Triple.getOS() == llvm::Triple::Linux ||
4919 Triple.getOS() == llvm::Triple::UnknownOS)
4920 this->MCountName =
4921 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004922 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004923
Alp Toker4925ba72014-06-07 23:30:42 +00004924 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004925
Craig Topper3164f332014-03-11 03:39:26 +00004926 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004927 ABI = Name;
4928
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004929 // The defaults (above) are for AAPCS, check if we need to change them.
4930 //
4931 // FIXME: We need support for -meabi... we could just mangle it into the
4932 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004933 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004934 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004935 return true;
4936 }
4937 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4938 setABIAAPCS();
4939 return true;
4940 }
4941 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004942 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004943
Renato Golinf5c4dec2015-05-27 13:33:00 +00004944 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004945 bool
4946 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4947 StringRef CPU,
4948 const std::vector<std::string> &FeaturesVec) const override {
4949
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004950 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004951 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004952
4953 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004954 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004955 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4956
4957 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004958 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004959 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4960
4961 for (const char *Feature : TargetFeatures)
4962 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004963 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004964
Eric Christopher007b0a02015-08-28 22:32:01 +00004965 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004966 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004967
Craig Topper3164f332014-03-11 03:39:26 +00004968 bool handleTargetFeatures(std::vector<std::string> &Features,
4969 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004970 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004971 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004972 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004973 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004974 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004975 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004976 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004977
Ranjeet Singhac08e532015-06-24 23:39:25 +00004978 // This does not diagnose illegal cases like having both
4979 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4980 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004981 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004982 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004983 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004984 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004985 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004986 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004987 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004988 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004989 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004990 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004991 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004992 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004993 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004994 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004995 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004996 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004997 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004998 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004999 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005000 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005001 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005002 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005003 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005004 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005005 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005006 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005007 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005008 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005009 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005010 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005011 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005012 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005013 } else if (Feature == "+strict-align") {
5014 Unaligned = 0;
5015 } else if (Feature == "+fp16") {
5016 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005017 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005018 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005019 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005020
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005021 switch (ArchVersion) {
5022 case 6:
5023 if (ArchProfile == llvm::ARM::PK_M)
5024 LDREX = 0;
5025 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5026 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5027 else
5028 LDREX = LDREX_W;
5029 break;
5030 case 7:
5031 if (ArchProfile == llvm::ARM::PK_M)
5032 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5033 else
5034 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5035 break;
5036 case 8:
5037 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5038 }
5039
Rafael Espindolaeb265472013-08-21 21:59:03 +00005040 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5041 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5042 return false;
5043 }
5044
5045 if (FPMath == FP_Neon)
5046 Features.push_back("+neonfp");
5047 else if (FPMath == FP_VFP)
5048 Features.push_back("-neonfp");
5049
Daniel Dunbar893d4752009-12-19 04:15:38 +00005050 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005051 auto Feature =
5052 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5053 if (Feature != Features.end())
5054 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005055
Rafael Espindolaeb265472013-08-21 21:59:03 +00005056 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005057 }
5058
Craig Topper3164f332014-03-11 03:39:26 +00005059 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005060 return llvm::StringSwitch<bool>(Feature)
5061 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005062 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005063 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005064 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005065 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005066 .Case("hwdiv", HWDiv & HWDivThumb)
5067 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005068 .Default(false);
5069 }
Renato Golin15b86152015-07-03 16:41:13 +00005070
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005071 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005072 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005073 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005074
Renato Golin15b86152015-07-03 16:41:13 +00005075 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005076 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005077 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005078 CPU = Name;
5079 return true;
5080 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005081
Craig Topper3164f332014-03-11 03:39:26 +00005082 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005083
Craig Topper3164f332014-03-11 03:39:26 +00005084 void getTargetDefines(const LangOptions &Opts,
5085 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005086 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005087 Builder.defineMacro("__arm");
5088 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005089 // For bare-metal none-eabi.
5090 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5091 getTriple().getEnvironment() == llvm::Triple::EABI)
5092 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005093
Chris Lattnerecd49032009-03-02 22:27:17 +00005094 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005095 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005096
5097 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5098 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005099 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005100 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5101
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005102 if (!CPUAttr.empty())
5103 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005104
5105 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005106 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005107 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005108
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005109 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005110 // ACLE 6.5.7 Crypto Extension
5111 if (Crypto)
5112 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5113 // ACLE 6.5.8 CRC32 Extension
5114 if (CRC)
5115 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5116 // ACLE 6.5.10 Numeric Maximum and Minimum
5117 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5118 // ACLE 6.5.9 Directed Rounding
5119 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005120 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005121
5122 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5123 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005124 // NOTE that the default profile is assumed to be 'A'
5125 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005126 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5127
Bradley Smithf4affc12016-03-03 13:52:22 +00005128 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5129 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5130 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5131 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005132 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005133 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005134 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005135 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5136
5137 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5138 // instruction set such as ARM or Thumb.
5139 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5140
5141 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5142
5143 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005144 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005145 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005146
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005147 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005148 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005149 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005150
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005151 // ACLE 6.4.4 LDREX/STREX
5152 if (LDREX)
5153 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5154
5155 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005156 if (ArchVersion == 5 ||
5157 (ArchVersion == 6 && CPUProfile != "M") ||
5158 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005159 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5160
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005161 // ACLE 6.5.1 Hardware Floating Point
5162 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005163 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005164
Yi Konga44c4d72014-06-27 21:25:42 +00005165 // ACLE predefines.
5166 Builder.defineMacro("__ARM_ACLE", "200");
5167
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005168 // FP16 support (we currently only support IEEE format).
5169 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5170 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5171
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005172 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005173 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005174 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5175
Mike Stump9d54bd72009-04-08 02:07:04 +00005176 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005177
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005178 // FIXME: It's more complicated than this and we don't really support
5179 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005180 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005181 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005182 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005183
David Tweed8f676532012-10-25 13:33:01 +00005184 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005185 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005186 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005187 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005188 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005189 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005190 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005191
Tim Northover28fc0e12016-04-28 13:59:55 +00005192 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5193 ABI == "aapcs16")
5194 Builder.defineMacro("__ARM_PCS_VFP", "1");
5195
Daniel Dunbar893d4752009-12-19 04:15:38 +00005196 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005197 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005198
5199 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005200 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005201
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005202 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005203 Builder.defineMacro("__THUMBEL__");
5204 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005205 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005206 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005207 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005208
5209 // ACLE 6.4.9 32-bit SIMD instructions
5210 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5211 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5212
5213 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005214 if (((HWDiv & HWDivThumb) && isThumb()) ||
5215 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005216 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005217 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005218 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005219
5220 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005221 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005222
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005223 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005224 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005225 if (FPU & VFP2FPU)
5226 Builder.defineMacro("__ARM_VFPV2__");
5227 if (FPU & VFP3FPU)
5228 Builder.defineMacro("__ARM_VFPV3__");
5229 if (FPU & VFP4FPU)
5230 Builder.defineMacro("__ARM_VFPV4__");
5231 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005232
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005233 // This only gets set when Neon instructions are actually available, unlike
5234 // the VFP define, hence the soft float and arch check. This is subtly
5235 // different from gcc, we follow the intent which was that it should be set
5236 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005237 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005238 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005239 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005240 // current AArch32 NEON implementations do not support double-precision
5241 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005242 Builder.defineMacro("__ARM_NEON_FP",
5243 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005244 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005245
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005246 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5247 Opts.ShortWChar ? "2" : "4");
5248
5249 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5250 Opts.ShortEnums ? "1" : "4");
5251
Bradley Smithf4affc12016-03-03 13:52:22 +00005252 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005253 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5254 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5255 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5256 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5257 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005258
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005259 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005260 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005261 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005262 }
5263
5264 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005265 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005266 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5267 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005268 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005269 }
5270
5271 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005272 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005273 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005274
5275 if (Opts.UnsafeFPMath)
5276 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005277
5278 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5279 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005280 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005281
Craig Topper6c03a542015-10-19 04:51:35 +00005282 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5283 return llvm::makeArrayRef(BuiltinInfo,
5284 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005285 }
Craig Topper3164f332014-03-11 03:39:26 +00005286 bool isCLZForZeroUndef() const override { return false; }
5287 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005288 return IsAAPCS
5289 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005290 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5291 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005292 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005293 ArrayRef<const char *> getGCCRegNames() const override;
5294 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005295 bool validateAsmConstraint(const char *&Name,
5296 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005297 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005298 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005299 case 'l': // r0-r7
5300 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005301 case 't': // VFP Floating point register single precision
5302 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005303 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005304 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005305 case 'I':
5306 case 'J':
5307 case 'K':
5308 case 'L':
5309 case 'M':
5310 // FIXME
5311 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005312 case 'Q': // A memory address that is a single base register.
5313 Info.setAllowsMemory();
5314 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005315 case 'U': // a memory reference...
5316 switch (Name[1]) {
5317 case 'q': // ...ARMV4 ldrsb
5318 case 'v': // ...VFP load/store (reg+constant offset)
5319 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005320 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005321 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005322 case 'n': // valid address for Neon doubleword vector load/store
5323 case 'm': // valid address for Neon element and structure load/store
5324 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005325 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005326 Info.setAllowsMemory();
5327 Name++;
5328 return true;
5329 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005330 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005331 return false;
5332 }
Craig Topper3164f332014-03-11 03:39:26 +00005333 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005334 std::string R;
5335 switch (*Constraint) {
5336 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005337 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005338 Constraint++;
5339 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005340 case 'p': // 'p' should be translated to 'r' by default.
5341 R = std::string("r");
5342 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005343 default:
5344 return std::string(1, *Constraint);
5345 }
5346 return R;
5347 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005348 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005349 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005350 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005351 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005352 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005353
Bill Wendling9d1ee112012-10-25 23:28:48 +00005354 // Strip off constraint modifiers.
5355 while (Constraint[0] == '=' ||
5356 Constraint[0] == '+' ||
5357 Constraint[0] == '&')
5358 Constraint = Constraint.substr(1);
5359
5360 switch (Constraint[0]) {
5361 default: break;
5362 case 'r': {
5363 switch (Modifier) {
5364 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005365 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005366 case 'q':
5367 // A register of size 32 cannot fit a vector type.
5368 return false;
5369 }
5370 }
5371 }
5372
5373 return true;
5374 }
Craig Topper3164f332014-03-11 03:39:26 +00005375 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005376 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005377 return "";
5378 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005379
Craig Topper3164f332014-03-11 03:39:26 +00005380 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005381 switch (CC) {
5382 case CC_AAPCS:
5383 case CC_AAPCS_VFP:
5384 case CC_Swift:
5385 return CCCR_OK;
5386 default:
5387 return CCCR_Warning;
5388 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005389 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005390
Craig Topper3164f332014-03-11 03:39:26 +00005391 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005392 if (RegNo == 0) return 0;
5393 if (RegNo == 1) return 1;
5394 return -1;
5395 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005396
5397 bool hasSjLjLowering() const override {
5398 return true;
5399 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005400};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005401
Rafael Espindolaeb265472013-08-21 21:59:03 +00005402bool ARMTargetInfo::setFPMath(StringRef Name) {
5403 if (Name == "neon") {
5404 FPMath = FP_Neon;
5405 return true;
5406 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5407 Name == "vfp4") {
5408 FPMath = FP_VFP;
5409 return true;
5410 }
5411 return false;
5412}
5413
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005414const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005415 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005416 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005417 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5418
5419 // Float registers
5420 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5421 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5422 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005423 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005424
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005425 // Double registers
5426 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5427 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005428 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5429 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005430
5431 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005432 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5433 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005434};
5435
Craig Topperf054e3a2015-10-19 03:52:27 +00005436ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5437 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005438}
5439
5440const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005441 { { "a1" }, "r0" },
5442 { { "a2" }, "r1" },
5443 { { "a3" }, "r2" },
5444 { { "a4" }, "r3" },
5445 { { "v1" }, "r4" },
5446 { { "v2" }, "r5" },
5447 { { "v3" }, "r6" },
5448 { { "v4" }, "r7" },
5449 { { "v5" }, "r8" },
5450 { { "v6", "rfp" }, "r9" },
5451 { { "sl" }, "r10" },
5452 { { "fp" }, "r11" },
5453 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005454 { { "r13" }, "sp" },
5455 { { "r14" }, "lr" },
5456 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005457 // The S, D and Q registers overlap, but aren't really aliases; we
5458 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005459};
5460
Craig Topperf054e3a2015-10-19 03:52:27 +00005461ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5462 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005463}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005464
5465const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005466#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005467 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005468#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5469 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005470#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005471
Craig Topper07d3b622015-08-07 05:14:44 +00005472#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005473 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005474#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005475 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005476#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5477 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005478#include "clang/Basic/BuiltinsARM.def"
5479};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005480
5481class ARMleTargetInfo : public ARMTargetInfo {
5482public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005483 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5484 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005485 void getTargetDefines(const LangOptions &Opts,
5486 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005487 Builder.defineMacro("__ARMEL__");
5488 ARMTargetInfo::getTargetDefines(Opts, Builder);
5489 }
5490};
5491
5492class ARMbeTargetInfo : public ARMTargetInfo {
5493public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005494 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5495 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005496 void getTargetDefines(const LangOptions &Opts,
5497 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005498 Builder.defineMacro("__ARMEB__");
5499 Builder.defineMacro("__ARM_BIG_ENDIAN");
5500 ARMTargetInfo::getTargetDefines(Opts, Builder);
5501 }
5502};
Chris Lattner17df24e2008-04-21 18:56:49 +00005503
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005504class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5505 const llvm::Triple Triple;
5506public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005507 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5508 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005509 WCharType = UnsignedShort;
5510 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005511 }
5512 void getVisualStudioDefines(const LangOptions &Opts,
5513 MacroBuilder &Builder) const {
5514 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5515
5516 // FIXME: this is invalid for WindowsCE
5517 Builder.defineMacro("_M_ARM_NT", "1");
5518 Builder.defineMacro("_M_ARMT", "_M_ARM");
5519 Builder.defineMacro("_M_THUMB", "_M_ARM");
5520
5521 assert((Triple.getArch() == llvm::Triple::arm ||
5522 Triple.getArch() == llvm::Triple::thumb) &&
5523 "invalid architecture for Windows ARM target info");
5524 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5525 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5526
5527 // TODO map the complete set of values
5528 // 31: VFPv3 40: VFPv4
5529 Builder.defineMacro("_M_ARM_FP", "31");
5530 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005531 BuiltinVaListKind getBuiltinVaListKind() const override {
5532 return TargetInfo::CharPtrBuiltinVaList;
5533 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005534 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5535 switch (CC) {
5536 case CC_X86StdCall:
5537 case CC_X86ThisCall:
5538 case CC_X86FastCall:
5539 case CC_X86VectorCall:
5540 return CCCR_Ignore;
5541 case CC_C:
5542 return CCCR_OK;
5543 default:
5544 return CCCR_Warning;
5545 }
5546 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005547};
5548
5549// Windows ARM + Itanium C++ ABI Target
5550class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5551public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005552 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5553 const TargetOptions &Opts)
5554 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005555 TheCXXABI.set(TargetCXXABI::GenericARM);
5556 }
5557
5558 void getTargetDefines(const LangOptions &Opts,
5559 MacroBuilder &Builder) const override {
5560 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5561
5562 if (Opts.MSVCCompat)
5563 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5564 }
5565};
5566
5567// Windows ARM, MS (C++) ABI
5568class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5569public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005570 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5571 const TargetOptions &Opts)
5572 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005573 TheCXXABI.set(TargetCXXABI::Microsoft);
5574 }
5575
5576 void getTargetDefines(const LangOptions &Opts,
5577 MacroBuilder &Builder) const override {
5578 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5579 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5580 }
5581};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005582
Yaron Keren321249c2015-07-15 13:32:23 +00005583// ARM MinGW target
5584class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5585public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005586 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5587 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005588 TheCXXABI.set(TargetCXXABI::GenericARM);
5589 }
5590
5591 void getTargetDefines(const LangOptions &Opts,
5592 MacroBuilder &Builder) const override {
5593 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5594 DefineStd(Builder, "WIN32", Opts);
5595 DefineStd(Builder, "WINNT", Opts);
5596 Builder.defineMacro("_ARM_");
5597 addMinGWDefines(Opts, Builder);
5598 }
5599};
5600
5601// ARM Cygwin target
5602class CygwinARMTargetInfo : public ARMleTargetInfo {
5603public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005604 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5605 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005606 TLSSupported = false;
5607 WCharType = UnsignedShort;
5608 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005609 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005610 }
5611 void getTargetDefines(const LangOptions &Opts,
5612 MacroBuilder &Builder) const override {
5613 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5614 Builder.defineMacro("_ARM_");
5615 Builder.defineMacro("__CYGWIN__");
5616 Builder.defineMacro("__CYGWIN32__");
5617 DefineStd(Builder, "unix", Opts);
5618 if (Opts.CPlusPlus)
5619 Builder.defineMacro("_GNU_SOURCE");
5620 }
5621};
5622
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005623class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005624protected:
Craig Topper3164f332014-03-11 03:39:26 +00005625 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5626 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005627 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005628 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005629
Torok Edwinb2b37c62009-06-30 17:10:35 +00005630public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005631 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5632 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005633 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005634 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005635 // FIXME: This should be based off of the target features in
5636 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005637 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005638
Tim Northoverd88ecb32016-01-27 19:32:40 +00005639 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005640 // Darwin on iOS uses a variant of the ARM C++ ABI.
5641 TheCXXABI.set(TargetCXXABI::WatchOS);
5642
5643 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5644 // size_t is long, it's a bit weird for it to be int.
5645 PtrDiffType = SignedLong;
5646
5647 // BOOL should be a real boolean on the new ABI
5648 UseSignedCharForObjCBool = false;
5649 } else
5650 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005651 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005652};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005653
Tim Northover573cbee2014-05-24 12:52:07 +00005654class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005655 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005656 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5657 static const char *const GCCRegNames[];
5658
James Molloy75f5f9e2014-04-16 15:33:48 +00005659 enum FPUModeEnum {
5660 FPUMode,
5661 NeonMode
5662 };
5663
5664 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005665 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005666 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005667 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005668 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005669
Tim Northovera2ee4332014-03-29 15:09:45 +00005670 static const Builtin::Info BuiltinInfo[];
5671
5672 std::string ABI;
5673
5674public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005675 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005676 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005677 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5678 WCharType = SignedInt;
5679
5680 // NetBSD apparently prefers consistency across ARM targets to consistency
5681 // across 64-bit targets.
5682 Int64Type = SignedLongLong;
5683 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005684 } else {
5685 WCharType = UnsignedInt;
5686 Int64Type = SignedLong;
5687 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005688 }
5689
Tim Northovera2ee4332014-03-29 15:09:45 +00005690 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005691 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005692 MaxAtomicInlineWidth = 128;
5693 MaxAtomicPromoteWidth = 128;
5694
Tim Northovera6a19f12015-02-06 01:25:07 +00005695 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005696 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5697
Tim Northovera2ee4332014-03-29 15:09:45 +00005698 // {} in inline assembly are neon specifiers, not assembly variant
5699 // specifiers.
5700 NoAsmVariants = true;
5701
Tim Northover7ad87af2015-01-16 18:44:04 +00005702 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5703 // contributes to the alignment of the containing aggregate in the same way
5704 // a plain (non bit-field) member of that type would, without exception for
5705 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005706 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005707 UseZeroLengthBitfieldAlignment = true;
5708
Tim Northover573cbee2014-05-24 12:52:07 +00005709 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005710 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005711
5712 if (Triple.getOS() == llvm::Triple::Linux ||
5713 Triple.getOS() == llvm::Triple::UnknownOS)
5714 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005715 }
5716
Alp Toker4925ba72014-06-07 23:30:42 +00005717 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005718 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005719 if (Name != "aapcs" && Name != "darwinpcs")
5720 return false;
5721
5722 ABI = Name;
5723 return true;
5724 }
5725
David Blaikie1cbb9712014-11-14 19:09:44 +00005726 bool setCPU(const std::string &Name) override {
Renato Golin3b8709c2016-05-25 12:36:31 +00005727 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5728 .Case("generic", true)
5729 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5730 "cortex-a35", "exynos-m1", true)
Sjoerd Meijer90df4a72016-06-02 10:48:37 +00005731 .Case("cortex-a73", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005732 .Case("cyclone", true)
5733 .Case("kryo", true)
Pankaj Gode3267e842016-06-29 10:00:31 +00005734 .Case("vulcan", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005735 .Default(false);
5736 return CPUKnown;
Tim Northovera2ee4332014-03-29 15:09:45 +00005737 }
5738
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005739 void getTargetDefines(const LangOptions &Opts,
5740 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005741 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005742 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005743
5744 // Target properties.
5745 Builder.defineMacro("_LP64");
5746 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005747
5748 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5749 Builder.defineMacro("__ARM_ACLE", "200");
5750 Builder.defineMacro("__ARM_ARCH", "8");
5751 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5752
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005753 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005754 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005755 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005756
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005757 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5758 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5759 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5760 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005761 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005762 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5763 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005764
5765 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5766
5767 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005768 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005769
5770 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5771 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005772 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5773 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005774
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005775 if (Opts.UnsafeFPMath)
5776 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005777
5778 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5779
5780 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5781 Opts.ShortEnums ? "1" : "4");
5782
James Molloy75f5f9e2014-04-16 15:33:48 +00005783 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005784 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005785 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005786 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005787 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005788
Bradley Smith418c5932014-05-02 15:17:51 +00005789 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005790 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005791
James Molloy75f5f9e2014-04-16 15:33:48 +00005792 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005793 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5794
5795 if (Unaligned)
5796 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005797
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005798 if (V8_1A)
5799 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5800
Reid Klecknerd167d422015-05-06 15:31:46 +00005801 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5802 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5803 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5804 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5805 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005806 }
5807
Craig Topper6c03a542015-10-19 04:51:35 +00005808 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5809 return llvm::makeArrayRef(BuiltinInfo,
5810 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005811 }
5812
David Blaikie1cbb9712014-11-14 19:09:44 +00005813 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005814 return Feature == "aarch64" ||
5815 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005816 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005817 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005818 }
5819
James Molloy5e73df52014-04-16 15:06:20 +00005820 bool handleTargetFeatures(std::vector<std::string> &Features,
5821 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005822 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005823 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005824 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005825 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005826 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005827
Eric Christopher610fe112015-08-26 08:21:55 +00005828 for (const auto &Feature : Features) {
5829 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005830 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005831 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005832 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005833 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005834 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005835 if (Feature == "+strict-align")
5836 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005837 if (Feature == "+v8.1a")
5838 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005839 }
5840
James Y Knightb214cbc2016-03-04 19:00:41 +00005841 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005842
5843 return true;
5844 }
5845
John McCall477f2bb2016-03-03 06:39:32 +00005846 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5847 switch (CC) {
5848 case CC_C:
5849 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005850 case CC_PreserveMost:
5851 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005852 return CCCR_OK;
5853 default:
5854 return CCCR_Warning;
5855 }
5856 }
5857
David Blaikie1cbb9712014-11-14 19:09:44 +00005858 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005859
David Blaikie1cbb9712014-11-14 19:09:44 +00005860 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005861 return TargetInfo::AArch64ABIBuiltinVaList;
5862 }
5863
Craig Topperf054e3a2015-10-19 03:52:27 +00005864 ArrayRef<const char *> getGCCRegNames() const override;
5865 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005866
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005867 bool validateAsmConstraint(const char *&Name,
5868 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005869 switch (*Name) {
5870 default:
5871 return false;
5872 case 'w': // Floating point and SIMD registers (V0-V31)
5873 Info.setAllowsRegister();
5874 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005875 case 'I': // Constant that can be used with an ADD instruction
5876 case 'J': // Constant that can be used with a SUB instruction
5877 case 'K': // Constant that can be used with a 32-bit logical instruction
5878 case 'L': // Constant that can be used with a 64-bit logical instruction
5879 case 'M': // Constant that can be used as a 32-bit MOV immediate
5880 case 'N': // Constant that can be used as a 64-bit MOV immediate
5881 case 'Y': // Floating point constant zero
5882 case 'Z': // Integer constant zero
5883 return true;
5884 case 'Q': // A memory reference with base register and no offset
5885 Info.setAllowsMemory();
5886 return true;
5887 case 'S': // A symbolic address
5888 Info.setAllowsRegister();
5889 return true;
5890 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005891 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5892 // Utf: A memory address suitable for ldp/stp in TF mode.
5893 // Usa: An absolute symbolic address.
5894 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5895 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005896 case 'z': // Zero register, wzr or xzr
5897 Info.setAllowsRegister();
5898 return true;
5899 case 'x': // Floating point and SIMD registers (V0-V15)
5900 Info.setAllowsRegister();
5901 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005902 }
5903 return false;
5904 }
5905
Akira Hatanaka987f1862014-08-22 06:05:21 +00005906 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005907 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005908 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005909 // Strip off constraint modifiers.
5910 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5911 Constraint = Constraint.substr(1);
5912
5913 switch (Constraint[0]) {
5914 default:
5915 return true;
5916 case 'z':
5917 case 'r': {
5918 switch (Modifier) {
5919 case 'x':
5920 case 'w':
5921 // For now assume that the person knows what they're
5922 // doing with the modifier.
5923 return true;
5924 default:
5925 // By default an 'r' constraint will be in the 'x'
5926 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005927 if (Size == 64)
5928 return true;
5929
5930 SuggestedModifier = "w";
5931 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005932 }
5933 }
5934 }
5935 }
5936
David Blaikie1cbb9712014-11-14 19:09:44 +00005937 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005938
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005939 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005940 if (RegNo == 0)
5941 return 0;
5942 if (RegNo == 1)
5943 return 1;
5944 return -1;
5945 }
5946};
5947
Tim Northover573cbee2014-05-24 12:52:07 +00005948const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005949 // 32-bit Integer registers
5950 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5951 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5952 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5953
5954 // 64-bit Integer registers
5955 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5956 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5957 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5958
5959 // 32-bit floating point regsisters
5960 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5961 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5962 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5963
5964 // 64-bit floating point regsisters
5965 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5966 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5967 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5968
5969 // Vector registers
5970 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5971 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5972 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5973};
5974
Craig Topperf054e3a2015-10-19 03:52:27 +00005975ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5976 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005977}
5978
Tim Northover573cbee2014-05-24 12:52:07 +00005979const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005980 { { "w31" }, "wsp" },
5981 { { "x29" }, "fp" },
5982 { { "x30" }, "lr" },
5983 { { "x31" }, "sp" },
5984 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5985 // don't want to substitute one of these for a different-sized one.
5986};
5987
Craig Topperf054e3a2015-10-19 03:52:27 +00005988ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5989 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005990}
5991
Tim Northover573cbee2014-05-24 12:52:07 +00005992const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005993#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005994 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005995#include "clang/Basic/BuiltinsNEON.def"
5996
5997#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005998 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005999#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006000};
James Molloy5e73df52014-04-16 15:06:20 +00006001
Tim Northover573cbee2014-05-24 12:52:07 +00006002class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006003 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006004 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006005 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006006 else
Evandro Menezes04abc142016-06-21 15:55:29 +00006007 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006008 }
6009
6010public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006011 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6012 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00006013 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006014 }
James Molloy5e73df52014-04-16 15:06:20 +00006015 void getTargetDefines(const LangOptions &Opts,
6016 MacroBuilder &Builder) const override {
6017 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006018 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006019 }
6020};
6021
Tim Northover573cbee2014-05-24 12:52:07 +00006022class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006023 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006024 assert(!getTriple().isOSBinFormatMachO());
Evandro Menezes04abc142016-06-21 15:55:29 +00006025 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006026 }
6027
6028public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006029 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6030 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006031 void getTargetDefines(const LangOptions &Opts,
6032 MacroBuilder &Builder) const override {
6033 Builder.defineMacro("__AARCH64EB__");
6034 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6035 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006036 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006037 }
6038};
Tim Northovera2ee4332014-03-29 15:09:45 +00006039
Tim Northover573cbee2014-05-24 12:52:07 +00006040class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006041protected:
6042 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6043 MacroBuilder &Builder) const override {
6044 Builder.defineMacro("__AARCH64_SIMD__");
6045 Builder.defineMacro("__ARM64_ARCH_8__");
6046 Builder.defineMacro("__ARM_NEON__");
6047 Builder.defineMacro("__LITTLE_ENDIAN__");
6048 Builder.defineMacro("__REGISTER_PREFIX__", "");
6049 Builder.defineMacro("__arm64", "1");
6050 Builder.defineMacro("__arm64__", "1");
6051
6052 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6053 }
6054
Tim Northovera2ee4332014-03-29 15:09:45 +00006055public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006056 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6057 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006058 Int64Type = SignedLongLong;
6059 WCharType = SignedInt;
6060 UseSignedCharForObjCBool = false;
6061
Tim Northovera6a19f12015-02-06 01:25:07 +00006062 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006063 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6064
6065 TheCXXABI.set(TargetCXXABI::iOS64);
6066 }
6067
David Blaikie1cbb9712014-11-14 19:09:44 +00006068 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006069 return TargetInfo::CharPtrBuiltinVaList;
6070 }
6071};
Tim Northovera2ee4332014-03-29 15:09:45 +00006072
Tony Linthicum76329bf2011-12-12 21:14:55 +00006073// Hexagon abstract base class
6074class HexagonTargetInfo : public TargetInfo {
6075 static const Builtin::Info BuiltinInfo[];
6076 static const char * const GCCRegNames[];
6077 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6078 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006079 bool HasHVX, HasHVXDouble;
6080
Tony Linthicum76329bf2011-12-12 21:14:55 +00006081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006082 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6083 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006084 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006085 // Specify the vector alignment explicitly. For v512x1, the calculated
6086 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6087 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006088 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006089 "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 +00006090 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006091 SizeType = UnsignedInt;
6092 PtrDiffType = SignedInt;
6093 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006094
6095 // {} in inline assembly are packet specifiers, not assembly variant
6096 // specifiers.
6097 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006098
6099 LargeArrayMinWidth = 64;
6100 LargeArrayAlign = 64;
6101 UseBitFieldTypeAlignment = true;
6102 ZeroLengthBitfieldBoundary = 32;
6103 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006104 }
6105
Craig Topper6c03a542015-10-19 04:51:35 +00006106 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6107 return llvm::makeArrayRef(BuiltinInfo,
6108 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006109 }
6110
Craig Topper3164f332014-03-11 03:39:26 +00006111 bool validateAsmConstraint(const char *&Name,
6112 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006113 switch (*Name) {
6114 case 'v':
6115 case 'q':
6116 if (HasHVX) {
6117 Info.setAllowsRegister();
6118 return true;
6119 }
6120 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006121 case 's':
6122 // Relocatable constant.
6123 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006124 }
6125 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006126 }
6127
Craig Topper3164f332014-03-11 03:39:26 +00006128 void getTargetDefines(const LangOptions &Opts,
6129 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006130
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006131 bool isCLZForZeroUndef() const override { return false; }
6132
Craig Topper3164f332014-03-11 03:39:26 +00006133 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006134 return llvm::StringSwitch<bool>(Feature)
6135 .Case("hexagon", true)
6136 .Case("hvx", HasHVX)
6137 .Case("hvx-double", HasHVXDouble)
6138 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006139 }
Craig Topper3164f332014-03-11 03:39:26 +00006140
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006141 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6142 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6143 const override;
6144
6145 bool handleTargetFeatures(std::vector<std::string> &Features,
6146 DiagnosticsEngine &Diags) override;
6147
Craig Topper3164f332014-03-11 03:39:26 +00006148 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006149 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006150 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006151 ArrayRef<const char *> getGCCRegNames() const override;
6152 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006153 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006154 return "";
6155 }
Sebastian Pop86500282012-01-13 20:37:10 +00006156
6157 static const char *getHexagonCPUSuffix(StringRef Name) {
6158 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006159 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006160 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006161 .Case("hexagonv55", "55")
6162 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006163 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006164 }
6165
Craig Topper3164f332014-03-11 03:39:26 +00006166 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006167 if (!getHexagonCPUSuffix(Name))
6168 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006169 CPU = Name;
6170 return true;
6171 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006172
6173 int getEHDataRegisterNumber(unsigned RegNo) const override {
6174 return RegNo < 2 ? RegNo : -1;
6175 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006176};
6177
6178void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006179 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006180 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006181 Builder.defineMacro("__hexagon__", "1");
6182
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006183 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006184 Builder.defineMacro("__HEXAGON_V4__");
6185 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006186 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006187 Builder.defineMacro("__QDSP6_V4__");
6188 Builder.defineMacro("__QDSP6_ARCH__", "4");
6189 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006190 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006191 Builder.defineMacro("__HEXAGON_V5__");
6192 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6193 if(Opts.HexagonQdsp6Compat) {
6194 Builder.defineMacro("__QDSP6_V5__");
6195 Builder.defineMacro("__QDSP6_ARCH__", "5");
6196 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006197 } else if (CPU == "hexagonv55") {
6198 Builder.defineMacro("__HEXAGON_V55__");
6199 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6200 Builder.defineMacro("__QDSP6_V55__");
6201 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006202 } else if (CPU == "hexagonv60") {
6203 Builder.defineMacro("__HEXAGON_V60__");
6204 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6205 Builder.defineMacro("__QDSP6_V60__");
6206 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006207 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006208
6209 if (hasFeature("hvx")) {
6210 Builder.defineMacro("__HVX__");
6211 if (hasFeature("hvx-double"))
6212 Builder.defineMacro("__HVXDBL__");
6213 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006214}
6215
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006216bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6217 DiagnosticsEngine &Diags) {
6218 for (auto &F : Features) {
6219 if (F == "+hvx")
6220 HasHVX = true;
6221 else if (F == "-hvx")
6222 HasHVX = HasHVXDouble = false;
6223 else if (F == "+hvx-double")
6224 HasHVX = HasHVXDouble = true;
6225 else if (F == "-hvx-double")
6226 HasHVXDouble = false;
6227 }
6228 return true;
6229}
6230
6231bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6232 DiagnosticsEngine &Diags, StringRef CPU,
6233 const std::vector<std::string> &FeaturesVec) const {
6234 // Default for v60: -hvx, -hvx-double.
6235 Features["hvx"] = false;
6236 Features["hvx-double"] = false;
6237
6238 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6239}
6240
6241
6242const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006243 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6244 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6245 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6246 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6247 "p0", "p1", "p2", "p3",
6248 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6249};
6250
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006251ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006252 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006253}
6254
Tony Linthicum76329bf2011-12-12 21:14:55 +00006255const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6256 { { "sp" }, "r29" },
6257 { { "fp" }, "r30" },
6258 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006259};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006260
Craig Topperf054e3a2015-10-19 03:52:27 +00006261ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6262 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006263}
6264
6265
6266const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006267#define BUILTIN(ID, TYPE, ATTRS) \
6268 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6269#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6270 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006271#include "clang/Basic/BuiltinsHexagon.def"
6272};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006273
Jacques Pienaard964cc22016-03-28 21:02:54 +00006274class LanaiTargetInfo : public TargetInfo {
6275 // Class for Lanai (32-bit).
6276 // The CPU profiles supported by the Lanai backend
6277 enum CPUKind {
6278 CK_NONE,
6279 CK_V11,
6280 } CPU;
6281
6282 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6283 static const char *const GCCRegNames[];
6284
6285public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006286 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6287 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006288 // Description string has to be kept in sync with backend.
6289 resetDataLayout("E" // Big endian
6290 "-m:e" // ELF name manging
6291 "-p:32:32" // 32 bit pointers, 32 bit aligned
6292 "-i64:64" // 64 bit integers, 64 bit aligned
6293 "-a:0:32" // 32 bit alignment of objects of aggregate type
6294 "-n32" // 32 bit native integer width
6295 "-S64" // 64 bit natural stack alignment
6296 );
6297
6298 // Setting RegParmMax equal to what mregparm was set to in the old
6299 // toolchain
6300 RegParmMax = 4;
6301
6302 // Set the default CPU to V11
6303 CPU = CK_V11;
6304
6305 // Temporary approach to make everything at least word-aligned and allow for
6306 // safely casting between pointers with different alignment requirements.
6307 // TODO: Remove this when there are no more cast align warnings on the
6308 // firmware.
6309 MinGlobalAlign = 32;
6310 }
6311
6312 void getTargetDefines(const LangOptions &Opts,
6313 MacroBuilder &Builder) const override {
6314 // Define __lanai__ when building for target lanai.
6315 Builder.defineMacro("__lanai__");
6316
6317 // Set define for the CPU specified.
6318 switch (CPU) {
6319 case CK_V11:
6320 Builder.defineMacro("__LANAI_V11__");
6321 break;
6322 case CK_NONE:
6323 llvm_unreachable("Unhandled target CPU");
6324 }
6325 }
6326
6327 bool setCPU(const std::string &Name) override {
6328 CPU = llvm::StringSwitch<CPUKind>(Name)
6329 .Case("v11", CK_V11)
6330 .Default(CK_NONE);
6331
6332 return CPU != CK_NONE;
6333 }
6334
6335 bool hasFeature(StringRef Feature) const override {
6336 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6337 }
6338
6339 ArrayRef<const char *> getGCCRegNames() const override;
6340
6341 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6342
6343 BuiltinVaListKind getBuiltinVaListKind() const override {
6344 return TargetInfo::VoidPtrBuiltinVaList;
6345 }
6346
6347 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6348
6349 bool validateAsmConstraint(const char *&Name,
6350 TargetInfo::ConstraintInfo &info) const override {
6351 return false;
6352 }
6353
6354 const char *getClobbers() const override { return ""; }
6355};
6356
6357const char *const LanaiTargetInfo::GCCRegNames[] = {
6358 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6359 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6360 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6361
6362ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6363 return llvm::makeArrayRef(GCCRegNames);
6364}
6365
6366const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6367 {{"pc"}, "r2"},
6368 {{"sp"}, "r4"},
6369 {{"fp"}, "r5"},
6370 {{"rv"}, "r8"},
6371 {{"rr1"}, "r10"},
6372 {{"rr2"}, "r11"},
6373 {{"rca"}, "r15"},
6374};
6375
6376ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6377 return llvm::makeArrayRef(GCCRegAliases);
6378}
6379
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006380// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6381class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006382 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6383 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006384 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006385public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006386 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006387 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006388
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006389 int getEHDataRegisterNumber(unsigned RegNo) const override {
6390 if (RegNo == 0) return 24;
6391 if (RegNo == 1) return 25;
6392 return -1;
6393 }
6394
Craig Topper3164f332014-03-11 03:39:26 +00006395 bool handleTargetFeatures(std::vector<std::string> &Features,
6396 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006397 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006398 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6399 if (Feature != Features.end()) {
6400 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006401 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006402 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006403 }
Craig Topper3164f332014-03-11 03:39:26 +00006404 void getTargetDefines(const LangOptions &Opts,
6405 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006406 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006407 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006408
6409 if (SoftFloat)
6410 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006411 }
Craig Topper3164f332014-03-11 03:39:26 +00006412
6413 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006414 return llvm::StringSwitch<bool>(Feature)
6415 .Case("softfloat", SoftFloat)
6416 .Case("sparc", true)
6417 .Default(false);
6418 }
Craig Topper3164f332014-03-11 03:39:26 +00006419
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006420 bool hasSjLjLowering() const override {
6421 return true;
6422 }
6423
Craig Topper6c03a542015-10-19 04:51:35 +00006424 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006425 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006426 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006427 }
Craig Topper3164f332014-03-11 03:39:26 +00006428 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006429 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006430 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006431 ArrayRef<const char *> getGCCRegNames() const override;
6432 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006433 bool validateAsmConstraint(const char *&Name,
6434 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006435 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006436 switch (*Name) {
6437 case 'I': // Signed 13-bit constant
6438 case 'J': // Zero
6439 case 'K': // 32-bit constant with the low 12 bits clear
6440 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6441 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6442 case 'N': // Same as 'K' but zext (required for SIMode)
6443 case 'O': // The constant 4096
6444 return true;
6445 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006446 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006447 }
Craig Topper3164f332014-03-11 03:39:26 +00006448 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006449 // FIXME: Implement!
6450 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006451 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006452
6453 // No Sparc V7 for now, the backend doesn't support it anyway.
6454 enum CPUKind {
6455 CK_GENERIC,
6456 CK_V8,
6457 CK_SUPERSPARC,
6458 CK_SPARCLITE,
6459 CK_F934,
6460 CK_HYPERSPARC,
6461 CK_SPARCLITE86X,
6462 CK_SPARCLET,
6463 CK_TSC701,
6464 CK_V9,
6465 CK_ULTRASPARC,
6466 CK_ULTRASPARC3,
6467 CK_NIAGARA,
6468 CK_NIAGARA2,
6469 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006470 CK_NIAGARA4,
6471 CK_MYRIAD2_1,
6472 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006473 } CPU = CK_GENERIC;
6474
6475 enum CPUGeneration {
6476 CG_V8,
6477 CG_V9,
6478 };
6479
6480 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6481 switch (Kind) {
6482 case CK_GENERIC:
6483 case CK_V8:
6484 case CK_SUPERSPARC:
6485 case CK_SPARCLITE:
6486 case CK_F934:
6487 case CK_HYPERSPARC:
6488 case CK_SPARCLITE86X:
6489 case CK_SPARCLET:
6490 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006491 case CK_MYRIAD2_1:
6492 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006493 return CG_V8;
6494 case CK_V9:
6495 case CK_ULTRASPARC:
6496 case CK_ULTRASPARC3:
6497 case CK_NIAGARA:
6498 case CK_NIAGARA2:
6499 case CK_NIAGARA3:
6500 case CK_NIAGARA4:
6501 return CG_V9;
6502 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006503 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006504 }
6505
6506 CPUKind getCPUKind(StringRef Name) const {
6507 return llvm::StringSwitch<CPUKind>(Name)
6508 .Case("v8", CK_V8)
6509 .Case("supersparc", CK_SUPERSPARC)
6510 .Case("sparclite", CK_SPARCLITE)
6511 .Case("f934", CK_F934)
6512 .Case("hypersparc", CK_HYPERSPARC)
6513 .Case("sparclite86x", CK_SPARCLITE86X)
6514 .Case("sparclet", CK_SPARCLET)
6515 .Case("tsc701", CK_TSC701)
6516 .Case("v9", CK_V9)
6517 .Case("ultrasparc", CK_ULTRASPARC)
6518 .Case("ultrasparc3", CK_ULTRASPARC3)
6519 .Case("niagara", CK_NIAGARA)
6520 .Case("niagara2", CK_NIAGARA2)
6521 .Case("niagara3", CK_NIAGARA3)
6522 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006523 .Case("myriad2", CK_MYRIAD2_1)
6524 .Case("myriad2.1", CK_MYRIAD2_1)
6525 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006526 .Default(CK_GENERIC);
6527 }
6528
6529 bool setCPU(const std::string &Name) override {
6530 CPU = getCPUKind(Name);
6531 return CPU != CK_GENERIC;
6532 }
Gabor Greif49991682008-02-21 16:29:08 +00006533};
6534
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006535const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006536 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6537 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6538 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6539 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6540};
6541
Craig Topperf054e3a2015-10-19 03:52:27 +00006542ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6543 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006544}
6545
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006546const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006547 { { "g0" }, "r0" },
6548 { { "g1" }, "r1" },
6549 { { "g2" }, "r2" },
6550 { { "g3" }, "r3" },
6551 { { "g4" }, "r4" },
6552 { { "g5" }, "r5" },
6553 { { "g6" }, "r6" },
6554 { { "g7" }, "r7" },
6555 { { "o0" }, "r8" },
6556 { { "o1" }, "r9" },
6557 { { "o2" }, "r10" },
6558 { { "o3" }, "r11" },
6559 { { "o4" }, "r12" },
6560 { { "o5" }, "r13" },
6561 { { "o6", "sp" }, "r14" },
6562 { { "o7" }, "r15" },
6563 { { "l0" }, "r16" },
6564 { { "l1" }, "r17" },
6565 { { "l2" }, "r18" },
6566 { { "l3" }, "r19" },
6567 { { "l4" }, "r20" },
6568 { { "l5" }, "r21" },
6569 { { "l6" }, "r22" },
6570 { { "l7" }, "r23" },
6571 { { "i0" }, "r24" },
6572 { { "i1" }, "r25" },
6573 { { "i2" }, "r26" },
6574 { { "i3" }, "r27" },
6575 { { "i4" }, "r28" },
6576 { { "i5" }, "r29" },
6577 { { "i6", "fp" }, "r30" },
6578 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006579};
6580
Craig Topperf054e3a2015-10-19 03:52:27 +00006581ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6582 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006583}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006584
6585// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6586class SparcV8TargetInfo : public SparcTargetInfo {
6587public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006588 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6589 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006590 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006591 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6592 switch (getTriple().getOS()) {
6593 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006594 SizeType = UnsignedInt;
6595 IntPtrType = SignedInt;
6596 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006597 break;
6598 case llvm::Triple::NetBSD:
6599 case llvm::Triple::OpenBSD:
6600 SizeType = UnsignedLong;
6601 IntPtrType = SignedLong;
6602 PtrDiffType = SignedLong;
6603 break;
Brad Smith56495d52015-08-13 22:00:53 +00006604 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006605 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006606 }
6607
Craig Topper3164f332014-03-11 03:39:26 +00006608 void getTargetDefines(const LangOptions &Opts,
6609 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006610 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006611 switch (getCPUGeneration(CPU)) {
6612 case CG_V8:
6613 Builder.defineMacro("__sparcv8");
6614 if (getTriple().getOS() != llvm::Triple::Solaris)
6615 Builder.defineMacro("__sparcv8__");
6616 break;
6617 case CG_V9:
6618 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006619 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006620 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006621 Builder.defineMacro("__sparc_v9__");
6622 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006623 break;
6624 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006625 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6626 switch (CPU) {
6627 case CK_MYRIAD2_1:
6628 Builder.defineMacro("__myriad2", "1");
6629 Builder.defineMacro("__myriad2__", "1");
6630 break;
6631 case CK_MYRIAD2_2:
6632 Builder.defineMacro("__myriad2", "2");
6633 Builder.defineMacro("__myriad2__", "2");
6634 break;
6635 default:
6636 break;
6637 }
6638 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006639 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006640
6641 bool hasSjLjLowering() const override {
6642 return true;
6643 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006644};
6645
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006646// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6647class SparcV8elTargetInfo : public SparcV8TargetInfo {
6648 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006649 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6650 : SparcV8TargetInfo(Triple, Opts) {
6651 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6652 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006653 }
6654};
6655
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006656// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6657class SparcV9TargetInfo : public SparcTargetInfo {
6658public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006659 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6660 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006661 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006662 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006663 // This is an LP64 platform.
6664 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006665
6666 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006667 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006668 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006669 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006670 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006671 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006672
6673 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6674 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6675 LongDoubleWidth = 128;
6676 LongDoubleAlign = 128;
6677 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006678 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006679 }
6680
Craig Topper3164f332014-03-11 03:39:26 +00006681 void getTargetDefines(const LangOptions &Opts,
6682 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006683 SparcTargetInfo::getTargetDefines(Opts, Builder);
6684 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006685 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006686 // Solaris doesn't need these variants, but the BSDs do.
6687 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006688 Builder.defineMacro("__sparc64__");
6689 Builder.defineMacro("__sparc_v9__");
6690 Builder.defineMacro("__sparcv9__");
6691 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006692 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006693
Craig Topper3164f332014-03-11 03:39:26 +00006694 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006695 if (!SparcTargetInfo::setCPU(Name))
6696 return false;
6697 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006698 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006699};
6700
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006701class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006702 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006703 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006704 std::string CPU;
6705 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006706 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006707
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006708public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006709 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006710 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6711 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006712 IntMaxType = SignedLong;
6713 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006714 TLSSupported = true;
6715 IntWidth = IntAlign = 32;
6716 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6717 PointerWidth = PointerAlign = 64;
6718 LongDoubleWidth = 128;
6719 LongDoubleAlign = 64;
6720 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006721 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006722 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006723 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 +00006724 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6725 }
6726 void getTargetDefines(const LangOptions &Opts,
6727 MacroBuilder &Builder) const override {
6728 Builder.defineMacro("__s390__");
6729 Builder.defineMacro("__s390x__");
6730 Builder.defineMacro("__zarch__");
6731 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006732
6733 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6734 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6735 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6736 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6737
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006738 if (HasTransactionalExecution)
6739 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006740 if (Opts.ZVector)
6741 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006742 }
Craig Topper6c03a542015-10-19 04:51:35 +00006743 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6744 return llvm::makeArrayRef(BuiltinInfo,
6745 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006746 }
6747
Craig Topperf054e3a2015-10-19 03:52:27 +00006748 ArrayRef<const char *> getGCCRegNames() const override;
6749 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006750 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006751 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006752 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006753 bool validateAsmConstraint(const char *&Name,
6754 TargetInfo::ConstraintInfo &info) const override;
6755 const char *getClobbers() const override {
6756 // FIXME: Is this really right?
6757 return "";
6758 }
6759 BuiltinVaListKind getBuiltinVaListKind() const override {
6760 return TargetInfo::SystemZBuiltinVaList;
6761 }
6762 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006763 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006764 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6765 .Case("z10", true)
6766 .Case("z196", true)
6767 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006768 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006769 .Default(false);
6770
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006771 return CPUKnown;
6772 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006773 bool
6774 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6775 StringRef CPU,
6776 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006777 if (CPU == "zEC12")
6778 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006779 if (CPU == "z13") {
6780 Features["transactional-execution"] = true;
6781 Features["vector"] = true;
6782 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006783 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006784 }
6785
6786 bool handleTargetFeatures(std::vector<std::string> &Features,
6787 DiagnosticsEngine &Diags) override {
6788 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006789 for (const auto &Feature : Features) {
6790 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006791 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006792 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006793 HasVector = true;
6794 }
6795 // If we use the vector ABI, vector types are 64-bit aligned.
6796 if (HasVector) {
6797 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006798 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6799 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006800 }
6801 return true;
6802 }
6803
6804 bool hasFeature(StringRef Feature) const override {
6805 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006806 .Case("systemz", true)
6807 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006808 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006809 .Default(false);
6810 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006811
Bryan Chane3f1ed52016-04-28 13:56:43 +00006812 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6813 switch (CC) {
6814 case CC_C:
6815 case CC_Swift:
6816 return CCCR_OK;
6817 default:
6818 return CCCR_Warning;
6819 }
6820 }
6821
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006822 StringRef getABI() const override {
6823 if (HasVector)
6824 return "vector";
6825 return "";
6826 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006827
6828 bool useFloat128ManglingForLongDouble() const override {
6829 return true;
6830 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006831};
6832
6833const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6834#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006835 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006836#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6837 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006838#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006839};
6840
6841const char *const SystemZTargetInfo::GCCRegNames[] = {
6842 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6843 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6844 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6845 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6846};
6847
Craig Topperf054e3a2015-10-19 03:52:27 +00006848ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6849 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006850}
6851
6852bool SystemZTargetInfo::
6853validateAsmConstraint(const char *&Name,
6854 TargetInfo::ConstraintInfo &Info) const {
6855 switch (*Name) {
6856 default:
6857 return false;
6858
6859 case 'a': // Address register
6860 case 'd': // Data register (equivalent to 'r')
6861 case 'f': // Floating-point register
6862 Info.setAllowsRegister();
6863 return true;
6864
6865 case 'I': // Unsigned 8-bit constant
6866 case 'J': // Unsigned 12-bit constant
6867 case 'K': // Signed 16-bit constant
6868 case 'L': // Signed 20-bit displacement (on all targets we support)
6869 case 'M': // 0x7fffffff
6870 return true;
6871
6872 case 'Q': // Memory with base and unsigned 12-bit displacement
6873 case 'R': // Likewise, plus an index
6874 case 'S': // Memory with base and signed 20-bit displacement
6875 case 'T': // Likewise, plus an index
6876 Info.setAllowsMemory();
6877 return true;
6878 }
6879}
Ulrich Weigand47445072013-05-06 16:26:41 +00006880
Eric Christopherc48497a2015-09-18 21:26:24 +00006881class MSP430TargetInfo : public TargetInfo {
6882 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006883
Eric Christopherc48497a2015-09-18 21:26:24 +00006884public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006885 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6886 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006887 BigEndian = false;
6888 TLSSupported = false;
6889 IntWidth = 16;
6890 IntAlign = 16;
6891 LongWidth = 32;
6892 LongLongWidth = 64;
6893 LongAlign = LongLongAlign = 16;
6894 PointerWidth = 16;
6895 PointerAlign = 16;
6896 SuitableAlign = 16;
6897 SizeType = UnsignedInt;
6898 IntMaxType = SignedLongLong;
6899 IntPtrType = SignedInt;
6900 PtrDiffType = SignedInt;
6901 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006902 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006903 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006904 void getTargetDefines(const LangOptions &Opts,
6905 MacroBuilder &Builder) const override {
6906 Builder.defineMacro("MSP430");
6907 Builder.defineMacro("__MSP430__");
6908 // FIXME: defines for different 'flavours' of MCU
6909 }
Craig Topper6c03a542015-10-19 04:51:35 +00006910 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006911 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006912 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006913 }
6914 bool hasFeature(StringRef Feature) const override {
6915 return Feature == "msp430";
6916 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006917 ArrayRef<const char *> getGCCRegNames() const override;
6918 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006919 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006920 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006921 }
6922 bool validateAsmConstraint(const char *&Name,
6923 TargetInfo::ConstraintInfo &info) const override {
6924 // FIXME: implement
6925 switch (*Name) {
6926 case 'K': // the constant 1
6927 case 'L': // constant -1^20 .. 1^19
6928 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006929 return true;
6930 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006931 // No target constraints for now.
6932 return false;
6933 }
6934 const char *getClobbers() const override {
6935 // FIXME: Is this really right?
6936 return "";
6937 }
6938 BuiltinVaListKind getBuiltinVaListKind() const override {
6939 // FIXME: implement
6940 return TargetInfo::CharPtrBuiltinVaList;
6941 }
6942};
6943
6944const char *const MSP430TargetInfo::GCCRegNames[] = {
6945 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6946 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6947
Craig Topperf054e3a2015-10-19 03:52:27 +00006948ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6949 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006950}
6951
6952// LLVM and Clang cannot be used directly to output native binaries for
6953// target, but is used to compile C code to llvm bitcode with correct
6954// type and alignment information.
6955//
6956// TCE uses the llvm bitcode as input and uses it for generating customized
6957// target processor and program binary. TCE co-design environment is
6958// publicly available in http://tce.cs.tut.fi
6959
6960static const unsigned TCEOpenCLAddrSpaceMap[] = {
6961 3, // opencl_global
6962 4, // opencl_local
6963 5, // opencl_constant
6964 // FIXME: generic has to be added to the target
6965 0, // opencl_generic
6966 0, // cuda_device
6967 0, // cuda_constant
6968 0 // cuda_shared
6969};
6970
6971class TCETargetInfo : public TargetInfo {
6972public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006973 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6974 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006975 TLSSupported = false;
6976 IntWidth = 32;
6977 LongWidth = LongLongWidth = 32;
6978 PointerWidth = 32;
6979 IntAlign = 32;
6980 LongAlign = LongLongAlign = 32;
6981 PointerAlign = 32;
6982 SuitableAlign = 32;
6983 SizeType = UnsignedInt;
6984 IntMaxType = SignedLong;
6985 IntPtrType = SignedInt;
6986 PtrDiffType = SignedInt;
6987 FloatWidth = 32;
6988 FloatAlign = 32;
6989 DoubleWidth = 32;
6990 DoubleAlign = 32;
6991 LongDoubleWidth = 32;
6992 LongDoubleAlign = 32;
6993 FloatFormat = &llvm::APFloat::IEEEsingle;
6994 DoubleFormat = &llvm::APFloat::IEEEsingle;
6995 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006996 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6997 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006998 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6999 UseAddrSpaceMapMangling = true;
7000 }
7001
7002 void getTargetDefines(const LangOptions &Opts,
7003 MacroBuilder &Builder) const override {
7004 DefineStd(Builder, "tce", Opts);
7005 Builder.defineMacro("__TCE__");
7006 Builder.defineMacro("__TCE_V1__");
7007 }
7008 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7009
Craig Topper6c03a542015-10-19 04:51:35 +00007010 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007011 const char *getClobbers() const override { return ""; }
7012 BuiltinVaListKind getBuiltinVaListKind() const override {
7013 return TargetInfo::VoidPtrBuiltinVaList;
7014 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007015 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007016 bool validateAsmConstraint(const char *&Name,
7017 TargetInfo::ConstraintInfo &info) const override {
7018 return true;
7019 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007020 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7021 return None;
7022 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007023};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007024
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007025class BPFTargetInfo : public TargetInfo {
7026public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007027 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7028 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007029 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7030 SizeType = UnsignedLong;
7031 PtrDiffType = SignedLong;
7032 IntPtrType = SignedLong;
7033 IntMaxType = SignedLong;
7034 Int64Type = SignedLong;
7035 RegParmMax = 5;
7036 if (Triple.getArch() == llvm::Triple::bpfeb) {
7037 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007038 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007039 } else {
7040 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007041 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007042 }
7043 MaxAtomicPromoteWidth = 64;
7044 MaxAtomicInlineWidth = 64;
7045 TLSSupported = false;
7046 }
7047 void getTargetDefines(const LangOptions &Opts,
7048 MacroBuilder &Builder) const override {
7049 DefineStd(Builder, "bpf", Opts);
7050 Builder.defineMacro("__BPF__");
7051 }
7052 bool hasFeature(StringRef Feature) const override {
7053 return Feature == "bpf";
7054 }
7055
Craig Topper6c03a542015-10-19 04:51:35 +00007056 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007057 const char *getClobbers() const override {
7058 return "";
7059 }
7060 BuiltinVaListKind getBuiltinVaListKind() const override {
7061 return TargetInfo::VoidPtrBuiltinVaList;
7062 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007063 ArrayRef<const char *> getGCCRegNames() const override {
7064 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007065 }
7066 bool validateAsmConstraint(const char *&Name,
7067 TargetInfo::ConstraintInfo &info) const override {
7068 return true;
7069 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007070 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7071 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007072 }
7073};
7074
Daniel Sanders4672af62016-05-27 11:51:02 +00007075class MipsTargetInfo : public TargetInfo {
7076 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007077 StringRef Layout;
7078
7079 if (ABI == "o32")
7080 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7081 else if (ABI == "n32")
7082 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7083 else if (ABI == "n64")
7084 Layout = "m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7085 else
7086 llvm_unreachable("Invalid ABI");
7087
7088 if (BigEndian)
7089 resetDataLayout(("E-" + Layout).str());
7090 else
7091 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007092 }
7093
Akira Hatanaka9064e362013-10-29 18:30:33 +00007094
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007095 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007096 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007097 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007098 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007099 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007100 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007101 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007102 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007103 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007104 enum DspRevEnum {
7105 NoDSP, DSP1, DSP2
7106 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007107 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007108
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007109protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007110 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007111 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007112
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007113public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007114 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007115 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7116 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7117 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007118 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007119 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7120 getTriple().getArch() == llvm::Triple::mips64;
7121
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007122 setABI((getTriple().getArch() == llvm::Triple::mips ||
7123 getTriple().getArch() == llvm::Triple::mipsel)
7124 ? "o32"
7125 : "n64");
7126
7127 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007128 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007129
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007130 bool isNaN2008Default() const {
7131 return CPU == "mips32r6" || CPU == "mips64r6";
7132 }
7133
7134 bool isFP64Default() const {
7135 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7136 }
7137
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007138 bool isNan2008() const override {
7139 return IsNan2008;
7140 }
7141
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007142 bool processorSupportsGPR64() const {
7143 return llvm::StringSwitch<bool>(CPU)
7144 .Case("mips3", true)
7145 .Case("mips4", true)
7146 .Case("mips5", true)
7147 .Case("mips64", true)
7148 .Case("mips64r2", true)
7149 .Case("mips64r3", true)
7150 .Case("mips64r5", true)
7151 .Case("mips64r6", true)
7152 .Case("octeon", true)
7153 .Default(false);
7154 return false;
7155 }
7156
Alp Toker4925ba72014-06-07 23:30:42 +00007157 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007158 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007159 if (Name == "o32") {
7160 setO32ABITypes();
7161 ABI = Name;
7162 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007163 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007164
7165 if (Name == "n32") {
7166 setN32ABITypes();
7167 ABI = Name;
7168 return true;
7169 }
7170 if (Name == "n64") {
7171 setN64ABITypes();
7172 ABI = Name;
7173 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007174 }
7175 return false;
7176 }
7177
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007178 void setO32ABITypes() {
7179 Int64Type = SignedLongLong;
7180 IntMaxType = Int64Type;
7181 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7182 LongDoubleWidth = LongDoubleAlign = 64;
7183 LongWidth = LongAlign = 32;
7184 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7185 PointerWidth = PointerAlign = 32;
7186 PtrDiffType = SignedInt;
7187 SizeType = UnsignedInt;
7188 SuitableAlign = 64;
7189 }
7190
7191 void setN32N64ABITypes() {
7192 LongDoubleWidth = LongDoubleAlign = 128;
7193 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7194 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7195 LongDoubleWidth = LongDoubleAlign = 64;
7196 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7197 }
7198 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7199 SuitableAlign = 128;
7200 }
7201
Daniel Sanders4672af62016-05-27 11:51:02 +00007202 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007203 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007204 Int64Type = SignedLong;
7205 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007206 LongWidth = LongAlign = 64;
7207 PointerWidth = PointerAlign = 64;
7208 PtrDiffType = SignedLong;
7209 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007210 }
7211
7212 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007213 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007214 Int64Type = SignedLongLong;
7215 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007216 LongWidth = LongAlign = 32;
7217 PointerWidth = PointerAlign = 32;
7218 PtrDiffType = SignedInt;
7219 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007220 }
7221
Craig Topper3164f332014-03-11 03:39:26 +00007222 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007223 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007224 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007225 .Case("mips1", true)
7226 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007227 .Case("mips3", true)
7228 .Case("mips4", true)
7229 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007230 .Case("mips32", true)
7231 .Case("mips32r2", true)
7232 .Case("mips32r3", true)
7233 .Case("mips32r5", true)
7234 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007235 .Case("mips64", true)
7236 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007237 .Case("mips64r3", true)
7238 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007239 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007240 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007241 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007242 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007243 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007244 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007245 bool
7246 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7247 StringRef CPU,
7248 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007249 if (CPU.empty())
7250 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007251 if (CPU == "octeon")
7252 Features["mips64r2"] = Features["cnmips"] = true;
7253 else
7254 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007255 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007256 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007257
Craig Topper3164f332014-03-11 03:39:26 +00007258 void getTargetDefines(const LangOptions &Opts,
7259 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007260 if (BigEndian) {
7261 DefineStd(Builder, "MIPSEB", Opts);
7262 Builder.defineMacro("_MIPSEB");
7263 } else {
7264 DefineStd(Builder, "MIPSEL", Opts);
7265 Builder.defineMacro("_MIPSEL");
7266 }
7267
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007268 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007269 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007270 if (Opts.GNUMode)
7271 Builder.defineMacro("mips");
7272
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007273 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007274 Builder.defineMacro("__mips", "32");
7275 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7276 } else {
7277 Builder.defineMacro("__mips", "64");
7278 Builder.defineMacro("__mips64");
7279 Builder.defineMacro("__mips64__");
7280 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7281 }
7282
7283 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7284 .Cases("mips32", "mips64", "1")
7285 .Cases("mips32r2", "mips64r2", "2")
7286 .Cases("mips32r3", "mips64r3", "3")
7287 .Cases("mips32r5", "mips64r5", "5")
7288 .Cases("mips32r6", "mips64r6", "6")
7289 .Default("");
7290 if (!ISARev.empty())
7291 Builder.defineMacro("__mips_isa_rev", ISARev);
7292
7293 if (ABI == "o32") {
7294 Builder.defineMacro("__mips_o32");
7295 Builder.defineMacro("_ABIO32", "1");
7296 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007297 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007298 Builder.defineMacro("__mips_n32");
7299 Builder.defineMacro("_ABIN32", "2");
7300 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7301 } else if (ABI == "n64") {
7302 Builder.defineMacro("__mips_n64");
7303 Builder.defineMacro("_ABI64", "3");
7304 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7305 } else
7306 llvm_unreachable("Invalid ABI.");
7307
Simon Atanasyan683535b2012-08-29 19:14:58 +00007308 Builder.defineMacro("__REGISTER_PREFIX__", "");
7309
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007310 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007311 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007312 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007313 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007314 case SoftFloat:
7315 Builder.defineMacro("__mips_soft_float", Twine(1));
7316 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007317 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007318
Simon Atanasyan16071912013-04-14 14:07:30 +00007319 if (IsSingleFloat)
7320 Builder.defineMacro("__mips_single_float", Twine(1));
7321
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007322 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7323 Builder.defineMacro("_MIPS_FPSET",
7324 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7325
Simon Atanasyan72244b62012-07-05 16:06:06 +00007326 if (IsMips16)
7327 Builder.defineMacro("__mips16", Twine(1));
7328
Simon Atanasyan60777612013-04-14 14:07:51 +00007329 if (IsMicromips)
7330 Builder.defineMacro("__mips_micromips", Twine(1));
7331
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007332 if (IsNan2008)
7333 Builder.defineMacro("__mips_nan2008", Twine(1));
7334
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007335 switch (DspRev) {
7336 default:
7337 break;
7338 case DSP1:
7339 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7340 Builder.defineMacro("__mips_dsp", Twine(1));
7341 break;
7342 case DSP2:
7343 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7344 Builder.defineMacro("__mips_dspr2", Twine(1));
7345 Builder.defineMacro("__mips_dsp", Twine(1));
7346 break;
7347 }
7348
Jack Carter44ff1e52013-08-12 17:20:29 +00007349 if (HasMSA)
7350 Builder.defineMacro("__mips_msa", Twine(1));
7351
Simon Atanasyan26f19672012-04-05 19:28:31 +00007352 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7353 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7354 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007355
7356 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7357 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007358
7359 // These shouldn't be defined for MIPS-I but there's no need to check
7360 // for that since MIPS-I isn't supported.
7361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7362 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7363 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007364
7365 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7366 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7367 // the instructions exist but using them violates the ABI since they
7368 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7369 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007370 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007371 }
7372
Craig Topper6c03a542015-10-19 04:51:35 +00007373 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7374 return llvm::makeArrayRef(BuiltinInfo,
7375 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007376 }
Craig Topper3164f332014-03-11 03:39:26 +00007377 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007378 return llvm::StringSwitch<bool>(Feature)
7379 .Case("mips", true)
7380 .Case("fp64", HasFP64)
7381 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007382 }
Craig Topper3164f332014-03-11 03:39:26 +00007383 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007384 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007385 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007386 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007387 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007388 // CPU register names
7389 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007390 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7391 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7392 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007393 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7394 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007395 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7396 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7397 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7398 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007399 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007400 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007401 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7402 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007403 // MSA register names
7404 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7405 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7406 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7407 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7408 // MSA control register names
7409 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7410 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007411 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007412 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007413 }
Craig Topper3164f332014-03-11 03:39:26 +00007414 bool validateAsmConstraint(const char *&Name,
7415 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007416 switch (*Name) {
7417 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007418 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007419 case 'r': // CPU registers.
7420 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007421 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007422 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007423 case 'c': // $25 for indirect jumps
7424 case 'l': // lo register
7425 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007426 Info.setAllowsRegister();
7427 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007428 case 'I': // Signed 16-bit constant
7429 case 'J': // Integer 0
7430 case 'K': // Unsigned 16-bit constant
7431 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7432 case 'M': // Constants not loadable via lui, addiu, or ori
7433 case 'N': // Constant -1 to -65535
7434 case 'O': // A signed 15-bit constant
7435 case 'P': // A constant between 1 go 65535
7436 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007437 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007438 Info.setAllowsMemory();
7439 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007440 case 'Z':
7441 if (Name[1] == 'C') { // An address usable by ll, and sc.
7442 Info.setAllowsMemory();
7443 Name++; // Skip over 'Z'.
7444 return true;
7445 }
7446 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007447 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007448 }
7449
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007450 std::string convertConstraint(const char *&Constraint) const override {
7451 std::string R;
7452 switch (*Constraint) {
7453 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7454 if (Constraint[1] == 'C') {
7455 R = std::string("^") + std::string(Constraint, 2);
7456 Constraint++;
7457 return R;
7458 }
7459 break;
7460 }
7461 return TargetInfo::convertConstraint(Constraint);
7462 }
7463
Craig Topper3164f332014-03-11 03:39:26 +00007464 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007465 // In GCC, $1 is not widely used in generated code (it's used only in a few
7466 // specific situations), so there is no real need for users to add it to
7467 // the clobbers list if they want to use it in their inline assembly code.
7468 //
7469 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7470 // code generation, so using it in inline assembly without adding it to the
7471 // clobbers list can cause conflicts between the inline assembly code and
7472 // the surrounding generated code.
7473 //
7474 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7475 // operands, which will conflict with the ".set at" assembler option (which
7476 // we use only for inline assembly, in order to maintain compatibility with
7477 // GCC) and will also conflict with the user's usage of $1.
7478 //
7479 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7480 // register for generated code is to automatically clobber $1 for all inline
7481 // assembly code.
7482 //
7483 // FIXME: We should automatically clobber $1 only for inline assembly code
7484 // which actually uses it. This would allow LLVM to use $1 for inline
7485 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007486 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007487 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007488
Craig Topper3164f332014-03-11 03:39:26 +00007489 bool handleTargetFeatures(std::vector<std::string> &Features,
7490 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007491 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007492 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007493 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007494 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007495 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007496 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007497 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007498
Eric Christopher610fe112015-08-26 08:21:55 +00007499 for (const auto &Feature : Features) {
7500 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007501 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007502 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007503 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007504 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007505 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007506 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007507 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007508 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007509 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007510 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007511 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007512 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007513 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007514 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007515 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007516 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007517 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007518 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007519 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007520 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007521 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007522 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007523
James Y Knightb214cbc2016-03-04 19:00:41 +00007524 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007525
Rafael Espindolaeb265472013-08-21 21:59:03 +00007526 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007527 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007528
Craig Topper3164f332014-03-11 03:39:26 +00007529 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007530 if (RegNo == 0) return 4;
7531 if (RegNo == 1) return 5;
7532 return -1;
7533 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007534
7535 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007536
7537 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7538 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7539 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7540 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7541 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7542 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7543 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7544 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7545 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7546 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7547 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7548 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7549 {{"ra"}, "$31"}};
7550 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7551 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7552 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7553 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7554 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7555 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7556 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7557 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7558 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7559 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7560 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7561 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007562 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007563 return llvm::makeArrayRef(O32RegAliases);
7564 return llvm::makeArrayRef(NewABIRegAliases);
7565 }
7566
7567 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007568 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007569 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007570
7571 bool validateTarget(DiagnosticsEngine &Diags) const override {
7572 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7573 // this yet. It's better to fail here than on the backend assertion.
7574 if (processorSupportsGPR64() && ABI == "o32") {
7575 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7576 return false;
7577 }
7578
7579 // 64-bit ABI's require 64-bit CPU's.
7580 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7581 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7582 return false;
7583 }
7584
7585 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7586 // can't handle this yet. It's better to fail here than on the
7587 // backend assertion.
7588 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7589 getTriple().getArch() == llvm::Triple::mips64el) &&
7590 ABI == "o32") {
7591 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7592 << ABI << getTriple().str();
7593 return false;
7594 }
7595
7596 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7597 // can't handle this yet. It's better to fail here than on the
7598 // backend assertion.
7599 if ((getTriple().getArch() == llvm::Triple::mips ||
7600 getTriple().getArch() == llvm::Triple::mipsel) &&
7601 (ABI == "n32" || ABI == "n64")) {
7602 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7603 << ABI << getTriple().str();
7604 return false;
7605 }
7606
7607 return true;
7608 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007609};
7610
Daniel Sanders4672af62016-05-27 11:51:02 +00007611const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007612#define BUILTIN(ID, TYPE, ATTRS) \
7613 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7614#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7615 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007616#include "clang/Basic/BuiltinsMips.def"
7617};
7618
Ivan Krasindd7403e2011-08-24 20:22:22 +00007619class PNaClTargetInfo : public TargetInfo {
7620public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007621 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7622 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007623 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007624 this->LongAlign = 32;
7625 this->LongWidth = 32;
7626 this->PointerAlign = 32;
7627 this->PointerWidth = 32;
7628 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007629 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007630 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007631 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007632 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007633 this->SizeType = TargetInfo::UnsignedInt;
7634 this->PtrDiffType = TargetInfo::SignedInt;
7635 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007636 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007637 }
7638
Craig Toppere6f17d02014-03-11 04:07:52 +00007639 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007640 Builder.defineMacro("__le32__");
7641 Builder.defineMacro("__pnacl__");
7642 }
Craig Topper3164f332014-03-11 03:39:26 +00007643 void getTargetDefines(const LangOptions &Opts,
7644 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007645 getArchDefines(Opts, Builder);
7646 }
Craig Topper3164f332014-03-11 03:39:26 +00007647 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007648 return Feature == "pnacl";
7649 }
Craig Topper6c03a542015-10-19 04:51:35 +00007650 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007651 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007652 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007653 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007654 ArrayRef<const char *> getGCCRegNames() const override;
7655 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007656 bool validateAsmConstraint(const char *&Name,
7657 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007658 return false;
7659 }
7660
Craig Topper3164f332014-03-11 03:39:26 +00007661 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007662 return "";
7663 }
7664};
7665
Craig Topperf054e3a2015-10-19 03:52:27 +00007666ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7667 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007668}
7669
Craig Topperf054e3a2015-10-19 03:52:27 +00007670ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7671 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007672}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007673
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007674// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007675class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007676public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007677 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7678 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007679
7680 BuiltinVaListKind getBuiltinVaListKind() const override {
7681 return TargetInfo::PNaClABIBuiltinVaList;
7682 }
7683};
7684
JF Bastien643817d2014-09-12 17:52:47 +00007685class Le64TargetInfo : public TargetInfo {
7686 static const Builtin::Info BuiltinInfo[];
7687
7688public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007689 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7690 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007691 BigEndian = false;
7692 NoAsmVariants = true;
7693 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7694 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007695 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007696 }
7697
7698 void getTargetDefines(const LangOptions &Opts,
7699 MacroBuilder &Builder) const override {
7700 DefineStd(Builder, "unix", Opts);
7701 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7702 Builder.defineMacro("__ELF__");
7703 }
Craig Topper6c03a542015-10-19 04:51:35 +00007704 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7705 return llvm::makeArrayRef(BuiltinInfo,
7706 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007707 }
7708 BuiltinVaListKind getBuiltinVaListKind() const override {
7709 return TargetInfo::PNaClABIBuiltinVaList;
7710 }
7711 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007712 ArrayRef<const char *> getGCCRegNames() const override {
7713 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007714 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007715 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7716 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007717 }
7718 bool validateAsmConstraint(const char *&Name,
7719 TargetInfo::ConstraintInfo &Info) const override {
7720 return false;
7721 }
7722
7723 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007724};
Dan Gohmanc2853072015-09-03 22:51:53 +00007725
7726class WebAssemblyTargetInfo : public TargetInfo {
7727 static const Builtin::Info BuiltinInfo[];
7728
7729 enum SIMDEnum {
7730 NoSIMD,
7731 SIMD128,
7732 } SIMDLevel;
7733
7734public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007735 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007736 : TargetInfo(T), SIMDLevel(NoSIMD) {
7737 BigEndian = false;
7738 NoAsmVariants = true;
7739 SuitableAlign = 128;
7740 LargeArrayMinWidth = 128;
7741 LargeArrayAlign = 128;
7742 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007743 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007744 LongDoubleWidth = LongDoubleAlign = 128;
7745 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007746 }
7747
7748protected:
7749 void getTargetDefines(const LangOptions &Opts,
7750 MacroBuilder &Builder) const override {
7751 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7752 if (SIMDLevel >= SIMD128)
7753 Builder.defineMacro("__wasm_simd128__");
7754 }
7755
7756private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007757 bool
7758 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7759 StringRef CPU,
7760 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007761 if (CPU == "bleeding-edge")
7762 Features["simd128"] = true;
7763 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7764 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007765 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007766 return llvm::StringSwitch<bool>(Feature)
7767 .Case("simd128", SIMDLevel >= SIMD128)
7768 .Default(false);
7769 }
7770 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007771 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007772 for (const auto &Feature : Features) {
7773 if (Feature == "+simd128") {
7774 SIMDLevel = std::max(SIMDLevel, SIMD128);
7775 continue;
7776 }
7777 if (Feature == "-simd128") {
7778 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7779 continue;
7780 }
7781
7782 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7783 << "-target-feature";
7784 return false;
7785 }
7786 return true;
7787 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007788 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007789 return llvm::StringSwitch<bool>(Name)
7790 .Case("mvp", true)
7791 .Case("bleeding-edge", true)
7792 .Case("generic", true)
7793 .Default(false);
7794 }
Craig Topper6c03a542015-10-19 04:51:35 +00007795 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7796 return llvm::makeArrayRef(BuiltinInfo,
7797 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007798 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007799 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007800 return VoidPtrBuiltinVaList;
7801 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007802 ArrayRef<const char *> getGCCRegNames() const final {
7803 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007804 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007805 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7806 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007807 }
7808 bool
7809 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007810 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007811 return false;
7812 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007813 const char *getClobbers() const final { return ""; }
7814 bool isCLZForZeroUndef() const final { return false; }
7815 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007816 IntType getIntTypeByWidth(unsigned BitWidth,
7817 bool IsSigned) const final {
7818 // WebAssembly prefers long long for explicitly 64-bit integers.
7819 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7820 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7821 }
7822 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7823 bool IsSigned) const final {
7824 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7825 return BitWidth == 64
7826 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7827 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7828 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007829};
7830
7831const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7832#define BUILTIN(ID, TYPE, ATTRS) \
7833 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7834#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7835 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7836#include "clang/Basic/BuiltinsWebAssembly.def"
7837};
7838
7839class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7840public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007841 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7842 const TargetOptions &Opts)
7843 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007844 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007845 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007846 }
7847
7848protected:
7849 void getTargetDefines(const LangOptions &Opts,
7850 MacroBuilder &Builder) const override {
7851 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7852 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7853 }
7854};
7855
7856class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7857public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007858 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7859 const TargetOptions &Opts)
7860 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007861 LongAlign = LongWidth = 64;
7862 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007863 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007864 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007865 }
7866
7867protected:
7868 void getTargetDefines(const LangOptions &Opts,
7869 MacroBuilder &Builder) const override {
7870 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7871 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7872 }
7873};
7874
JF Bastien643817d2014-09-12 17:52:47 +00007875const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7876#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007877 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007878#include "clang/Basic/BuiltinsLe64.def"
7879};
7880
Eric Christopherc48497a2015-09-18 21:26:24 +00007881static const unsigned SPIRAddrSpaceMap[] = {
7882 1, // opencl_global
7883 3, // opencl_local
7884 2, // opencl_constant
7885 4, // opencl_generic
7886 0, // cuda_device
7887 0, // cuda_constant
7888 0 // cuda_shared
7889};
7890class SPIRTargetInfo : public TargetInfo {
7891public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007892 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7893 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007894 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7895 "SPIR target must use unknown OS");
7896 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7897 "SPIR target must use unknown environment type");
7898 BigEndian = false;
7899 TLSSupported = false;
7900 LongWidth = LongAlign = 64;
7901 AddrSpaceMap = &SPIRAddrSpaceMap;
7902 UseAddrSpaceMapMangling = true;
7903 // Define available target features
7904 // These must be defined in sorted order!
7905 NoAsmVariants = true;
7906 }
7907 void getTargetDefines(const LangOptions &Opts,
7908 MacroBuilder &Builder) const override {
7909 DefineStd(Builder, "SPIR", Opts);
7910 }
7911 bool hasFeature(StringRef Feature) const override {
7912 return Feature == "spir";
7913 }
Craig Topper3164f332014-03-11 03:39:26 +00007914
Craig Topper6c03a542015-10-19 04:51:35 +00007915 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007916 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007917 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007918 bool validateAsmConstraint(const char *&Name,
7919 TargetInfo::ConstraintInfo &info) const override {
7920 return true;
7921 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007922 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7923 return None;
7924 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007925 BuiltinVaListKind getBuiltinVaListKind() const override {
7926 return TargetInfo::VoidPtrBuiltinVaList;
7927 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007928
Eric Christopherc48497a2015-09-18 21:26:24 +00007929 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7930 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7931 : CCCR_Warning;
7932 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007933
Eric Christopherc48497a2015-09-18 21:26:24 +00007934 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7935 return CC_SpirFunction;
7936 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007937
7938 void setSupportedOpenCLOpts() override {
7939 // Assume all OpenCL extensions and optional core features are supported
7940 // for SPIR since it is a generic target.
7941 getSupportedOpenCLOpts().setAll();
7942 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007943};
Guy Benyeib798fc92012-12-11 21:38:14 +00007944
Eric Christopherc48497a2015-09-18 21:26:24 +00007945class SPIR32TargetInfo : public SPIRTargetInfo {
7946public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007947 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7948 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007949 PointerWidth = PointerAlign = 32;
7950 SizeType = TargetInfo::UnsignedInt;
7951 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007952 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7953 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007954 }
7955 void getTargetDefines(const LangOptions &Opts,
7956 MacroBuilder &Builder) const override {
7957 DefineStd(Builder, "SPIR32", Opts);
7958 }
7959};
Guy Benyeib798fc92012-12-11 21:38:14 +00007960
Eric Christopherc48497a2015-09-18 21:26:24 +00007961class SPIR64TargetInfo : public SPIRTargetInfo {
7962public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007963 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7964 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007965 PointerWidth = PointerAlign = 64;
7966 SizeType = TargetInfo::UnsignedLong;
7967 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007968 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7969 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007970 }
7971 void getTargetDefines(const LangOptions &Opts,
7972 MacroBuilder &Builder) const override {
7973 DefineStd(Builder, "SPIR64", Opts);
7974 }
7975};
Guy Benyeib798fc92012-12-11 21:38:14 +00007976
Robert Lytton0e076492013-08-13 09:43:10 +00007977class XCoreTargetInfo : public TargetInfo {
7978 static const Builtin::Info BuiltinInfo[];
7979public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007980 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7981 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007982 BigEndian = false;
7983 NoAsmVariants = true;
7984 LongLongAlign = 32;
7985 SuitableAlign = 32;
7986 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007987 SizeType = UnsignedInt;
7988 PtrDiffType = SignedInt;
7989 IntPtrType = SignedInt;
7990 WCharType = UnsignedChar;
7991 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007992 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007993 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7994 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007995 }
Craig Topper3164f332014-03-11 03:39:26 +00007996 void getTargetDefines(const LangOptions &Opts,
7997 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007998 Builder.defineMacro("__XS1B__");
7999 }
Craig Topper6c03a542015-10-19 04:51:35 +00008000 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8001 return llvm::makeArrayRef(BuiltinInfo,
8002 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008003 }
Craig Topper3164f332014-03-11 03:39:26 +00008004 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008005 return TargetInfo::VoidPtrBuiltinVaList;
8006 }
Craig Topper3164f332014-03-11 03:39:26 +00008007 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008008 return "";
8009 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008010 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008011 static const char * const GCCRegNames[] = {
8012 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8013 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8014 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008015 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008016 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008017 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8018 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008019 }
Craig Topper3164f332014-03-11 03:39:26 +00008020 bool validateAsmConstraint(const char *&Name,
8021 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008022 return false;
8023 }
Craig Topper3164f332014-03-11 03:39:26 +00008024 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008025 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8026 return (RegNo < 2)? RegNo : -1;
8027 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008028 bool allowsLargerPreferedTypeAlignment() const override {
8029 return false;
8030 }
Robert Lytton0e076492013-08-13 09:43:10 +00008031};
8032
8033const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008034#define BUILTIN(ID, TYPE, ATTRS) \
8035 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8036#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8037 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008038#include "clang/Basic/BuiltinsXCore.def"
8039};
Robert Lytton0e076492013-08-13 09:43:10 +00008040
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008041// x86_32 Android target
8042class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8043public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008044 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8045 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008046 SuitableAlign = 32;
8047 LongDoubleWidth = 64;
8048 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8049 }
8050};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008051
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008052// x86_64 Android target
8053class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8054public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008055 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8056 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008057 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8058 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008059
8060 bool useFloat128ManglingForLongDouble() const override {
8061 return true;
8062 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008063};
8064} // end anonymous namespace
8065
Chris Lattner5ba61f02006-10-14 07:39:34 +00008066//===----------------------------------------------------------------------===//
8067// Driver code
8068//===----------------------------------------------------------------------===//
8069
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8071 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008072 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008073
Daniel Dunbar52322032009-08-18 05:47:58 +00008074 switch (Triple.getArch()) {
8075 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008076 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008077
Tim Northover2a0783d2014-05-30 14:14:07 +00008078 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008079 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008080
8081 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008082 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008083
Jacques Pienaard964cc22016-03-28 21:02:54 +00008084 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008085 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008086
Tim Northover2a0783d2014-05-30 14:14:07 +00008087 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008088 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008089 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008090
8091 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008092 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008093 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008094 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008095 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008096 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008097 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008098 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008099 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008100 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008101 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008102 }
8103
Christian Pirker9b019ae2014-02-25 13:51:00 +00008104 case llvm::Triple::aarch64_be:
8105 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008106 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008107 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008108 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008109 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008110 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008111 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008112 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008113 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008114 }
8115
Daniel Dunbar52322032009-08-18 05:47:58 +00008116 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008117 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008118 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008119 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008120
Daniel Dunbar52322032009-08-18 05:47:58 +00008121 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008122 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008123 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008124 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008125 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008126 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008127 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008128 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008129 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008130 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008131 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008132 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008133 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008134 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008135 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008136 case llvm::Triple::Win32:
8137 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008138 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008139 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008140 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008141 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008142 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008143 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008144 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008145 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008146 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008147 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008148 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008149 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008150 }
8151
8152 case llvm::Triple::armeb:
8153 case llvm::Triple::thumbeb:
8154 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008155 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008156
8157 switch (os) {
8158 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008159 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008160 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008161 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008162 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008163 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008164 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008165 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008166 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008167 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008168 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008169 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008170 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008171 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008172 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008173 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008174 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008175
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008176 case llvm::Triple::bpfeb:
8177 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008178 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008179
Daniel Dunbar52322032009-08-18 05:47:58 +00008180 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008181 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008182
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008183 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008184 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008185 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008186 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008187 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008188 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008189 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008190 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008191 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008192 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008193 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008194 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008195 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008196
8197 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008198 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008199 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008200 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008201 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008202 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008203 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008204 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008205 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008206 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008207 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008208 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008209 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008210 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008211 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008212
Akira Hatanakabef17452011-09-20 19:21:49 +00008213 case llvm::Triple::mips64:
8214 switch (os) {
8215 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008216 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008217 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008218 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008219 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008220 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008221 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008222 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008223 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008224 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008225 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008226 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008227 }
8228
8229 case llvm::Triple::mips64el:
8230 switch (os) {
8231 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008232 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008233 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008234 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008235 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008236 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008237 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008238 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008239 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008240 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008241 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008242 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008243 }
8244
Ivan Krasindd7403e2011-08-24 20:22:22 +00008245 case llvm::Triple::le32:
8246 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008247 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008248 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008249 default:
8250 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008251 }
8252
JF Bastien643817d2014-09-12 17:52:47 +00008253 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008254 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008255
Daniel Dunbar52322032009-08-18 05:47:58 +00008256 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008257 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008258 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008259 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008260 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008262 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008264 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008265 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008266 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008267 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008268 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008269 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008270 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008272 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008273
8274 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008275 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008276 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008277 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008278 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008279 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008280 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008281 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008282 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008283 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008284 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008285 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008286 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008287 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008288 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008289
Bill Schmidt778d3872013-07-26 01:36:11 +00008290 case llvm::Triple::ppc64le:
8291 switch (os) {
8292 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008294 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008295 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008296 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008297 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008298 }
8299
Peter Collingbournec947aae2012-05-20 23:28:41 +00008300 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008302 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008304
Tom Stellardd8e38a32015-01-06 20:34:47 +00008305 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008306 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008308
Daniel Dunbar52322032009-08-18 05:47:58 +00008309 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008310 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008311 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008312 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008313 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008314 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008315 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008316 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008317 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008318 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008319 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008320 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008321 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008322 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008323 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008324
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008325 // The 'sparcel' architecture copies all the above cases except for Solaris.
8326 case llvm::Triple::sparcel:
8327 switch (os) {
8328 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008330 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008332 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008334 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008336 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008337 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008338 }
8339
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008340 case llvm::Triple::sparcv9:
8341 switch (os) {
8342 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008343 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008344 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008345 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008346 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008347 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008348 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008350 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008351 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008352 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008353 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008354 }
8355
Ulrich Weigand47445072013-05-06 16:26:41 +00008356 case llvm::Triple::systemz:
8357 switch (os) {
8358 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008359 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008360 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008361 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008362 }
8363
Eli Friedmana9c3d712009-08-19 20:47:07 +00008364 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008366
Daniel Dunbar52322032009-08-18 05:47:58 +00008367 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008368 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008370
Daniel Dunbar52322032009-08-18 05:47:58 +00008371 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008372 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008373 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008374 case llvm::Triple::Linux: {
8375 switch (Triple.getEnvironment()) {
8376 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008377 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008378 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008379 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008380 }
8381 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008382 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008383 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008384 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008385 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008386 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008387 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008388 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008389 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008390 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008391 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008392 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008394 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008395 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008396 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008397 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008398 case llvm::Triple::Win32: {
8399 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008400 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008401 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008402 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008403 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008404 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008405 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008406 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008407 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008408 }
8409 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008410 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008411 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008412 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008414 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008415 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008416 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008417 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008418 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008419 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008420 }
8421
8422 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008423 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008424 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008425
Daniel Dunbar52322032009-08-18 05:47:58 +00008426 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008427 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008428 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008429 case llvm::Triple::Linux: {
8430 switch (Triple.getEnvironment()) {
8431 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008432 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008433 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008434 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008435 }
8436 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008437 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008438 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008439 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008440 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008441 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008442 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008443 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008444 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008445 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008446 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008447 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008448 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008449 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008450 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008451 case llvm::Triple::Win32: {
8452 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008453 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008455 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008456 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008457 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008458 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008459 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008460 }
8461 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008462 case llvm::Triple::Haiku:
8463 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008464 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008466 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008467 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008468 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008469 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008470 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008471
Douglas Katzman78d7c542015-05-12 21:18:10 +00008472 case llvm::Triple::spir: {
8473 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8474 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8475 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008476 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008477 }
8478 case llvm::Triple::spir64: {
8479 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8480 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8481 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008482 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008483 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008484 case llvm::Triple::wasm32:
8485 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8486 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008487 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008488 case llvm::Triple::wasm64:
8489 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8490 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008491 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008492 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008493}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008494
8495/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008496/// options.
Alp Toker80758082014-07-06 05:26:44 +00008497TargetInfo *
8498TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008499 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008500 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008501
8502 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008503 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008504 if (!Target) {
8505 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008506 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008507 }
Alp Toker80758082014-07-06 05:26:44 +00008508 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008509
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008510 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008511 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8512 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008513 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008514 }
8515
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008516 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008517 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8518 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008519 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008520 }
8521
Rafael Espindolaeb265472013-08-21 21:59:03 +00008522 // Set the fp math unit.
8523 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8524 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008525 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008526 }
8527
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008528 // Compute the default target features, we need the target to handle this
8529 // because features may have dependencies on one another.
8530 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008531 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8532 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008533 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008534
8535 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008536 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008537 for (const auto &F : Features)
8538 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8539
Eric Christopher3ff21b32013-10-16 21:26:26 +00008540 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008541 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008542
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008543 Target->setSupportedOpenCLOpts();
8544
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008545 if (!Target->validateTarget(Diags))
8546 return nullptr;
8547
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008548 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008549}