blob: 890a1a7a502a1adcc66e902579f7a95c7c69d5cd [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Saleem Abdulrasool10a49722016-04-08 16:52:00 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Justin Lebar76945b22016-04-29 23:05:19 +000068static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
69 const TargetOptions &Opts);
70
Chris Lattner09d98f52008-10-05 21:50:58 +000071//===----------------------------------------------------------------------===//
72// Defines specific to certain operating systems.
73//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000074
Torok Edwinb2b37c62009-06-30 17:10:35 +000075namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076template<typename TgtInfo>
77class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000078protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000079 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000082 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
83 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000084 void getTargetDefines(const LangOptions &Opts,
85 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000086 TgtInfo::getTargetDefines(Opts, Builder);
87 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000088 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000089
90};
Chris Lattner30ba6742009-08-10 19:03:04 +000091
Eric Christopher7d0c7252015-09-24 21:17:04 +000092// CloudABI Target
93template <typename Target>
94class CloudABITargetInfo : public OSTargetInfo<Target> {
95protected:
96 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
97 MacroBuilder &Builder) const override {
98 Builder.defineMacro("__CloudABI__");
99 Builder.defineMacro("__ELF__");
100
101 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
102 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
103 Builder.defineMacro("__STDC_UTF_16__");
104 Builder.defineMacro("__STDC_UTF_32__");
105 }
106
107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000108 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
109 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000110};
111
Daniel Dunbard86666f2010-01-26 01:44:04 +0000112static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000114 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000116 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000119 // AddressSanitizer doesn't play well with source fortification, which is on
120 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000121 if (Opts.Sanitize.has(SanitizerKind::Address))
122 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000123
John McCall460ce582015-10-22 18:38:17 +0000124 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
125 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000126 // __weak is always defined, for use in blocks and with objc pointers.
127 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000128 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000129 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000130 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000131
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000136
137 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 if (Triple.isMacOSX()) {
143 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000146 Triple.getOSVersion(Maj, Min, Rev);
147 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000148 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000149
Sebastian Pop422377c2012-01-20 22:01:23 +0000150 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000151 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000152 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153 if (PlatformName == "win32") {
154 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
155 return;
156 }
157
Evan Cheng31dd9a62014-01-26 23:12:43 +0000158 // Set the appropriate OS version define.
159 if (Triple.isiOS()) {
160 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
161 char Str[6];
162 Str[0] = '0' + Maj;
163 Str[1] = '0' + (Min / 10);
164 Str[2] = '0' + (Min % 10);
165 Str[3] = '0' + (Rev / 10);
166 Str[4] = '0' + (Rev % 10);
167 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000168 if (Triple.isTvOS())
169 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
170 else
171 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
172 Str);
173
174 } else if (Triple.isWatchOS()) {
175 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
176 char Str[6];
177 Str[0] = '0' + Maj;
178 Str[1] = '0' + (Min / 10);
179 Str[2] = '0' + (Min % 10);
180 Str[3] = '0' + (Rev / 10);
181 Str[4] = '0' + (Rev % 10);
182 Str[5] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000184 } else if (Triple.isMacOSX()) {
185 // Note that the Driver allows versions which aren't representable in the
186 // define (because we only get a single digit for the minor and micro
187 // revision numbers). So, we limit them to the maximum representable
188 // version.
189 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000190 char Str[7];
191 if (Maj < 10 || (Maj == 10 && Min < 10)) {
192 Str[0] = '0' + (Maj / 10);
193 Str[1] = '0' + (Maj % 10);
194 Str[2] = '0' + std::min(Min, 9U);
195 Str[3] = '0' + std::min(Rev, 9U);
196 Str[4] = '\0';
197 } else {
198 // Handle versions > 10.9.
199 Str[0] = '0' + (Maj / 10);
200 Str[1] = '0' + (Maj % 10);
201 Str[2] = '0' + (Min / 10);
202 Str[3] = '0' + (Min % 10);
203 Str[4] = '0' + (Rev / 10);
204 Str[5] = '0' + (Rev % 10);
205 Str[6] = '\0';
206 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000207 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000208 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210 // Tell users about the kernel if there is one.
211 if (Triple.isOSDarwin())
212 Builder.defineMacro("__MACH__");
213
Chris Bieneman46977b62016-04-29 17:53:00 +0000214 // The Watch ABI uses Dwarf EH.
215 if(Triple.isWatchABI())
216 Builder.defineMacro("__ARM_DWARF_EH__");
217
Daniel Dunbarecf13562011-04-19 21:40:34 +0000218 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000219}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000220
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221template<typename Target>
222class DarwinTargetInfo : public OSTargetInfo<Target> {
223protected:
Craig Topper3164f332014-03-11 03:39:26 +0000224 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
225 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000226 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000227 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228 }
Mike Stump11289f42009-09-09 15:08:12 +0000229
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000231 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
232 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000233 // By default, no TLS, and we whitelist permitted architecture/OS
234 // combinations.
235 this->TLSSupported = false;
236
237 if (Triple.isMacOSX())
238 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
239 else if (Triple.isiOS()) {
240 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
241 if (Triple.getArch() == llvm::Triple::x86_64 ||
242 Triple.getArch() == llvm::Triple::aarch64)
243 this->TLSSupported = !Triple.isOSVersionLT(8);
244 else if (Triple.getArch() == llvm::Triple::x86 ||
245 Triple.getArch() == llvm::Triple::arm ||
246 Triple.getArch() == llvm::Triple::thumb)
247 this->TLSSupported = !Triple.isOSVersionLT(9);
248 } else if (Triple.isWatchOS())
249 this->TLSSupported = !Triple.isOSVersionLT(2);
250
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000251 this->MCountName = "\01mcount";
252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000255 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000256 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000257 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000258 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000259 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000260 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000261 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000262
Craig Topper3164f332014-03-11 03:39:26 +0000263 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000264 // FIXME: We should return 0 when building kexts.
265 return "__TEXT,__StaticInit,regular,pure_instructions";
266 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000267
John McCalleed64c72012-01-29 01:20:30 +0000268 /// Darwin does not support protected visibility. Darwin's "default"
269 /// is very similar to ELF's "protected"; Darwin requires a "weak"
270 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000271 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000272 return false;
273 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000274
275 unsigned getExnObjectAlignment() const override {
276 // The alignment of an exception object is 8-bytes for darwin since
277 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
278 // and therefore doesn't guarantee 16-byte alignment.
279 return 64;
280 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281};
282
Chris Lattner30ba6742009-08-10 19:03:04 +0000283
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284// DragonFlyBSD Target
285template<typename Target>
286class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
287protected:
Craig Topper3164f332014-03-11 03:39:26 +0000288 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__DragonFly__");
292 Builder.defineMacro("__DragonFly_cc_version", "100001");
293 Builder.defineMacro("__ELF__");
294 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
295 Builder.defineMacro("__tune_i386__");
296 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297 }
298public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000299 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
300 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000301 switch (Triple.getArch()) {
302 default:
303 case llvm::Triple::x86:
304 case llvm::Triple::x86_64:
305 this->MCountName = ".mcount";
306 break;
307 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000308 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000309};
310
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));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000737 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000738
739 if (Opts.MicrosoftExt) {
740 Builder.defineMacro("_MSC_EXTENSIONS");
741
742 if (Opts.CPlusPlus11) {
743 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
744 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
745 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
746 }
747 }
748
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000749 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000750 }
751
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000752public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000753 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
754 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000755};
756
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000757template <typename Target>
758class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000759protected:
Craig Topper3164f332014-03-11 03:39:26 +0000760 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
761 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000762 if (Opts.POSIXThreads)
763 Builder.defineMacro("_REENTRANT");
764 if (Opts.CPlusPlus)
765 Builder.defineMacro("_GNU_SOURCE");
766
767 DefineStd(Builder, "unix", Opts);
768 Builder.defineMacro("__ELF__");
769 Builder.defineMacro("__native_client__");
770 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000771
772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000775 this->LongAlign = 32;
776 this->LongWidth = 32;
777 this->PointerAlign = 32;
778 this->PointerWidth = 32;
779 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000780 this->Int64Type = TargetInfo::SignedLongLong;
781 this->DoubleAlign = 64;
782 this->LongDoubleWidth = 64;
783 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000784 this->LongLongWidth = 64;
785 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000786 this->SizeType = TargetInfo::UnsignedInt;
787 this->PtrDiffType = TargetInfo::SignedInt;
788 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000789 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000790 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000791 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000792 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000793 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000794 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000795 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000796 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000797 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000798 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000799 } else {
800 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000801 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000802 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000803 }
804};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000805
Dan Gohmanc2853072015-09-03 22:51:53 +0000806// WebAssembly target
807template <typename Target>
808class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
809 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000810 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000811 // A common platform macro.
812 if (Opts.POSIXThreads)
813 Builder.defineMacro("_REENTRANT");
814 // Follow g++ convention and predefine _GNU_SOURCE for C++.
815 if (Opts.CPlusPlus)
816 Builder.defineMacro("_GNU_SOURCE");
817 }
818
819 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000820 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000821 return ".text.__startup";
822 }
823
824public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000825 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
826 const TargetOptions &Opts)
827 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000828 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000829 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
830 }
831};
Dan Gohmanc2853072015-09-03 22:51:53 +0000832
Chris Lattner09d98f52008-10-05 21:50:58 +0000833//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000834// Specific target implementations.
835//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000836
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000837// PPC abstract base class
838class PPCTargetInfo : public TargetInfo {
839 static const Builtin::Info BuiltinInfo[];
840 static const char * const GCCRegNames[];
841 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000842 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000843
844 // Target cpu features.
845 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000846 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000847 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000848 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000849 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000850 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000851 bool HasBPERMD;
852 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000853
Ulrich Weigand8afad612014-07-28 13:17:52 +0000854protected:
855 std::string ABI;
856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000858 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000859 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
860 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000861 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000862 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000863 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000864 LongDoubleWidth = LongDoubleAlign = 128;
865 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
866 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000867
Hal Finkel6b984f02012-07-03 16:51:04 +0000868 /// \brief Flags for architecture specific defines.
869 typedef enum {
870 ArchDefineNone = 0,
871 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
872 ArchDefinePpcgr = 1 << 1,
873 ArchDefinePpcsq = 1 << 2,
874 ArchDefine440 = 1 << 3,
875 ArchDefine603 = 1 << 4,
876 ArchDefine604 = 1 << 5,
877 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000878 ArchDefinePwr5 = 1 << 7,
879 ArchDefinePwr5x = 1 << 8,
880 ArchDefinePwr6 = 1 << 9,
881 ArchDefinePwr6x = 1 << 10,
882 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000883 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000884 ArchDefinePwr9 = 1 << 13,
885 ArchDefineA2 = 1 << 14,
886 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000887 } ArchDefineTypes;
888
Bill Schmidt38378a02013-02-01 20:23:10 +0000889 // Note: GCC recognizes the following additional cpus:
890 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
891 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
892 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000893 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000894 bool CPUKnown = llvm::StringSwitch<bool>(Name)
895 .Case("generic", true)
896 .Case("440", true)
897 .Case("450", true)
898 .Case("601", true)
899 .Case("602", true)
900 .Case("603", true)
901 .Case("603e", true)
902 .Case("603ev", true)
903 .Case("604", true)
904 .Case("604e", true)
905 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000906 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000907 .Case("g3", true)
908 .Case("7400", true)
909 .Case("g4", true)
910 .Case("7450", true)
911 .Case("g4+", true)
912 .Case("750", true)
913 .Case("970", true)
914 .Case("g5", true)
915 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000916 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000917 .Case("e500mc", true)
918 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000919 .Case("power3", true)
920 .Case("pwr3", true)
921 .Case("power4", true)
922 .Case("pwr4", true)
923 .Case("power5", true)
924 .Case("pwr5", true)
925 .Case("power5x", true)
926 .Case("pwr5x", true)
927 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000928 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000929 .Case("power6x", true)
930 .Case("pwr6x", true)
931 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000932 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000933 .Case("power8", true)
934 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000935 .Case("power9", true)
936 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000937 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000938 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000940 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000941 .Case("powerpc64le", true)
942 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000943 .Default(false);
944
945 if (CPUKnown)
946 CPU = Name;
947
948 return CPUKnown;
949 }
950
Ulrich Weigand8afad612014-07-28 13:17:52 +0000951
952 StringRef getABI() const override { return ABI; }
953
Craig Topper6c03a542015-10-19 04:51:35 +0000954 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
955 return llvm::makeArrayRef(BuiltinInfo,
956 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000957 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000958
Craig Topper3164f332014-03-11 03:39:26 +0000959 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000960
Craig Topper3164f332014-03-11 03:39:26 +0000961 void getTargetDefines(const LangOptions &Opts,
962 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000963
Eric Christopher8c47b422015-10-09 18:39:55 +0000964 bool
965 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
966 StringRef CPU,
967 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000968
Craig Topper3164f332014-03-11 03:39:26 +0000969 bool handleTargetFeatures(std::vector<std::string> &Features,
970 DiagnosticsEngine &Diags) override;
971 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000972 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
973 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000974
Craig Topperf054e3a2015-10-19 03:52:27 +0000975 ArrayRef<const char *> getGCCRegNames() const override;
976 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000977 bool validateAsmConstraint(const char *&Name,
978 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000979 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000980 default: return false;
981 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000982 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000983 case 'b': // Base register
984 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000985 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000986 break;
987 // FIXME: The following are added to allow parsing.
988 // I just took a guess at what the actions should be.
989 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000991 case 'v': // Altivec vector register
992 Info.setAllowsRegister();
993 break;
994 case 'w':
995 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 case 'd':// VSX vector register to hold vector double data
997 case 'f':// VSX vector register to hold vector float data
998 case 's':// VSX vector register to hold scalar float data
999 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001000 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001001 break;
1002 default:
1003 return false;
1004 }
1005 Info.setAllowsRegister();
1006 Name++; // Skip over 'w'.
1007 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001008 case 'h': // `MQ', `CTR', or `LINK' register
1009 case 'q': // `MQ' register
1010 case 'c': // `CTR' register
1011 case 'l': // `LINK' register
1012 case 'x': // `CR' register (condition register) number 0
1013 case 'y': // `CR' register (condition register)
1014 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001015 Info.setAllowsRegister();
1016 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001017 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001018 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001019 // (use `L' instead for SImode constants)
1020 case 'K': // Unsigned 16-bit constant
1021 case 'L': // Signed 16-bit constant shifted left 16 bits
1022 case 'M': // Constant larger than 31
1023 case 'N': // Exact power of 2
1024 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001025 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001026 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001027 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001029 break;
1030 case 'm': // Memory operand. Note that on PowerPC targets, m can
1031 // include addresses that update the base register. It
1032 // is therefore only safe to use `m' in an asm statement
1033 // if that asm statement accesses the operand exactly once.
1034 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001035 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001036 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001037 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001039 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1040 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001041 // register to be updated.
1042 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001043 if (Name[1] != 's')
1044 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001045 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001046 // include any automodification of the base register. Unlike
1047 // `m', this constraint can be used in asm statements that
1048 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001049 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001050 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001051 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001052 break;
1053 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001054 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001055 case 'Z': // Memory operand that is an indexed or indirect from a
1056 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001057 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001058 Info.setAllowsMemory();
1059 Info.setAllowsRegister();
1060 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 // register (`p' is preferable for asm statements)
1064 case 'S': // Constant suitable as a 64-bit mask operand
1065 case 'T': // Constant suitable as a 32-bit mask operand
1066 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001067 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001068 // instructions
1069 case 'W': // Vector constant that does not require memory
1070 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001073 }
John Thompson07a61a42010-06-24 22:44:13 +00001074 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001075 }
Craig Topper3164f332014-03-11 03:39:26 +00001076 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001077 std::string R;
1078 switch (*Constraint) {
1079 case 'e':
1080 case 'w':
1081 // Two-character constraint; add "^" hint for later parsing.
1082 R = std::string("^") + std::string(Constraint, 2);
1083 Constraint++;
1084 break;
1085 default:
1086 return TargetInfo::convertConstraint(Constraint);
1087 }
1088 return R;
1089 }
Craig Topper3164f332014-03-11 03:39:26 +00001090 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001091 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001092 }
Craig Topper3164f332014-03-11 03:39:26 +00001093 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001094 if (RegNo == 0) return 3;
1095 if (RegNo == 1) return 4;
1096 return -1;
1097 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001098
1099 bool hasSjLjLowering() const override {
1100 return true;
1101 }
David Majnemer2617ea62015-06-09 18:05:33 +00001102
1103 bool useFloat128ManglingForLongDouble() const override {
1104 return LongDoubleWidth == 128 &&
1105 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1106 getTriple().isOSBinFormatELF();
1107 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001108};
Anders Carlssonf511f642007-11-27 04:11:28 +00001109
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001111#define BUILTIN(ID, TYPE, ATTRS) \
1112 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1113#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1114 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001115#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001116};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001117
Eric Christopher917e9522014-11-18 22:36:15 +00001118/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001119/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001120bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001121 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001122 for (const auto &Feature : Features) {
1123 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001124 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001125 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001126 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001127 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001128 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001129 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001130 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001131 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001132 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001133 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001134 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001135 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001136 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001137 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001138 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001139 } else if (Feature == "+float128") {
1140 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001141 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001142 // TODO: Finish this list and add an assert that we've handled them
1143 // all.
1144 }
Eric Christopher02c33352015-08-25 00:59:11 +00001145
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001146 return true;
1147}
1148
Chris Lattnerecd49032009-03-02 22:27:17 +00001149/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1150/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001151void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001152 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001153 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001154 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001155 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001156 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001157 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001158 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001159 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001160 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001161 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001162 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001163 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001164 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001165
Chris Lattnerecd49032009-03-02 22:27:17 +00001166 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001167 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1168 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001169 } else {
1170 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1171 getTriple().getOS() != llvm::Triple::OpenBSD)
1172 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001173 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001174
Ulrich Weigand8afad612014-07-28 13:17:52 +00001175 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001176 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001177 Builder.defineMacro("_CALL_ELF", "1");
1178 if (ABI == "elfv2")
1179 Builder.defineMacro("_CALL_ELF", "2");
1180
Chris Lattnerecd49032009-03-02 22:27:17 +00001181 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1183 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001184
Chris Lattnerecd49032009-03-02 22:27:17 +00001185 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001186 if (LongDoubleWidth == 128)
1187 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001188
John Thompsone467e192009-11-19 17:18:50 +00001189 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001190 Builder.defineMacro("__VEC__", "10206");
1191 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001192 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001193
1194 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001195 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1196 .Case("440", ArchDefineName)
1197 .Case("450", ArchDefineName | ArchDefine440)
1198 .Case("601", ArchDefineName)
1199 .Case("602", ArchDefineName | ArchDefinePpcgr)
1200 .Case("603", ArchDefineName | ArchDefinePpcgr)
1201 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1202 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1203 .Case("604", ArchDefineName | ArchDefinePpcgr)
1204 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1205 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001206 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001207 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1208 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1209 .Case("750", ArchDefineName | ArchDefinePpcgr)
1210 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1211 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001212 .Case("a2", ArchDefineA2)
1213 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001214 .Case("pwr3", ArchDefinePpcgr)
1215 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1216 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1217 | ArchDefinePpcsq)
1218 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1219 | ArchDefinePpcgr | ArchDefinePpcsq)
1220 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1221 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1222 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1223 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1224 | ArchDefinePpcsq)
1225 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1226 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001227 | ArchDefinePpcgr | ArchDefinePpcsq)
1228 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1229 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1230 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001231 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1232 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1233 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1234 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001235 .Case("power3", ArchDefinePpcgr)
1236 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1237 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1238 | ArchDefinePpcsq)
1239 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1240 | ArchDefinePpcgr | ArchDefinePpcsq)
1241 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1242 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1243 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1244 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1245 | ArchDefinePpcsq)
1246 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1247 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001248 | ArchDefinePpcgr | ArchDefinePpcsq)
1249 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1250 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1251 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001252 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1253 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1254 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1255 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001256 .Default(ArchDefineNone);
1257
1258 if (defs & ArchDefineName)
1259 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1260 if (defs & ArchDefinePpcgr)
1261 Builder.defineMacro("_ARCH_PPCGR");
1262 if (defs & ArchDefinePpcsq)
1263 Builder.defineMacro("_ARCH_PPCSQ");
1264 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001265 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001266 if (defs & ArchDefine603)
1267 Builder.defineMacro("_ARCH_603");
1268 if (defs & ArchDefine604)
1269 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001270 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001271 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001272 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001273 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001274 if (defs & ArchDefinePwr5x)
1275 Builder.defineMacro("_ARCH_PWR5X");
1276 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001277 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001278 if (defs & ArchDefinePwr6x)
1279 Builder.defineMacro("_ARCH_PWR6X");
1280 if (defs & ArchDefinePwr7)
1281 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001282 if (defs & ArchDefinePwr8)
1283 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001284 if (defs & ArchDefinePwr9)
1285 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001286 if (defs & ArchDefineA2)
1287 Builder.defineMacro("_ARCH_A2");
1288 if (defs & ArchDefineA2q) {
1289 Builder.defineMacro("_ARCH_A2Q");
1290 Builder.defineMacro("_ARCH_QP");
1291 }
1292
1293 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1294 Builder.defineMacro("__bg__");
1295 Builder.defineMacro("__THW_BLUEGENE__");
1296 Builder.defineMacro("__bgq__");
1297 Builder.defineMacro("__TOS_BGQ__");
1298 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001299
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001300 if (HasVSX)
1301 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001302 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001303 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001304 if (HasP8Crypto)
1305 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001306 if (HasHTM)
1307 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001308 if (HasFloat128)
1309 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001310
1311 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1312 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1313 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1314 if (PointerWidth == 64)
1315 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001316
Bill Schmidt38378a02013-02-01 20:23:10 +00001317 // FIXME: The following are not yet generated here by Clang, but are
1318 // generated by GCC:
1319 //
1320 // _SOFT_FLOAT_
1321 // __RECIP_PRECISION__
1322 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001323 // __RECIP__
1324 // __RECIPF__
1325 // __RSQRTE__
1326 // __RSQRTEF__
1327 // _SOFT_DOUBLE_
1328 // __NO_LWSYNC__
1329 // __HAVE_BSWAP__
1330 // __LONGDOUBLE128
1331 // __CMODEL_MEDIUM__
1332 // __CMODEL_LARGE__
1333 // _CALL_SYSV
1334 // _CALL_DARWIN
1335 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001336}
1337
Eric Christophera8a14c32015-08-31 18:39:16 +00001338// Handle explicit options being passed to the compiler here: if we've
1339// explicitly turned off vsx and turned on power8-vector or direct-move then
1340// go ahead and error since the customer has expressed a somewhat incompatible
1341// set of options.
1342static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001343 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001344
1345 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1346 FeaturesVec.end()) {
1347 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1348 FeaturesVec.end()) {
1349 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1350 << "-mno-vsx";
1351 return false;
1352 }
1353
1354 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1355 FeaturesVec.end()) {
1356 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1357 << "-mno-vsx";
1358 return false;
1359 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001360
1361 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1362 FeaturesVec.end()) {
1363 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1364 << "-mno-vsx";
1365 return false;
1366 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001367 }
1368
1369 return true;
1370}
1371
Eric Christopher8c47b422015-10-09 18:39:55 +00001372bool PPCTargetInfo::initFeatureMap(
1373 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1374 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001375 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1376 .Case("7400", true)
1377 .Case("g4", true)
1378 .Case("7450", true)
1379 .Case("g4+", true)
1380 .Case("970", true)
1381 .Case("g5", true)
1382 .Case("pwr6", true)
1383 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001384 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001385 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001386 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001387 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001388 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001389
1390 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001391 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1392 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001393 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001394 .Case("pwr8", true)
1395 .Default(false);
1396 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1397 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001398 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001399 .Case("pwr8", true)
1400 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001401 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1402 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001403 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001404 .Case("pwr8", true)
1405 .Case("pwr7", true)
1406 .Default(false);
1407 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1408 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001409 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001410 .Case("pwr8", true)
1411 .Case("pwr7", true)
1412 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001413 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1414 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001415 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001416 .Case("pwr8", true)
1417 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001418 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1419 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001420 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001421 .Case("pwr8", true)
1422 .Case("pwr7", true)
1423 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001424
Eric Christophera8a14c32015-08-31 18:39:16 +00001425 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1426 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001427
Eric Christopher007b0a02015-08-28 22:32:01 +00001428 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001429}
1430
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001431bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001432 return llvm::StringSwitch<bool>(Feature)
1433 .Case("powerpc", true)
1434 .Case("vsx", HasVSX)
1435 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001436 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001437 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001438 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001439 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001440 .Case("bpermd", HasBPERMD)
1441 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001442 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001443 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001444}
Chris Lattner17df24e2008-04-21 18:56:49 +00001445
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001446void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1447 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001448 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1449 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1450 // incompatible options.
1451 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001452 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001453 Features[Name] = Features["vsx"] = true;
1454 } else if (Name == "power8-vector") {
1455 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001456 } else if (Name == "float128") {
1457 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001458 } else {
1459 Features[Name] = true;
1460 }
1461 } else {
1462 if (Name == "vsx") {
1463 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001464 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001465 } else {
1466 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001467 }
1468 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001469}
1470
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001471const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001472 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1473 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1474 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1475 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1476 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1477 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1478 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1479 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001480 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001481 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001482 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001483 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1484 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1485 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1486 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001487 "vrsave", "vscr",
1488 "spe_acc", "spefscr",
1489 "sfp"
1490};
Chris Lattner10a5b382007-01-29 05:24:35 +00001491
Craig Topperf054e3a2015-10-19 03:52:27 +00001492ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1493 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001494}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001495
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001496const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1497 // While some of these aliases do map to different registers
1498 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001499 { { "0" }, "r0" },
1500 { { "1"}, "r1" },
1501 { { "2" }, "r2" },
1502 { { "3" }, "r3" },
1503 { { "4" }, "r4" },
1504 { { "5" }, "r5" },
1505 { { "6" }, "r6" },
1506 { { "7" }, "r7" },
1507 { { "8" }, "r8" },
1508 { { "9" }, "r9" },
1509 { { "10" }, "r10" },
1510 { { "11" }, "r11" },
1511 { { "12" }, "r12" },
1512 { { "13" }, "r13" },
1513 { { "14" }, "r14" },
1514 { { "15" }, "r15" },
1515 { { "16" }, "r16" },
1516 { { "17" }, "r17" },
1517 { { "18" }, "r18" },
1518 { { "19" }, "r19" },
1519 { { "20" }, "r20" },
1520 { { "21" }, "r21" },
1521 { { "22" }, "r22" },
1522 { { "23" }, "r23" },
1523 { { "24" }, "r24" },
1524 { { "25" }, "r25" },
1525 { { "26" }, "r26" },
1526 { { "27" }, "r27" },
1527 { { "28" }, "r28" },
1528 { { "29" }, "r29" },
1529 { { "30" }, "r30" },
1530 { { "31" }, "r31" },
1531 { { "fr0" }, "f0" },
1532 { { "fr1" }, "f1" },
1533 { { "fr2" }, "f2" },
1534 { { "fr3" }, "f3" },
1535 { { "fr4" }, "f4" },
1536 { { "fr5" }, "f5" },
1537 { { "fr6" }, "f6" },
1538 { { "fr7" }, "f7" },
1539 { { "fr8" }, "f8" },
1540 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001541 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001542 { { "fr11" }, "f11" },
1543 { { "fr12" }, "f12" },
1544 { { "fr13" }, "f13" },
1545 { { "fr14" }, "f14" },
1546 { { "fr15" }, "f15" },
1547 { { "fr16" }, "f16" },
1548 { { "fr17" }, "f17" },
1549 { { "fr18" }, "f18" },
1550 { { "fr19" }, "f19" },
1551 { { "fr20" }, "f20" },
1552 { { "fr21" }, "f21" },
1553 { { "fr22" }, "f22" },
1554 { { "fr23" }, "f23" },
1555 { { "fr24" }, "f24" },
1556 { { "fr25" }, "f25" },
1557 { { "fr26" }, "f26" },
1558 { { "fr27" }, "f27" },
1559 { { "fr28" }, "f28" },
1560 { { "fr29" }, "f29" },
1561 { { "fr30" }, "f30" },
1562 { { "fr31" }, "f31" },
1563 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001564};
1565
Craig Topperf054e3a2015-10-19 03:52:27 +00001566ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1567 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001568}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001569
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001570class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001571public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001572 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1573 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001574 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001575
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001576 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001577 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001578 case llvm::Triple::FreeBSD:
1579 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001580 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001581 PtrDiffType = SignedInt;
1582 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001583 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001584 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001585 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001586 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001587
Roman Divacky3ffe7462012-03-13 19:20:17 +00001588 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1589 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001590 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001591 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001592
1593 // PPC32 supports atomics up to 4 bytes.
1594 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001595 }
1596
Craig Topper3164f332014-03-11 03:39:26 +00001597 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001598 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001599 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001600 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001601};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001602
Bill Schmidt778d3872013-07-26 01:36:11 +00001603// Note: ABI differences may eventually require us to have a separate
1604// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001605class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001606public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001607 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1608 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001609 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001610 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001611 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001612
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001613 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001614 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001615 ABI = "elfv2";
1616 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001617 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001618 ABI = "elfv1";
1619 }
1620
1621 switch (getTriple().getOS()) {
1622 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001623 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001624 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001625 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001626 case llvm::Triple::NetBSD:
1627 IntMaxType = SignedLongLong;
1628 Int64Type = SignedLongLong;
1629 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001630 default:
1631 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001632 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001633
1634 // PPC64 supports atomics up to 8 bytes.
1635 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001636 }
Craig Topper3164f332014-03-11 03:39:26 +00001637 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001638 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001639 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001640 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001641 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001642 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001643 ABI = Name;
1644 return true;
1645 }
1646 return false;
1647 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001648};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001649
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001650class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001651public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001652 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1653 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001654 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001655 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001656 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001657 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001658 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001659 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001660 }
Craig Topper3164f332014-03-11 03:39:26 +00001661 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001662 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001663 }
1664};
1665
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001666class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001667public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001668 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1669 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001670 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001671 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001672 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001673 }
1674};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001675
Eric Christopherc48497a2015-09-18 21:26:24 +00001676static const unsigned NVPTXAddrSpaceMap[] = {
1677 1, // opencl_global
1678 3, // opencl_local
1679 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001680 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001681 0, // opencl_generic
1682 1, // cuda_device
1683 4, // cuda_constant
1684 3, // cuda_shared
1685};
1686
1687class NVPTXTargetInfo : public TargetInfo {
1688 static const char *const GCCRegNames[];
1689 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001690
1691 // The GPU profiles supported by the NVPTX backend
1692 enum GPUKind {
1693 GK_NONE,
1694 GK_SM20,
1695 GK_SM21,
1696 GK_SM30,
1697 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001698 GK_SM37,
Artem Belevichffa5fc52016-05-19 17:47:47 +00001699 GK_SM50,
1700 GK_SM52,
1701 GK_SM53,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001702 } GPU;
1703
Eric Christopherc48497a2015-09-18 21:26:24 +00001704public:
Justin Lebar76945b22016-04-29 23:05:19 +00001705 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001706 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001707 BigEndian = false;
1708 TLSSupported = false;
1709 LongWidth = LongAlign = 64;
1710 AddrSpaceMap = &NVPTXAddrSpaceMap;
1711 UseAddrSpaceMapMangling = true;
1712 // Define available target features
1713 // These must be defined in sorted order!
1714 NoAsmVariants = true;
1715 // Set the default GPU to sm20
1716 GPU = GK_SM20;
Justin Lebar76945b22016-04-29 23:05:19 +00001717
1718 // If possible, get a TargetInfo for our host triple, so we can match its
1719 // types.
1720 llvm::Triple HostTriple(Opts.HostTriple);
1721 if (HostTriple.isNVPTX())
1722 return;
1723 std::unique_ptr<TargetInfo> HostTarget(
1724 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1725 if (!HostTarget) {
1726 return;
1727 }
1728
1729 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1730 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1731 BoolWidth = HostTarget->getBoolWidth();
1732 BoolAlign = HostTarget->getBoolAlign();
1733 IntWidth = HostTarget->getIntWidth();
1734 IntAlign = HostTarget->getIntAlign();
1735 HalfWidth = HostTarget->getHalfWidth();
1736 HalfAlign = HostTarget->getHalfAlign();
1737 FloatWidth = HostTarget->getFloatWidth();
1738 FloatAlign = HostTarget->getFloatAlign();
1739 DoubleWidth = HostTarget->getDoubleWidth();
1740 DoubleAlign = HostTarget->getDoubleAlign();
1741 LongWidth = HostTarget->getLongWidth();
1742 LongAlign = HostTarget->getLongAlign();
1743 LongLongWidth = HostTarget->getLongLongWidth();
1744 LongLongAlign = HostTarget->getLongLongAlign();
1745 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1746 DefaultAlignForAttributeAligned =
1747 HostTarget->getDefaultAlignForAttributeAligned();
1748 SizeType = HostTarget->getSizeType();
1749 IntMaxType = HostTarget->getIntMaxType();
1750 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1751 IntPtrType = HostTarget->getIntPtrType();
1752 WCharType = HostTarget->getWCharType();
1753 WIntType = HostTarget->getWIntType();
1754 Char16Type = HostTarget->getChar16Type();
1755 Char32Type = HostTarget->getChar32Type();
1756 Int64Type = HostTarget->getInt64Type();
1757 SigAtomicType = HostTarget->getSigAtomicType();
1758 ProcessIDType = HostTarget->getProcessIDType();
1759
1760 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1761 UseZeroLengthBitfieldAlignment =
1762 HostTarget->useZeroLengthBitfieldAlignment();
1763 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1764 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1765
1766 // Properties intentionally not copied from host:
1767 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1768 // host/device boundary.
1769 // - SuitableAlign: Not visible across the host/device boundary, and may
1770 // correctly be different on host/device, e.g. if host has wider vector
1771 // types than device.
1772 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1773 // as its double type, but that's not necessarily true on the host.
1774 // TODO: nvcc emits a warning when using long double on device; we should
1775 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001776 }
1777 void getTargetDefines(const LangOptions &Opts,
1778 MacroBuilder &Builder) const override {
1779 Builder.defineMacro("__PTX__");
1780 Builder.defineMacro("__NVPTX__");
1781 if (Opts.CUDAIsDevice) {
1782 // Set __CUDA_ARCH__ for the GPU specified.
1783 std::string CUDAArchCode;
1784 switch (GPU) {
1785 case GK_SM20:
1786 CUDAArchCode = "200";
1787 break;
1788 case GK_SM21:
1789 CUDAArchCode = "210";
1790 break;
1791 case GK_SM30:
1792 CUDAArchCode = "300";
1793 break;
1794 case GK_SM35:
1795 CUDAArchCode = "350";
1796 break;
1797 case GK_SM37:
1798 CUDAArchCode = "370";
1799 break;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001800 case GK_SM50:
1801 CUDAArchCode = "500";
1802 break;
1803 case GK_SM52:
1804 CUDAArchCode = "520";
1805 break;
1806 case GK_SM53:
1807 CUDAArchCode = "530";
1808 break;
Eric Christopherc48497a2015-09-18 21:26:24 +00001809 default:
1810 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001811 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001812 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001813 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001814 }
Craig Topper6c03a542015-10-19 04:51:35 +00001815 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1816 return llvm::makeArrayRef(BuiltinInfo,
1817 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001818 }
1819 bool hasFeature(StringRef Feature) const override {
1820 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001821 }
1822
Craig Topperf054e3a2015-10-19 03:52:27 +00001823 ArrayRef<const char *> getGCCRegNames() const override;
1824 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001825 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001826 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001827 }
1828 bool validateAsmConstraint(const char *&Name,
1829 TargetInfo::ConstraintInfo &Info) const override {
1830 switch (*Name) {
1831 default:
1832 return false;
1833 case 'c':
1834 case 'h':
1835 case 'r':
1836 case 'l':
1837 case 'f':
1838 case 'd':
1839 Info.setAllowsRegister();
1840 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001841 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001842 }
1843 const char *getClobbers() const override {
1844 // FIXME: Is this really right?
1845 return "";
1846 }
1847 BuiltinVaListKind getBuiltinVaListKind() const override {
1848 // FIXME: implement
1849 return TargetInfo::CharPtrBuiltinVaList;
1850 }
1851 bool setCPU(const std::string &Name) override {
1852 GPU = llvm::StringSwitch<GPUKind>(Name)
1853 .Case("sm_20", GK_SM20)
1854 .Case("sm_21", GK_SM21)
1855 .Case("sm_30", GK_SM30)
1856 .Case("sm_35", GK_SM35)
1857 .Case("sm_37", GK_SM37)
Artem Belevichffa5fc52016-05-19 17:47:47 +00001858 .Case("sm_50", GK_SM50)
1859 .Case("sm_52", GK_SM52)
1860 .Case("sm_53", GK_SM53)
Eric Christopherc48497a2015-09-18 21:26:24 +00001861 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001862
Eric Christopherc48497a2015-09-18 21:26:24 +00001863 return GPU != GK_NONE;
1864 }
1865};
1866
1867const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1868#define BUILTIN(ID, TYPE, ATTRS) \
1869 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1870#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1871 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1872#include "clang/Basic/BuiltinsNVPTX.def"
1873};
1874
1875const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1876
Craig Topperf054e3a2015-10-19 03:52:27 +00001877ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1878 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001879}
1880
1881class NVPTX32TargetInfo : public NVPTXTargetInfo {
1882public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001883 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1884 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001885 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001886 PointerWidth = PointerAlign = 32;
1887 SizeType = TargetInfo::UnsignedInt;
1888 PtrDiffType = TargetInfo::SignedInt;
1889 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001890 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001891 }
1892};
1893
1894class NVPTX64TargetInfo : public NVPTXTargetInfo {
1895public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001896 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1897 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001898 PointerWidth = PointerAlign = 64;
1899 SizeType = TargetInfo::UnsignedLong;
1900 PtrDiffType = TargetInfo::SignedLong;
1901 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001902 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001903 }
1904};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001905
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001906static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001907 1, // opencl_global
1908 3, // opencl_local
1909 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001910 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001911 1, // cuda_device
1912 2, // cuda_constant
1913 3 // cuda_shared
1914};
1915
Tom Stellarda96344b2014-08-21 13:58:40 +00001916// If you edit the description strings, make sure you update
1917// getPointerWidthV().
1918
Craig Topper273dbc62015-10-18 05:29:26 +00001919static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001920 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1921 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001922
Craig Topper273dbc62015-10-18 05:29:26 +00001923static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001924 "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 +00001925 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1926 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001927
Matt Arsenault250024f2016-06-08 01:56:42 +00001928class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001929 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001930 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001931
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001932 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001933 enum GPUKind {
1934 GK_NONE,
1935 GK_R600,
1936 GK_R600_DOUBLE_OPS,
1937 GK_R700,
1938 GK_R700_DOUBLE_OPS,
1939 GK_EVERGREEN,
1940 GK_EVERGREEN_DOUBLE_OPS,
1941 GK_NORTHERN_ISLANDS,
1942 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001943 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001944 GK_SEA_ISLANDS,
1945 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001946 } GPU;
1947
Jan Veselyeebeaea2015-05-04 19:53:36 +00001948 bool hasFP64:1;
1949 bool hasFMAF:1;
1950 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001951
Matt Arsenault250024f2016-06-08 01:56:42 +00001952 static bool isAMDGCN(const llvm::Triple &TT) {
1953 return TT.getArch() == llvm::Triple::amdgcn;
1954 }
1955
Eli Friedmand13b41e2012-10-12 23:32:00 +00001956public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001957 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Matt Arsenault250024f2016-06-08 01:56:42 +00001958 : TargetInfo(Triple) ,
1959 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1960 hasFP64(false),
1961 hasFMAF(false),
1962 hasLDEXPF(false) {
1963 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001964 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001965 hasFMAF = true;
1966 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001967 }
Matt Arsenault250024f2016-06-08 01:56:42 +00001968
1969 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1970 DataLayoutStringSI : DataLayoutStringR600);
1971
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001972 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001973 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001974 }
1975
Tom Stellarda96344b2014-08-21 13:58:40 +00001976 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1977 if (GPU <= GK_CAYMAN)
1978 return 32;
1979
1980 switch(AddrSpace) {
1981 default:
1982 return 64;
1983 case 0:
1984 case 3:
1985 case 5:
1986 return 32;
1987 }
1988 }
1989
Craig Topper3164f332014-03-11 03:39:26 +00001990 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001991 return "";
1992 }
1993
Craig Topperf054e3a2015-10-19 03:52:27 +00001994 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001995
Craig Topperf054e3a2015-10-19 03:52:27 +00001996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1997 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001998 }
1999
Craig Topper3164f332014-03-11 03:39:26 +00002000 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002001 TargetInfo::ConstraintInfo &Info) const override {
2002 switch (*Name) {
2003 default: break;
2004 case 'v': // vgpr
2005 case 's': // sgpr
2006 Info.setAllowsRegister();
2007 return true;
2008 }
2009 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002010 }
2011
Matt Arsenault250024f2016-06-08 01:56:42 +00002012 bool initFeatureMap(llvm::StringMap<bool> &Features,
2013 DiagnosticsEngine &Diags, StringRef CPU,
2014 const std::vector<std::string> &FeatureVec) const override;
2015
Craig Topper6c03a542015-10-19 04:51:35 +00002016 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2017 return llvm::makeArrayRef(BuiltinInfo,
2018 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002019 }
2020
Craig Topper3164f332014-03-11 03:39:26 +00002021 void getTargetDefines(const LangOptions &Opts,
2022 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002023 if (getTriple().getArch() == llvm::Triple::amdgcn)
2024 Builder.defineMacro("__AMDGCN__");
2025 else
2026 Builder.defineMacro("__R600__");
2027
Jan Veselyeebeaea2015-05-04 19:53:36 +00002028 if (hasFMAF)
2029 Builder.defineMacro("__HAS_FMAF__");
2030 if (hasLDEXPF)
2031 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002032 if (hasFP64)
2033 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002034 }
2035
Craig Topper3164f332014-03-11 03:39:26 +00002036 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002037 return TargetInfo::CharPtrBuiltinVaList;
2038 }
2039
Matt Arsenault250024f2016-06-08 01:56:42 +00002040 static GPUKind parseR600Name(StringRef Name) {
2041 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002042 .Case("r600" , GK_R600)
2043 .Case("rv610", GK_R600)
2044 .Case("rv620", GK_R600)
2045 .Case("rv630", GK_R600)
2046 .Case("rv635", GK_R600)
2047 .Case("rs780", GK_R600)
2048 .Case("rs880", GK_R600)
2049 .Case("rv670", GK_R600_DOUBLE_OPS)
2050 .Case("rv710", GK_R700)
2051 .Case("rv730", GK_R700)
2052 .Case("rv740", GK_R700_DOUBLE_OPS)
2053 .Case("rv770", GK_R700_DOUBLE_OPS)
2054 .Case("palm", GK_EVERGREEN)
2055 .Case("cedar", GK_EVERGREEN)
2056 .Case("sumo", GK_EVERGREEN)
2057 .Case("sumo2", GK_EVERGREEN)
2058 .Case("redwood", GK_EVERGREEN)
2059 .Case("juniper", GK_EVERGREEN)
2060 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2061 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2062 .Case("barts", GK_NORTHERN_ISLANDS)
2063 .Case("turks", GK_NORTHERN_ISLANDS)
2064 .Case("caicos", GK_NORTHERN_ISLANDS)
2065 .Case("cayman", GK_CAYMAN)
2066 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002067 .Default(GK_NONE);
2068 }
2069
2070 static GPUKind parseAMDGCNName(StringRef Name) {
2071 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellard785699322013-04-01 20:56:49 +00002072 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002073 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2074 .Case("verde", GK_SOUTHERN_ISLANDS)
2075 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002076 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002077 .Case("bonaire", GK_SEA_ISLANDS)
2078 .Case("kabini", GK_SEA_ISLANDS)
2079 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002080 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002081 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002082 .Case("tonga", GK_VOLCANIC_ISLANDS)
2083 .Case("iceland", GK_VOLCANIC_ISLANDS)
2084 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002085 .Case("fiji", GK_VOLCANIC_ISLANDS)
2086 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002087 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002088 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002089
Matt Arsenault250024f2016-06-08 01:56:42 +00002090 bool setCPU(const std::string &Name) override {
2091 if (getTriple().getArch() == llvm::Triple::amdgcn)
2092 GPU = parseAMDGCNName(Name);
2093 else
2094 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002095
Matt Arsenault250024f2016-06-08 01:56:42 +00002096 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002097 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002098
Jan Vesely211ba782016-06-17 02:25:03 +00002099 void setSupportedOpenCLOpts() override {
2100 auto &Opts = getSupportedOpenCLOpts();
2101 Opts.cl_clang_storage_class_specifiers = 1;
2102 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002103
Jan Vesely211ba782016-06-17 02:25:03 +00002104 if (hasFP64)
2105 Opts.cl_khr_fp64 = 1;
2106 if (GPU >= GK_EVERGREEN) {
2107 Opts.cl_khr_byte_addressable_store = 1;
2108 Opts.cl_khr_global_int32_base_atomics = 1;
2109 Opts.cl_khr_global_int32_extended_atomics = 1;
2110 Opts.cl_khr_local_int32_base_atomics = 1;
2111 Opts.cl_khr_local_int32_extended_atomics = 1;
2112 }
2113 if (GPU >= GK_SOUTHERN_ISLANDS) {
2114 Opts.cl_khr_fp16 = 1;
2115 Opts.cl_khr_int64_base_atomics = 1;
2116 Opts.cl_khr_int64_extended_atomics = 1;
2117 Opts.cl_khr_3d_image_writes = 1;
2118 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002119 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002120};
2121
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002122const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002123#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002124 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002125#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2126 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002127#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002128};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002129const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002130 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2131 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2132 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2133 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2134 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2135 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2136 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2137 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2138 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2139 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2140 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2141 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2142 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2143 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2144 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2145 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2146 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2147 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2148 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2149 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2150 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2151 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2152 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2153 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2154 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2155 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2156 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2157 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2158 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2159 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2160 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2161 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2162 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2163 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2164 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2165 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2166 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2167 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2168 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2169 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2170 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2171 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2172 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2173 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2174 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2175 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2176 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002177 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002178 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2179 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002180};
2181
Craig Topperf054e3a2015-10-19 03:52:27 +00002182ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2183 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002184}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002185
Matt Arsenault250024f2016-06-08 01:56:42 +00002186bool AMDGPUTargetInfo::initFeatureMap(
2187 llvm::StringMap<bool> &Features,
2188 DiagnosticsEngine &Diags, StringRef CPU,
2189 const std::vector<std::string> &FeatureVec) const {
2190
2191 // XXX - What does the member GPU mean if device name string passed here?
2192 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2193 if (CPU.empty())
2194 CPU = "tahiti";
2195
2196 switch (parseAMDGCNName(CPU)) {
2197 case GK_SOUTHERN_ISLANDS:
2198 case GK_SEA_ISLANDS:
2199 break;
2200
2201 case GK_VOLCANIC_ISLANDS:
2202 Features["s-memrealtime"] = true;
2203 Features["16-bit-insts"] = true;
2204 break;
2205
2206 case GK_NONE:
2207 return false;
2208 default:
2209 llvm_unreachable("unhandled subtarget");
2210 }
2211 } else {
2212 if (CPU.empty())
2213 CPU = "r600";
2214
2215 switch (parseR600Name(CPU)) {
2216 case GK_R600:
2217 case GK_R700:
2218 case GK_EVERGREEN:
2219 case GK_NORTHERN_ISLANDS:
2220 break;
2221 case GK_R600_DOUBLE_OPS:
2222 case GK_R700_DOUBLE_OPS:
2223 case GK_EVERGREEN_DOUBLE_OPS:
2224 case GK_CAYMAN:
2225 Features["fp64"] = true;
2226 break;
2227 case GK_NONE:
2228 return false;
2229 default:
2230 llvm_unreachable("unhandled subtarget");
2231 }
2232 }
2233
2234 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2235}
2236
Eli Friedman3fd920a2008-08-20 02:34:37 +00002237// Namespace for x86 abstract base class
2238const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002239#define BUILTIN(ID, TYPE, ATTRS) \
2240 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002241#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002242 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002243#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002244 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002245#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002246};
Eli Friedmanb5366062008-05-20 14:21:01 +00002247
Nuno Lopescfca1f02009-12-23 17:49:57 +00002248static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002249 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2250 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002251 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002252 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2253 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2254 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002255 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002256 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2257 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002258 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2259 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2260 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2261 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2262 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2263 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2264 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2265 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002266};
2267
Eric Christophercdd36352011-06-21 00:05:20 +00002268const TargetInfo::AddlRegName AddlRegNames[] = {
2269 { { "al", "ah", "eax", "rax" }, 0 },
2270 { { "bl", "bh", "ebx", "rbx" }, 3 },
2271 { { "cl", "ch", "ecx", "rcx" }, 2 },
2272 { { "dl", "dh", "edx", "rdx" }, 1 },
2273 { { "esi", "rsi" }, 4 },
2274 { { "edi", "rdi" }, 5 },
2275 { { "esp", "rsp" }, 7 },
2276 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002277 { { "r8d", "r8w", "r8b" }, 38 },
2278 { { "r9d", "r9w", "r9b" }, 39 },
2279 { { "r10d", "r10w", "r10b" }, 40 },
2280 { { "r11d", "r11w", "r11b" }, 41 },
2281 { { "r12d", "r12w", "r12b" }, 42 },
2282 { { "r13d", "r13w", "r13b" }, 43 },
2283 { { "r14d", "r14w", "r14b" }, 44 },
2284 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002285};
2286
2287// X86 target abstract base class; x86-32 and x86-64 are very close, so
2288// most of the implementation can be shared.
2289class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002290 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002291 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002292 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002293 enum MMX3DNowEnum {
2294 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002295 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002296 enum XOPEnum {
2297 NoXOP,
2298 SSE4A,
2299 FMA4,
2300 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002301 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002302
Craig Topper543f3bd2015-10-14 23:47:57 +00002303 bool HasAES = false;
2304 bool HasPCLMUL = false;
2305 bool HasLZCNT = false;
2306 bool HasRDRND = false;
2307 bool HasFSGSBASE = false;
2308 bool HasBMI = false;
2309 bool HasBMI2 = false;
2310 bool HasPOPCNT = false;
2311 bool HasRTM = false;
2312 bool HasPRFCHW = false;
2313 bool HasRDSEED = false;
2314 bool HasADX = false;
2315 bool HasTBM = false;
2316 bool HasFMA = false;
2317 bool HasF16C = false;
2318 bool HasAVX512CD = false;
2319 bool HasAVX512ER = false;
2320 bool HasAVX512PF = false;
2321 bool HasAVX512DQ = false;
2322 bool HasAVX512BW = false;
2323 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002324 bool HasAVX512VBMI = false;
2325 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002326 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002327 bool HasMPX = false;
2328 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002329 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002330 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002331 bool HasXSAVE = false;
2332 bool HasXSAVEOPT = false;
2333 bool HasXSAVEC = false;
2334 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002335 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002336 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002337 bool HasCLFLUSHOPT = false;
2338 bool HasPCOMMIT = false;
2339 bool HasCLWB = false;
2340 bool HasUMIP = false;
2341 bool HasMOVBE = false;
2342 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002343
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002344 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2345 ///
2346 /// Each enumeration represents a particular CPU supported by Clang. These
2347 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2348 enum CPUKind {
2349 CK_Generic,
2350
2351 /// \name i386
2352 /// i386-generation processors.
2353 //@{
2354 CK_i386,
2355 //@}
2356
2357 /// \name i486
2358 /// i486-generation processors.
2359 //@{
2360 CK_i486,
2361 CK_WinChipC6,
2362 CK_WinChip2,
2363 CK_C3,
2364 //@}
2365
2366 /// \name i586
2367 /// i586-generation processors, P5 microarchitecture based.
2368 //@{
2369 CK_i586,
2370 CK_Pentium,
2371 CK_PentiumMMX,
2372 //@}
2373
2374 /// \name i686
2375 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2376 //@{
2377 CK_i686,
2378 CK_PentiumPro,
2379 CK_Pentium2,
2380 CK_Pentium3,
2381 CK_Pentium3M,
2382 CK_PentiumM,
2383 CK_C3_2,
2384
2385 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2386 /// Clang however has some logic to suport this.
2387 // FIXME: Warn, deprecate, and potentially remove this.
2388 CK_Yonah,
2389 //@}
2390
2391 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002392 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002393 //@{
2394 CK_Pentium4,
2395 CK_Pentium4M,
2396 CK_Prescott,
2397 CK_Nocona,
2398 //@}
2399
2400 /// \name Core
2401 /// Core microarchitecture based processors.
2402 //@{
2403 CK_Core2,
2404
2405 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2406 /// codename which GCC no longer accepts as an option to -march, but Clang
2407 /// has some logic for recognizing it.
2408 // FIXME: Warn, deprecate, and potentially remove this.
2409 CK_Penryn,
2410 //@}
2411
2412 /// \name Atom
2413 /// Atom processors
2414 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002415 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002416 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002417 //@}
2418
2419 /// \name Nehalem
2420 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002421 CK_Nehalem,
2422
2423 /// \name Westmere
2424 /// Westmere microarchitecture based processors.
2425 CK_Westmere,
2426
2427 /// \name Sandy Bridge
2428 /// Sandy Bridge microarchitecture based processors.
2429 CK_SandyBridge,
2430
2431 /// \name Ivy Bridge
2432 /// Ivy Bridge microarchitecture based processors.
2433 CK_IvyBridge,
2434
2435 /// \name Haswell
2436 /// Haswell microarchitecture based processors.
2437 CK_Haswell,
2438
2439 /// \name Broadwell
2440 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002441 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002442
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002443 /// \name Skylake Client
2444 /// Skylake client microarchitecture based processors.
2445 CK_SkylakeClient,
2446
2447 /// \name Skylake Server
2448 /// Skylake server microarchitecture based processors.
2449 CK_SkylakeServer,
2450
2451 /// \name Cannonlake Client
2452 /// Cannonlake client microarchitecture based processors.
2453 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002454
Craig Topper449314e2013-08-20 07:09:39 +00002455 /// \name Knights Landing
2456 /// Knights Landing processor.
2457 CK_KNL,
2458
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002459 /// \name Lakemont
2460 /// Lakemont microarchitecture based processors.
2461 CK_Lakemont,
2462
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002463 /// \name K6
2464 /// K6 architecture processors.
2465 //@{
2466 CK_K6,
2467 CK_K6_2,
2468 CK_K6_3,
2469 //@}
2470
2471 /// \name K7
2472 /// K7 architecture processors.
2473 //@{
2474 CK_Athlon,
2475 CK_AthlonThunderbird,
2476 CK_Athlon4,
2477 CK_AthlonXP,
2478 CK_AthlonMP,
2479 //@}
2480
2481 /// \name K8
2482 /// K8 architecture processors.
2483 //@{
2484 CK_Athlon64,
2485 CK_Athlon64SSE3,
2486 CK_AthlonFX,
2487 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002488 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002489 CK_Opteron,
2490 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002491 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002492 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002493
Benjamin Kramer569f2152012-01-10 11:50:18 +00002494 /// \name Bobcat
2495 /// Bobcat architecture processors.
2496 //@{
2497 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002498 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002499 //@}
2500
2501 /// \name Bulldozer
2502 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002503 //@{
2504 CK_BDVER1,
2505 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002506 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002507 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002508 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002509
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002510 /// This specification is deprecated and will be removed in the future.
2511 /// Users should prefer \see CK_K8.
2512 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002513 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002514 CK_x86_64,
2515 //@}
2516
2517 /// \name Geode
2518 /// Geode processors.
2519 //@{
2520 CK_Geode
2521 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002522 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002523
Eric Christopherc50738f2015-08-27 00:05:50 +00002524 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002525 return llvm::StringSwitch<CPUKind>(CPU)
2526 .Case("i386", CK_i386)
2527 .Case("i486", CK_i486)
2528 .Case("winchip-c6", CK_WinChipC6)
2529 .Case("winchip2", CK_WinChip2)
2530 .Case("c3", CK_C3)
2531 .Case("i586", CK_i586)
2532 .Case("pentium", CK_Pentium)
2533 .Case("pentium-mmx", CK_PentiumMMX)
2534 .Case("i686", CK_i686)
2535 .Case("pentiumpro", CK_PentiumPro)
2536 .Case("pentium2", CK_Pentium2)
2537 .Case("pentium3", CK_Pentium3)
2538 .Case("pentium3m", CK_Pentium3M)
2539 .Case("pentium-m", CK_PentiumM)
2540 .Case("c3-2", CK_C3_2)
2541 .Case("yonah", CK_Yonah)
2542 .Case("pentium4", CK_Pentium4)
2543 .Case("pentium4m", CK_Pentium4M)
2544 .Case("prescott", CK_Prescott)
2545 .Case("nocona", CK_Nocona)
2546 .Case("core2", CK_Core2)
2547 .Case("penryn", CK_Penryn)
2548 .Case("bonnell", CK_Bonnell)
2549 .Case("atom", CK_Bonnell) // Legacy name.
2550 .Case("silvermont", CK_Silvermont)
2551 .Case("slm", CK_Silvermont) // Legacy name.
2552 .Case("nehalem", CK_Nehalem)
2553 .Case("corei7", CK_Nehalem) // Legacy name.
2554 .Case("westmere", CK_Westmere)
2555 .Case("sandybridge", CK_SandyBridge)
2556 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2557 .Case("ivybridge", CK_IvyBridge)
2558 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2559 .Case("haswell", CK_Haswell)
2560 .Case("core-avx2", CK_Haswell) // Legacy name.
2561 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002562 .Case("skylake", CK_SkylakeClient)
2563 .Case("skylake-avx512", CK_SkylakeServer)
2564 .Case("skx", CK_SkylakeServer) // Legacy name.
2565 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002566 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002567 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002568 .Case("k6", CK_K6)
2569 .Case("k6-2", CK_K6_2)
2570 .Case("k6-3", CK_K6_3)
2571 .Case("athlon", CK_Athlon)
2572 .Case("athlon-tbird", CK_AthlonThunderbird)
2573 .Case("athlon-4", CK_Athlon4)
2574 .Case("athlon-xp", CK_AthlonXP)
2575 .Case("athlon-mp", CK_AthlonMP)
2576 .Case("athlon64", CK_Athlon64)
2577 .Case("athlon64-sse3", CK_Athlon64SSE3)
2578 .Case("athlon-fx", CK_AthlonFX)
2579 .Case("k8", CK_K8)
2580 .Case("k8-sse3", CK_K8SSE3)
2581 .Case("opteron", CK_Opteron)
2582 .Case("opteron-sse3", CK_OpteronSSE3)
2583 .Case("barcelona", CK_AMDFAM10)
2584 .Case("amdfam10", CK_AMDFAM10)
2585 .Case("btver1", CK_BTVER1)
2586 .Case("btver2", CK_BTVER2)
2587 .Case("bdver1", CK_BDVER1)
2588 .Case("bdver2", CK_BDVER2)
2589 .Case("bdver3", CK_BDVER3)
2590 .Case("bdver4", CK_BDVER4)
2591 .Case("x86-64", CK_x86_64)
2592 .Case("geode", CK_Geode)
2593 .Default(CK_Generic);
2594 }
2595
Rafael Espindolaeb265472013-08-21 21:59:03 +00002596 enum FPMathKind {
2597 FP_Default,
2598 FP_SSE,
2599 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002600 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002601
Eli Friedman3fd920a2008-08-20 02:34:37 +00002602public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002603 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2604 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002605 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002606 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002607 }
Craig Topper3164f332014-03-11 03:39:26 +00002608 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002609 // X87 evaluates with 80 bits "long double" precision.
2610 return SSELevel == NoSSE ? 2 : 0;
2611 }
Craig Topper6c03a542015-10-19 04:51:35 +00002612 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2613 return llvm::makeArrayRef(BuiltinInfo,
2614 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002615 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002616 ArrayRef<const char *> getGCCRegNames() const override {
2617 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002618 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002619 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2620 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002621 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002622 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2623 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002624 }
Eric Christopherd9832702015-06-29 21:00:05 +00002625 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002626 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002627 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002628
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002629 bool validateGlobalRegisterVariable(StringRef RegName,
2630 unsigned RegSize,
2631 bool &HasSizeMismatch) const override {
2632 // esp and ebp are the only 32-bit registers the x86 backend can currently
2633 // handle.
2634 if (RegName.equals("esp") || RegName.equals("ebp")) {
2635 // Check that the register size is 32-bit.
2636 HasSizeMismatch = RegSize != 32;
2637 return true;
2638 }
2639
2640 return false;
2641 }
2642
Akira Hatanaka974131e2014-09-18 18:17:18 +00002643 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2644
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002645 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2646
Akira Hatanaka974131e2014-09-18 18:17:18 +00002647 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2648
Craig Topper3164f332014-03-11 03:39:26 +00002649 std::string convertConstraint(const char *&Constraint) const override;
2650 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002651 return "~{dirflag},~{fpsr},~{flags}";
2652 }
Craig Topper3164f332014-03-11 03:39:26 +00002653 void getTargetDefines(const LangOptions &Opts,
2654 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002655 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2656 bool Enabled);
2657 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2658 bool Enabled);
2659 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2660 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002661 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2662 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002663 setFeatureEnabledImpl(Features, Name, Enabled);
2664 }
2665 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002666 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002667 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2668 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002669 bool
2670 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2671 StringRef CPU,
2672 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002673 bool hasFeature(StringRef Feature) const override;
2674 bool handleTargetFeatures(std::vector<std::string> &Features,
2675 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002676 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002677 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2678 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002679 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002680 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002681 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002682 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002683 return "no-mmx";
2684 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002685 }
Craig Topper3164f332014-03-11 03:39:26 +00002686 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002687 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002688
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002689 // Perform any per-CPU checks necessary to determine if this CPU is
2690 // acceptable.
2691 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2692 // invalid without explaining *why*.
2693 switch (CPU) {
2694 case CK_Generic:
2695 // No processor selected!
2696 return false;
2697
2698 case CK_i386:
2699 case CK_i486:
2700 case CK_WinChipC6:
2701 case CK_WinChip2:
2702 case CK_C3:
2703 case CK_i586:
2704 case CK_Pentium:
2705 case CK_PentiumMMX:
2706 case CK_i686:
2707 case CK_PentiumPro:
2708 case CK_Pentium2:
2709 case CK_Pentium3:
2710 case CK_Pentium3M:
2711 case CK_PentiumM:
2712 case CK_Yonah:
2713 case CK_C3_2:
2714 case CK_Pentium4:
2715 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002716 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002717 case CK_Prescott:
2718 case CK_K6:
2719 case CK_K6_2:
2720 case CK_K6_3:
2721 case CK_Athlon:
2722 case CK_AthlonThunderbird:
2723 case CK_Athlon4:
2724 case CK_AthlonXP:
2725 case CK_AthlonMP:
2726 case CK_Geode:
2727 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002728 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002729 return false;
2730
2731 // Fallthrough
2732 case CK_Nocona:
2733 case CK_Core2:
2734 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002735 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002736 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002737 case CK_Nehalem:
2738 case CK_Westmere:
2739 case CK_SandyBridge:
2740 case CK_IvyBridge:
2741 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002742 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002743 case CK_SkylakeClient:
2744 case CK_SkylakeServer:
2745 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002746 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002747 case CK_Athlon64:
2748 case CK_Athlon64SSE3:
2749 case CK_AthlonFX:
2750 case CK_K8:
2751 case CK_K8SSE3:
2752 case CK_Opteron:
2753 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002754 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002755 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002756 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002757 case CK_BDVER1:
2758 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002759 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002760 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002761 case CK_x86_64:
2762 return true;
2763 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002764 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002765 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002766
Craig Topper3164f332014-03-11 03:39:26 +00002767 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002768
Craig Topper3164f332014-03-11 03:39:26 +00002769 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002770 // Most of the non-ARM calling conventions are i386 conventions.
2771 switch (CC) {
2772 case CC_X86ThisCall:
2773 case CC_X86FastCall:
2774 case CC_X86StdCall:
2775 case CC_X86VectorCall:
2776 case CC_C:
2777 case CC_Swift:
2778 case CC_X86Pascal:
2779 case CC_IntelOclBicc:
2780 return CCCR_OK;
2781 default:
2782 return CCCR_Warning;
2783 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002784 }
2785
Craig Topper3164f332014-03-11 03:39:26 +00002786 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002787 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002788 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002789
2790 bool hasSjLjLowering() const override {
2791 return true;
2792 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002793
2794 void setSupportedOpenCLOpts() override {
2795 getSupportedOpenCLOpts().setAll();
2796 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002797};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002798
Rafael Espindolaeb265472013-08-21 21:59:03 +00002799bool X86TargetInfo::setFPMath(StringRef Name) {
2800 if (Name == "387") {
2801 FPMath = FP_387;
2802 return true;
2803 }
2804 if (Name == "sse") {
2805 FPMath = FP_SSE;
2806 return true;
2807 }
2808 return false;
2809}
2810
Eric Christopher007b0a02015-08-28 22:32:01 +00002811bool X86TargetInfo::initFeatureMap(
2812 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002813 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002814 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002815 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002816 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002817 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002818
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002819 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002820
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002821 // Enable X87 for all X86 processors but Lakemont.
2822 if (Kind != CK_Lakemont)
2823 setFeatureEnabledImpl(Features, "x87", true);
2824
2825 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002826 case CK_Generic:
2827 case CK_i386:
2828 case CK_i486:
2829 case CK_i586:
2830 case CK_Pentium:
2831 case CK_i686:
2832 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002833 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002834 break;
2835 case CK_PentiumMMX:
2836 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002837 case CK_K6:
2838 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002839 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002840 break;
2841 case CK_Pentium3:
2842 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002843 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002844 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002845 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002846 break;
2847 case CK_PentiumM:
2848 case CK_Pentium4:
2849 case CK_Pentium4M:
2850 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002851 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002852 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002853 break;
2854 case CK_Yonah:
2855 case CK_Prescott:
2856 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002857 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002858 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002859 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002860 break;
2861 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002862 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002863 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002864 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002865 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002866 break;
2867 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002868 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002869 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002870 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002871 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002872 case CK_Cannonlake:
2873 setFeatureEnabledImpl(Features, "avx512ifma", true);
2874 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2875 setFeatureEnabledImpl(Features, "sha", true);
2876 setFeatureEnabledImpl(Features, "umip", true);
2877 // FALLTHROUGH
2878 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002879 setFeatureEnabledImpl(Features, "avx512f", true);
2880 setFeatureEnabledImpl(Features, "avx512cd", true);
2881 setFeatureEnabledImpl(Features, "avx512dq", true);
2882 setFeatureEnabledImpl(Features, "avx512bw", true);
2883 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002884 setFeatureEnabledImpl(Features, "pku", true);
2885 setFeatureEnabledImpl(Features, "pcommit", true);
2886 setFeatureEnabledImpl(Features, "clwb", true);
2887 // FALLTHROUGH
2888 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002889 setFeatureEnabledImpl(Features, "xsavec", true);
2890 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002891 setFeatureEnabledImpl(Features, "mpx", true);
2892 setFeatureEnabledImpl(Features, "sgx", true);
2893 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002894 // FALLTHROUGH
2895 case CK_Broadwell:
2896 setFeatureEnabledImpl(Features, "rdseed", true);
2897 setFeatureEnabledImpl(Features, "adx", true);
2898 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002899 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002900 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002901 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002902 setFeatureEnabledImpl(Features, "bmi", true);
2903 setFeatureEnabledImpl(Features, "bmi2", true);
2904 setFeatureEnabledImpl(Features, "rtm", true);
2905 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002906 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002907 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002908 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002909 setFeatureEnabledImpl(Features, "rdrnd", true);
2910 setFeatureEnabledImpl(Features, "f16c", true);
2911 setFeatureEnabledImpl(Features, "fsgsbase", true);
2912 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002913 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002914 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002915 setFeatureEnabledImpl(Features, "xsave", true);
2916 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002917 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002918 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002919 case CK_Silvermont:
2920 setFeatureEnabledImpl(Features, "aes", true);
2921 setFeatureEnabledImpl(Features, "pclmul", true);
2922 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002923 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002924 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002925 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002926 setFeatureEnabledImpl(Features, "cx16", true);
2927 break;
2928 case CK_KNL:
2929 setFeatureEnabledImpl(Features, "avx512f", true);
2930 setFeatureEnabledImpl(Features, "avx512cd", true);
2931 setFeatureEnabledImpl(Features, "avx512er", true);
2932 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002933 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002934 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002935 setFeatureEnabledImpl(Features, "rdseed", true);
2936 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002937 setFeatureEnabledImpl(Features, "lzcnt", true);
2938 setFeatureEnabledImpl(Features, "bmi", true);
2939 setFeatureEnabledImpl(Features, "bmi2", true);
2940 setFeatureEnabledImpl(Features, "rtm", true);
2941 setFeatureEnabledImpl(Features, "fma", true);
2942 setFeatureEnabledImpl(Features, "rdrnd", true);
2943 setFeatureEnabledImpl(Features, "f16c", true);
2944 setFeatureEnabledImpl(Features, "fsgsbase", true);
2945 setFeatureEnabledImpl(Features, "aes", true);
2946 setFeatureEnabledImpl(Features, "pclmul", true);
2947 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002948 setFeatureEnabledImpl(Features, "xsaveopt", true);
2949 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002950 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002951 break;
2952 case CK_K6_2:
2953 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002954 case CK_WinChip2:
2955 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002956 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002957 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002958 case CK_Athlon:
2959 case CK_AthlonThunderbird:
2960 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002961 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002962 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002963 case CK_Athlon4:
2964 case CK_AthlonXP:
2965 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002966 setFeatureEnabledImpl(Features, "sse", true);
2967 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002968 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002969 break;
2970 case CK_K8:
2971 case CK_Opteron:
2972 case CK_Athlon64:
2973 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002974 setFeatureEnabledImpl(Features, "sse2", true);
2975 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002976 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002977 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002978 case CK_AMDFAM10:
2979 setFeatureEnabledImpl(Features, "sse4a", true);
2980 setFeatureEnabledImpl(Features, "lzcnt", true);
2981 setFeatureEnabledImpl(Features, "popcnt", true);
2982 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002983 case CK_K8SSE3:
2984 case CK_OpteronSSE3:
2985 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002986 setFeatureEnabledImpl(Features, "sse3", true);
2987 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002988 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002989 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002990 case CK_BTVER2:
2991 setFeatureEnabledImpl(Features, "avx", true);
2992 setFeatureEnabledImpl(Features, "aes", true);
2993 setFeatureEnabledImpl(Features, "pclmul", true);
2994 setFeatureEnabledImpl(Features, "bmi", true);
2995 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002996 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002997 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002998 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002999 setFeatureEnabledImpl(Features, "ssse3", true);
3000 setFeatureEnabledImpl(Features, "sse4a", true);
3001 setFeatureEnabledImpl(Features, "lzcnt", true);
3002 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003003 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003004 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003005 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003006 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003007 case CK_BDVER4:
3008 setFeatureEnabledImpl(Features, "avx2", true);
3009 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003010 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003011 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003012 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003013 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003014 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003015 // FALLTHROUGH
3016 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003017 setFeatureEnabledImpl(Features, "bmi", true);
3018 setFeatureEnabledImpl(Features, "fma", true);
3019 setFeatureEnabledImpl(Features, "f16c", true);
3020 setFeatureEnabledImpl(Features, "tbm", true);
3021 // FALLTHROUGH
3022 case CK_BDVER1:
3023 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003024 setFeatureEnabledImpl(Features, "xop", true);
3025 setFeatureEnabledImpl(Features, "lzcnt", true);
3026 setFeatureEnabledImpl(Features, "aes", true);
3027 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003028 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003029 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003030 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003031 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003032 break;
Eli Friedman33465822011-07-08 23:31:17 +00003033 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003034 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3035 return false;
3036
3037 // Can't do this earlier because we need to be able to explicitly enable
3038 // or disable these features and the things that they depend upon.
3039
3040 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3041 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003042 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003043 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3044 FeaturesVec.end())
3045 Features["popcnt"] = true;
3046
3047 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3048 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003049 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003050 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3051 FeaturesVec.end())
3052 Features["prfchw"] = true;
3053
Eric Christophera7260af2015-10-08 20:10:18 +00003054 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3055 // then enable MMX.
3056 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003057 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003058 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3059 FeaturesVec.end())
3060 Features["mmx"] = true;
3061
Eric Christopherbbd746d2015-10-08 20:10:14 +00003062 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003063}
3064
Rafael Espindolae62e2792013-08-20 13:44:29 +00003065void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003066 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003067 if (Enabled) {
3068 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003069 case AVX512F:
3070 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003071 case AVX2:
3072 Features["avx2"] = true;
3073 case AVX:
3074 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003075 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003076 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003077 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003078 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003079 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003080 case SSSE3:
3081 Features["ssse3"] = true;
3082 case SSE3:
3083 Features["sse3"] = true;
3084 case SSE2:
3085 Features["sse2"] = true;
3086 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003087 Features["sse"] = true;
3088 case NoSSE:
3089 break;
3090 }
3091 return;
3092 }
3093
3094 switch (Level) {
3095 case NoSSE:
3096 case SSE1:
3097 Features["sse"] = false;
3098 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003099 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3100 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003101 case SSE3:
3102 Features["sse3"] = false;
3103 setXOPLevel(Features, NoXOP, false);
3104 case SSSE3:
3105 Features["ssse3"] = false;
3106 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003107 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003108 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003109 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003110 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003111 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3112 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003113 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003114 case AVX2:
3115 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003116 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003117 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003118 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003119 Features["avx512vl"] = Features["avx512vbmi"] =
3120 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003121 }
3122}
3123
3124void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003125 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003126 if (Enabled) {
3127 switch (Level) {
3128 case AMD3DNowAthlon:
3129 Features["3dnowa"] = true;
3130 case AMD3DNow:
3131 Features["3dnow"] = true;
3132 case MMX:
3133 Features["mmx"] = true;
3134 case NoMMX3DNow:
3135 break;
3136 }
3137 return;
3138 }
3139
3140 switch (Level) {
3141 case NoMMX3DNow:
3142 case MMX:
3143 Features["mmx"] = false;
3144 case AMD3DNow:
3145 Features["3dnow"] = false;
3146 case AMD3DNowAthlon:
3147 Features["3dnowa"] = false;
3148 }
3149}
3150
3151void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003152 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003153 if (Enabled) {
3154 switch (Level) {
3155 case XOP:
3156 Features["xop"] = true;
3157 case FMA4:
3158 Features["fma4"] = true;
3159 setSSELevel(Features, AVX, true);
3160 case SSE4A:
3161 Features["sse4a"] = true;
3162 setSSELevel(Features, SSE3, true);
3163 case NoXOP:
3164 break;
3165 }
3166 return;
3167 }
3168
3169 switch (Level) {
3170 case NoXOP:
3171 case SSE4A:
3172 Features["sse4a"] = false;
3173 case FMA4:
3174 Features["fma4"] = false;
3175 case XOP:
3176 Features["xop"] = false;
3177 }
3178}
3179
Craig Topper86d79ef2013-09-17 04:51:29 +00003180void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3181 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003182 // This is a bit of a hack to deal with the sse4 target feature when used
3183 // as part of the target attribute. We handle sse4 correctly everywhere
3184 // else. See below for more information on how we handle the sse4 options.
3185 if (Name != "sse4")
3186 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003187
Craig Topper29561122013-09-19 01:13:07 +00003188 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003189 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003190 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003191 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003192 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003193 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003194 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003195 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003196 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003197 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003198 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003199 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003200 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003201 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003202 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003203 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003204 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003205 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003206 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003207 if (Enabled)
3208 setSSELevel(Features, SSE2, Enabled);
3209 } else if (Name == "pclmul") {
3210 if (Enabled)
3211 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003212 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003213 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003214 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003215 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003216 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003217 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003218 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3219 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3220 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003221 if (Enabled)
3222 setSSELevel(Features, AVX512F, Enabled);
3223 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003224 if (Enabled)
3225 setSSELevel(Features, AVX, Enabled);
3226 } else if (Name == "fma4") {
3227 setXOPLevel(Features, FMA4, Enabled);
3228 } else if (Name == "xop") {
3229 setXOPLevel(Features, XOP, Enabled);
3230 } else if (Name == "sse4a") {
3231 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003232 } else if (Name == "f16c") {
3233 if (Enabled)
3234 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003235 } else if (Name == "sha") {
3236 if (Enabled)
3237 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003238 } else if (Name == "sse4") {
3239 // We can get here via the __target__ attribute since that's not controlled
3240 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3241 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3242 // disabled.
3243 if (Enabled)
3244 setSSELevel(Features, SSE42, Enabled);
3245 else
3246 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003247 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003248 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003249 Features["xsaveopt"] = false;
3250 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003251 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003252 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003253 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003254}
3255
Eric Christopher3ff21b32013-10-16 21:26:26 +00003256/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003257/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003258bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003259 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003260 for (const auto &Feature : Features) {
3261 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003262 continue;
3263
Eric Christopher610fe112015-08-26 08:21:55 +00003264 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003265 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003266 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003267 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003268 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003269 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003270 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003271 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003272 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003273 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003274 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003275 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003276 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003277 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003278 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003279 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003280 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003281 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003282 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003283 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003284 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003285 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003286 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003287 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003288 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003289 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003290 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003291 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003292 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003293 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003294 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003295 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003296 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003297 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003298 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003299 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003300 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003301 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003302 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003303 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003304 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003305 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003306 } else if (Feature == "+avx512vbmi") {
3307 HasAVX512VBMI = true;
3308 } else if (Feature == "+avx512ifma") {
3309 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003310 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003311 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003312 } else if (Feature == "+mpx") {
3313 HasMPX = true;
3314 } else if (Feature == "+movbe") {
3315 HasMOVBE = true;
3316 } else if (Feature == "+sgx") {
3317 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003318 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003319 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003320 } else if (Feature == "+fxsr") {
3321 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003322 } else if (Feature == "+xsave") {
3323 HasXSAVE = true;
3324 } else if (Feature == "+xsaveopt") {
3325 HasXSAVEOPT = true;
3326 } else if (Feature == "+xsavec") {
3327 HasXSAVEC = true;
3328 } else if (Feature == "+xsaves") {
3329 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003330 } else if (Feature == "+mwaitx") {
3331 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003332 } else if (Feature == "+pku") {
3333 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003334 } else if (Feature == "+clflushopt") {
3335 HasCLFLUSHOPT = true;
3336 } else if (Feature == "+pcommit") {
3337 HasPCOMMIT = true;
3338 } else if (Feature == "+clwb") {
3339 HasCLWB = true;
3340 } else if (Feature == "+umip") {
3341 HasUMIP = true;
3342 } else if (Feature == "+prefetchwt1") {
3343 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003344 }
3345
Benjamin Kramer27402c62012-03-05 15:10:44 +00003346 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003347 .Case("+avx512f", AVX512F)
3348 .Case("+avx2", AVX2)
3349 .Case("+avx", AVX)
3350 .Case("+sse4.2", SSE42)
3351 .Case("+sse4.1", SSE41)
3352 .Case("+ssse3", SSSE3)
3353 .Case("+sse3", SSE3)
3354 .Case("+sse2", SSE2)
3355 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003356 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003357 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003358
Eli Friedman33465822011-07-08 23:31:17 +00003359 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003360 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003361 .Case("+3dnowa", AMD3DNowAthlon)
3362 .Case("+3dnow", AMD3DNow)
3363 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003364 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003365 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003366
3367 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003368 .Case("+xop", XOP)
3369 .Case("+fma4", FMA4)
3370 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003371 .Default(NoXOP);
3372 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003373 }
Eli Friedman33465822011-07-08 23:31:17 +00003374
Rafael Espindolaeb265472013-08-21 21:59:03 +00003375 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3376 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003377 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3378 (FPMath == FP_387 && SSELevel >= SSE1)) {
3379 Diags.Report(diag::err_target_unsupported_fpmath) <<
3380 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003381 return false;
3382 }
3383
Alexey Bataev00396512015-07-02 03:40:19 +00003384 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003385 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003386 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003387}
Chris Lattnerecd49032009-03-02 22:27:17 +00003388
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003389/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3390/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003391void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003392 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003393 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003394 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003395 Builder.defineMacro("__amd64__");
3396 Builder.defineMacro("__amd64");
3397 Builder.defineMacro("__x86_64");
3398 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003399 if (getTriple().getArchName() == "x86_64h") {
3400 Builder.defineMacro("__x86_64h");
3401 Builder.defineMacro("__x86_64h__");
3402 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003403 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003404 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003405 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003406
Chris Lattnerecd49032009-03-02 22:27:17 +00003407 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003408 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3409 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003410 switch (CPU) {
3411 case CK_Generic:
3412 break;
3413 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003414 // The rest are coming from the i386 define above.
3415 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003416 break;
3417 case CK_i486:
3418 case CK_WinChipC6:
3419 case CK_WinChip2:
3420 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003421 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003422 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003423 case CK_PentiumMMX:
3424 Builder.defineMacro("__pentium_mmx__");
3425 Builder.defineMacro("__tune_pentium_mmx__");
3426 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003427 case CK_i586:
3428 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003429 defineCPUMacros(Builder, "i586");
3430 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003431 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003432 case CK_Pentium3:
3433 case CK_Pentium3M:
3434 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003435 Builder.defineMacro("__tune_pentium3__");
3436 // Fallthrough
3437 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003438 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003439 Builder.defineMacro("__tune_pentium2__");
3440 // Fallthrough
3441 case CK_PentiumPro:
3442 Builder.defineMacro("__tune_i686__");
3443 Builder.defineMacro("__tune_pentiumpro__");
3444 // Fallthrough
3445 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003446 Builder.defineMacro("__i686");
3447 Builder.defineMacro("__i686__");
3448 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3449 Builder.defineMacro("__pentiumpro");
3450 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003451 break;
3452 case CK_Pentium4:
3453 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003454 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003455 break;
3456 case CK_Yonah:
3457 case CK_Prescott:
3458 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003459 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003460 break;
3461 case CK_Core2:
3462 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003463 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003464 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003465 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003466 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003467 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003468 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003469 defineCPUMacros(Builder, "slm");
3470 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003471 case CK_Nehalem:
3472 case CK_Westmere:
3473 case CK_SandyBridge:
3474 case CK_IvyBridge:
3475 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003476 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003477 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003478 // FIXME: Historically, we defined this legacy name, it would be nice to
3479 // remove it at some point. We've never exposed fine-grained names for
3480 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003481 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003482 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003483 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003484 defineCPUMacros(Builder, "skx");
3485 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003486 case CK_Cannonlake:
3487 break;
Craig Topper449314e2013-08-20 07:09:39 +00003488 case CK_KNL:
3489 defineCPUMacros(Builder, "knl");
3490 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003491 case CK_Lakemont:
3492 Builder.defineMacro("__tune_lakemont__");
3493 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003494 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003495 Builder.defineMacro("__k6_2__");
3496 Builder.defineMacro("__tune_k6_2__");
3497 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003498 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003499 if (CPU != CK_K6_2) { // In case of fallthrough
3500 // FIXME: GCC may be enabling these in cases where some other k6
3501 // architecture is specified but -m3dnow is explicitly provided. The
3502 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003503 Builder.defineMacro("__k6_3__");
3504 Builder.defineMacro("__tune_k6_3__");
3505 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003506 // Fallthrough
3507 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003508 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003509 break;
3510 case CK_Athlon:
3511 case CK_AthlonThunderbird:
3512 case CK_Athlon4:
3513 case CK_AthlonXP:
3514 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003515 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003516 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003517 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003518 Builder.defineMacro("__tune_athlon_sse__");
3519 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003520 break;
3521 case CK_K8:
3522 case CK_K8SSE3:
3523 case CK_x86_64:
3524 case CK_Opteron:
3525 case CK_OpteronSSE3:
3526 case CK_Athlon64:
3527 case CK_Athlon64SSE3:
3528 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003529 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003530 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003531 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003532 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003533 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003534 case CK_BTVER1:
3535 defineCPUMacros(Builder, "btver1");
3536 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003537 case CK_BTVER2:
3538 defineCPUMacros(Builder, "btver2");
3539 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003540 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003541 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003542 break;
3543 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003544 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003545 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003546 case CK_BDVER3:
3547 defineCPUMacros(Builder, "bdver3");
3548 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003549 case CK_BDVER4:
3550 defineCPUMacros(Builder, "bdver4");
3551 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003552 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003553 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003554 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003555 }
Chris Lattner96e43572009-03-02 22:40:39 +00003556
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003557 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003558 Builder.defineMacro("__REGISTER_PREFIX__", "");
3559
Chris Lattner6df41af2009-04-19 17:32:33 +00003560 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3561 // functions in glibc header files that use FP Stack inline asm which the
3562 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003563 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003564
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003565 if (HasAES)
3566 Builder.defineMacro("__AES__");
3567
Craig Topper3f122a72012-05-31 05:18:48 +00003568 if (HasPCLMUL)
3569 Builder.defineMacro("__PCLMUL__");
3570
Craig Topper22967d42011-12-25 05:06:45 +00003571 if (HasLZCNT)
3572 Builder.defineMacro("__LZCNT__");
3573
Benjamin Kramer1e250392012-07-07 09:39:18 +00003574 if (HasRDRND)
3575 Builder.defineMacro("__RDRND__");
3576
Craig Topper8c7f2512014-11-03 06:51:41 +00003577 if (HasFSGSBASE)
3578 Builder.defineMacro("__FSGSBASE__");
3579
Craig Topper22967d42011-12-25 05:06:45 +00003580 if (HasBMI)
3581 Builder.defineMacro("__BMI__");
3582
3583 if (HasBMI2)
3584 Builder.defineMacro("__BMI2__");
3585
Craig Topper1de83482011-12-29 16:10:46 +00003586 if (HasPOPCNT)
3587 Builder.defineMacro("__POPCNT__");
3588
Michael Liao625a8752012-11-10 05:17:46 +00003589 if (HasRTM)
3590 Builder.defineMacro("__RTM__");
3591
Michael Liao74f4eaf2013-03-26 17:52:08 +00003592 if (HasPRFCHW)
3593 Builder.defineMacro("__PRFCHW__");
3594
Michael Liaoffaae352013-03-29 05:17:55 +00003595 if (HasRDSEED)
3596 Builder.defineMacro("__RDSEED__");
3597
Robert Khasanov50e6f582014-09-19 09:53:48 +00003598 if (HasADX)
3599 Builder.defineMacro("__ADX__");
3600
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003601 if (HasTBM)
3602 Builder.defineMacro("__TBM__");
3603
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003604 if (HasMWAITX)
3605 Builder.defineMacro("__MWAITX__");
3606
Rafael Espindolae62e2792013-08-20 13:44:29 +00003607 switch (XOPLevel) {
3608 case XOP:
3609 Builder.defineMacro("__XOP__");
3610 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003611 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003612 case SSE4A:
3613 Builder.defineMacro("__SSE4A__");
3614 case NoXOP:
3615 break;
3616 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003617
Craig Topperbba778b2012-06-03 21:46:30 +00003618 if (HasFMA)
3619 Builder.defineMacro("__FMA__");
3620
Manman Rena45358c2012-10-11 00:59:55 +00003621 if (HasF16C)
3622 Builder.defineMacro("__F16C__");
3623
Craig Topper679b53a2013-08-21 05:29:10 +00003624 if (HasAVX512CD)
3625 Builder.defineMacro("__AVX512CD__");
3626 if (HasAVX512ER)
3627 Builder.defineMacro("__AVX512ER__");
3628 if (HasAVX512PF)
3629 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003630 if (HasAVX512DQ)
3631 Builder.defineMacro("__AVX512DQ__");
3632 if (HasAVX512BW)
3633 Builder.defineMacro("__AVX512BW__");
3634 if (HasAVX512VL)
3635 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003636 if (HasAVX512VBMI)
3637 Builder.defineMacro("__AVX512VBMI__");
3638 if (HasAVX512IFMA)
3639 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003640
Ben Langmuir58078d02013-09-19 13:22:04 +00003641 if (HasSHA)
3642 Builder.defineMacro("__SHA__");
3643
Craig Toppere33f51f2015-10-16 06:22:36 +00003644 if (HasFXSR)
3645 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003646 if (HasXSAVE)
3647 Builder.defineMacro("__XSAVE__");
3648 if (HasXSAVEOPT)
3649 Builder.defineMacro("__XSAVEOPT__");
3650 if (HasXSAVEC)
3651 Builder.defineMacro("__XSAVEC__");
3652 if (HasXSAVES)
3653 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003654 if (HasPKU)
3655 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003656 if (HasCX16)
3657 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3658
Chris Lattner96e43572009-03-02 22:40:39 +00003659 // Each case falls through to the previous one here.
3660 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003661 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003662 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003663 case AVX2:
3664 Builder.defineMacro("__AVX2__");
3665 case AVX:
3666 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003667 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003668 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003669 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003670 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003671 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003672 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003673 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003674 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003675 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003676 Builder.defineMacro("__SSE2__");
3677 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003678 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003679 Builder.defineMacro("__SSE__");
3680 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003681 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003682 break;
3683 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003684
Derek Schuffc7dd7222012-10-11 15:52:22 +00003685 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003686 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003687 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003688 case AVX2:
3689 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003690 case SSE42:
3691 case SSE41:
3692 case SSSE3:
3693 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003694 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003695 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003696 break;
3697 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003698 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003699 break;
3700 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003701 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003702 }
3703 }
3704
Anders Carlssone437c682010-01-27 03:47:49 +00003705 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003706 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003707 case AMD3DNowAthlon:
3708 Builder.defineMacro("__3dNOW_A__");
3709 case AMD3DNow:
3710 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003711 case MMX:
3712 Builder.defineMacro("__MMX__");
3713 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003714 break;
3715 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003716
3717 if (CPU >= CK_i486) {
3718 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3719 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3720 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3721 }
3722 if (CPU >= CK_i586)
3723 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003724}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003725
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003726bool X86TargetInfo::hasFeature(StringRef Feature) const {
3727 return llvm::StringSwitch<bool>(Feature)
3728 .Case("aes", HasAES)
3729 .Case("avx", SSELevel >= AVX)
3730 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003731 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003732 .Case("avx512cd", HasAVX512CD)
3733 .Case("avx512er", HasAVX512ER)
3734 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003735 .Case("avx512dq", HasAVX512DQ)
3736 .Case("avx512bw", HasAVX512BW)
3737 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003738 .Case("avx512vbmi", HasAVX512VBMI)
3739 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003740 .Case("bmi", HasBMI)
3741 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003742 .Case("clflushopt", HasCLFLUSHOPT)
3743 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003744 .Case("cx16", HasCX16)
3745 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003746 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003747 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003748 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003749 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003750 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003751 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3752 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3753 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003754 .Case("movbe", HasMOVBE)
3755 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003756 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003757 .Case("pcommit", HasPCOMMIT)
3758 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003759 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003760 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003761 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003762 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003763 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003764 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003765 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003766 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003767 .Case("sse", SSELevel >= SSE1)
3768 .Case("sse2", SSELevel >= SSE2)
3769 .Case("sse3", SSELevel >= SSE3)
3770 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003771 .Case("sse4.1", SSELevel >= SSE41)
3772 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003773 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003774 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003775 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003776 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003777 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3778 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003779 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003780 .Case("xsave", HasXSAVE)
3781 .Case("xsavec", HasXSAVEC)
3782 .Case("xsaves", HasXSAVES)
3783 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003784 .Default(false);
3785}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003786
Eric Christopherd9832702015-06-29 21:00:05 +00003787// We can't use a generic validation scheme for the features accepted here
3788// versus subtarget features accepted in the target attribute because the
3789// bitfield structure that's initialized in the runtime only supports the
3790// below currently rather than the full range of subtarget features. (See
3791// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3792bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3793 return llvm::StringSwitch<bool>(FeatureStr)
3794 .Case("cmov", true)
3795 .Case("mmx", true)
3796 .Case("popcnt", true)
3797 .Case("sse", true)
3798 .Case("sse2", true)
3799 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003800 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003801 .Case("sse4.1", true)
3802 .Case("sse4.2", true)
3803 .Case("avx", true)
3804 .Case("avx2", true)
3805 .Case("sse4a", true)
3806 .Case("fma4", true)
3807 .Case("xop", true)
3808 .Case("fma", true)
3809 .Case("avx512f", true)
3810 .Case("bmi", true)
3811 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003812 .Case("aes", true)
3813 .Case("pclmul", true)
3814 .Case("avx512vl", true)
3815 .Case("avx512bw", true)
3816 .Case("avx512dq", true)
3817 .Case("avx512cd", true)
3818 .Case("avx512er", true)
3819 .Case("avx512pf", true)
3820 .Case("avx512vbmi", true)
3821 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003822 .Default(false);
3823}
3824
Eli Friedman3fd920a2008-08-20 02:34:37 +00003825bool
Anders Carlsson58436352009-02-28 17:11:49 +00003826X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003827 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003828 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003829 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003830 // Constant constraints.
3831 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3832 // instructions.
3833 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3834 // x86_64 instructions.
3835 case 's':
3836 Info.setRequiresImmediate();
3837 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003838 case 'I':
3839 Info.setRequiresImmediate(0, 31);
3840 return true;
3841 case 'J':
3842 Info.setRequiresImmediate(0, 63);
3843 return true;
3844 case 'K':
3845 Info.setRequiresImmediate(-128, 127);
3846 return true;
3847 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003848 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003849 return true;
3850 case 'M':
3851 Info.setRequiresImmediate(0, 3);
3852 return true;
3853 case 'N':
3854 Info.setRequiresImmediate(0, 255);
3855 return true;
3856 case 'O':
3857 Info.setRequiresImmediate(0, 127);
3858 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003859 // Register constraints.
3860 case 'Y': // 'Y' is the first character for several 2-character constraints.
3861 // Shift the pointer to the second character of the constraint.
3862 Name++;
3863 switch (*Name) {
3864 default:
3865 return false;
3866 case '0': // First SSE register.
3867 case 't': // Any SSE register, when SSE2 is enabled.
3868 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3869 case 'm': // Any MMX register, when inter-unit moves enabled.
3870 Info.setAllowsRegister();
3871 return true;
3872 }
3873 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003874 // Constraint 'f' cannot be used for output operands.
3875 if (Info.ConstraintStr[0] == '=')
3876 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003877 Info.setAllowsRegister();
3878 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003879 case 'a': // eax.
3880 case 'b': // ebx.
3881 case 'c': // ecx.
3882 case 'd': // edx.
3883 case 'S': // esi.
3884 case 'D': // edi.
3885 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003886 case 't': // Top of floating point stack.
3887 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003888 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003889 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003890 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003891 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003892 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3893 case 'l': // "Index" registers: any general register that can be used as an
3894 // index in a base+index memory access.
3895 Info.setAllowsRegister();
3896 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003897 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003898 case 'C': // SSE floating point constant.
3899 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003900 return true;
3901 }
3902}
3903
Akira Hatanaka974131e2014-09-18 18:17:18 +00003904bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3905 unsigned Size) const {
3906 // Strip off constraint modifiers.
3907 while (Constraint[0] == '=' ||
3908 Constraint[0] == '+' ||
3909 Constraint[0] == '&')
3910 Constraint = Constraint.substr(1);
3911
3912 return validateOperandSize(Constraint, Size);
3913}
3914
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003915bool X86TargetInfo::validateInputSize(StringRef Constraint,
3916 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003917 return validateOperandSize(Constraint, Size);
3918}
3919
3920bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3921 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003922 switch (Constraint[0]) {
3923 default: break;
3924 case 'y':
3925 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003926 case 'f':
3927 case 't':
3928 case 'u':
3929 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003930 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003931 if (SSELevel >= AVX512F)
3932 // 512-bit zmm registers can be used if target supports AVX512F.
3933 return Size <= 512U;
3934 else if (SSELevel >= AVX)
3935 // 256-bit ymm registers can be used if target supports AVX.
3936 return Size <= 256U;
3937 return Size <= 128U;
3938 case 'Y':
3939 // 'Y' is the first character for several 2-character constraints.
3940 switch (Constraint[1]) {
3941 default: break;
3942 case 'm':
3943 // 'Ym' is synonymous with 'y'.
3944 return Size <= 64;
3945 case 'i':
3946 case 't':
3947 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3948 if (SSELevel >= AVX512F)
3949 return Size <= 512U;
3950 else if (SSELevel >= AVX)
3951 return Size <= 256U;
3952 return SSELevel >= SSE2 && Size <= 128U;
3953 }
3954
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003955 }
3956
3957 return true;
3958}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003959
Eli Friedman3fd920a2008-08-20 02:34:37 +00003960std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003961X86TargetInfo::convertConstraint(const char *&Constraint) const {
3962 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003963 case 'a': return std::string("{ax}");
3964 case 'b': return std::string("{bx}");
3965 case 'c': return std::string("{cx}");
3966 case 'd': return std::string("{dx}");
3967 case 'S': return std::string("{si}");
3968 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003969 case 'p': // address
3970 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003971 case 't': // top of floating point stack.
3972 return std::string("{st}");
3973 case 'u': // second from top of floating point stack.
3974 return std::string("{st(1)}"); // second from top of floating point stack.
3975 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003976 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003977 }
3978}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003979
Eli Friedman3fd920a2008-08-20 02:34:37 +00003980// X86-32 generic target
3981class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003982public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003983 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3984 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003985 DoubleAlign = LongLongAlign = 32;
3986 LongDoubleWidth = 96;
3987 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003988 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003989 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003990 SizeType = UnsignedInt;
3991 PtrDiffType = SignedInt;
3992 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003993 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003994
3995 // Use fpret for all types.
3996 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3997 (1 << TargetInfo::Double) |
3998 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003999
4000 // x86-32 has atomics up to 8 bytes
4001 // FIXME: Check that we actually have cmpxchg8b before setting
4002 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4003 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004004 }
Craig Topper3164f332014-03-11 03:39:26 +00004005 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004006 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004007 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004008
Craig Topper3164f332014-03-11 03:39:26 +00004009 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004010 if (RegNo == 0) return 0;
4011 if (RegNo == 1) return 2;
4012 return -1;
4013 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004014 bool validateOperandSize(StringRef Constraint,
4015 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004016 switch (Constraint[0]) {
4017 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004018 case 'R':
4019 case 'q':
4020 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004021 case 'a':
4022 case 'b':
4023 case 'c':
4024 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004025 case 'S':
4026 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004027 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004028 case 'A':
4029 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004030 }
4031
Akira Hatanaka974131e2014-09-18 18:17:18 +00004032 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004033 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004034};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004035
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004036class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4037public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004038 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4039 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004040
Craig Topper3164f332014-03-11 03:39:26 +00004041 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004042 unsigned Major, Minor, Micro;
4043 getTriple().getOSVersion(Major, Minor, Micro);
4044 // New NetBSD uses the default rounding mode.
4045 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4046 return X86_32TargetInfo::getFloatEvalMethod();
4047 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004048 return 1;
4049 }
4050};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004051
Eli Friedmane3aa4542009-07-05 18:47:56 +00004052class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4053public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004054 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4055 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004056 SizeType = UnsignedLong;
4057 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004058 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004059 }
4060};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004061
Eli Friedman9fa28852012-08-08 23:57:20 +00004062class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4063public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004064 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4065 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004066 SizeType = UnsignedLong;
4067 IntPtrType = SignedLong;
4068 PtrDiffType = SignedLong;
4069 }
4070};
Eli Friedman9fa28852012-08-08 23:57:20 +00004071
Torok Edwinb2b37c62009-06-30 17:10:35 +00004072class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004073public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004074 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4075 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004076 LongDoubleWidth = 128;
4077 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004078 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004079 MaxVectorAlign = 256;
4080 // The watchOS simulator uses the builtin bool type for Objective-C.
4081 llvm::Triple T = llvm::Triple(Triple);
4082 if (T.isWatchOS())
4083 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004084 SizeType = UnsignedLong;
4085 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004086 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004087 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004088 }
4089
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004090 bool handleTargetFeatures(std::vector<std::string> &Features,
4091 DiagnosticsEngine &Diags) override {
4092 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4093 Diags))
4094 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004095 // We now know the features we have: we can decide how to align vectors.
4096 MaxVectorAlign =
4097 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004098 return true;
4099 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004100};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004101
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004102// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004103class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004104public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004105 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4106 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004107 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004108 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004109 bool IsWinCOFF =
4110 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004111 resetDataLayout(IsWinCOFF
4112 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4113 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004114 }
Craig Topper3164f332014-03-11 03:39:26 +00004115 void getTargetDefines(const LangOptions &Opts,
4116 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004117 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4118 }
4119};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004120
4121// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004122class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004123public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004124 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4125 const TargetOptions &Opts)
4126 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004127 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004128 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4129 }
Craig Topper3164f332014-03-11 03:39:26 +00004130 void getTargetDefines(const LangOptions &Opts,
4131 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004132 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4133 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4134 // The value of the following reflects processor type.
4135 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4136 // We lost the original triple, so we use the default.
4137 Builder.defineMacro("_M_IX86", "600");
4138 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004139};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004140
David Majnemerae1ed0e2015-05-28 04:36:18 +00004141static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004142 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4143 // supports __declspec natively under -fms-extensions, but we define a no-op
4144 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004145 if (Opts.MicrosoftExt)
4146 Builder.defineMacro("__declspec", "__declspec");
4147 else
4148 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4149
4150 if (!Opts.MicrosoftExt) {
4151 // Provide macros for all the calling convention keywords. Provide both
4152 // single and double underscore prefixed variants. These are available on
4153 // x64 as well as x86, even though they have no effect.
4154 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4155 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004156 std::string GCCSpelling = "__attribute__((__";
4157 GCCSpelling += CC;
4158 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004159 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4160 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4161 }
4162 }
4163}
4164
David Majnemerae1ed0e2015-05-28 04:36:18 +00004165static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4166 Builder.defineMacro("__MSVCRT__");
4167 Builder.defineMacro("__MINGW32__");
4168 addCygMingDefines(Opts, Builder);
4169}
4170
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004171// x86-32 MinGW target
4172class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4173public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004174 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4175 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004176 void getTargetDefines(const LangOptions &Opts,
4177 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004178 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004179 DefineStd(Builder, "WIN32", Opts);
4180 DefineStd(Builder, "WINNT", Opts);
4181 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004182 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004183 }
4184};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004185
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004186// x86-32 Cygwin target
4187class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4188public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004189 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4190 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004191 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004192 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004193 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 +00004194 }
Craig Topper3164f332014-03-11 03:39:26 +00004195 void getTargetDefines(const LangOptions &Opts,
4196 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004197 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004198 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004199 Builder.defineMacro("__CYGWIN__");
4200 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004201 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004202 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004203 if (Opts.CPlusPlus)
4204 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004205 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004206};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004207
Chris Lattnerb986aba2010-04-11 19:29:39 +00004208// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004209class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004210public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004211 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004212 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004213 }
Craig Topper3164f332014-03-11 03:39:26 +00004214 void getTargetDefines(const LangOptions &Opts,
4215 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004216 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004217 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004218 }
4219};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004220
Alexey Bataevc99b0492015-11-25 09:24:26 +00004221// X86-32 MCU target
4222class MCUX86_32TargetInfo : public X86_32TargetInfo {
4223public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004224 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4225 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004226 LongDoubleWidth = 64;
4227 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004228 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 +00004229 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004230 }
4231
4232 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4233 // On MCU we support only C calling convention.
4234 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4235 }
4236
4237 void getTargetDefines(const LangOptions &Opts,
4238 MacroBuilder &Builder) const override {
4239 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4240 Builder.defineMacro("__iamcu");
4241 Builder.defineMacro("__iamcu__");
4242 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004243
4244 bool allowsLargerPreferedTypeAlignment() const override {
4245 return false;
4246 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004247};
4248
Douglas Gregor9fabd852011-07-01 22:41:14 +00004249// RTEMS Target
4250template<typename Target>
4251class RTEMSTargetInfo : public OSTargetInfo<Target> {
4252protected:
Craig Topper3164f332014-03-11 03:39:26 +00004253 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4254 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004255 // RTEMS defines; list based off of gcc output
4256
Douglas Gregor9fabd852011-07-01 22:41:14 +00004257 Builder.defineMacro("__rtems__");
4258 Builder.defineMacro("__ELF__");
4259 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004260
Douglas Gregor9fabd852011-07-01 22:41:14 +00004261public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004262 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4263 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004264 switch (Triple.getArch()) {
4265 default:
4266 case llvm::Triple::x86:
4267 // this->MCountName = ".mcount";
4268 break;
4269 case llvm::Triple::mips:
4270 case llvm::Triple::mipsel:
4271 case llvm::Triple::ppc:
4272 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004273 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004274 // this->MCountName = "_mcount";
4275 break;
4276 case llvm::Triple::arm:
4277 // this->MCountName = "__mcount";
4278 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004279 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004280 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004281};
4282
Douglas Gregor9fabd852011-07-01 22:41:14 +00004283// x86-32 RTEMS target
4284class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4285public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004286 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4287 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004288 SizeType = UnsignedLong;
4289 IntPtrType = SignedLong;
4290 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004291 }
Craig Topper3164f332014-03-11 03:39:26 +00004292 void getTargetDefines(const LangOptions &Opts,
4293 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004294 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4295 Builder.defineMacro("__INTEL__");
4296 Builder.defineMacro("__rtems__");
4297 }
4298};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004299
Eli Friedman3fd920a2008-08-20 02:34:37 +00004300// x86-64 generic target
4301class X86_64TargetInfo : public X86TargetInfo {
4302public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004303 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4304 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004305 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004306 bool IsWinCOFF =
4307 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004308 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004309 LongDoubleWidth = 128;
4310 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004311 LargeArrayMinWidth = 128;
4312 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004313 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004314 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4315 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4316 IntPtrType = IsX32 ? SignedInt : SignedLong;
4317 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004318 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004319 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004320
Eric Christopher917e9522014-11-18 22:36:15 +00004321 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004322 resetDataLayout(IsX32
4323 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4324 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4325 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004326
4327 // Use fpret only for long double.
4328 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004329
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004330 // Use fp2ret for _Complex long double.
4331 ComplexLongDoubleUsesFP2Ret = true;
4332
Charles Davisc7d5c942015-09-17 20:55:33 +00004333 // Make __builtin_ms_va_list available.
4334 HasBuiltinMSVaList = true;
4335
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004336 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004337 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004338 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004339 }
Craig Topper3164f332014-03-11 03:39:26 +00004340 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004341 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004342 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004343
Craig Topper3164f332014-03-11 03:39:26 +00004344 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004345 if (RegNo == 0) return 0;
4346 if (RegNo == 1) return 1;
4347 return -1;
4348 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004349
Craig Topper3164f332014-03-11 03:39:26 +00004350 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004351 switch (CC) {
4352 case CC_C:
4353 case CC_Swift:
4354 case CC_X86VectorCall:
4355 case CC_IntelOclBicc:
4356 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004357 case CC_PreserveMost:
4358 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004359 return CCCR_OK;
4360 default:
4361 return CCCR_Warning;
4362 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004363 }
4364
Craig Topper3164f332014-03-11 03:39:26 +00004365 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004366 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004367 }
4368
Pavel Chupinfd223e12014-08-04 12:39:43 +00004369 // for x32 we need it here explicitly
4370 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004371 unsigned getUnwindWordWidth() const override { return 64; }
4372 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004373
4374 bool validateGlobalRegisterVariable(StringRef RegName,
4375 unsigned RegSize,
4376 bool &HasSizeMismatch) const override {
4377 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4378 // handle.
4379 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4380 // Check that the register size is 64-bit.
4381 HasSizeMismatch = RegSize != 64;
4382 return true;
4383 }
4384
4385 // Check if the register is a 32-bit register the backend can handle.
4386 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4387 HasSizeMismatch);
4388 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004389};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004390
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004391// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004392class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004393public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004394 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4395 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004396 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004397 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004398 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004399 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004400 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004401 SizeType = UnsignedLongLong;
4402 PtrDiffType = SignedLongLong;
4403 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004404 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004405
Craig Topper3164f332014-03-11 03:39:26 +00004406 void getTargetDefines(const LangOptions &Opts,
4407 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004408 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004409 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004410 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004411
Craig Topper3164f332014-03-11 03:39:26 +00004412 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004413 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004414 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004415
Craig Topper3164f332014-03-11 03:39:26 +00004416 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004417 switch (CC) {
4418 case CC_X86StdCall:
4419 case CC_X86ThisCall:
4420 case CC_X86FastCall:
4421 return CCCR_Ignore;
4422 case CC_C:
4423 case CC_X86VectorCall:
4424 case CC_IntelOclBicc:
4425 case CC_X86_64SysV:
4426 return CCCR_OK;
4427 default:
4428 return CCCR_Warning;
4429 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004430 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004431};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004432
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004433// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004434class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004435public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004436 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4437 const TargetOptions &Opts)
4438 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004439 LongDoubleWidth = LongDoubleAlign = 64;
4440 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004441 }
Craig Topper3164f332014-03-11 03:39:26 +00004442 void getTargetDefines(const LangOptions &Opts,
4443 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004444 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4445 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004446 Builder.defineMacro("_M_X64", "100");
4447 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004448 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004449};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004450
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004451// x86-64 MinGW target
4452class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4453public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004454 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4455 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004456 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4457 // with x86 FP ops. Weird.
4458 LongDoubleWidth = LongDoubleAlign = 128;
4459 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4460 }
4461
Craig Topper3164f332014-03-11 03:39:26 +00004462 void getTargetDefines(const LangOptions &Opts,
4463 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004464 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004465 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004466 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004467 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004468
4469 // GCC defines this macro when it is using __gxx_personality_seh0.
4470 if (!Opts.SjLjExceptions)
4471 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004472 }
4473};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004474
Yaron Kerend030d112015-07-22 17:38:19 +00004475// x86-64 Cygwin target
4476class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4477public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004478 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4479 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004480 TLSSupported = false;
4481 WCharType = UnsignedShort;
4482 }
4483 void getTargetDefines(const LangOptions &Opts,
4484 MacroBuilder &Builder) const override {
4485 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4486 Builder.defineMacro("__x86_64__");
4487 Builder.defineMacro("__CYGWIN__");
4488 Builder.defineMacro("__CYGWIN64__");
4489 addCygMingDefines(Opts, Builder);
4490 DefineStd(Builder, "unix", Opts);
4491 if (Opts.CPlusPlus)
4492 Builder.defineMacro("_GNU_SOURCE");
4493
4494 // GCC defines this macro when it is using __gxx_personality_seh0.
4495 if (!Opts.SjLjExceptions)
4496 Builder.defineMacro("__SEH__");
4497 }
4498};
4499
Eli Friedman2857ccb2009-07-01 03:36:11 +00004500class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4501public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004502 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4503 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004504 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004505 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4506 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004507 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004508 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004509 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004510 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004511
4512 bool handleTargetFeatures(std::vector<std::string> &Features,
4513 DiagnosticsEngine &Diags) override {
4514 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4515 Diags))
4516 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004517 // We now know the features we have: we can decide how to align vectors.
4518 MaxVectorAlign =
4519 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004520 return true;
4521 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004522};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004523
Eli Friedman245f2292009-07-05 22:31:18 +00004524class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4525public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004526 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4527 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004528 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004529 Int64Type = SignedLongLong;
4530 }
4531};
Eli Friedman245f2292009-07-05 22:31:18 +00004532
Eli Friedman9fa28852012-08-08 23:57:20 +00004533class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4534public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004535 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4536 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004537 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004538 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004539 }
4540};
Tim Northover9bb857a2013-01-31 12:13:10 +00004541
Eli Friedmanf05b7722008-08-20 07:44:10 +00004542class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004543 // Possible FPU choices.
4544 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004545 VFP2FPU = (1 << 0),
4546 VFP3FPU = (1 << 1),
4547 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004548 NeonFPU = (1 << 3),
4549 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004550 };
4551
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004552 // Possible HWDiv features.
4553 enum HWDivMode {
4554 HWDivThumb = (1 << 0),
4555 HWDivARM = (1 << 1)
4556 };
4557
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004558 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004559 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004560 }
4561
4562 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4563 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004564
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004565 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004566
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004567 StringRef CPUProfile;
4568 StringRef CPUAttr;
4569
Rafael Espindolaeb265472013-08-21 21:59:03 +00004570 enum {
4571 FP_Default,
4572 FP_VFP,
4573 FP_Neon
4574 } FPMath;
4575
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004576 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004577 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004578 unsigned ArchProfile;
4579 unsigned ArchVersion;
4580
Bernard Ogdenda13af32013-10-24 18:32:51 +00004581 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004582
Logan Chien57086ce2012-10-10 06:56:20 +00004583 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004584 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004585
4586 // Initialized via features.
4587 unsigned SoftFloat : 1;
4588 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004589
Bernard Ogden18b57012013-10-29 09:47:51 +00004590 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004591 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004592 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004593 unsigned Unaligned : 1;
4594
4595 enum {
4596 LDREX_B = (1 << 0), /// byte (8-bit)
4597 LDREX_H = (1 << 1), /// half (16-bit)
4598 LDREX_W = (1 << 2), /// word (32-bit)
4599 LDREX_D = (1 << 3), /// double (64-bit)
4600 };
4601
4602 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004603
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004604 // ACLE 6.5.1 Hardware floating point
4605 enum {
4606 HW_FP_HP = (1 << 1), /// half (16-bit)
4607 HW_FP_SP = (1 << 2), /// single (32-bit)
4608 HW_FP_DP = (1 << 3), /// double (64-bit)
4609 };
4610 uint32_t HW_FP;
4611
Chris Lattner5cc15e02010-03-03 19:03:45 +00004612 static const Builtin::Info BuiltinInfo[];
4613
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004614 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004615 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004616
4617 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004618 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004619
Renato Golin9ba39232015-02-27 16:35:48 +00004620 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4621 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4622 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004623 SizeType = UnsignedLong;
4624 else
4625 SizeType = UnsignedInt;
4626
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004627 switch (T.getOS()) {
4628 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004629 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004630 break;
4631 case llvm::Triple::Win32:
4632 WCharType = UnsignedShort;
4633 break;
4634 case llvm::Triple::Linux:
4635 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004636 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4637 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004638 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004639 }
4640
4641 UseBitFieldTypeAlignment = true;
4642
4643 ZeroLengthBitfieldBoundary = 0;
4644
Tim Northover147cd2f2014-10-14 22:12:21 +00004645 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4646 // so set preferred for small types to 32.
4647 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004648 resetDataLayout(BigEndian
4649 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4650 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004651 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004652 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004653 resetDataLayout("e"
4654 "-m:w"
4655 "-p:32:32"
4656 "-i64:64"
4657 "-v128:64:128"
4658 "-a:0:32"
4659 "-n32"
4660 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004661 } else if (T.isOSNaCl()) {
4662 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004663 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004664 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004665 resetDataLayout(BigEndian
4666 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4667 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004668 }
4669
4670 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004671 }
4672
Tim Northover5627d392015-10-30 16:30:45 +00004673 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004674 const llvm::Triple &T = getTriple();
4675
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004676 IsAAPCS = false;
4677
Tim Northover5627d392015-10-30 16:30:45 +00004678 if (IsAAPCS16)
4679 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4680 else
4681 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004682
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004683 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004684 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004685 SizeType = UnsignedInt;
4686 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004687 SizeType = UnsignedLong;
4688
4689 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4690 WCharType = SignedInt;
4691
4692 // Do not respect the alignment of bit-field types when laying out
4693 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4694 UseBitFieldTypeAlignment = false;
4695
4696 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4697 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4698 /// gcc.
4699 ZeroLengthBitfieldBoundary = 32;
4700
Tim Northover5627d392015-10-30 16:30:45 +00004701 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4702 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004703 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004704 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004705 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004706 BigEndian
4707 ? "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 +00004708 : "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 +00004709 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004710 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004711 BigEndian
4712 ? "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 +00004713 : "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 +00004714
4715 // FIXME: Override "preferred align" for double and long long.
4716 }
4717
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004718 void setArchInfo() {
4719 StringRef ArchName = getTriple().getArchName();
4720
Renato Goline84b0002015-10-08 16:43:26 +00004721 ArchISA = llvm::ARM::parseArchISA(ArchName);
4722 CPU = llvm::ARM::getDefaultCPU(ArchName);
4723 unsigned AK = llvm::ARM::parseArch(ArchName);
4724 if (AK != llvm::ARM::AK_INVALID)
4725 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004726 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004727 }
4728
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004729 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004730 StringRef SubArch;
4731
4732 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004733 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004734 SubArch = llvm::ARM::getSubArch(ArchKind);
4735 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4736 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004737
4738 // cache CPU related strings
4739 CPUAttr = getCPUAttr();
4740 CPUProfile = getCPUProfile();
4741 }
4742
4743 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004744 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004745 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004746 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004747 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4748 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004749 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004750 if (ArchProfile == llvm::ARM::PK_M) {
4751 MaxAtomicPromoteWidth = 32;
4752 if (ShouldUseInlineAtomic)
4753 MaxAtomicInlineWidth = 32;
4754 }
4755 else {
4756 MaxAtomicPromoteWidth = 64;
4757 if (ShouldUseInlineAtomic)
4758 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004759 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004760 }
4761
4762 bool isThumb() const {
4763 return (ArchISA == llvm::ARM::IK_THUMB);
4764 }
4765
4766 bool supportsThumb() const {
4767 return CPUAttr.count('T') || ArchVersion >= 6;
4768 }
4769
4770 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004771 return CPUAttr.equals("6T2") ||
4772 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004773 }
4774
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004775 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004776 // For most sub-arches, the build attribute CPU name is enough.
4777 // For Cortex variants, it's slightly different.
4778 switch(ArchKind) {
4779 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004780 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004781 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004782 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004783 case llvm::ARM::AK_ARMV7S:
4784 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004785 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004786 return "7A";
4787 case llvm::ARM::AK_ARMV7R:
4788 return "7R";
4789 case llvm::ARM::AK_ARMV7M:
4790 return "7M";
4791 case llvm::ARM::AK_ARMV7EM:
4792 return "7EM";
4793 case llvm::ARM::AK_ARMV8A:
4794 return "8A";
4795 case llvm::ARM::AK_ARMV8_1A:
4796 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004797 case llvm::ARM::AK_ARMV8_2A:
4798 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004799 case llvm::ARM::AK_ARMV8MBaseline:
4800 return "8M_BASE";
4801 case llvm::ARM::AK_ARMV8MMainline:
4802 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004803 }
4804 }
4805
4806 StringRef getCPUProfile() const {
4807 switch(ArchProfile) {
4808 case llvm::ARM::PK_A:
4809 return "A";
4810 case llvm::ARM::PK_R:
4811 return "R";
4812 case llvm::ARM::PK_M:
4813 return "M";
4814 default:
4815 return "";
4816 }
4817 }
4818
Chris Lattner17df24e2008-04-21 18:56:49 +00004819public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004820 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4821 bool IsBigEndian)
4822 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4823 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004824 BigEndian = IsBigEndian;
4825
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004826 switch (getTriple().getOS()) {
4827 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004828 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004829 break;
4830 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004831 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004832 break;
4833 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004834
Renato Goline84b0002015-10-08 16:43:26 +00004835 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004836 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004837
Chris Lattner1a8f3942010-04-23 16:29:58 +00004838 // {} in inline assembly are neon specifiers, not assembly variant
4839 // specifiers.
4840 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004841
Eric Christopher0e261882014-12-05 01:06:59 +00004842 // FIXME: This duplicates code from the driver that sets the -target-abi
4843 // option - this code is used if -target-abi isn't passed and should
4844 // be unified in some way.
4845 if (Triple.isOSBinFormatMachO()) {
4846 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4847 // the frontend matches that.
4848 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4849 Triple.getOS() == llvm::Triple::UnknownOS ||
4850 StringRef(CPU).startswith("cortex-m")) {
4851 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004852 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004853 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004854 } else {
4855 setABI("apcs-gnu");
4856 }
4857 } else if (Triple.isOSWindows()) {
4858 // FIXME: this is invalid for WindowsCE
4859 setABI("aapcs");
4860 } else {
4861 // Select the default based on the platform.
4862 switch (Triple.getEnvironment()) {
4863 case llvm::Triple::Android:
4864 case llvm::Triple::GNUEABI:
4865 case llvm::Triple::GNUEABIHF:
4866 setABI("aapcs-linux");
4867 break;
4868 case llvm::Triple::EABIHF:
4869 case llvm::Triple::EABI:
4870 setABI("aapcs");
4871 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004872 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004873 setABI("apcs-gnu");
4874 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004875 default:
4876 if (Triple.getOS() == llvm::Triple::NetBSD)
4877 setABI("apcs-gnu");
4878 else
4879 setABI("aapcs");
4880 break;
4881 }
4882 }
John McCall86353412010-08-21 22:46:04 +00004883
4884 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004885 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004886
Renato Golin15b86152015-07-03 16:41:13 +00004887 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004888 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004889
James Molloya7139222012-03-12 09:14:10 +00004890 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004891 // the alignment of the zero-length bitfield is greater than the member
4892 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004893 // zero length bitfield.
4894 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004895
4896 if (Triple.getOS() == llvm::Triple::Linux ||
4897 Triple.getOS() == llvm::Triple::UnknownOS)
4898 this->MCountName =
4899 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004900 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004901
Alp Toker4925ba72014-06-07 23:30:42 +00004902 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004903
Craig Topper3164f332014-03-11 03:39:26 +00004904 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004905 ABI = Name;
4906
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004907 // The defaults (above) are for AAPCS, check if we need to change them.
4908 //
4909 // FIXME: We need support for -meabi... we could just mangle it into the
4910 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004911 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004912 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004913 return true;
4914 }
4915 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4916 setABIAAPCS();
4917 return true;
4918 }
4919 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004920 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004921
Renato Golinf5c4dec2015-05-27 13:33:00 +00004922 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004923 bool
4924 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4925 StringRef CPU,
4926 const std::vector<std::string> &FeaturesVec) const override {
4927
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004928 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004929 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004930
4931 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004932 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004933 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4934
4935 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004936 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004937 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4938
4939 for (const char *Feature : TargetFeatures)
4940 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004941 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004942
Eric Christopher007b0a02015-08-28 22:32:01 +00004943 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004944 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004945
Craig Topper3164f332014-03-11 03:39:26 +00004946 bool handleTargetFeatures(std::vector<std::string> &Features,
4947 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004948 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004949 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004950 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004951 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004952 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004953 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004954 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004955
Ranjeet Singhac08e532015-06-24 23:39:25 +00004956 // This does not diagnose illegal cases like having both
4957 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4958 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004959 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004960 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004961 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004962 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004963 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004964 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004965 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004966 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004967 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004968 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004969 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004970 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004971 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004972 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004973 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004974 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004975 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004976 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004977 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004978 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004979 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004980 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004981 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004982 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004983 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004984 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004985 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004986 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004987 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004988 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004989 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00004990 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004991 } else if (Feature == "+strict-align") {
4992 Unaligned = 0;
4993 } else if (Feature == "+fp16") {
4994 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004995 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004996 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004997 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004998
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004999 switch (ArchVersion) {
5000 case 6:
5001 if (ArchProfile == llvm::ARM::PK_M)
5002 LDREX = 0;
5003 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5004 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5005 else
5006 LDREX = LDREX_W;
5007 break;
5008 case 7:
5009 if (ArchProfile == llvm::ARM::PK_M)
5010 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5011 else
5012 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5013 break;
5014 case 8:
5015 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5016 }
5017
Rafael Espindolaeb265472013-08-21 21:59:03 +00005018 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5019 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5020 return false;
5021 }
5022
5023 if (FPMath == FP_Neon)
5024 Features.push_back("+neonfp");
5025 else if (FPMath == FP_VFP)
5026 Features.push_back("-neonfp");
5027
Daniel Dunbar893d4752009-12-19 04:15:38 +00005028 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005029 auto Feature =
5030 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5031 if (Feature != Features.end())
5032 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005033
Rafael Espindolaeb265472013-08-21 21:59:03 +00005034 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005035 }
5036
Craig Topper3164f332014-03-11 03:39:26 +00005037 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005038 return llvm::StringSwitch<bool>(Feature)
5039 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005040 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005041 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005042 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005043 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005044 .Case("hwdiv", HWDiv & HWDivThumb)
5045 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005046 .Default(false);
5047 }
Renato Golin15b86152015-07-03 16:41:13 +00005048
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005049 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005050 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005051 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005052
Renato Golin15b86152015-07-03 16:41:13 +00005053 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005054 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005055 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005056 CPU = Name;
5057 return true;
5058 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005059
Craig Topper3164f332014-03-11 03:39:26 +00005060 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005061
Craig Topper3164f332014-03-11 03:39:26 +00005062 void getTargetDefines(const LangOptions &Opts,
5063 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005064 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005065 Builder.defineMacro("__arm");
5066 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005067 // For bare-metal none-eabi.
5068 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5069 getTriple().getEnvironment() == llvm::Triple::EABI)
5070 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005071
Chris Lattnerecd49032009-03-02 22:27:17 +00005072 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005073 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005074
5075 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5076 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005077 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005078 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5079
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005080 if (!CPUAttr.empty())
5081 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005082
5083 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005084 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005085 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005086
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005087 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005088 // ACLE 6.5.7 Crypto Extension
5089 if (Crypto)
5090 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5091 // ACLE 6.5.8 CRC32 Extension
5092 if (CRC)
5093 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5094 // ACLE 6.5.10 Numeric Maximum and Minimum
5095 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5096 // ACLE 6.5.9 Directed Rounding
5097 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005098 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005099
5100 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5101 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005102 // NOTE that the default profile is assumed to be 'A'
5103 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005104 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5105
Bradley Smithf4affc12016-03-03 13:52:22 +00005106 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5107 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5108 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5109 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005110 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005111 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005112 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005113 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5114
5115 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5116 // instruction set such as ARM or Thumb.
5117 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5118
5119 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5120
5121 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005122 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005123 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005124
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005125 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005126 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005127 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005128
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005129 // ACLE 6.4.4 LDREX/STREX
5130 if (LDREX)
5131 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5132
5133 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005134 if (ArchVersion == 5 ||
5135 (ArchVersion == 6 && CPUProfile != "M") ||
5136 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005137 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5138
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005139 // ACLE 6.5.1 Hardware Floating Point
5140 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005141 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005142
Yi Konga44c4d72014-06-27 21:25:42 +00005143 // ACLE predefines.
5144 Builder.defineMacro("__ARM_ACLE", "200");
5145
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005146 // FP16 support (we currently only support IEEE format).
5147 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5148 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5149
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005150 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005151 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005152 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5153
Mike Stump9d54bd72009-04-08 02:07:04 +00005154 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005155
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005156 // FIXME: It's more complicated than this and we don't really support
5157 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005158 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005159 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005160 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005161
David Tweed8f676532012-10-25 13:33:01 +00005162 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005163 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005164 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005165 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005166 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005167 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005168 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005169
Tim Northover28fc0e12016-04-28 13:59:55 +00005170 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5171 ABI == "aapcs16")
5172 Builder.defineMacro("__ARM_PCS_VFP", "1");
5173
Daniel Dunbar893d4752009-12-19 04:15:38 +00005174 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005175 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005176
5177 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005178 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005179
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005180 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005181 Builder.defineMacro("__THUMBEL__");
5182 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005183 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005184 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005185 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005186
5187 // ACLE 6.4.9 32-bit SIMD instructions
5188 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5189 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5190
5191 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005192 if (((HWDiv & HWDivThumb) && isThumb()) ||
5193 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005194 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005195 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005196 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005197
5198 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005199 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005200
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005201 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005202 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005203 if (FPU & VFP2FPU)
5204 Builder.defineMacro("__ARM_VFPV2__");
5205 if (FPU & VFP3FPU)
5206 Builder.defineMacro("__ARM_VFPV3__");
5207 if (FPU & VFP4FPU)
5208 Builder.defineMacro("__ARM_VFPV4__");
5209 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005210
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005211 // This only gets set when Neon instructions are actually available, unlike
5212 // the VFP define, hence the soft float and arch check. This is subtly
5213 // different from gcc, we follow the intent which was that it should be set
5214 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005215 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005216 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005217 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005218 // current AArch32 NEON implementations do not support double-precision
5219 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005220 Builder.defineMacro("__ARM_NEON_FP",
5221 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005222 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005223
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005224 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5225 Opts.ShortWChar ? "2" : "4");
5226
5227 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5228 Opts.ShortEnums ? "1" : "4");
5229
Bradley Smithf4affc12016-03-03 13:52:22 +00005230 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005231 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5232 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5233 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5234 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5235 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005236
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005237 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005238 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005239 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005240 }
5241
5242 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005243 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005244 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5245 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005246 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005247 }
5248
5249 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005250 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005251 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005252
5253 if (Opts.UnsafeFPMath)
5254 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005255
5256 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5257 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005258 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005259
Craig Topper6c03a542015-10-19 04:51:35 +00005260 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5261 return llvm::makeArrayRef(BuiltinInfo,
5262 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005263 }
Craig Topper3164f332014-03-11 03:39:26 +00005264 bool isCLZForZeroUndef() const override { return false; }
5265 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005266 return IsAAPCS
5267 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005268 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5269 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005270 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005271 ArrayRef<const char *> getGCCRegNames() const override;
5272 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005273 bool validateAsmConstraint(const char *&Name,
5274 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005275 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005276 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005277 case 'l': // r0-r7
5278 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005279 case 't': // VFP Floating point register single precision
5280 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005281 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005282 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005283 case 'I':
5284 case 'J':
5285 case 'K':
5286 case 'L':
5287 case 'M':
5288 // FIXME
5289 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005290 case 'Q': // A memory address that is a single base register.
5291 Info.setAllowsMemory();
5292 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005293 case 'U': // a memory reference...
5294 switch (Name[1]) {
5295 case 'q': // ...ARMV4 ldrsb
5296 case 'v': // ...VFP load/store (reg+constant offset)
5297 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005298 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005299 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005300 case 'n': // valid address for Neon doubleword vector load/store
5301 case 'm': // valid address for Neon element and structure load/store
5302 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005303 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005304 Info.setAllowsMemory();
5305 Name++;
5306 return true;
5307 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005308 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005309 return false;
5310 }
Craig Topper3164f332014-03-11 03:39:26 +00005311 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005312 std::string R;
5313 switch (*Constraint) {
5314 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005315 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005316 Constraint++;
5317 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005318 case 'p': // 'p' should be translated to 'r' by default.
5319 R = std::string("r");
5320 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005321 default:
5322 return std::string(1, *Constraint);
5323 }
5324 return R;
5325 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005326 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005327 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005328 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005329 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005330 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005331
Bill Wendling9d1ee112012-10-25 23:28:48 +00005332 // Strip off constraint modifiers.
5333 while (Constraint[0] == '=' ||
5334 Constraint[0] == '+' ||
5335 Constraint[0] == '&')
5336 Constraint = Constraint.substr(1);
5337
5338 switch (Constraint[0]) {
5339 default: break;
5340 case 'r': {
5341 switch (Modifier) {
5342 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005343 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005344 case 'q':
5345 // A register of size 32 cannot fit a vector type.
5346 return false;
5347 }
5348 }
5349 }
5350
5351 return true;
5352 }
Craig Topper3164f332014-03-11 03:39:26 +00005353 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005354 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005355 return "";
5356 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005357
Craig Topper3164f332014-03-11 03:39:26 +00005358 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005359 switch (CC) {
5360 case CC_AAPCS:
5361 case CC_AAPCS_VFP:
5362 case CC_Swift:
5363 return CCCR_OK;
5364 default:
5365 return CCCR_Warning;
5366 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005367 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005368
Craig Topper3164f332014-03-11 03:39:26 +00005369 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005370 if (RegNo == 0) return 0;
5371 if (RegNo == 1) return 1;
5372 return -1;
5373 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005374
5375 bool hasSjLjLowering() const override {
5376 return true;
5377 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005378};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005379
Rafael Espindolaeb265472013-08-21 21:59:03 +00005380bool ARMTargetInfo::setFPMath(StringRef Name) {
5381 if (Name == "neon") {
5382 FPMath = FP_Neon;
5383 return true;
5384 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5385 Name == "vfp4") {
5386 FPMath = FP_VFP;
5387 return true;
5388 }
5389 return false;
5390}
5391
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005392const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005393 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005394 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005395 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5396
5397 // Float registers
5398 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5399 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5400 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005401 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005402
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005403 // Double registers
5404 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5405 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005406 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5407 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005408
5409 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005410 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5411 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005412};
5413
Craig Topperf054e3a2015-10-19 03:52:27 +00005414ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5415 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005416}
5417
5418const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005419 { { "a1" }, "r0" },
5420 { { "a2" }, "r1" },
5421 { { "a3" }, "r2" },
5422 { { "a4" }, "r3" },
5423 { { "v1" }, "r4" },
5424 { { "v2" }, "r5" },
5425 { { "v3" }, "r6" },
5426 { { "v4" }, "r7" },
5427 { { "v5" }, "r8" },
5428 { { "v6", "rfp" }, "r9" },
5429 { { "sl" }, "r10" },
5430 { { "fp" }, "r11" },
5431 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005432 { { "r13" }, "sp" },
5433 { { "r14" }, "lr" },
5434 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005435 // The S, D and Q registers overlap, but aren't really aliases; we
5436 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005437};
5438
Craig Topperf054e3a2015-10-19 03:52:27 +00005439ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5440 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005441}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005442
5443const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005444#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005445 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005446#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5447 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005448#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005449
Craig Topper07d3b622015-08-07 05:14:44 +00005450#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005451 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005452#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005453 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005454#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5455 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005456#include "clang/Basic/BuiltinsARM.def"
5457};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005458
5459class ARMleTargetInfo : public ARMTargetInfo {
5460public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005461 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5462 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005463 void getTargetDefines(const LangOptions &Opts,
5464 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005465 Builder.defineMacro("__ARMEL__");
5466 ARMTargetInfo::getTargetDefines(Opts, Builder);
5467 }
5468};
5469
5470class ARMbeTargetInfo : public ARMTargetInfo {
5471public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005472 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5473 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005474 void getTargetDefines(const LangOptions &Opts,
5475 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005476 Builder.defineMacro("__ARMEB__");
5477 Builder.defineMacro("__ARM_BIG_ENDIAN");
5478 ARMTargetInfo::getTargetDefines(Opts, Builder);
5479 }
5480};
Chris Lattner17df24e2008-04-21 18:56:49 +00005481
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005482class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5483 const llvm::Triple Triple;
5484public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005485 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5486 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005487 WCharType = UnsignedShort;
5488 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005489 }
5490 void getVisualStudioDefines(const LangOptions &Opts,
5491 MacroBuilder &Builder) const {
5492 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5493
5494 // FIXME: this is invalid for WindowsCE
5495 Builder.defineMacro("_M_ARM_NT", "1");
5496 Builder.defineMacro("_M_ARMT", "_M_ARM");
5497 Builder.defineMacro("_M_THUMB", "_M_ARM");
5498
5499 assert((Triple.getArch() == llvm::Triple::arm ||
5500 Triple.getArch() == llvm::Triple::thumb) &&
5501 "invalid architecture for Windows ARM target info");
5502 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5503 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5504
5505 // TODO map the complete set of values
5506 // 31: VFPv3 40: VFPv4
5507 Builder.defineMacro("_M_ARM_FP", "31");
5508 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005509 BuiltinVaListKind getBuiltinVaListKind() const override {
5510 return TargetInfo::CharPtrBuiltinVaList;
5511 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005512 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5513 switch (CC) {
5514 case CC_X86StdCall:
5515 case CC_X86ThisCall:
5516 case CC_X86FastCall:
5517 case CC_X86VectorCall:
5518 return CCCR_Ignore;
5519 case CC_C:
5520 return CCCR_OK;
5521 default:
5522 return CCCR_Warning;
5523 }
5524 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005525};
5526
5527// Windows ARM + Itanium C++ ABI Target
5528class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5529public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005530 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5531 const TargetOptions &Opts)
5532 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005533 TheCXXABI.set(TargetCXXABI::GenericARM);
5534 }
5535
5536 void getTargetDefines(const LangOptions &Opts,
5537 MacroBuilder &Builder) const override {
5538 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5539
5540 if (Opts.MSVCCompat)
5541 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5542 }
5543};
5544
5545// Windows ARM, MS (C++) ABI
5546class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005548 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5549 const TargetOptions &Opts)
5550 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005551 TheCXXABI.set(TargetCXXABI::Microsoft);
5552 }
5553
5554 void getTargetDefines(const LangOptions &Opts,
5555 MacroBuilder &Builder) const override {
5556 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5557 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5558 }
5559};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005560
Yaron Keren321249c2015-07-15 13:32:23 +00005561// ARM MinGW target
5562class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5563public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005564 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5565 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005566 TheCXXABI.set(TargetCXXABI::GenericARM);
5567 }
5568
5569 void getTargetDefines(const LangOptions &Opts,
5570 MacroBuilder &Builder) const override {
5571 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5572 DefineStd(Builder, "WIN32", Opts);
5573 DefineStd(Builder, "WINNT", Opts);
5574 Builder.defineMacro("_ARM_");
5575 addMinGWDefines(Opts, Builder);
5576 }
5577};
5578
5579// ARM Cygwin target
5580class CygwinARMTargetInfo : public ARMleTargetInfo {
5581public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005582 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5583 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005584 TLSSupported = false;
5585 WCharType = UnsignedShort;
5586 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005587 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005588 }
5589 void getTargetDefines(const LangOptions &Opts,
5590 MacroBuilder &Builder) const override {
5591 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5592 Builder.defineMacro("_ARM_");
5593 Builder.defineMacro("__CYGWIN__");
5594 Builder.defineMacro("__CYGWIN32__");
5595 DefineStd(Builder, "unix", Opts);
5596 if (Opts.CPlusPlus)
5597 Builder.defineMacro("_GNU_SOURCE");
5598 }
5599};
5600
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005601class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005602protected:
Craig Topper3164f332014-03-11 03:39:26 +00005603 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5604 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005605 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005606 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005607
Torok Edwinb2b37c62009-06-30 17:10:35 +00005608public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005609 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5610 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005611 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005612 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005613 // FIXME: This should be based off of the target features in
5614 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005615 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005616
Tim Northoverd88ecb32016-01-27 19:32:40 +00005617 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005618 // Darwin on iOS uses a variant of the ARM C++ ABI.
5619 TheCXXABI.set(TargetCXXABI::WatchOS);
5620
5621 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5622 // size_t is long, it's a bit weird for it to be int.
5623 PtrDiffType = SignedLong;
5624
5625 // BOOL should be a real boolean on the new ABI
5626 UseSignedCharForObjCBool = false;
5627 } else
5628 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005629 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005630};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005631
Tim Northover573cbee2014-05-24 12:52:07 +00005632class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005633 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005634 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5635 static const char *const GCCRegNames[];
5636
James Molloy75f5f9e2014-04-16 15:33:48 +00005637 enum FPUModeEnum {
5638 FPUMode,
5639 NeonMode
5640 };
5641
5642 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005643 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005644 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005645 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005646 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005647
Tim Northovera2ee4332014-03-29 15:09:45 +00005648 static const Builtin::Info BuiltinInfo[];
5649
5650 std::string ABI;
5651
5652public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005653 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005654 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005655 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5656 WCharType = SignedInt;
5657
5658 // NetBSD apparently prefers consistency across ARM targets to consistency
5659 // across 64-bit targets.
5660 Int64Type = SignedLongLong;
5661 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005662 } else {
5663 WCharType = UnsignedInt;
5664 Int64Type = SignedLong;
5665 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005666 }
5667
Tim Northovera2ee4332014-03-29 15:09:45 +00005668 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005669 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005670 MaxAtomicInlineWidth = 128;
5671 MaxAtomicPromoteWidth = 128;
5672
Tim Northovera6a19f12015-02-06 01:25:07 +00005673 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005674 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5675
Tim Northovera2ee4332014-03-29 15:09:45 +00005676 // {} in inline assembly are neon specifiers, not assembly variant
5677 // specifiers.
5678 NoAsmVariants = true;
5679
Tim Northover7ad87af2015-01-16 18:44:04 +00005680 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5681 // contributes to the alignment of the containing aggregate in the same way
5682 // a plain (non bit-field) member of that type would, without exception for
5683 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005684 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005685 UseZeroLengthBitfieldAlignment = true;
5686
Tim Northover573cbee2014-05-24 12:52:07 +00005687 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005688 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005689
5690 if (Triple.getOS() == llvm::Triple::Linux ||
5691 Triple.getOS() == llvm::Triple::UnknownOS)
5692 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005693 }
5694
Alp Toker4925ba72014-06-07 23:30:42 +00005695 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005696 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005697 if (Name != "aapcs" && Name != "darwinpcs")
5698 return false;
5699
5700 ABI = Name;
5701 return true;
5702 }
5703
David Blaikie1cbb9712014-11-14 19:09:44 +00005704 bool setCPU(const std::string &Name) override {
Renato Golin3b8709c2016-05-25 12:36:31 +00005705 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5706 .Case("generic", true)
5707 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5708 "cortex-a35", "exynos-m1", true)
Sjoerd Meijer90df4a72016-06-02 10:48:37 +00005709 .Case("cortex-a73", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005710 .Case("cyclone", true)
5711 .Case("kryo", true)
5712 .Default(false);
5713 return CPUKnown;
Tim Northovera2ee4332014-03-29 15:09:45 +00005714 }
5715
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005716 void getTargetDefines(const LangOptions &Opts,
5717 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005718 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005719 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005720
5721 // Target properties.
5722 Builder.defineMacro("_LP64");
5723 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005724
5725 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5726 Builder.defineMacro("__ARM_ACLE", "200");
5727 Builder.defineMacro("__ARM_ARCH", "8");
5728 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5729
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005730 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005731 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005732 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005733
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005734 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5735 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5736 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5737 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005738 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005739 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5740 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005741
5742 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5743
5744 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005745 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005746
5747 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5748 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005749 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5750 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005751
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005752 if (Opts.UnsafeFPMath)
5753 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005754
5755 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5756
5757 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5758 Opts.ShortEnums ? "1" : "4");
5759
James Molloy75f5f9e2014-04-16 15:33:48 +00005760 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005761 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005762 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005763 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005764 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005765
Bradley Smith418c5932014-05-02 15:17:51 +00005766 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005767 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005768
James Molloy75f5f9e2014-04-16 15:33:48 +00005769 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005770 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5771
5772 if (Unaligned)
5773 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005774
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005775 if (V8_1A)
5776 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5777
Reid Klecknerd167d422015-05-06 15:31:46 +00005778 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5779 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5780 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5781 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5782 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005783 }
5784
Craig Topper6c03a542015-10-19 04:51:35 +00005785 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5786 return llvm::makeArrayRef(BuiltinInfo,
5787 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005788 }
5789
David Blaikie1cbb9712014-11-14 19:09:44 +00005790 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005791 return Feature == "aarch64" ||
5792 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005793 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005794 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005795 }
5796
James Molloy5e73df52014-04-16 15:06:20 +00005797 bool handleTargetFeatures(std::vector<std::string> &Features,
5798 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005799 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005800 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005801 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005802 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005803 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005804
Eric Christopher610fe112015-08-26 08:21:55 +00005805 for (const auto &Feature : Features) {
5806 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005807 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005808 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005809 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005810 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005811 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005812 if (Feature == "+strict-align")
5813 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005814 if (Feature == "+v8.1a")
5815 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005816 }
5817
James Y Knightb214cbc2016-03-04 19:00:41 +00005818 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005819
5820 return true;
5821 }
5822
John McCall477f2bb2016-03-03 06:39:32 +00005823 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5824 switch (CC) {
5825 case CC_C:
5826 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005827 case CC_PreserveMost:
5828 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005829 return CCCR_OK;
5830 default:
5831 return CCCR_Warning;
5832 }
5833 }
5834
David Blaikie1cbb9712014-11-14 19:09:44 +00005835 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005836
David Blaikie1cbb9712014-11-14 19:09:44 +00005837 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005838 return TargetInfo::AArch64ABIBuiltinVaList;
5839 }
5840
Craig Topperf054e3a2015-10-19 03:52:27 +00005841 ArrayRef<const char *> getGCCRegNames() const override;
5842 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005843
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005844 bool validateAsmConstraint(const char *&Name,
5845 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005846 switch (*Name) {
5847 default:
5848 return false;
5849 case 'w': // Floating point and SIMD registers (V0-V31)
5850 Info.setAllowsRegister();
5851 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005852 case 'I': // Constant that can be used with an ADD instruction
5853 case 'J': // Constant that can be used with a SUB instruction
5854 case 'K': // Constant that can be used with a 32-bit logical instruction
5855 case 'L': // Constant that can be used with a 64-bit logical instruction
5856 case 'M': // Constant that can be used as a 32-bit MOV immediate
5857 case 'N': // Constant that can be used as a 64-bit MOV immediate
5858 case 'Y': // Floating point constant zero
5859 case 'Z': // Integer constant zero
5860 return true;
5861 case 'Q': // A memory reference with base register and no offset
5862 Info.setAllowsMemory();
5863 return true;
5864 case 'S': // A symbolic address
5865 Info.setAllowsRegister();
5866 return true;
5867 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005868 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5869 // Utf: A memory address suitable for ldp/stp in TF mode.
5870 // Usa: An absolute symbolic address.
5871 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5872 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005873 case 'z': // Zero register, wzr or xzr
5874 Info.setAllowsRegister();
5875 return true;
5876 case 'x': // Floating point and SIMD registers (V0-V15)
5877 Info.setAllowsRegister();
5878 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005879 }
5880 return false;
5881 }
5882
Akira Hatanaka987f1862014-08-22 06:05:21 +00005883 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005884 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005885 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005886 // Strip off constraint modifiers.
5887 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5888 Constraint = Constraint.substr(1);
5889
5890 switch (Constraint[0]) {
5891 default:
5892 return true;
5893 case 'z':
5894 case 'r': {
5895 switch (Modifier) {
5896 case 'x':
5897 case 'w':
5898 // For now assume that the person knows what they're
5899 // doing with the modifier.
5900 return true;
5901 default:
5902 // By default an 'r' constraint will be in the 'x'
5903 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005904 if (Size == 64)
5905 return true;
5906
5907 SuggestedModifier = "w";
5908 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005909 }
5910 }
5911 }
5912 }
5913
David Blaikie1cbb9712014-11-14 19:09:44 +00005914 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005915
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005916 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005917 if (RegNo == 0)
5918 return 0;
5919 if (RegNo == 1)
5920 return 1;
5921 return -1;
5922 }
5923};
5924
Tim Northover573cbee2014-05-24 12:52:07 +00005925const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005926 // 32-bit Integer registers
5927 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5928 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5929 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5930
5931 // 64-bit Integer registers
5932 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5933 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5934 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5935
5936 // 32-bit floating point regsisters
5937 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5938 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5939 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5940
5941 // 64-bit floating point regsisters
5942 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5943 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5944 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5945
5946 // Vector registers
5947 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5948 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5949 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5950};
5951
Craig Topperf054e3a2015-10-19 03:52:27 +00005952ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5953 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005954}
5955
Tim Northover573cbee2014-05-24 12:52:07 +00005956const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005957 { { "w31" }, "wsp" },
5958 { { "x29" }, "fp" },
5959 { { "x30" }, "lr" },
5960 { { "x31" }, "sp" },
5961 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5962 // don't want to substitute one of these for a different-sized one.
5963};
5964
Craig Topperf054e3a2015-10-19 03:52:27 +00005965ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5966 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005967}
5968
Tim Northover573cbee2014-05-24 12:52:07 +00005969const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005970#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005971 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005972#include "clang/Basic/BuiltinsNEON.def"
5973
5974#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005975 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005976#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005977};
James Molloy5e73df52014-04-16 15:06:20 +00005978
Tim Northover573cbee2014-05-24 12:52:07 +00005979class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005980 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005981 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005982 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005983 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005984 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005985 }
5986
5987public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005988 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5989 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00005990 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005991 }
James Molloy5e73df52014-04-16 15:06:20 +00005992 void getTargetDefines(const LangOptions &Opts,
5993 MacroBuilder &Builder) const override {
5994 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005995 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005996 }
5997};
5998
Tim Northover573cbee2014-05-24 12:52:07 +00005999class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006000 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006001 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00006002 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006003 }
6004
6005public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006006 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6007 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006008 void getTargetDefines(const LangOptions &Opts,
6009 MacroBuilder &Builder) const override {
6010 Builder.defineMacro("__AARCH64EB__");
6011 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6012 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006013 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006014 }
6015};
Tim Northovera2ee4332014-03-29 15:09:45 +00006016
Tim Northover573cbee2014-05-24 12:52:07 +00006017class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006018protected:
6019 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6020 MacroBuilder &Builder) const override {
6021 Builder.defineMacro("__AARCH64_SIMD__");
6022 Builder.defineMacro("__ARM64_ARCH_8__");
6023 Builder.defineMacro("__ARM_NEON__");
6024 Builder.defineMacro("__LITTLE_ENDIAN__");
6025 Builder.defineMacro("__REGISTER_PREFIX__", "");
6026 Builder.defineMacro("__arm64", "1");
6027 Builder.defineMacro("__arm64__", "1");
6028
6029 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6030 }
6031
Tim Northovera2ee4332014-03-29 15:09:45 +00006032public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006033 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6034 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006035 Int64Type = SignedLongLong;
6036 WCharType = SignedInt;
6037 UseSignedCharForObjCBool = false;
6038
Tim Northovera6a19f12015-02-06 01:25:07 +00006039 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006040 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6041
6042 TheCXXABI.set(TargetCXXABI::iOS64);
6043 }
6044
David Blaikie1cbb9712014-11-14 19:09:44 +00006045 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006046 return TargetInfo::CharPtrBuiltinVaList;
6047 }
6048};
Tim Northovera2ee4332014-03-29 15:09:45 +00006049
Tony Linthicum76329bf2011-12-12 21:14:55 +00006050// Hexagon abstract base class
6051class HexagonTargetInfo : public TargetInfo {
6052 static const Builtin::Info BuiltinInfo[];
6053 static const char * const GCCRegNames[];
6054 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6055 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006056 bool HasHVX, HasHVXDouble;
6057
Tony Linthicum76329bf2011-12-12 21:14:55 +00006058public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006059 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6060 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006061 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006062 // Specify the vector alignment explicitly. For v512x1, the calculated
6063 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6064 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006065 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006066 "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 +00006067 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006068 SizeType = UnsignedInt;
6069 PtrDiffType = SignedInt;
6070 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006071
6072 // {} in inline assembly are packet specifiers, not assembly variant
6073 // specifiers.
6074 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006075
6076 LargeArrayMinWidth = 64;
6077 LargeArrayAlign = 64;
6078 UseBitFieldTypeAlignment = true;
6079 ZeroLengthBitfieldBoundary = 32;
6080 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006081 }
6082
Craig Topper6c03a542015-10-19 04:51:35 +00006083 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6084 return llvm::makeArrayRef(BuiltinInfo,
6085 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006086 }
6087
Craig Topper3164f332014-03-11 03:39:26 +00006088 bool validateAsmConstraint(const char *&Name,
6089 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006090 switch (*Name) {
6091 case 'v':
6092 case 'q':
6093 if (HasHVX) {
6094 Info.setAllowsRegister();
6095 return true;
6096 }
6097 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006098 case 's':
6099 // Relocatable constant.
6100 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006101 }
6102 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006103 }
6104
Craig Topper3164f332014-03-11 03:39:26 +00006105 void getTargetDefines(const LangOptions &Opts,
6106 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006107
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006108 bool isCLZForZeroUndef() const override { return false; }
6109
Craig Topper3164f332014-03-11 03:39:26 +00006110 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006111 return llvm::StringSwitch<bool>(Feature)
6112 .Case("hexagon", true)
6113 .Case("hvx", HasHVX)
6114 .Case("hvx-double", HasHVXDouble)
6115 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006116 }
Craig Topper3164f332014-03-11 03:39:26 +00006117
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006118 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6119 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6120 const override;
6121
6122 bool handleTargetFeatures(std::vector<std::string> &Features,
6123 DiagnosticsEngine &Diags) override;
6124
Craig Topper3164f332014-03-11 03:39:26 +00006125 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006126 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006127 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006128 ArrayRef<const char *> getGCCRegNames() const override;
6129 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006130 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006131 return "";
6132 }
Sebastian Pop86500282012-01-13 20:37:10 +00006133
6134 static const char *getHexagonCPUSuffix(StringRef Name) {
6135 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006136 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006137 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006138 .Case("hexagonv55", "55")
6139 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006140 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006141 }
6142
Craig Topper3164f332014-03-11 03:39:26 +00006143 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006144 if (!getHexagonCPUSuffix(Name))
6145 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006146 CPU = Name;
6147 return true;
6148 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006149
6150 int getEHDataRegisterNumber(unsigned RegNo) const override {
6151 return RegNo < 2 ? RegNo : -1;
6152 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006153};
6154
6155void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006156 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006157 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006158 Builder.defineMacro("__hexagon__", "1");
6159
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006160 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006161 Builder.defineMacro("__HEXAGON_V4__");
6162 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006163 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006164 Builder.defineMacro("__QDSP6_V4__");
6165 Builder.defineMacro("__QDSP6_ARCH__", "4");
6166 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006167 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006168 Builder.defineMacro("__HEXAGON_V5__");
6169 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6170 if(Opts.HexagonQdsp6Compat) {
6171 Builder.defineMacro("__QDSP6_V5__");
6172 Builder.defineMacro("__QDSP6_ARCH__", "5");
6173 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006174 } else if (CPU == "hexagonv55") {
6175 Builder.defineMacro("__HEXAGON_V55__");
6176 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6177 Builder.defineMacro("__QDSP6_V55__");
6178 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006179 } else if (CPU == "hexagonv60") {
6180 Builder.defineMacro("__HEXAGON_V60__");
6181 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6182 Builder.defineMacro("__QDSP6_V60__");
6183 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006184 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006185
6186 if (hasFeature("hvx")) {
6187 Builder.defineMacro("__HVX__");
6188 if (hasFeature("hvx-double"))
6189 Builder.defineMacro("__HVXDBL__");
6190 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006191}
6192
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006193bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6194 DiagnosticsEngine &Diags) {
6195 for (auto &F : Features) {
6196 if (F == "+hvx")
6197 HasHVX = true;
6198 else if (F == "-hvx")
6199 HasHVX = HasHVXDouble = false;
6200 else if (F == "+hvx-double")
6201 HasHVX = HasHVXDouble = true;
6202 else if (F == "-hvx-double")
6203 HasHVXDouble = false;
6204 }
6205 return true;
6206}
6207
6208bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6209 DiagnosticsEngine &Diags, StringRef CPU,
6210 const std::vector<std::string> &FeaturesVec) const {
6211 // Default for v60: -hvx, -hvx-double.
6212 Features["hvx"] = false;
6213 Features["hvx-double"] = false;
6214
6215 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6216}
6217
6218
6219const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006220 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6221 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6222 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6223 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6224 "p0", "p1", "p2", "p3",
6225 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6226};
6227
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006228ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006229 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006230}
6231
Tony Linthicum76329bf2011-12-12 21:14:55 +00006232const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6233 { { "sp" }, "r29" },
6234 { { "fp" }, "r30" },
6235 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006236};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006237
Craig Topperf054e3a2015-10-19 03:52:27 +00006238ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6239 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006240}
6241
6242
6243const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006244#define BUILTIN(ID, TYPE, ATTRS) \
6245 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6246#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6247 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006248#include "clang/Basic/BuiltinsHexagon.def"
6249};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006250
Jacques Pienaard964cc22016-03-28 21:02:54 +00006251class LanaiTargetInfo : public TargetInfo {
6252 // Class for Lanai (32-bit).
6253 // The CPU profiles supported by the Lanai backend
6254 enum CPUKind {
6255 CK_NONE,
6256 CK_V11,
6257 } CPU;
6258
6259 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6260 static const char *const GCCRegNames[];
6261
6262public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006263 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6264 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006265 // Description string has to be kept in sync with backend.
6266 resetDataLayout("E" // Big endian
6267 "-m:e" // ELF name manging
6268 "-p:32:32" // 32 bit pointers, 32 bit aligned
6269 "-i64:64" // 64 bit integers, 64 bit aligned
6270 "-a:0:32" // 32 bit alignment of objects of aggregate type
6271 "-n32" // 32 bit native integer width
6272 "-S64" // 64 bit natural stack alignment
6273 );
6274
6275 // Setting RegParmMax equal to what mregparm was set to in the old
6276 // toolchain
6277 RegParmMax = 4;
6278
6279 // Set the default CPU to V11
6280 CPU = CK_V11;
6281
6282 // Temporary approach to make everything at least word-aligned and allow for
6283 // safely casting between pointers with different alignment requirements.
6284 // TODO: Remove this when there are no more cast align warnings on the
6285 // firmware.
6286 MinGlobalAlign = 32;
6287 }
6288
6289 void getTargetDefines(const LangOptions &Opts,
6290 MacroBuilder &Builder) const override {
6291 // Define __lanai__ when building for target lanai.
6292 Builder.defineMacro("__lanai__");
6293
6294 // Set define for the CPU specified.
6295 switch (CPU) {
6296 case CK_V11:
6297 Builder.defineMacro("__LANAI_V11__");
6298 break;
6299 case CK_NONE:
6300 llvm_unreachable("Unhandled target CPU");
6301 }
6302 }
6303
6304 bool setCPU(const std::string &Name) override {
6305 CPU = llvm::StringSwitch<CPUKind>(Name)
6306 .Case("v11", CK_V11)
6307 .Default(CK_NONE);
6308
6309 return CPU != CK_NONE;
6310 }
6311
6312 bool hasFeature(StringRef Feature) const override {
6313 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6314 }
6315
6316 ArrayRef<const char *> getGCCRegNames() const override;
6317
6318 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6319
6320 BuiltinVaListKind getBuiltinVaListKind() const override {
6321 return TargetInfo::VoidPtrBuiltinVaList;
6322 }
6323
6324 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6325
6326 bool validateAsmConstraint(const char *&Name,
6327 TargetInfo::ConstraintInfo &info) const override {
6328 return false;
6329 }
6330
6331 const char *getClobbers() const override { return ""; }
6332};
6333
6334const char *const LanaiTargetInfo::GCCRegNames[] = {
6335 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6336 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6337 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6338
6339ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6340 return llvm::makeArrayRef(GCCRegNames);
6341}
6342
6343const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6344 {{"pc"}, "r2"},
6345 {{"sp"}, "r4"},
6346 {{"fp"}, "r5"},
6347 {{"rv"}, "r8"},
6348 {{"rr1"}, "r10"},
6349 {{"rr2"}, "r11"},
6350 {{"rca"}, "r15"},
6351};
6352
6353ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6354 return llvm::makeArrayRef(GCCRegAliases);
6355}
6356
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006357// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6358class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006359 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6360 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006361 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006362public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006363 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006364 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006365
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006366 int getEHDataRegisterNumber(unsigned RegNo) const override {
6367 if (RegNo == 0) return 24;
6368 if (RegNo == 1) return 25;
6369 return -1;
6370 }
6371
Craig Topper3164f332014-03-11 03:39:26 +00006372 bool handleTargetFeatures(std::vector<std::string> &Features,
6373 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006374 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006375 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6376 if (Feature != Features.end()) {
6377 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006378 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006379 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006380 }
Craig Topper3164f332014-03-11 03:39:26 +00006381 void getTargetDefines(const LangOptions &Opts,
6382 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006383 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006384 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006385
6386 if (SoftFloat)
6387 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006388 }
Craig Topper3164f332014-03-11 03:39:26 +00006389
6390 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006391 return llvm::StringSwitch<bool>(Feature)
6392 .Case("softfloat", SoftFloat)
6393 .Case("sparc", true)
6394 .Default(false);
6395 }
Craig Topper3164f332014-03-11 03:39:26 +00006396
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006397 bool hasSjLjLowering() const override {
6398 return true;
6399 }
6400
Craig Topper6c03a542015-10-19 04:51:35 +00006401 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006402 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006403 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006404 }
Craig Topper3164f332014-03-11 03:39:26 +00006405 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006406 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006407 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006408 ArrayRef<const char *> getGCCRegNames() const override;
6409 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006410 bool validateAsmConstraint(const char *&Name,
6411 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006412 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006413 switch (*Name) {
6414 case 'I': // Signed 13-bit constant
6415 case 'J': // Zero
6416 case 'K': // 32-bit constant with the low 12 bits clear
6417 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6418 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6419 case 'N': // Same as 'K' but zext (required for SIMode)
6420 case 'O': // The constant 4096
6421 return true;
6422 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006423 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006424 }
Craig Topper3164f332014-03-11 03:39:26 +00006425 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006426 // FIXME: Implement!
6427 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006428 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006429
6430 // No Sparc V7 for now, the backend doesn't support it anyway.
6431 enum CPUKind {
6432 CK_GENERIC,
6433 CK_V8,
6434 CK_SUPERSPARC,
6435 CK_SPARCLITE,
6436 CK_F934,
6437 CK_HYPERSPARC,
6438 CK_SPARCLITE86X,
6439 CK_SPARCLET,
6440 CK_TSC701,
6441 CK_V9,
6442 CK_ULTRASPARC,
6443 CK_ULTRASPARC3,
6444 CK_NIAGARA,
6445 CK_NIAGARA2,
6446 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006447 CK_NIAGARA4,
6448 CK_MYRIAD2_1,
6449 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006450 } CPU = CK_GENERIC;
6451
6452 enum CPUGeneration {
6453 CG_V8,
6454 CG_V9,
6455 };
6456
6457 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6458 switch (Kind) {
6459 case CK_GENERIC:
6460 case CK_V8:
6461 case CK_SUPERSPARC:
6462 case CK_SPARCLITE:
6463 case CK_F934:
6464 case CK_HYPERSPARC:
6465 case CK_SPARCLITE86X:
6466 case CK_SPARCLET:
6467 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006468 case CK_MYRIAD2_1:
6469 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006470 return CG_V8;
6471 case CK_V9:
6472 case CK_ULTRASPARC:
6473 case CK_ULTRASPARC3:
6474 case CK_NIAGARA:
6475 case CK_NIAGARA2:
6476 case CK_NIAGARA3:
6477 case CK_NIAGARA4:
6478 return CG_V9;
6479 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006480 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006481 }
6482
6483 CPUKind getCPUKind(StringRef Name) const {
6484 return llvm::StringSwitch<CPUKind>(Name)
6485 .Case("v8", CK_V8)
6486 .Case("supersparc", CK_SUPERSPARC)
6487 .Case("sparclite", CK_SPARCLITE)
6488 .Case("f934", CK_F934)
6489 .Case("hypersparc", CK_HYPERSPARC)
6490 .Case("sparclite86x", CK_SPARCLITE86X)
6491 .Case("sparclet", CK_SPARCLET)
6492 .Case("tsc701", CK_TSC701)
6493 .Case("v9", CK_V9)
6494 .Case("ultrasparc", CK_ULTRASPARC)
6495 .Case("ultrasparc3", CK_ULTRASPARC3)
6496 .Case("niagara", CK_NIAGARA)
6497 .Case("niagara2", CK_NIAGARA2)
6498 .Case("niagara3", CK_NIAGARA3)
6499 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006500 .Case("myriad2", CK_MYRIAD2_1)
6501 .Case("myriad2.1", CK_MYRIAD2_1)
6502 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006503 .Default(CK_GENERIC);
6504 }
6505
6506 bool setCPU(const std::string &Name) override {
6507 CPU = getCPUKind(Name);
6508 return CPU != CK_GENERIC;
6509 }
Gabor Greif49991682008-02-21 16:29:08 +00006510};
6511
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006512const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006513 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6514 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6515 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6516 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6517};
6518
Craig Topperf054e3a2015-10-19 03:52:27 +00006519ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6520 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006521}
6522
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006523const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006524 { { "g0" }, "r0" },
6525 { { "g1" }, "r1" },
6526 { { "g2" }, "r2" },
6527 { { "g3" }, "r3" },
6528 { { "g4" }, "r4" },
6529 { { "g5" }, "r5" },
6530 { { "g6" }, "r6" },
6531 { { "g7" }, "r7" },
6532 { { "o0" }, "r8" },
6533 { { "o1" }, "r9" },
6534 { { "o2" }, "r10" },
6535 { { "o3" }, "r11" },
6536 { { "o4" }, "r12" },
6537 { { "o5" }, "r13" },
6538 { { "o6", "sp" }, "r14" },
6539 { { "o7" }, "r15" },
6540 { { "l0" }, "r16" },
6541 { { "l1" }, "r17" },
6542 { { "l2" }, "r18" },
6543 { { "l3" }, "r19" },
6544 { { "l4" }, "r20" },
6545 { { "l5" }, "r21" },
6546 { { "l6" }, "r22" },
6547 { { "l7" }, "r23" },
6548 { { "i0" }, "r24" },
6549 { { "i1" }, "r25" },
6550 { { "i2" }, "r26" },
6551 { { "i3" }, "r27" },
6552 { { "i4" }, "r28" },
6553 { { "i5" }, "r29" },
6554 { { "i6", "fp" }, "r30" },
6555 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006556};
6557
Craig Topperf054e3a2015-10-19 03:52:27 +00006558ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6559 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006560}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006561
6562// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6563class SparcV8TargetInfo : public SparcTargetInfo {
6564public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006565 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6566 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006567 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006568 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6569 switch (getTriple().getOS()) {
6570 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006571 SizeType = UnsignedInt;
6572 IntPtrType = SignedInt;
6573 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006574 break;
6575 case llvm::Triple::NetBSD:
6576 case llvm::Triple::OpenBSD:
6577 SizeType = UnsignedLong;
6578 IntPtrType = SignedLong;
6579 PtrDiffType = SignedLong;
6580 break;
Brad Smith56495d52015-08-13 22:00:53 +00006581 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006582 }
6583
Craig Topper3164f332014-03-11 03:39:26 +00006584 void getTargetDefines(const LangOptions &Opts,
6585 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006586 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006587 switch (getCPUGeneration(CPU)) {
6588 case CG_V8:
6589 Builder.defineMacro("__sparcv8");
6590 if (getTriple().getOS() != llvm::Triple::Solaris)
6591 Builder.defineMacro("__sparcv8__");
6592 break;
6593 case CG_V9:
6594 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006595 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006596 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006597 Builder.defineMacro("__sparc_v9__");
6598 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006599 break;
6600 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006601 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6602 switch (CPU) {
6603 case CK_MYRIAD2_1:
6604 Builder.defineMacro("__myriad2", "1");
6605 Builder.defineMacro("__myriad2__", "1");
6606 break;
6607 case CK_MYRIAD2_2:
6608 Builder.defineMacro("__myriad2", "2");
6609 Builder.defineMacro("__myriad2__", "2");
6610 break;
6611 default:
6612 break;
6613 }
6614 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006615 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006616
6617 bool hasSjLjLowering() const override {
6618 return true;
6619 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006620};
6621
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006622// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6623class SparcV8elTargetInfo : public SparcV8TargetInfo {
6624 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006625 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6626 : SparcV8TargetInfo(Triple, Opts) {
6627 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6628 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006629 }
6630};
6631
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006632// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6633class SparcV9TargetInfo : public SparcTargetInfo {
6634public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006635 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6636 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006637 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006638 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006639 // This is an LP64 platform.
6640 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006641
6642 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006643 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006644 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006645 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006646 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006647 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006648
6649 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6650 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6651 LongDoubleWidth = 128;
6652 LongDoubleAlign = 128;
6653 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006654 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006655 }
6656
Craig Topper3164f332014-03-11 03:39:26 +00006657 void getTargetDefines(const LangOptions &Opts,
6658 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006659 SparcTargetInfo::getTargetDefines(Opts, Builder);
6660 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006661 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006662 // Solaris doesn't need these variants, but the BSDs do.
6663 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006664 Builder.defineMacro("__sparc64__");
6665 Builder.defineMacro("__sparc_v9__");
6666 Builder.defineMacro("__sparcv9__");
6667 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006668 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006669
Craig Topper3164f332014-03-11 03:39:26 +00006670 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006671 if (!SparcTargetInfo::setCPU(Name))
6672 return false;
6673 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006674 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006675};
6676
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006677class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006678 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006679 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006680 std::string CPU;
6681 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006682 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006683
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006684public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006685 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006686 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6687 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006688 IntMaxType = SignedLong;
6689 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006690 TLSSupported = true;
6691 IntWidth = IntAlign = 32;
6692 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6693 PointerWidth = PointerAlign = 64;
6694 LongDoubleWidth = 128;
6695 LongDoubleAlign = 64;
6696 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006697 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006698 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006699 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 +00006700 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6701 }
6702 void getTargetDefines(const LangOptions &Opts,
6703 MacroBuilder &Builder) const override {
6704 Builder.defineMacro("__s390__");
6705 Builder.defineMacro("__s390x__");
6706 Builder.defineMacro("__zarch__");
6707 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006708
6709 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6710 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6711 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6712 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6713
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006714 if (HasTransactionalExecution)
6715 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006716 if (Opts.ZVector)
6717 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006718 }
Craig Topper6c03a542015-10-19 04:51:35 +00006719 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6720 return llvm::makeArrayRef(BuiltinInfo,
6721 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006722 }
6723
Craig Topperf054e3a2015-10-19 03:52:27 +00006724 ArrayRef<const char *> getGCCRegNames() const override;
6725 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006726 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006727 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006728 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006729 bool validateAsmConstraint(const char *&Name,
6730 TargetInfo::ConstraintInfo &info) const override;
6731 const char *getClobbers() const override {
6732 // FIXME: Is this really right?
6733 return "";
6734 }
6735 BuiltinVaListKind getBuiltinVaListKind() const override {
6736 return TargetInfo::SystemZBuiltinVaList;
6737 }
6738 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006739 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006740 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6741 .Case("z10", true)
6742 .Case("z196", true)
6743 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006744 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006745 .Default(false);
6746
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006747 return CPUKnown;
6748 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006749 bool
6750 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6751 StringRef CPU,
6752 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006753 if (CPU == "zEC12")
6754 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006755 if (CPU == "z13") {
6756 Features["transactional-execution"] = true;
6757 Features["vector"] = true;
6758 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006759 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006760 }
6761
6762 bool handleTargetFeatures(std::vector<std::string> &Features,
6763 DiagnosticsEngine &Diags) override {
6764 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006765 for (const auto &Feature : Features) {
6766 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006767 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006768 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006769 HasVector = true;
6770 }
6771 // If we use the vector ABI, vector types are 64-bit aligned.
6772 if (HasVector) {
6773 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006774 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6775 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006776 }
6777 return true;
6778 }
6779
6780 bool hasFeature(StringRef Feature) const override {
6781 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006782 .Case("systemz", true)
6783 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006784 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006785 .Default(false);
6786 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006787
Bryan Chane3f1ed52016-04-28 13:56:43 +00006788 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6789 switch (CC) {
6790 case CC_C:
6791 case CC_Swift:
6792 return CCCR_OK;
6793 default:
6794 return CCCR_Warning;
6795 }
6796 }
6797
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006798 StringRef getABI() const override {
6799 if (HasVector)
6800 return "vector";
6801 return "";
6802 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006803
6804 bool useFloat128ManglingForLongDouble() const override {
6805 return true;
6806 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006807};
6808
6809const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6810#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006811 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006812#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6813 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006814#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006815};
6816
6817const char *const SystemZTargetInfo::GCCRegNames[] = {
6818 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6819 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6820 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6821 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6822};
6823
Craig Topperf054e3a2015-10-19 03:52:27 +00006824ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6825 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006826}
6827
6828bool SystemZTargetInfo::
6829validateAsmConstraint(const char *&Name,
6830 TargetInfo::ConstraintInfo &Info) const {
6831 switch (*Name) {
6832 default:
6833 return false;
6834
6835 case 'a': // Address register
6836 case 'd': // Data register (equivalent to 'r')
6837 case 'f': // Floating-point register
6838 Info.setAllowsRegister();
6839 return true;
6840
6841 case 'I': // Unsigned 8-bit constant
6842 case 'J': // Unsigned 12-bit constant
6843 case 'K': // Signed 16-bit constant
6844 case 'L': // Signed 20-bit displacement (on all targets we support)
6845 case 'M': // 0x7fffffff
6846 return true;
6847
6848 case 'Q': // Memory with base and unsigned 12-bit displacement
6849 case 'R': // Likewise, plus an index
6850 case 'S': // Memory with base and signed 20-bit displacement
6851 case 'T': // Likewise, plus an index
6852 Info.setAllowsMemory();
6853 return true;
6854 }
6855}
Ulrich Weigand47445072013-05-06 16:26:41 +00006856
Eric Christopherc48497a2015-09-18 21:26:24 +00006857class MSP430TargetInfo : public TargetInfo {
6858 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006859
Eric Christopherc48497a2015-09-18 21:26:24 +00006860public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006861 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6862 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006863 BigEndian = false;
6864 TLSSupported = false;
6865 IntWidth = 16;
6866 IntAlign = 16;
6867 LongWidth = 32;
6868 LongLongWidth = 64;
6869 LongAlign = LongLongAlign = 16;
6870 PointerWidth = 16;
6871 PointerAlign = 16;
6872 SuitableAlign = 16;
6873 SizeType = UnsignedInt;
6874 IntMaxType = SignedLongLong;
6875 IntPtrType = SignedInt;
6876 PtrDiffType = SignedInt;
6877 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006878 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006879 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006880 void getTargetDefines(const LangOptions &Opts,
6881 MacroBuilder &Builder) const override {
6882 Builder.defineMacro("MSP430");
6883 Builder.defineMacro("__MSP430__");
6884 // FIXME: defines for different 'flavours' of MCU
6885 }
Craig Topper6c03a542015-10-19 04:51:35 +00006886 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006887 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006888 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006889 }
6890 bool hasFeature(StringRef Feature) const override {
6891 return Feature == "msp430";
6892 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006893 ArrayRef<const char *> getGCCRegNames() const override;
6894 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006895 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006896 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006897 }
6898 bool validateAsmConstraint(const char *&Name,
6899 TargetInfo::ConstraintInfo &info) const override {
6900 // FIXME: implement
6901 switch (*Name) {
6902 case 'K': // the constant 1
6903 case 'L': // constant -1^20 .. 1^19
6904 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006905 return true;
6906 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006907 // No target constraints for now.
6908 return false;
6909 }
6910 const char *getClobbers() const override {
6911 // FIXME: Is this really right?
6912 return "";
6913 }
6914 BuiltinVaListKind getBuiltinVaListKind() const override {
6915 // FIXME: implement
6916 return TargetInfo::CharPtrBuiltinVaList;
6917 }
6918};
6919
6920const char *const MSP430TargetInfo::GCCRegNames[] = {
6921 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6922 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6923
Craig Topperf054e3a2015-10-19 03:52:27 +00006924ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6925 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006926}
6927
6928// LLVM and Clang cannot be used directly to output native binaries for
6929// target, but is used to compile C code to llvm bitcode with correct
6930// type and alignment information.
6931//
6932// TCE uses the llvm bitcode as input and uses it for generating customized
6933// target processor and program binary. TCE co-design environment is
6934// publicly available in http://tce.cs.tut.fi
6935
6936static const unsigned TCEOpenCLAddrSpaceMap[] = {
6937 3, // opencl_global
6938 4, // opencl_local
6939 5, // opencl_constant
6940 // FIXME: generic has to be added to the target
6941 0, // opencl_generic
6942 0, // cuda_device
6943 0, // cuda_constant
6944 0 // cuda_shared
6945};
6946
6947class TCETargetInfo : public TargetInfo {
6948public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006949 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6950 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006951 TLSSupported = false;
6952 IntWidth = 32;
6953 LongWidth = LongLongWidth = 32;
6954 PointerWidth = 32;
6955 IntAlign = 32;
6956 LongAlign = LongLongAlign = 32;
6957 PointerAlign = 32;
6958 SuitableAlign = 32;
6959 SizeType = UnsignedInt;
6960 IntMaxType = SignedLong;
6961 IntPtrType = SignedInt;
6962 PtrDiffType = SignedInt;
6963 FloatWidth = 32;
6964 FloatAlign = 32;
6965 DoubleWidth = 32;
6966 DoubleAlign = 32;
6967 LongDoubleWidth = 32;
6968 LongDoubleAlign = 32;
6969 FloatFormat = &llvm::APFloat::IEEEsingle;
6970 DoubleFormat = &llvm::APFloat::IEEEsingle;
6971 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006972 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6973 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006974 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6975 UseAddrSpaceMapMangling = true;
6976 }
6977
6978 void getTargetDefines(const LangOptions &Opts,
6979 MacroBuilder &Builder) const override {
6980 DefineStd(Builder, "tce", Opts);
6981 Builder.defineMacro("__TCE__");
6982 Builder.defineMacro("__TCE_V1__");
6983 }
6984 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6985
Craig Topper6c03a542015-10-19 04:51:35 +00006986 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006987 const char *getClobbers() const override { return ""; }
6988 BuiltinVaListKind getBuiltinVaListKind() const override {
6989 return TargetInfo::VoidPtrBuiltinVaList;
6990 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006991 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006992 bool validateAsmConstraint(const char *&Name,
6993 TargetInfo::ConstraintInfo &info) const override {
6994 return true;
6995 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6997 return None;
6998 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006999};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007000
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007001class BPFTargetInfo : public TargetInfo {
7002public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007003 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7004 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007005 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7006 SizeType = UnsignedLong;
7007 PtrDiffType = SignedLong;
7008 IntPtrType = SignedLong;
7009 IntMaxType = SignedLong;
7010 Int64Type = SignedLong;
7011 RegParmMax = 5;
7012 if (Triple.getArch() == llvm::Triple::bpfeb) {
7013 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007014 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007015 } else {
7016 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007017 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007018 }
7019 MaxAtomicPromoteWidth = 64;
7020 MaxAtomicInlineWidth = 64;
7021 TLSSupported = false;
7022 }
7023 void getTargetDefines(const LangOptions &Opts,
7024 MacroBuilder &Builder) const override {
7025 DefineStd(Builder, "bpf", Opts);
7026 Builder.defineMacro("__BPF__");
7027 }
7028 bool hasFeature(StringRef Feature) const override {
7029 return Feature == "bpf";
7030 }
7031
Craig Topper6c03a542015-10-19 04:51:35 +00007032 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007033 const char *getClobbers() const override {
7034 return "";
7035 }
7036 BuiltinVaListKind getBuiltinVaListKind() const override {
7037 return TargetInfo::VoidPtrBuiltinVaList;
7038 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007039 ArrayRef<const char *> getGCCRegNames() const override {
7040 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007041 }
7042 bool validateAsmConstraint(const char *&Name,
7043 TargetInfo::ConstraintInfo &info) const override {
7044 return true;
7045 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007046 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7047 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007048 }
7049};
7050
Daniel Sanders4672af62016-05-27 11:51:02 +00007051class MipsTargetInfo : public TargetInfo {
7052 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007053 StringRef Layout;
7054
7055 if (ABI == "o32")
7056 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7057 else if (ABI == "n32")
7058 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7059 else if (ABI == "n64")
7060 Layout = "m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7061 else
7062 llvm_unreachable("Invalid ABI");
7063
7064 if (BigEndian)
7065 resetDataLayout(("E-" + Layout).str());
7066 else
7067 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007068 }
7069
Akira Hatanaka9064e362013-10-29 18:30:33 +00007070
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007071 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007072 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007073 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007074 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007075 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007076 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007077 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007078 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007079 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007080 enum DspRevEnum {
7081 NoDSP, DSP1, DSP2
7082 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007083 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007084
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007085protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007086 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007087 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007088
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007089public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007090 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007091 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7092 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7093 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007094 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007095 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7096 getTriple().getArch() == llvm::Triple::mips64;
7097
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007098 setABI((getTriple().getArch() == llvm::Triple::mips ||
7099 getTriple().getArch() == llvm::Triple::mipsel)
7100 ? "o32"
7101 : "n64");
7102
7103 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007104 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007105
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007106 bool isNaN2008Default() const {
7107 return CPU == "mips32r6" || CPU == "mips64r6";
7108 }
7109
7110 bool isFP64Default() const {
7111 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7112 }
7113
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007114 bool isNan2008() const override {
7115 return IsNan2008;
7116 }
7117
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007118 bool processorSupportsGPR64() const {
7119 return llvm::StringSwitch<bool>(CPU)
7120 .Case("mips3", true)
7121 .Case("mips4", true)
7122 .Case("mips5", true)
7123 .Case("mips64", true)
7124 .Case("mips64r2", true)
7125 .Case("mips64r3", true)
7126 .Case("mips64r5", true)
7127 .Case("mips64r6", true)
7128 .Case("octeon", true)
7129 .Default(false);
7130 return false;
7131 }
7132
Alp Toker4925ba72014-06-07 23:30:42 +00007133 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007134 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007135 if (Name == "o32") {
7136 setO32ABITypes();
7137 ABI = Name;
7138 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007139 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007140
7141 if (Name == "n32") {
7142 setN32ABITypes();
7143 ABI = Name;
7144 return true;
7145 }
7146 if (Name == "n64") {
7147 setN64ABITypes();
7148 ABI = Name;
7149 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007150 }
7151 return false;
7152 }
7153
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007154 void setO32ABITypes() {
7155 Int64Type = SignedLongLong;
7156 IntMaxType = Int64Type;
7157 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7158 LongDoubleWidth = LongDoubleAlign = 64;
7159 LongWidth = LongAlign = 32;
7160 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7161 PointerWidth = PointerAlign = 32;
7162 PtrDiffType = SignedInt;
7163 SizeType = UnsignedInt;
7164 SuitableAlign = 64;
7165 }
7166
7167 void setN32N64ABITypes() {
7168 LongDoubleWidth = LongDoubleAlign = 128;
7169 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7170 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7171 LongDoubleWidth = LongDoubleAlign = 64;
7172 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7173 }
7174 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7175 SuitableAlign = 128;
7176 }
7177
Daniel Sanders4672af62016-05-27 11:51:02 +00007178 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007179 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007180 Int64Type = SignedLong;
7181 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007182 LongWidth = LongAlign = 64;
7183 PointerWidth = PointerAlign = 64;
7184 PtrDiffType = SignedLong;
7185 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007186 }
7187
7188 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007189 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007190 Int64Type = SignedLongLong;
7191 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007192 LongWidth = LongAlign = 32;
7193 PointerWidth = PointerAlign = 32;
7194 PtrDiffType = SignedInt;
7195 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007196 }
7197
Craig Topper3164f332014-03-11 03:39:26 +00007198 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007199 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007200 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007201 .Case("mips1", true)
7202 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007203 .Case("mips3", true)
7204 .Case("mips4", true)
7205 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007206 .Case("mips32", true)
7207 .Case("mips32r2", true)
7208 .Case("mips32r3", true)
7209 .Case("mips32r5", true)
7210 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007211 .Case("mips64", true)
7212 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007213 .Case("mips64r3", true)
7214 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007215 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007216 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007217 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007218 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007219 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007220 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007221 bool
7222 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7223 StringRef CPU,
7224 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007225 if (CPU.empty())
7226 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007227 if (CPU == "octeon")
7228 Features["mips64r2"] = Features["cnmips"] = true;
7229 else
7230 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007231 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007232 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007233
Craig Topper3164f332014-03-11 03:39:26 +00007234 void getTargetDefines(const LangOptions &Opts,
7235 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007236 if (BigEndian) {
7237 DefineStd(Builder, "MIPSEB", Opts);
7238 Builder.defineMacro("_MIPSEB");
7239 } else {
7240 DefineStd(Builder, "MIPSEL", Opts);
7241 Builder.defineMacro("_MIPSEL");
7242 }
7243
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007244 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007245 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007246 if (Opts.GNUMode)
7247 Builder.defineMacro("mips");
7248
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007249 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007250 Builder.defineMacro("__mips", "32");
7251 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7252 } else {
7253 Builder.defineMacro("__mips", "64");
7254 Builder.defineMacro("__mips64");
7255 Builder.defineMacro("__mips64__");
7256 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7257 }
7258
7259 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7260 .Cases("mips32", "mips64", "1")
7261 .Cases("mips32r2", "mips64r2", "2")
7262 .Cases("mips32r3", "mips64r3", "3")
7263 .Cases("mips32r5", "mips64r5", "5")
7264 .Cases("mips32r6", "mips64r6", "6")
7265 .Default("");
7266 if (!ISARev.empty())
7267 Builder.defineMacro("__mips_isa_rev", ISARev);
7268
7269 if (ABI == "o32") {
7270 Builder.defineMacro("__mips_o32");
7271 Builder.defineMacro("_ABIO32", "1");
7272 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007273 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007274 Builder.defineMacro("__mips_n32");
7275 Builder.defineMacro("_ABIN32", "2");
7276 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7277 } else if (ABI == "n64") {
7278 Builder.defineMacro("__mips_n64");
7279 Builder.defineMacro("_ABI64", "3");
7280 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7281 } else
7282 llvm_unreachable("Invalid ABI.");
7283
Simon Atanasyan683535b2012-08-29 19:14:58 +00007284 Builder.defineMacro("__REGISTER_PREFIX__", "");
7285
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007286 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007287 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007288 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007289 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007290 case SoftFloat:
7291 Builder.defineMacro("__mips_soft_float", Twine(1));
7292 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007293 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007294
Simon Atanasyan16071912013-04-14 14:07:30 +00007295 if (IsSingleFloat)
7296 Builder.defineMacro("__mips_single_float", Twine(1));
7297
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007298 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7299 Builder.defineMacro("_MIPS_FPSET",
7300 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7301
Simon Atanasyan72244b62012-07-05 16:06:06 +00007302 if (IsMips16)
7303 Builder.defineMacro("__mips16", Twine(1));
7304
Simon Atanasyan60777612013-04-14 14:07:51 +00007305 if (IsMicromips)
7306 Builder.defineMacro("__mips_micromips", Twine(1));
7307
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007308 if (IsNan2008)
7309 Builder.defineMacro("__mips_nan2008", Twine(1));
7310
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007311 switch (DspRev) {
7312 default:
7313 break;
7314 case DSP1:
7315 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7316 Builder.defineMacro("__mips_dsp", Twine(1));
7317 break;
7318 case DSP2:
7319 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7320 Builder.defineMacro("__mips_dspr2", Twine(1));
7321 Builder.defineMacro("__mips_dsp", Twine(1));
7322 break;
7323 }
7324
Jack Carter44ff1e52013-08-12 17:20:29 +00007325 if (HasMSA)
7326 Builder.defineMacro("__mips_msa", Twine(1));
7327
Simon Atanasyan26f19672012-04-05 19:28:31 +00007328 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7329 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7330 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007331
7332 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7333 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007334
7335 // These shouldn't be defined for MIPS-I but there's no need to check
7336 // for that since MIPS-I isn't supported.
7337 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7338 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7339 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007340
7341 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7342 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7343 // the instructions exist but using them violates the ABI since they
7344 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7345 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007346 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007347 }
7348
Craig Topper6c03a542015-10-19 04:51:35 +00007349 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7350 return llvm::makeArrayRef(BuiltinInfo,
7351 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007352 }
Craig Topper3164f332014-03-11 03:39:26 +00007353 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007354 return llvm::StringSwitch<bool>(Feature)
7355 .Case("mips", true)
7356 .Case("fp64", HasFP64)
7357 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007358 }
Craig Topper3164f332014-03-11 03:39:26 +00007359 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007360 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007361 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007362 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007363 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007364 // CPU register names
7365 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007366 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7367 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7368 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007369 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7370 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007371 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7372 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7373 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7374 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007375 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007376 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007377 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7378 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007379 // MSA register names
7380 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7381 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7382 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7383 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7384 // MSA control register names
7385 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7386 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007387 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007388 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007389 }
Craig Topper3164f332014-03-11 03:39:26 +00007390 bool validateAsmConstraint(const char *&Name,
7391 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007392 switch (*Name) {
7393 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007394 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007395 case 'r': // CPU registers.
7396 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007397 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007398 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007399 case 'c': // $25 for indirect jumps
7400 case 'l': // lo register
7401 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007402 Info.setAllowsRegister();
7403 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007404 case 'I': // Signed 16-bit constant
7405 case 'J': // Integer 0
7406 case 'K': // Unsigned 16-bit constant
7407 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7408 case 'M': // Constants not loadable via lui, addiu, or ori
7409 case 'N': // Constant -1 to -65535
7410 case 'O': // A signed 15-bit constant
7411 case 'P': // A constant between 1 go 65535
7412 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007413 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007414 Info.setAllowsMemory();
7415 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007416 case 'Z':
7417 if (Name[1] == 'C') { // An address usable by ll, and sc.
7418 Info.setAllowsMemory();
7419 Name++; // Skip over 'Z'.
7420 return true;
7421 }
7422 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007423 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007424 }
7425
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007426 std::string convertConstraint(const char *&Constraint) const override {
7427 std::string R;
7428 switch (*Constraint) {
7429 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7430 if (Constraint[1] == 'C') {
7431 R = std::string("^") + std::string(Constraint, 2);
7432 Constraint++;
7433 return R;
7434 }
7435 break;
7436 }
7437 return TargetInfo::convertConstraint(Constraint);
7438 }
7439
Craig Topper3164f332014-03-11 03:39:26 +00007440 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007441 // In GCC, $1 is not widely used in generated code (it's used only in a few
7442 // specific situations), so there is no real need for users to add it to
7443 // the clobbers list if they want to use it in their inline assembly code.
7444 //
7445 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7446 // code generation, so using it in inline assembly without adding it to the
7447 // clobbers list can cause conflicts between the inline assembly code and
7448 // the surrounding generated code.
7449 //
7450 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7451 // operands, which will conflict with the ".set at" assembler option (which
7452 // we use only for inline assembly, in order to maintain compatibility with
7453 // GCC) and will also conflict with the user's usage of $1.
7454 //
7455 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7456 // register for generated code is to automatically clobber $1 for all inline
7457 // assembly code.
7458 //
7459 // FIXME: We should automatically clobber $1 only for inline assembly code
7460 // which actually uses it. This would allow LLVM to use $1 for inline
7461 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007462 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007463 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007464
Craig Topper3164f332014-03-11 03:39:26 +00007465 bool handleTargetFeatures(std::vector<std::string> &Features,
7466 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007467 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007468 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007469 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007470 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007471 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007472 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007473 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007474
Eric Christopher610fe112015-08-26 08:21:55 +00007475 for (const auto &Feature : Features) {
7476 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007477 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007478 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007479 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007480 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007481 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007482 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007483 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007484 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007485 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007486 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007487 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007488 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007489 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007490 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007491 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007492 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007493 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007494 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007495 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007496 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007497 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007498 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007499
James Y Knightb214cbc2016-03-04 19:00:41 +00007500 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007501
Rafael Espindolaeb265472013-08-21 21:59:03 +00007502 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007503 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007504
Craig Topper3164f332014-03-11 03:39:26 +00007505 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007506 if (RegNo == 0) return 4;
7507 if (RegNo == 1) return 5;
7508 return -1;
7509 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007510
7511 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007512
7513 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7514 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7515 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7516 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7517 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7518 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7519 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7520 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7521 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7522 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7523 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7524 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7525 {{"ra"}, "$31"}};
7526 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7527 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7528 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7529 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7530 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7531 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7532 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7533 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7534 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7535 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7536 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7537 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007538 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007539 return llvm::makeArrayRef(O32RegAliases);
7540 return llvm::makeArrayRef(NewABIRegAliases);
7541 }
7542
7543 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007544 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007545 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007546
7547 bool validateTarget(DiagnosticsEngine &Diags) const override {
7548 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7549 // this yet. It's better to fail here than on the backend assertion.
7550 if (processorSupportsGPR64() && ABI == "o32") {
7551 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7552 return false;
7553 }
7554
7555 // 64-bit ABI's require 64-bit CPU's.
7556 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7557 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7558 return false;
7559 }
7560
7561 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7562 // can't handle this yet. It's better to fail here than on the
7563 // backend assertion.
7564 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7565 getTriple().getArch() == llvm::Triple::mips64el) &&
7566 ABI == "o32") {
7567 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7568 << ABI << getTriple().str();
7569 return false;
7570 }
7571
7572 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7573 // can't handle this yet. It's better to fail here than on the
7574 // backend assertion.
7575 if ((getTriple().getArch() == llvm::Triple::mips ||
7576 getTriple().getArch() == llvm::Triple::mipsel) &&
7577 (ABI == "n32" || ABI == "n64")) {
7578 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7579 << ABI << getTriple().str();
7580 return false;
7581 }
7582
7583 return true;
7584 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007585};
7586
Daniel Sanders4672af62016-05-27 11:51:02 +00007587const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007588#define BUILTIN(ID, TYPE, ATTRS) \
7589 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7590#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7591 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007592#include "clang/Basic/BuiltinsMips.def"
7593};
7594
Ivan Krasindd7403e2011-08-24 20:22:22 +00007595class PNaClTargetInfo : public TargetInfo {
7596public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007597 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7598 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007599 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007600 this->LongAlign = 32;
7601 this->LongWidth = 32;
7602 this->PointerAlign = 32;
7603 this->PointerWidth = 32;
7604 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007605 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007606 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007607 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007608 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007609 this->SizeType = TargetInfo::UnsignedInt;
7610 this->PtrDiffType = TargetInfo::SignedInt;
7611 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007612 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007613 }
7614
Craig Toppere6f17d02014-03-11 04:07:52 +00007615 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007616 Builder.defineMacro("__le32__");
7617 Builder.defineMacro("__pnacl__");
7618 }
Craig Topper3164f332014-03-11 03:39:26 +00007619 void getTargetDefines(const LangOptions &Opts,
7620 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007621 getArchDefines(Opts, Builder);
7622 }
Craig Topper3164f332014-03-11 03:39:26 +00007623 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007624 return Feature == "pnacl";
7625 }
Craig Topper6c03a542015-10-19 04:51:35 +00007626 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007627 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007628 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007629 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007630 ArrayRef<const char *> getGCCRegNames() const override;
7631 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007632 bool validateAsmConstraint(const char *&Name,
7633 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007634 return false;
7635 }
7636
Craig Topper3164f332014-03-11 03:39:26 +00007637 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007638 return "";
7639 }
7640};
7641
Craig Topperf054e3a2015-10-19 03:52:27 +00007642ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7643 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007644}
7645
Craig Topperf054e3a2015-10-19 03:52:27 +00007646ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7647 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007648}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007649
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007650// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007651class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007652public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007653 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7654 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007655
7656 BuiltinVaListKind getBuiltinVaListKind() const override {
7657 return TargetInfo::PNaClABIBuiltinVaList;
7658 }
7659};
7660
JF Bastien643817d2014-09-12 17:52:47 +00007661class Le64TargetInfo : public TargetInfo {
7662 static const Builtin::Info BuiltinInfo[];
7663
7664public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007665 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7666 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007667 BigEndian = false;
7668 NoAsmVariants = true;
7669 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7670 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007671 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007672 }
7673
7674 void getTargetDefines(const LangOptions &Opts,
7675 MacroBuilder &Builder) const override {
7676 DefineStd(Builder, "unix", Opts);
7677 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7678 Builder.defineMacro("__ELF__");
7679 }
Craig Topper6c03a542015-10-19 04:51:35 +00007680 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7681 return llvm::makeArrayRef(BuiltinInfo,
7682 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007683 }
7684 BuiltinVaListKind getBuiltinVaListKind() const override {
7685 return TargetInfo::PNaClABIBuiltinVaList;
7686 }
7687 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007688 ArrayRef<const char *> getGCCRegNames() const override {
7689 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007690 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007691 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7692 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007693 }
7694 bool validateAsmConstraint(const char *&Name,
7695 TargetInfo::ConstraintInfo &Info) const override {
7696 return false;
7697 }
7698
7699 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007700};
Dan Gohmanc2853072015-09-03 22:51:53 +00007701
7702class WebAssemblyTargetInfo : public TargetInfo {
7703 static const Builtin::Info BuiltinInfo[];
7704
7705 enum SIMDEnum {
7706 NoSIMD,
7707 SIMD128,
7708 } SIMDLevel;
7709
7710public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007711 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007712 : TargetInfo(T), SIMDLevel(NoSIMD) {
7713 BigEndian = false;
7714 NoAsmVariants = true;
7715 SuitableAlign = 128;
7716 LargeArrayMinWidth = 128;
7717 LargeArrayAlign = 128;
7718 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007719 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007720 LongDoubleWidth = LongDoubleAlign = 128;
7721 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007722 }
7723
7724protected:
7725 void getTargetDefines(const LangOptions &Opts,
7726 MacroBuilder &Builder) const override {
7727 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7728 if (SIMDLevel >= SIMD128)
7729 Builder.defineMacro("__wasm_simd128__");
7730 }
7731
7732private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007733 bool
7734 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7735 StringRef CPU,
7736 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007737 if (CPU == "bleeding-edge")
7738 Features["simd128"] = true;
7739 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7740 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007741 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007742 return llvm::StringSwitch<bool>(Feature)
7743 .Case("simd128", SIMDLevel >= SIMD128)
7744 .Default(false);
7745 }
7746 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007747 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007748 for (const auto &Feature : Features) {
7749 if (Feature == "+simd128") {
7750 SIMDLevel = std::max(SIMDLevel, SIMD128);
7751 continue;
7752 }
7753 if (Feature == "-simd128") {
7754 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7755 continue;
7756 }
7757
7758 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7759 << "-target-feature";
7760 return false;
7761 }
7762 return true;
7763 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007764 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007765 return llvm::StringSwitch<bool>(Name)
7766 .Case("mvp", true)
7767 .Case("bleeding-edge", true)
7768 .Case("generic", true)
7769 .Default(false);
7770 }
Craig Topper6c03a542015-10-19 04:51:35 +00007771 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7772 return llvm::makeArrayRef(BuiltinInfo,
7773 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007774 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007775 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007776 return VoidPtrBuiltinVaList;
7777 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007778 ArrayRef<const char *> getGCCRegNames() const final {
7779 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007780 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007781 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7782 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007783 }
7784 bool
7785 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007786 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007787 return false;
7788 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007789 const char *getClobbers() const final { return ""; }
7790 bool isCLZForZeroUndef() const final { return false; }
7791 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007792 IntType getIntTypeByWidth(unsigned BitWidth,
7793 bool IsSigned) const final {
7794 // WebAssembly prefers long long for explicitly 64-bit integers.
7795 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7796 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7797 }
7798 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7799 bool IsSigned) const final {
7800 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7801 return BitWidth == 64
7802 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7803 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7804 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007805};
7806
7807const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7808#define BUILTIN(ID, TYPE, ATTRS) \
7809 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7810#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7811 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7812#include "clang/Basic/BuiltinsWebAssembly.def"
7813};
7814
7815class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7816public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007817 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7818 const TargetOptions &Opts)
7819 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007820 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007821 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007822 }
7823
7824protected:
7825 void getTargetDefines(const LangOptions &Opts,
7826 MacroBuilder &Builder) const override {
7827 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7828 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7829 }
7830};
7831
7832class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7833public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007834 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7835 const TargetOptions &Opts)
7836 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007837 LongAlign = LongWidth = 64;
7838 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007839 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007840 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007841 }
7842
7843protected:
7844 void getTargetDefines(const LangOptions &Opts,
7845 MacroBuilder &Builder) const override {
7846 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7847 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7848 }
7849};
7850
JF Bastien643817d2014-09-12 17:52:47 +00007851const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7852#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007853 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007854#include "clang/Basic/BuiltinsLe64.def"
7855};
7856
Eric Christopherc48497a2015-09-18 21:26:24 +00007857static const unsigned SPIRAddrSpaceMap[] = {
7858 1, // opencl_global
7859 3, // opencl_local
7860 2, // opencl_constant
7861 4, // opencl_generic
7862 0, // cuda_device
7863 0, // cuda_constant
7864 0 // cuda_shared
7865};
7866class SPIRTargetInfo : public TargetInfo {
7867public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007868 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7869 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007870 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7871 "SPIR target must use unknown OS");
7872 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7873 "SPIR target must use unknown environment type");
7874 BigEndian = false;
7875 TLSSupported = false;
7876 LongWidth = LongAlign = 64;
7877 AddrSpaceMap = &SPIRAddrSpaceMap;
7878 UseAddrSpaceMapMangling = true;
7879 // Define available target features
7880 // These must be defined in sorted order!
7881 NoAsmVariants = true;
7882 }
7883 void getTargetDefines(const LangOptions &Opts,
7884 MacroBuilder &Builder) const override {
7885 DefineStd(Builder, "SPIR", Opts);
7886 }
7887 bool hasFeature(StringRef Feature) const override {
7888 return Feature == "spir";
7889 }
Craig Topper3164f332014-03-11 03:39:26 +00007890
Craig Topper6c03a542015-10-19 04:51:35 +00007891 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007892 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007893 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007894 bool validateAsmConstraint(const char *&Name,
7895 TargetInfo::ConstraintInfo &info) const override {
7896 return true;
7897 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007898 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7899 return None;
7900 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007901 BuiltinVaListKind getBuiltinVaListKind() const override {
7902 return TargetInfo::VoidPtrBuiltinVaList;
7903 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007904
Eric Christopherc48497a2015-09-18 21:26:24 +00007905 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7906 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7907 : CCCR_Warning;
7908 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007909
Eric Christopherc48497a2015-09-18 21:26:24 +00007910 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7911 return CC_SpirFunction;
7912 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007913
7914 void setSupportedOpenCLOpts() override {
7915 // Assume all OpenCL extensions and optional core features are supported
7916 // for SPIR since it is a generic target.
7917 getSupportedOpenCLOpts().setAll();
7918 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007919};
Guy Benyeib798fc92012-12-11 21:38:14 +00007920
Eric Christopherc48497a2015-09-18 21:26:24 +00007921class SPIR32TargetInfo : public SPIRTargetInfo {
7922public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007923 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7924 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007925 PointerWidth = PointerAlign = 32;
7926 SizeType = TargetInfo::UnsignedInt;
7927 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007928 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7929 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007930 }
7931 void getTargetDefines(const LangOptions &Opts,
7932 MacroBuilder &Builder) const override {
7933 DefineStd(Builder, "SPIR32", Opts);
7934 }
7935};
Guy Benyeib798fc92012-12-11 21:38:14 +00007936
Eric Christopherc48497a2015-09-18 21:26:24 +00007937class SPIR64TargetInfo : public SPIRTargetInfo {
7938public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007939 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7940 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007941 PointerWidth = PointerAlign = 64;
7942 SizeType = TargetInfo::UnsignedLong;
7943 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007944 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7945 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007946 }
7947 void getTargetDefines(const LangOptions &Opts,
7948 MacroBuilder &Builder) const override {
7949 DefineStd(Builder, "SPIR64", Opts);
7950 }
7951};
Guy Benyeib798fc92012-12-11 21:38:14 +00007952
Robert Lytton0e076492013-08-13 09:43:10 +00007953class XCoreTargetInfo : public TargetInfo {
7954 static const Builtin::Info BuiltinInfo[];
7955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007956 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7957 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007958 BigEndian = false;
7959 NoAsmVariants = true;
7960 LongLongAlign = 32;
7961 SuitableAlign = 32;
7962 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007963 SizeType = UnsignedInt;
7964 PtrDiffType = SignedInt;
7965 IntPtrType = SignedInt;
7966 WCharType = UnsignedChar;
7967 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007968 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007969 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7970 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007971 }
Craig Topper3164f332014-03-11 03:39:26 +00007972 void getTargetDefines(const LangOptions &Opts,
7973 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007974 Builder.defineMacro("__XS1B__");
7975 }
Craig Topper6c03a542015-10-19 04:51:35 +00007976 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7977 return llvm::makeArrayRef(BuiltinInfo,
7978 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007979 }
Craig Topper3164f332014-03-11 03:39:26 +00007980 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007981 return TargetInfo::VoidPtrBuiltinVaList;
7982 }
Craig Topper3164f332014-03-11 03:39:26 +00007983 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007984 return "";
7985 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007986 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007987 static const char * const GCCRegNames[] = {
7988 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7989 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7990 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007991 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007992 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007993 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7994 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007995 }
Craig Topper3164f332014-03-11 03:39:26 +00007996 bool validateAsmConstraint(const char *&Name,
7997 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007998 return false;
7999 }
Craig Topper3164f332014-03-11 03:39:26 +00008000 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008001 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8002 return (RegNo < 2)? RegNo : -1;
8003 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008004 bool allowsLargerPreferedTypeAlignment() const override {
8005 return false;
8006 }
Robert Lytton0e076492013-08-13 09:43:10 +00008007};
8008
8009const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008010#define BUILTIN(ID, TYPE, ATTRS) \
8011 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8012#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8013 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008014#include "clang/Basic/BuiltinsXCore.def"
8015};
Robert Lytton0e076492013-08-13 09:43:10 +00008016
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008017// x86_32 Android target
8018class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8019public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008020 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8021 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008022 SuitableAlign = 32;
8023 LongDoubleWidth = 64;
8024 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8025 }
8026};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008027
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008028// x86_64 Android target
8029class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8030public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008031 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8032 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008033 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8034 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008035
8036 bool useFloat128ManglingForLongDouble() const override {
8037 return true;
8038 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008039};
8040} // end anonymous namespace
8041
Chris Lattner5ba61f02006-10-14 07:39:34 +00008042//===----------------------------------------------------------------------===//
8043// Driver code
8044//===----------------------------------------------------------------------===//
8045
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008046static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8047 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008048 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008049
Daniel Dunbar52322032009-08-18 05:47:58 +00008050 switch (Triple.getArch()) {
8051 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008052 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008053
Tim Northover2a0783d2014-05-30 14:14:07 +00008054 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008055 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008056
8057 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008058 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008059
Jacques Pienaard964cc22016-03-28 21:02:54 +00008060 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008061 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008062
Tim Northover2a0783d2014-05-30 14:14:07 +00008063 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008064 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008065 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008066
8067 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008068 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008069 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008070 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008071 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008072 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008073 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008074 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008075 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008076 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008077 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008078 }
8079
Christian Pirker9b019ae2014-02-25 13:51:00 +00008080 case llvm::Triple::aarch64_be:
8081 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008082 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008083 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008084 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008085 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008086 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008087 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008088 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008089 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008090 }
8091
Daniel Dunbar52322032009-08-18 05:47:58 +00008092 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008093 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008094 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008095 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008096
Daniel Dunbar52322032009-08-18 05:47:58 +00008097 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008098 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008099 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008100 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008101 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008102 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008103 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008104 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008105 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008106 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008107 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008108 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008109 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008110 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008111 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008112 case llvm::Triple::Win32:
8113 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008114 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008115 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008116 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008117 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008118 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008119 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008120 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008121 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008122 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008123 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008124 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008125 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008126 }
8127
8128 case llvm::Triple::armeb:
8129 case llvm::Triple::thumbeb:
8130 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008131 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008132
8133 switch (os) {
8134 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008135 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008136 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008137 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008138 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008139 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008140 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008141 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008142 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008143 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008144 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008145 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008146 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008147 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008148 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008149 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008150 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008151
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008152 case llvm::Triple::bpfeb:
8153 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008154 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008155
Daniel Dunbar52322032009-08-18 05:47:58 +00008156 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008157 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008158
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008159 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008160 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008161 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008162 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008163 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008164 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008165 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008166 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008167 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008168 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008169 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008170 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008171 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008172
8173 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008174 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008175 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008176 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008177 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008178 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008179 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008180 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008181 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008182 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008183 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008184 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008185 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008186 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008187 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008188
Akira Hatanakabef17452011-09-20 19:21:49 +00008189 case llvm::Triple::mips64:
8190 switch (os) {
8191 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008192 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008193 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008194 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008195 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008196 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008197 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008198 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008199 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008200 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008201 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008202 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008203 }
8204
8205 case llvm::Triple::mips64el:
8206 switch (os) {
8207 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008208 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008209 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008210 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008211 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008212 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008213 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008214 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008215 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008216 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008217 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008218 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008219 }
8220
Ivan Krasindd7403e2011-08-24 20:22:22 +00008221 case llvm::Triple::le32:
8222 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008223 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008224 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008225 default:
8226 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008227 }
8228
JF Bastien643817d2014-09-12 17:52:47 +00008229 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008230 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008231
Daniel Dunbar52322032009-08-18 05:47:58 +00008232 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008233 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008234 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008235 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008236 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008238 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008240 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008242 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008244 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008246 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008247 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008248 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008249
8250 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008251 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008252 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008253 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008254 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008256 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008257 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008258 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008260 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008262 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008264 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008265
Bill Schmidt778d3872013-07-26 01:36:11 +00008266 case llvm::Triple::ppc64le:
8267 switch (os) {
8268 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008269 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008270 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008272 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008274 }
8275
Peter Collingbournec947aae2012-05-20 23:28:41 +00008276 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008277 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008278 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008279 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008280
Tom Stellardd8e38a32015-01-06 20:34:47 +00008281 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008282 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008283 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008284
Daniel Dunbar52322032009-08-18 05:47:58 +00008285 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008286 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008287 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008288 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008289 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008290 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008291 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008292 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008293 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008294 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008295 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008296 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008297 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008298 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008299 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008300
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008301 // The 'sparcel' architecture copies all the above cases except for Solaris.
8302 case llvm::Triple::sparcel:
8303 switch (os) {
8304 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008306 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008308 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008310 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008312 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008313 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008314 }
8315
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008316 case llvm::Triple::sparcv9:
8317 switch (os) {
8318 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008319 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008320 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008321 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008322 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008323 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008324 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008325 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008326 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008328 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008330 }
8331
Ulrich Weigand47445072013-05-06 16:26:41 +00008332 case llvm::Triple::systemz:
8333 switch (os) {
8334 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008336 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008337 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008338 }
8339
Eli Friedmana9c3d712009-08-19 20:47:07 +00008340 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008341 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008342
Daniel Dunbar52322032009-08-18 05:47:58 +00008343 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008344 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008345 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008346
Daniel Dunbar52322032009-08-18 05:47:58 +00008347 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008348 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008350 case llvm::Triple::Linux: {
8351 switch (Triple.getEnvironment()) {
8352 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008353 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008354 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008356 }
8357 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008358 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008359 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008360 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008361 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008362 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008363 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008364 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008366 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008367 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008368 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008370 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008371 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008372 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008373 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008374 case llvm::Triple::Win32: {
8375 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008376 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008377 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008378 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008379 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008380 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008381 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008382 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008383 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008384 }
8385 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008386 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008387 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008388 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008389 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008390 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008391 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008392 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008394 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008395 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008396 }
8397
8398 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008399 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008401
Daniel Dunbar52322032009-08-18 05:47:58 +00008402 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008403 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008404 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008405 case llvm::Triple::Linux: {
8406 switch (Triple.getEnvironment()) {
8407 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008408 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008409 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008410 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008411 }
8412 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008413 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008414 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008415 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008416 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008417 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008418 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008419 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008420 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008421 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008422 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008423 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008424 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008425 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008426 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008427 case llvm::Triple::Win32: {
8428 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008429 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008430 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008431 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008432 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008433 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008434 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008436 }
8437 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008438 case llvm::Triple::Haiku:
8439 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008440 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008441 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008442 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008443 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008444 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008445 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008446 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008447
Douglas Katzman78d7c542015-05-12 21:18:10 +00008448 case llvm::Triple::spir: {
8449 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8450 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8451 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008452 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008453 }
8454 case llvm::Triple::spir64: {
8455 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8456 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8457 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008458 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008459 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008460 case llvm::Triple::wasm32:
8461 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8462 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008464 case llvm::Triple::wasm64:
8465 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8466 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008467 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008468 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008469}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008470
8471/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008472/// options.
Alp Toker80758082014-07-06 05:26:44 +00008473TargetInfo *
8474TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008475 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008476 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008477
8478 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008480 if (!Target) {
8481 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008482 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008483 }
Alp Toker80758082014-07-06 05:26:44 +00008484 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008485
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008486 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008487 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8488 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008489 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008490 }
8491
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008492 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008493 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8494 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008495 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008496 }
8497
Rafael Espindolaeb265472013-08-21 21:59:03 +00008498 // Set the fp math unit.
8499 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8500 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008501 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008502 }
8503
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008504 // Compute the default target features, we need the target to handle this
8505 // because features may have dependencies on one another.
8506 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008507 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8508 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008509 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008510
8511 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008512 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008513 for (const auto &F : Features)
8514 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8515
Eric Christopher3ff21b32013-10-16 21:26:26 +00008516 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008517 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008518
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008519 Target->setSupportedOpenCLOpts();
8520
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008521 if (!Target->validateTarget(Diags))
8522 return nullptr;
8523
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008524 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008525}